ETH Price: $3,151.27 (-8.46%)
Gas: 8 Gwei

Contract

0x02Ca9F2c5dD0635516241efD480091870277865b
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Ready For Commit...203750582024-07-24 7:58:4729 hrs ago1721807927IN
0x02Ca9F2c...70277865b
0 ETH0.000353022.64308184
Ready For Commit...203629142024-07-22 15:17:592 days ago1721661479IN
0x02Ca9F2c...70277865b
0 ETH0.001162078.70048552
Ready For Commit...203587912024-07-22 1:28:353 days ago1721611715IN
0x02Ca9F2c...70277865b
0 ETH0.000433883.25072671
Ready For Commit...203587512024-07-22 1:20:353 days ago1721611235IN
0x02Ca9F2c...70277865b
0 ETH0.000469043.51409997
Ready To Sync203582822024-07-21 23:46:113 days ago1721605571IN
0x02Ca9F2c...70277865b
0 ETH0.000168093.40355349
Ready To Sync203511322024-07-20 23:49:234 days ago1721519363IN
0x02Ca9F2c...70277865b
0 ETH0.000104432.11455094
Ready To Sync203511302024-07-20 23:48:594 days ago1721519339IN
0x02Ca9F2c...70277865b
0 ETH0.000102172.06884725
Ready For Commit...203254432024-07-17 9:46:358 days ago1721209595IN
0x02Ca9F2c...70277865b
0 ETH0.001230069.20954734
Ready For Commit...203132952024-07-15 17:06:479 days ago1721063207IN
0x02Ca9F2c...70277865b
0 ETH0.0028829221.58459211
Ready For Commit...203091672024-07-15 3:16:4710 days ago1721013407IN
0x02Ca9F2c...70277865b
0 ETH0.000411693.08447909
Ready For Commit...203091092024-07-15 3:05:1110 days ago1721012711IN
0x02Ca9F2c...70277865b
0 ETH0.000525273.93541276
Ready To Sync203086522024-07-15 1:33:3510 days ago1721007215IN
0x02Ca9F2c...70277865b
0 ETH0.000195913.96694075
Ready To Sync203015042024-07-14 1:37:2311 days ago1720921043IN
0x02Ca9F2c...70277865b
0 ETH0.000166653.37449069
Ready To Sync203014952024-07-14 1:35:3511 days ago1720920935IN
0x02Ca9F2c...70277865b
0 ETH0.00016293.29850278
Ready For Commit...202758282024-07-10 11:33:5915 days ago1720611239IN
0x02Ca9F2c...70277865b
0 ETH0.0018286713.69137962
Ready For Commit...202637052024-07-08 18:54:1116 days ago1720464851IN
0x02Ca9F2c...70277865b
0 ETH0.000418733.13525174
Ready For Commit...202595922024-07-08 5:05:3517 days ago1720415135IN
0x02Ca9F2c...70277865b
0 ETH0.000190791.42951498
Ready For Commit...202595342024-07-08 4:53:4717 days ago1720414427IN
0x02Ca9F2c...70277865b
0 ETH0.000175661.31616282
Ready To Sync202590752024-07-08 3:21:3517 days ago1720408895IN
0x02Ca9F2c...70277865b
0 ETH0.000064621.30851814
Ready To Sync202519342024-07-07 3:25:1118 days ago1720322711IN
0x02Ca9F2c...70277865b
0 ETH0.000063261.28099711
Ready For Commit...202262492024-07-03 13:22:1122 days ago1720012931IN
0x02Ca9F2c...70277865b
0 ETH0.0027624420.68347307
Ready For Commit...202141272024-07-01 20:42:1123 days ago1719866531IN
0x02Ca9F2c...70277865b
0 ETH0.00099347.4380053
Ready For Commit...202100062024-07-01 6:53:4724 days ago1719816827IN
0x02Ca9F2c...70277865b
0 ETH0.000370232.77394806
Ready For Commit...202099522024-07-01 6:42:4724 days ago1719816167IN
0x02Ca9F2c...70277865b
0 ETH0.000267412.00355931
Ready To Sync202094852024-07-01 5:08:4724 days ago1719810527IN
0x02Ca9F2c...70277865b
0 ETH0.00010212.06746055
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
203819972024-07-25 7:13:236 hrs ago1721891603
0x02Ca9F2c...70277865b
0 ETH
203819972024-07-25 7:13:236 hrs ago1721891603
0x02Ca9F2c...70277865b
0 ETH
203819692024-07-25 7:07:476 hrs ago1721891267
0x02Ca9F2c...70277865b
0 ETH
203819692024-07-25 7:07:476 hrs ago1721891267
0x02Ca9F2c...70277865b
0 ETH
203818712024-07-25 6:47:597 hrs ago1721890079
0x02Ca9F2c...70277865b
0 ETH
203818712024-07-25 6:47:597 hrs ago1721890079
0x02Ca9F2c...70277865b
0 ETH
203818632024-07-25 6:46:237 hrs ago1721889983
0x02Ca9F2c...70277865b
0 ETH
203818632024-07-25 6:46:237 hrs ago1721889983
0x02Ca9F2c...70277865b
0 ETH
203809252024-07-25 3:38:2310 hrs ago1721878703
0x02Ca9F2c...70277865b
0 ETH
203809252024-07-25 3:38:2310 hrs ago1721878703
0x02Ca9F2c...70277865b
0 ETH
203750582024-07-24 7:58:4729 hrs ago1721807927
0x02Ca9F2c...70277865b
0 ETH
203750582024-07-24 7:58:4729 hrs ago1721807927
0x02Ca9F2c...70277865b
0 ETH
203750582024-07-24 7:58:4729 hrs ago1721807927
0x02Ca9F2c...70277865b
0 ETH
203750582024-07-24 7:58:4729 hrs ago1721807927
0x02Ca9F2c...70277865b
0 ETH
203750582024-07-24 7:58:4729 hrs ago1721807927
0x02Ca9F2c...70277865b
0 ETH
203737632024-07-24 3:38:2334 hrs ago1721792303
0x02Ca9F2c...70277865b
0 ETH
203737632024-07-24 3:38:2334 hrs ago1721792303
0x02Ca9F2c...70277865b
0 ETH
203731952024-07-24 1:44:2336 hrs ago1721785463
0x02Ca9F2c...70277865b
0 ETH
203731952024-07-24 1:44:2336 hrs ago1721785463
0x02Ca9F2c...70277865b
0 ETH
203731922024-07-24 1:43:4736 hrs ago1721785427
0x02Ca9F2c...70277865b
0 ETH
203731922024-07-24 1:43:4736 hrs ago1721785427
0x02Ca9F2c...70277865b
0 ETH
203674462024-07-23 6:29:592 days ago1721716199
0x02Ca9F2c...70277865b
0 ETH
203674462024-07-23 6:29:592 days ago1721716199
0x02Ca9F2c...70277865b
0 ETH
203665932024-07-23 3:38:232 days ago1721705903
0x02Ca9F2c...70277865b
0 ETH
203665932024-07-23 3:38:232 days ago1721705903
0x02Ca9F2c...70277865b
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Elections

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-04
*/

// File: @openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: contracts/spec_interfaces/IElections.sol

pragma solidity 0.6.12;

/// @title Elections contract interface
interface IElections {
	
	// Election state change events
	event StakeChanged(address indexed addr, uint256 selfDelegatedStake, uint256 delegatedStake, uint256 effectiveStake);
	event GuardianStatusUpdated(address indexed guardian, bool readyToSync, bool readyForCommittee);

	// Vote out / Vote unready
	event GuardianVotedUnready(address indexed guardian);
	event VoteUnreadyCasted(address indexed voter, address indexed subject, uint256 expiration);
	event GuardianVotedOut(address indexed guardian);
	event VoteOutCasted(address indexed voter, address indexed subject);

	/*
	 * External functions
	 */

    /// Notifies that the guardian is ready to sync with other nodes
    /// @dev may be called with either the guardian address or the guardian's orbs address
    /// @dev ready to sync state is not managed in the contract that only emits an event
    /// @dev readyToSync clears the readyForCommittee state
	function readyToSync() external;

    /// Notifies that the guardian is ready to join the committee
    /// @dev may be called with either the guardian address or the guardian's orbs address
    /// @dev a qualified guardian calling readyForCommittee is added to the committee
	function readyForCommittee() external;

    /// Checks if a guardian is qualified to join the committee
    /// @dev when true, calling readyForCommittee() will result in adding the guardian to the committee
    /// @dev called periodically by guardians to check if they are qualified to join the committee
    /// @param guardian is the guardian to check
    /// @return canJoin indicating that the guardian can join the current committee
	function canJoinCommittee(address guardian) external view returns (bool);

    /// Returns an address effective stake
    /// The effective stake is derived from a guardian delegate stake and selfs stake  
    /// @return effectiveStake is the guardian's effective stake
	function getEffectiveStake(address guardian) external view returns (uint effectiveStake);

    /// Returns the current committee along with the guardians' Orbs address and IP
    /// @return committee is a list of the committee members' guardian addresses
    /// @return weights is a list of the committee members' weight (effective stake)
    /// @return orbsAddrs is a list of the committee members' orbs address
    /// @return certification is a list of bool indicating the committee members certification
    /// @return ips is a list of the committee members' ip
	function getCommittee() external view returns (address[] memory committee, uint256[] memory weights, address[] memory orbsAddrs, bool[] memory certification, bytes4[] memory ips);

	// Vote-unready

    /// Casts an unready vote on a subject guardian
    /// @dev Called by a guardian as part of the automatic vote-unready flow
    /// @dev The transaction may be sent from the guardian or orbs address.
    /// @param subject is the subject guardian to vote out
    /// @param voteExpiration is the expiration time of the vote unready to prevent counting of a vote that is already irrelevant.
	function voteUnready(address subject, uint voteExpiration) external;

    /// Returns the current vote unready vote for a voter and a subject pair
    /// @param voter is the voting guardian address
    /// @param subject is the subject guardian address
    /// @return valid indicates whether there is a valid vote
    /// @return expiration returns the votes expiration time
	function getVoteUnreadyVote(address voter, address subject) external view returns (bool valid, uint256 expiration);

    /// Returns the current vote-unready status of a subject guardian.
    /// @dev the committee and certification data is used to check the certified and committee threshold
    /// @param subject is the subject guardian address
    /// @return committee is a list of the current committee members
    /// @return weights is a list of the current committee members weight
    /// @return certification is a list of bool indicating the committee members certification
    /// @return votes is a list of bool indicating the members that votes the subject unready
    /// @return subjectInCommittee indicates that the subject is in the committee
    /// @return subjectInCertifiedCommittee indicates that the subject is in the certified committee
	function getVoteUnreadyStatus(address subject) external view returns (
		address[] memory committee,
		uint256[] memory weights,
		bool[] memory certification,
		bool[] memory votes,
		bool subjectInCommittee,
		bool subjectInCertifiedCommittee
	);

	// Vote-out

    /// Casts a voteOut vote by the sender to the given address
    /// @dev the transaction is sent from the guardian address
    /// @param subject is the subject guardian address
	function voteOut(address subject) external;

    /// Returns the subject address the addr has voted-out against
    /// @param voter is the voting guardian address
    /// @return subject is the subject the voter has voted out
	function getVoteOutVote(address voter) external view returns (address);

    /// Returns the governance voteOut status of a guardian.
    /// @dev A guardian is voted out if votedStake / totalDelegatedStake (in percent mille) > threshold
    /// @param subject is the subject guardian address
    /// @return votedOut indicates whether the subject was voted out
    /// @return votedStake is the total stake voting against the subject
    /// @return totalDelegatedStake is the total delegated stake
	function getVoteOutStatus(address subject) external view returns (bool votedOut, uint votedStake, uint totalDelegatedStake);

	/*
	 * Notification functions from other PoS contracts
	 */

    /// Notifies a delegated stake change event
    /// @dev Called by: delegation contract
    /// @param delegate is the delegate to update
    /// @param selfDelegatedStake is the delegate self stake (0 if not self-delegating)
    /// @param delegatedStake is the delegate delegated stake (0 if not self-delegating)
    /// @param totalDelegatedStake is the total delegated stake
	function delegatedStakeChange(address delegate, uint256 selfDelegatedStake, uint256 delegatedStake, uint256 totalDelegatedStake) external /* onlyDelegationsContract onlyWhenActive */;

    /// Notifies a new guardian was unregistered
    /// @dev Called by: guardian registration contract
    /// @dev when a guardian unregisters its status is updated to not ready to sync and is removed from the committee
    /// @param guardian is the address of the guardian that unregistered
	function guardianUnregistered(address guardian) external /* onlyGuardiansRegistrationContract */;

    /// Notifies on a guardian certification change
    /// @dev Called by: guardian registration contract
    /// @param guardian is the address of the guardian to update
    /// @param isCertified indicates whether the guardian is certified
	function guardianCertificationChanged(address guardian, bool isCertified) external /* onlyCertificationContract */;


	/*
     * Governance functions
	 */

	event VoteUnreadyTimeoutSecondsChanged(uint32 newValue, uint32 oldValue);
	event VoteOutPercentMilleThresholdChanged(uint32 newValue, uint32 oldValue);
	event VoteUnreadyPercentMilleThresholdChanged(uint32 newValue, uint32 oldValue);
	event MinSelfStakePercentMilleChanged(uint32 newValue, uint32 oldValue);

    /// Sets the minimum self stake requirement for the effective stake
    /// @dev governance function called only by the functional manager
    /// @param minSelfStakePercentMille is the minimum self stake in percent-mille (0-100,000) 
	function setMinSelfStakePercentMille(uint32 minSelfStakePercentMille) external /* onlyFunctionalManager */;

    /// Returns the minimum self-stake required for the effective stake
    /// @return minSelfStakePercentMille is the minimum self stake in percent-mille 
	function getMinSelfStakePercentMille() external view returns (uint32);

    /// Sets the vote-out threshold
    /// @dev governance function called only by the functional manager
    /// @param voteOutPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000)
	function setVoteOutPercentMilleThreshold(uint32 voteOutPercentMilleThreshold) external /* onlyFunctionalManager */;

    /// Returns the vote-out threshold
    /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille
	function getVoteOutPercentMilleThreshold() external view returns (uint32);

    /// Sets the vote-unready threshold
    /// @dev governance function called only by the functional manager
    /// @param voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000)
	function setVoteUnreadyPercentMilleThreshold(uint32 voteUnreadyPercentMilleThreshold) external /* onlyFunctionalManager */;

    /// Returns the vote-unready threshold
    /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille
	function getVoteUnreadyPercentMilleThreshold() external view returns (uint32);

    /// Returns the contract's settings 
    /// @return minSelfStakePercentMille is the minimum self stake in percent-mille
    /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille
    /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille
	function getSettings() external view returns (
		uint32 minSelfStakePercentMille,
		uint32 voteUnreadyPercentMilleThreshold,
		uint32 voteOutPercentMilleThreshold
	);

    /// Initializes the ready for committee notification for the committee guardians
    /// @dev governance function called only by the initialization admin during migration 
    /// @dev identical behaviour as if each guardian sent readyForCommittee() 
    /// @param guardians a list of guardians addresses to update
	function initReadyForCommittee(address[] calldata guardians) external /* onlyInitializationAdmin */;

}

// File: contracts/spec_interfaces/IDelegations.sol

pragma solidity 0.6.12;

/// @title Delegations contract interface
interface IDelegations /* is IStakeChangeNotifier */ {

    // Delegation state change events
	event DelegatedStakeChanged(address indexed addr, uint256 selfDelegatedStake, uint256 delegatedStake, address indexed delegator, uint256 delegatorContributedStake);

    // Function calls
	event Delegated(address indexed from, address indexed to);

	/*
     * External functions
     */

    /// Delegate your stake
    /// @dev updates the election contract on the changes in the delegated stake
    /// @dev updates the rewards contract on the upcoming change in the delegator's delegation state
    /// @param to is the address to delegate to
	function delegate(address to) external /* onlyWhenActive */;

    /// Refresh the address stake for delegation power based on the staking contract
    /// @dev Disabled stake change update notifications from the staking contract may create mismatches
    /// @dev refreshStake re-syncs the stake data with the staking contract
    /// @param addr is the address to refresh its stake
	function refreshStake(address addr) external /* onlyWhenActive */;

    /// Refresh the addresses stake for delegation power based on the staking contract
    /// @dev Batched version of refreshStake
    /// @dev Disabled stake change update notifications from the staking contract may create mismatches
    /// @dev refreshStakeBatch re-syncs the stake data with the staking contract
    /// @param addrs is the list of addresses to refresh their stake
	function refreshStakeBatch(address[] calldata addrs) external /* onlyWhenActive */;

    /// Returns the delegate address of the given address
    /// @param addr is the address to query
    /// @return delegation is the address the addr delegated to
	function getDelegation(address addr) external view returns (address);

    /// Returns a delegator info
    /// @param addr is the address to query
    /// @return delegation is the address the addr delegated to
    /// @return delegatorStake is the stake of the delegator as reflected in the delegation contract
	function getDelegationInfo(address addr) external view returns (address delegation, uint256 delegatorStake);
	
    /// Returns the delegated stake of an addr 
    /// @dev an address that is not self delegating has a 0 delegated stake
    /// @param addr is the address to query
    /// @return delegatedStake is the address delegated stake
	function getDelegatedStake(address addr) external view returns (uint256);

    /// Returns the total delegated stake
    /// @dev delegatedStake - the total stake delegated to an address that is self delegating
    /// @dev the delegated stake of a non self-delegated address is 0
    /// @return totalDelegatedStake is the total delegatedStake of all the addresses
	function getTotalDelegatedStake() external view returns (uint256) ;

	/*
	 * Governance functions
	 */

	event DelegationsImported(address[] from, address indexed to);

	event DelegationInitialized(address indexed from, address indexed to);

    /// Imports delegations during initial migration
    /// @dev initialization function called only by the initializationManager
    /// @dev Does not update the Rewards or Election contracts
    /// @dev assumes deactivated Rewards
    /// @param from is a list of delegator addresses
    /// @param to is the address the delegators delegate to
	function importDelegations(address[] calldata from, address to) external /* onlyMigrationManager onlyDuringDelegationImport */;

    /// Initializes the delegation of an address during initial migration 
    /// @dev initialization function called only by the initializationManager
    /// @dev behaves identically to a delegate transaction sent by the delegator
    /// @param from is the delegator addresses
    /// @param to is the delegator delegates to
	function initDelegation(address from, address to) external /* onlyInitializationAdmin */;
}

// File: contracts/spec_interfaces/IGuardiansRegistration.sol

pragma solidity 0.6.12;

/// @title Guardian registration contract interface
interface IGuardiansRegistration {
	event GuardianRegistered(address indexed guardian);
	event GuardianUnregistered(address indexed guardian);
	event GuardianDataUpdated(address indexed guardian, bool isRegistered, bytes4 ip, address orbsAddr, string name, string website, uint256 registrationTime);
	event GuardianMetadataChanged(address indexed guardian, string key, string newValue, string oldValue);

	/*
     * External methods
     */

    /// Registers a new guardian
    /// @dev called using the guardian's address that holds the guardian self-stake and used for delegation
    /// @param ip is the guardian's node ipv4 address as a 32b number 
    /// @param orbsAddr is the guardian's Orbs node address 
    /// @param name is the guardian's name as a string
    /// @param website is the guardian's website as a string, publishing a name and website provide information for delegators
	function registerGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website) external;

    /// Updates a registered guardian data
    /// @dev may be called only by a registered guardian
    /// @param ip is the guardian's node ipv4 address as a 32b number 
    /// @param orbsAddr is the guardian's Orbs node address 
    /// @param name is the guardian's name as a string
    /// @param website is the guardian's website as a string, publishing a name and website provide information for delegators
	function updateGuardian(bytes4 ip, address orbsAddr, string calldata name, string calldata website) external;

    /// Updates a registered guardian ip address
    /// @dev may be called only by a registered guardian
    /// @dev may be called with either the guardian address or the guardian's orbs address
    /// @param ip is the guardian's node ipv4 address as a 32b number 
	function updateGuardianIp(bytes4 ip) external /* onlyWhenActive */;

    /// Updates a guardian's metadata property
    /// @dev called using the guardian's address
    /// @dev any key may be updated to be used by Orbs platform and tools
    /// @param key is the name of the property to update
    /// @param value is the value of the property to update in a string format
    function setMetadata(string calldata key, string calldata value) external;

    /// Returns a guardian's metadata property
    /// @dev a property that wasn't set returns an empty string
    /// @param guardian is the guardian to query
    /// @param key is the name of the metadata property to query
    /// @return value is the value of the queried property in a string format
    function getMetadata(address guardian, string calldata key) external view returns (string memory);

    /// Unregisters a guardian
    /// @dev may be called only by a registered guardian
    /// @dev unregistering does not clear the guardian's metadata properties
	function unregisterGuardian() external;

    /// Returns a guardian's data
    /// @param guardian is the guardian to query
    /// @param ip is the guardian's node ipv4 address as a 32b number 
    /// @param orbsAddr is the guardian's Orbs node address 
    /// @param name is the guardian's name as a string
    /// @param website is the guardian's website as a string
    /// @param registrationTime is the timestamp of the guardian's registration
    /// @param lastUpdateTime is the timestamp of the guardian's last update
	function getGuardianData(address guardian) external view returns (bytes4 ip, address orbsAddr, string memory name, string memory website, uint registrationTime, uint lastUpdateTime);

    /// Returns the Orbs addresses of a list of guardians
    /// @dev an unregistered guardian returns address(0) Orbs address
    /// @param guardianAddrs is a list of guardians' addresses to query
    /// @return orbsAddrs is a list of the guardians' Orbs addresses 
	function getGuardiansOrbsAddress(address[] calldata guardianAddrs) external view returns (address[] memory orbsAddrs);

    /// Returns a guardian's ip
    /// @dev an unregistered guardian returns 0 ip address
    /// @param guardian is the guardian to query
    /// @return ip is the guardian's node ipv4 address as a 32b number 
	function getGuardianIp(address guardian) external view returns (bytes4 ip);

    /// Returns the ip of a list of guardians
    /// @dev an unregistered guardian returns 0 ip address
    /// @param guardianAddrs is a list of guardians' addresses to query
    /// @param ips is a list of the guardians' node ipv4 addresses as a 32b numbers
	function getGuardianIps(address[] calldata guardianAddrs) external view returns (bytes4[] memory ips);

    /// Checks if a guardian is registered
    /// @param guardian is the guardian to query
    /// @return registered is a bool indicating a guardian address is registered
	function isRegistered(address guardian) external view returns (bool);

    /// Translates a list guardians Orbs addresses to guardian addresses
    /// @dev an Orbs address that does not correspond to any registered guardian returns address(0)
    /// @param orbsAddrs is a list of the guardians' Orbs addresses to query
    /// @return guardianAddrs is a list of guardians' addresses that matches the Orbs addresses
	function getGuardianAddresses(address[] calldata orbsAddrs) external view returns (address[] memory guardianAddrs);

    /// Resolves the guardian address for a guardian, given a Guardian/Orbs address
    /// @dev revert if the address does not correspond to a registered guardian address or Orbs address
    /// @dev designed to be used for contracts calls, validating a registered guardian
    /// @dev should be used with caution when called by tools as the call may revert
    /// @dev in case of a conflict matching both guardian and Orbs address, the Guardian address takes precedence
    /// @param guardianOrOrbsAddress is the address to query representing a guardian address or Orbs address
    /// @return guardianAddress is the guardian address that matches the queried address
	function resolveGuardianAddress(address guardianOrOrbsAddress) external view returns (address guardianAddress);

	/*
	 * Governance functions
	 */

    /// Migrates a list of guardians from a previous guardians registration contract
    /// @dev governance function called only by the initialization admin
    /// @dev reads the migrated guardians data by calling getGuardianData in the previous contract
    /// @dev imports also the guardians' registration time and last update
    /// @dev emits a GuardianDataUpdated for each guardian to allow tracking by tools
    /// @param guardiansToMigrate is a list of guardians' addresses to migrate
    /// @param previousContract is the previous registration contract address
	function migrateGuardians(address[] calldata guardiansToMigrate, IGuardiansRegistration previousContract) external /* onlyInitializationAdmin */;

}

// File: contracts/spec_interfaces/ICommittee.sol

pragma solidity 0.6.12;

/// @title Committee contract interface
interface ICommittee {
	event CommitteeChange(address indexed addr, uint256 weight, bool certification, bool inCommittee);
	event CommitteeSnapshot(address[] addrs, uint256[] weights, bool[] certification);

	// No external functions

	/*
     * External functions
     */

    /// Notifies a weight change of a member
    /// @dev Called only by: Elections contract
    /// @param addr is the committee member address
    /// @param weight is the updated weight of the committee member
	function memberWeightChange(address addr, uint256 weight) external /* onlyElectionsContract onlyWhenActive */;

    /// Notifies a change in the certification of a member
    /// @dev Called only by: Elections contract
    /// @param addr is the committee member address
    /// @param isCertified is the updated certification state of the member
	function memberCertificationChange(address addr, bool isCertified) external /* onlyElectionsContract onlyWhenActive */;

    /// Notifies a member removal for example due to voteOut or voteUnready
    /// @dev Called only by: Elections contract
    /// @param memberRemoved is the removed committee member address
    /// @return memberRemoved indicates whether the member was removed from the committee
    /// @return removedMemberWeight indicates the removed member weight
    /// @return removedMemberCertified indicates whether the member was in the certified committee
	function removeMember(address addr) external returns (bool memberRemoved, uint removedMemberWeight, bool removedMemberCertified)/* onlyElectionContract */;

    /// Notifies a new member applicable for committee (due to registration, unbanning, certification change)
    /// The new member will be added only if it is qualified to join the committee 
    /// @dev Called only by: Elections contract
    /// @param addr is the added committee member address
    /// @param weight is the added member weight
    /// @param isCertified is the added member certification state
    /// @return memberAdded bool indicates whether the member was added
	function addMember(address addr, uint256 weight, bool isCertified) external returns (bool memberAdded)  /* onlyElectionsContract */;

    /// Checks if addMember() would add a the member to the committee (qualified to join)
    /// @param addr is the candidate committee member address
    /// @param weight is the candidate committee member weight
    /// @return wouldAddMember bool indicates whether the member will be added
	function checkAddMember(address addr, uint256 weight) external view returns (bool wouldAddMember);

    /// Returns the committee members and their weights
    /// @return addrs is the committee members list
    /// @return weights is an array of uint, indicating committee members list weight
    /// @return certification is an array of bool, indicating the committee members certification status
	function getCommittee() external view returns (address[] memory addrs, uint256[] memory weights, bool[] memory certification);

    /// Returns the currently appointed committee data
    /// @return generalCommitteeSize is the number of members in the committee
    /// @return certifiedCommitteeSize is the number of certified members in the committee
    /// @return totalWeight is the total effective stake (weight) of the committee
	function getCommitteeStats() external view returns (uint generalCommitteeSize, uint certifiedCommitteeSize, uint totalWeight);

    /// Returns a committee member data
    /// @param addr is the committee member address
    /// @return inCommittee indicates whether the queried address is a member in the committee
    /// @return weight is the committee member weight
    /// @return isCertified indicates whether the committee member is certified
    /// @return totalCommitteeWeight is the total weight of the committee.
	function getMemberInfo(address addr) external view returns (bool inCommittee, uint weight, bool isCertified, uint totalCommitteeWeight);

    /// Emits a CommitteeSnapshot events with current committee info
    /// @dev a CommitteeSnapshot is useful on contract migration or to remove the need to track past events.
	function emitCommitteeSnapshot() external;

	/*
	 * Governance functions
	 */

	event MaxCommitteeSizeChanged(uint8 newValue, uint8 oldValue);

    /// Sets the maximum number of committee members
    /// @dev governance function called only by the functional manager
    /// @dev when reducing the number of members, the bottom ones are removed from the committee
    /// @param _maxCommitteeSize is the maximum number of committee members 
	function setMaxCommitteeSize(uint8 _maxCommitteeSize) external /* onlyFunctionalManager */;

    /// Returns the maximum number of committee members
    /// @return maxCommitteeSize is the maximum number of committee members 
	function getMaxCommitteeSize() external view returns (uint8);
	
    /// Imports the committee members from a previous committee contract during migration
    /// @dev initialization function called only by the initializationManager
    /// @dev does not update the reward contract to avoid incorrect notifications 
    /// @param previousCommitteeContract is the address of the previous committee contract
	function importMembers(ICommittee previousCommitteeContract) external /* onlyInitializationAdmin */;
}

// File: contracts/spec_interfaces/ICertification.sol

pragma solidity 0.6.12;

/// @title Certification contract interface
interface ICertification /* is Ownable */ {
	event GuardianCertificationUpdate(address indexed guardian, bool isCertified);

	/*
     * External methods
     */

    /// Returns the certification status of a guardian
    /// @param guardian is the guardian to query
	function isGuardianCertified(address guardian) external view returns (bool isCertified);

    /// Sets the guardian certification status
    /// @dev governance function called only by the certification manager
    /// @param guardian is the guardian to update
    /// @param isCertified bool indication whether the guardian is certified
	function setGuardianCertification(address guardian, bool isCertified) external /* onlyCertificationManager */ ;
}

// File: contracts/spec_interfaces/IManagedContract.sol

pragma solidity 0.6.12;

/// @title managed contract interface, used by the contracts registry to notify the contract on updates
interface IManagedContract /* is ILockable, IContractRegistryAccessor, Initializable */ {

    /// Refreshes the address of the other contracts the contract interacts with
    /// @dev called by the registry contract upon an update of a contract in the registry
    function refreshContracts() external;

}

// File: contracts/spec_interfaces/IContractRegistry.sol

pragma solidity 0.6.12;

/// @title Contract registry contract interface
/// @dev The contract registry holds Orbs PoS contracts and managers lists
/// @dev The contract registry updates the managed contracts on changes in the contract list
/// @dev Governance functions restricted to managers access the registry to retrieve the manager address 
/// @dev The contract registry represents the source of truth for Orbs Ethereum contracts 
/// @dev By tracking the registry events or query before interaction, one can access the up to date contracts 
interface IContractRegistry {

	event ContractAddressUpdated(string contractName, address addr, bool managedContract);
	event ManagerChanged(string role, address newManager);
	event ContractRegistryUpdated(address newContractRegistry);

	/*
	* External functions
	*/

    /// Updates the contracts address and emits a corresponding event
    /// @dev governance function called only by the migrationManager or registryAdmin
    /// @param contractName is the contract name, used to identify it
    /// @param addr is the contract updated address
    /// @param managedContract indicates whether the contract is managed by the registry and notified on changes
	function setContract(string calldata contractName, address addr, bool managedContract) external /* onlyAdminOrMigrationManager */;

    /// Returns the current address of the given contracts
    /// @param contractName is the contract name, used to identify it
    /// @return addr is the contract updated address
	function getContract(string calldata contractName) external view returns (address);

    /// Returns the list of contract addresses managed by the registry
    /// @dev Managed contracts are updated on changes in the registry contracts addresses 
    /// @return addrs is the list of managed contracts
	function getManagedContracts() external view returns (address[] memory);

    /// Locks all the managed contracts 
    /// @dev governance function called only by the migrationManager or registryAdmin
    /// @dev When set all onlyWhenActive functions will revert
	function lockContracts() external /* onlyAdminOrMigrationManager */;

    /// Unlocks all the managed contracts 
    /// @dev governance function called only by the migrationManager or registryAdmin
	function unlockContracts() external /* onlyAdminOrMigrationManager */;
	
    /// Updates a manager address and emits a corresponding event
    /// @dev governance function called only by the registryAdmin
    /// @dev the managers list is a flexible list of role to the manager's address
    /// @param role is the managers' role name, for example "functionalManager"
    /// @param manager is the manager updated address
	function setManager(string calldata role, address manager) external /* onlyAdmin */;

    /// Returns the current address of the given manager
    /// @param role is the manager name, used to identify it
    /// @return addr is the manager updated address
	function getManager(string calldata role) external view returns (address);

    /// Sets a new contract registry to migrate to
    /// @dev governance function called only by the registryAdmin
    /// @dev updates the registry address record in all the managed contracts
    /// @dev by tracking the emitted ContractRegistryUpdated, tools can track the up to date contracts
    /// @param newRegistry is the new registry contract 
	function setNewContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */;

    /// Returns the previous contract registry address 
    /// @dev used when the setting the contract as a new registry to assure a valid registry
    /// @return previousContractRegistry is the previous contract registry
	function getPreviousContractRegistry() external view returns (address);
}

// File: contracts/spec_interfaces/IContractRegistryAccessor.sol

pragma solidity 0.6.12;


interface IContractRegistryAccessor {

    /// Sets the contract registry address
    /// @dev governance function called only by an admin
    /// @param newRegistry is the new registry contract 
    function setContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */;

    /// Returns the contract registry address
    /// @return contractRegistry is the contract registry address
    function getContractRegistry() external view returns (IContractRegistry contractRegistry);

    function setRegistryAdmin(address _registryAdmin) external /* onlyInitializationAdmin */;

}

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: contracts/WithClaimableRegistryManagement.sol

pragma solidity 0.6.12;


/**
 * @title Claimable
 * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract WithClaimableRegistryManagement is Context {
    address private _registryAdmin;
    address private _pendingRegistryAdmin;

    event RegistryManagementTransferred(address indexed previousRegistryAdmin, address indexed newRegistryAdmin);

    /**
     * @dev Initializes the contract setting the deployer as the initial registryRegistryAdmin.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _registryAdmin = msgSender;
        emit RegistryManagementTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current registryAdmin.
     */
    function registryAdmin() public view returns (address) {
        return _registryAdmin;
    }

    /**
     * @dev Throws if called by any account other than the registryAdmin.
     */
    modifier onlyRegistryAdmin() {
        require(isRegistryAdmin(), "WithClaimableRegistryManagement: caller is not the registryAdmin");
        _;
    }

    /**
     * @dev Returns true if the caller is the current registryAdmin.
     */
    function isRegistryAdmin() public view returns (bool) {
        return _msgSender() == _registryAdmin;
    }

    /**
     * @dev Leaves the contract without registryAdmin. It will not be possible to call
     * `onlyManager` functions anymore. Can only be called by the current registryAdmin.
     *
     * NOTE: Renouncing registryManagement will leave the contract without an registryAdmin,
     * thereby removing any functionality that is only available to the registryAdmin.
     */
    function renounceRegistryManagement() public onlyRegistryAdmin {
        emit RegistryManagementTransferred(_registryAdmin, address(0));
        _registryAdmin = address(0);
    }

    /**
     * @dev Transfers registryManagement of the contract to a new account (`newManager`).
     */
    function _transferRegistryManagement(address newRegistryAdmin) internal {
        require(newRegistryAdmin != address(0), "RegistryAdmin: new registryAdmin is the zero address");
        emit RegistryManagementTransferred(_registryAdmin, newRegistryAdmin);
        _registryAdmin = newRegistryAdmin;
    }

    /**
     * @dev Modifier throws if called by any account other than the pendingManager.
     */
    modifier onlyPendingRegistryAdmin() {
        require(msg.sender == _pendingRegistryAdmin, "Caller is not the pending registryAdmin");
        _;
    }
    /**
     * @dev Allows the current registryAdmin to set the pendingManager address.
     * @param newRegistryAdmin The address to transfer registryManagement to.
     */
    function transferRegistryManagement(address newRegistryAdmin) public onlyRegistryAdmin {
        _pendingRegistryAdmin = newRegistryAdmin;
    }

    /**
     * @dev Allows the _pendingRegistryAdmin address to finalize the transfer.
     */
    function claimRegistryManagement() external onlyPendingRegistryAdmin {
        _transferRegistryManagement(_pendingRegistryAdmin);
        _pendingRegistryAdmin = address(0);
    }

    /**
     * @dev Returns the current pendingRegistryAdmin
    */
    function pendingRegistryAdmin() public view returns (address) {
       return _pendingRegistryAdmin;  
    }
}

// File: contracts/Initializable.sol

pragma solidity 0.6.12;

contract Initializable {

    address private _initializationAdmin;

    event InitializationComplete();

    /// Constructor
    /// Sets the initializationAdmin to the contract deployer
    /// The initialization admin may call any manager only function until initializationComplete
    constructor() public{
        _initializationAdmin = msg.sender;
    }

    modifier onlyInitializationAdmin() {
        require(msg.sender == initializationAdmin(), "sender is not the initialization admin");

        _;
    }

    /*
    * External functions
    */

    /// Returns the initializationAdmin address
    function initializationAdmin() public view returns (address) {
        return _initializationAdmin;
    }

    /// Finalizes the initialization and revokes the initializationAdmin role 
    function initializationComplete() external onlyInitializationAdmin {
        _initializationAdmin = address(0);
        emit InitializationComplete();
    }

    /// Checks if the initialization was completed
    function isInitializationComplete() public view returns (bool) {
        return _initializationAdmin == address(0);
    }

}

// File: contracts/ContractRegistryAccessor.sol

pragma solidity 0.6.12;





contract ContractRegistryAccessor is IContractRegistryAccessor, WithClaimableRegistryManagement, Initializable {

    IContractRegistry private contractRegistry;

    /// Constructor
    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    constructor(IContractRegistry _contractRegistry, address _registryAdmin) public {
        require(address(_contractRegistry) != address(0), "_contractRegistry cannot be 0");
        setContractRegistry(_contractRegistry);
        _transferRegistryManagement(_registryAdmin);
    }

    modifier onlyAdmin {
        require(isAdmin(), "sender is not an admin (registryManger or initializationAdmin)");

        _;
    }

    modifier onlyMigrationManager {
        require(isMigrationManager(), "sender is not the migration manager");

        _;
    }

    modifier onlyFunctionalManager {
        require(isFunctionalManager(), "sender is not the functional manager");

        _;
    }

    /// Checks whether the caller is Admin: either the contract registry, the registry admin, or the initialization admin
    function isAdmin() internal view returns (bool) {
        return msg.sender == address(contractRegistry) || msg.sender == registryAdmin() || msg.sender == initializationAdmin();
    }

    /// Checks whether the caller is a specific manager role or and Admin
    /// @dev queries the registry contract for the up to date manager assignment
    function isManager(string memory role) internal view returns (bool) {
        IContractRegistry _contractRegistry = contractRegistry;
        return isAdmin() || _contractRegistry != IContractRegistry(0) && contractRegistry.getManager(role) == msg.sender;
    }

    /// Checks whether the caller is the migration manager
    function isMigrationManager() internal view returns (bool) {
        return isManager('migrationManager');
    }

    /// Checks whether the caller is the functional manager
    function isFunctionalManager() internal view returns (bool) {
        return isManager('functionalManager');
    }

    /* 
     * Contract getters, return the address of a contract by calling the contract registry 
     */ 

    function getProtocolContract() internal view returns (address) {
        return contractRegistry.getContract("protocol");
    }

    function getStakingRewardsContract() internal view returns (address) {
        return contractRegistry.getContract("stakingRewards");
    }

    function getFeesAndBootstrapRewardsContract() internal view returns (address) {
        return contractRegistry.getContract("feesAndBootstrapRewards");
    }

    function getCommitteeContract() internal view returns (address) {
        return contractRegistry.getContract("committee");
    }

    function getElectionsContract() internal view returns (address) {
        return contractRegistry.getContract("elections");
    }

    function getDelegationsContract() internal view returns (address) {
        return contractRegistry.getContract("delegations");
    }

    function getGuardiansRegistrationContract() internal view returns (address) {
        return contractRegistry.getContract("guardiansRegistration");
    }

    function getCertificationContract() internal view returns (address) {
        return contractRegistry.getContract("certification");
    }

    function getStakingContract() internal view returns (address) {
        return contractRegistry.getContract("staking");
    }

    function getSubscriptionsContract() internal view returns (address) {
        return contractRegistry.getContract("subscriptions");
    }

    function getStakingRewardsWallet() internal view returns (address) {
        return contractRegistry.getContract("stakingRewardsWallet");
    }

    function getBootstrapRewardsWallet() internal view returns (address) {
        return contractRegistry.getContract("bootstrapRewardsWallet");
    }

    function getGeneralFeesWallet() internal view returns (address) {
        return contractRegistry.getContract("generalFeesWallet");
    }

    function getCertifiedFeesWallet() internal view returns (address) {
        return contractRegistry.getContract("certifiedFeesWallet");
    }

    function getStakingContractHandler() internal view returns (address) {
        return contractRegistry.getContract("stakingContractHandler");
    }

    /*
    * Governance functions
    */

    event ContractRegistryAddressUpdated(address addr);

    /// Sets the contract registry address
    /// @dev governance function called only by an admin
    /// @param newContractRegistry is the new registry contract 
    function setContractRegistry(IContractRegistry newContractRegistry) public override onlyAdmin {
        require(newContractRegistry.getPreviousContractRegistry() == address(contractRegistry), "new contract registry must provide the previous contract registry");
        contractRegistry = newContractRegistry;
        emit ContractRegistryAddressUpdated(address(newContractRegistry));
    }

    /// Returns the contract registry that the contract is set to use
    /// @return contractRegistry is the registry contract address
    function getContractRegistry() public override view returns (IContractRegistry) {
        return contractRegistry;
    }

    function setRegistryAdmin(address _registryAdmin) external override onlyInitializationAdmin {
        _transferRegistryManagement(_registryAdmin);
    }

}

// File: contracts/spec_interfaces/ILockable.sol

pragma solidity 0.6.12;

/// @title lockable contract interface, allows to lock a contract
interface ILockable {

    event Locked();
    event Unlocked();

    /// Locks the contract to external non-governance function calls
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon locking all managed contracts
    /// @dev getters and migration functions remain active also for locked contracts
    /// @dev checked by the onlyWhenActive modifier
    function lock() external /* onlyMigrationManager */;

    /// Unlocks the contract 
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon unlocking all managed contracts
    function unlock() external /* onlyMigrationManager */;

    /// Returns the contract locking status
    /// @return isLocked is a bool indicating the contract is locked 
    function isLocked() view external returns (bool);

}

// File: contracts/Lockable.sol

pragma solidity 0.6.12;



/// @title lockable contract
contract Lockable is ILockable, ContractRegistryAccessor {

    bool public locked;

    /// Constructor
    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    constructor(IContractRegistry _contractRegistry, address _registryAdmin) ContractRegistryAccessor(_contractRegistry, _registryAdmin) public {}

    /// Locks the contract to external non-governance function calls
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon locking all managed contracts
    /// @dev getters and migration functions remain active also for locked contracts
    /// @dev checked by the onlyWhenActive modifier
    function lock() external override onlyMigrationManager {
        locked = true;
        emit Locked();
    }

    /// Unlocks the contract 
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon unlocking all managed contracts
    function unlock() external override onlyMigrationManager {
        locked = false;
        emit Unlocked();
    }

    /// Returns the contract locking status
    /// @return isLocked is a bool indicating the contract is locked 
    function isLocked() external override view returns (bool) {
        return locked;
    }

    modifier onlyWhenActive() {
        require(!locked, "contract is locked for this operation");

        _;
    }
}

// File: contracts/ManagedContract.sol

pragma solidity 0.6.12;



/// @title managed contract
contract ManagedContract is IManagedContract, Lockable {

    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    constructor(IContractRegistry _contractRegistry, address _registryAdmin) Lockable(_contractRegistry, _registryAdmin) public {}

    /// Refreshes the address of the other contracts the contract interacts with
    /// @dev called by the registry contract upon an update of a contract in the registry
    function refreshContracts() virtual override external {}

}

// File: contracts/Elections.sol

pragma solidity 0.6.12;








/// @title Elections contract
contract Elections is IElections, ManagedContract {
	using SafeMath for uint256;

	uint32 constant PERCENT_MILLIE_BASE = 100000;

	mapping(address => mapping(address => uint256)) voteUnreadyVotes; // by => to => expiration
	mapping(address => uint256) public votersStake;
	mapping(address => address) voteOutVotes; // by => to
	mapping(address => uint256) accumulatedStakesForVoteOut; // addr => total stake
	mapping(address => bool) votedOutGuardians;

	struct Settings {
		uint32 minSelfStakePercentMille;
		uint32 voteUnreadyPercentMilleThreshold;
		uint32 voteOutPercentMilleThreshold;
	}
	Settings settings;

    /// Constructor
    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    /// @param minSelfStakePercentMille is the minimum self stake in percent-mille (0-100,000) 
    /// @param voteUnreadyPercentMilleThreshold is the minimum vote-unready threshold in percent-mille (0-100,000)
    /// @param voteOutPercentMilleThreshold is the minimum vote-out threshold in percent-mille (0-100,000)
	constructor(IContractRegistry _contractRegistry, address _registryAdmin, uint32 minSelfStakePercentMille, uint32 voteUnreadyPercentMilleThreshold, uint32 voteOutPercentMilleThreshold) ManagedContract(_contractRegistry, _registryAdmin) public {
		setMinSelfStakePercentMille(minSelfStakePercentMille);
		setVoteOutPercentMilleThreshold(voteOutPercentMilleThreshold);
		setVoteUnreadyPercentMilleThreshold(voteUnreadyPercentMilleThreshold);
	}

	modifier onlyDelegationsContract() {
		require(msg.sender == address(delegationsContract), "caller is not the delegations contract");

		_;
	}

	modifier onlyGuardiansRegistrationContract() {
		require(msg.sender == address(guardianRegistrationContract), "caller is not the guardian registrations contract");

		_;
	}

	modifier onlyCertificationContract() {
		require(msg.sender == address(certificationContract), "caller is not the certification contract");

		_;
	}

	/*
	 * External functions
	 */

    /// Notifies that the guardian is ready to sync with other nodes
    /// @dev ready to sync state is not managed in the contract that only emits an event
    /// @dev readyToSync clears the readyForCommittee state
	function readyToSync() external override onlyWhenActive {
		address guardian = guardianRegistrationContract.resolveGuardianAddress(msg.sender); // this validates registration
		require(!isVotedOut(guardian), "caller is voted-out");

		emit GuardianStatusUpdated(guardian, true, false);

		committeeContract.removeMember(guardian);
	}

    /// Notifies that the guardian is ready to join the committee
    /// @dev a qualified guardian calling readyForCommittee is added to the committee
	function readyForCommittee() external override onlyWhenActive {
		_readyForCommittee(msg.sender);
	}

    /// Checks if a guardian is qualified to join the committee
    /// @dev when true, calling readyForCommittee() will result in adding the guardian to the committee
    /// @dev called periodically by guardians to check if they are qualified to join the committee
    /// @param guardian is the guardian to check
    /// @return canJoin indicating that the guardian can join the current committee
	function canJoinCommittee(address guardian) external view override returns (bool) {
		guardian = guardianRegistrationContract.resolveGuardianAddress(guardian); // this validates registration

		if (isVotedOut(guardian)) {
			return false;
		}

		uint256 effectiveStake = getGuardianEffectiveStake(guardian, settings);
		return committeeContract.checkAddMember(guardian, effectiveStake);
	}

    /// Returns an address effective stake
    /// The effective stake is derived from a guardian delegate stake and selfs stake  
    /// @return effectiveStake is the guardian's effective stake
	function getEffectiveStake(address guardian) external override view returns (uint effectiveStake) {
		return getGuardianEffectiveStake(guardian, settings);
	}

    /// Returns the current committee along with the guardians' Orbs address and IP
    /// @return committee is a list of the committee members' guardian addresses
    /// @return weights is a list of the committee members' weight (effective stake)
    /// @return orbsAddrs is a list of the committee members' orbs address
    /// @return certification is a list of bool indicating the committee members certification
    /// @return ips is a list of the committee members' ip
	function getCommittee() external override view returns (address[] memory committee, uint256[] memory weights, address[] memory orbsAddrs, bool[] memory certification, bytes4[] memory ips) {
		IGuardiansRegistration _guardianRegistrationContract = guardianRegistrationContract;
		(committee, weights, certification) = committeeContract.getCommittee();
		orbsAddrs = _guardianRegistrationContract.getGuardiansOrbsAddress(committee);
		ips = _guardianRegistrationContract.getGuardianIps(committee);
	}

	// Vote-unready

    /// Casts an unready vote on a subject guardian
    /// @dev Called by a guardian as part of the automatic vote-unready flow
    /// @dev The transaction may be sent from the guardian or orbs address.
    /// @param subject is the subject guardian to vote out
    /// @param voteExpiration is the expiration time of the vote unready to prevent counting of a vote that is already irrelevant.
	function voteUnready(address subject, uint voteExpiration) external override onlyWhenActive {
		require(voteExpiration >= block.timestamp, "vote expiration time must not be in the past");

		address voter = guardianRegistrationContract.resolveGuardianAddress(msg.sender);
		voteUnreadyVotes[voter][subject] = voteExpiration;
		emit VoteUnreadyCasted(voter, subject, voteExpiration);

		(address[] memory generalCommittee, uint256[] memory generalWeights, bool[] memory certification) = committeeContract.getCommittee();

		bool votedUnready = isCommitteeVoteUnreadyThresholdReached(generalCommittee, generalWeights, certification, subject);
		if (votedUnready) {
			clearCommitteeUnreadyVotes(generalCommittee, subject);
			emit GuardianVotedUnready(subject);

			emit GuardianStatusUpdated(subject, false, false);
			committeeContract.removeMember(subject);
		}
	}

    /// Returns the current vote unready vote for a voter and a subject pair
    /// @param voter is the voting guardian address
    /// @param subject is the subject guardian address
    /// @return valid indicates whether there is a valid vote
    /// @return expiration returns the votes expiration time
	function getVoteUnreadyVote(address voter, address subject) public override view returns (bool valid, uint256 expiration) {
		expiration = voteUnreadyVotes[voter][subject];
		valid = expiration != 0 && block.timestamp < expiration;
	}

    /// Returns the current vote-unready status of a subject guardian.
    /// @dev the committee and certification data is used to check the certified and committee threshold
    /// @param subject is the subject guardian address
    /// @return committee is a list of the current committee members
    /// @return weights is a list of the current committee members weight
    /// @return certification is a list of bool indicating the committee members certification
    /// @return votes is a list of bool indicating the members that votes the subject unready
    /// @return subjectInCommittee indicates that the subject is in the committee
    /// @return subjectInCertifiedCommittee indicates that the subject is in the certified committee
	function getVoteUnreadyStatus(address subject) external override view returns (address[] memory committee, uint256[] memory weights, bool[] memory certification, bool[] memory votes, bool subjectInCommittee, bool subjectInCertifiedCommittee) {
		(committee, weights, certification) = committeeContract.getCommittee();

		votes = new bool[](committee.length);
		for (uint i = 0; i < committee.length; i++) {
			address memberAddr = committee[i];
			if (block.timestamp < voteUnreadyVotes[memberAddr][subject]) {
				votes[i] = true;
			}

			if (memberAddr == subject) {
				subjectInCommittee = true;
				subjectInCertifiedCommittee = certification[i];
			}
		}
	}

	// Vote-out

    /// Casts a voteOut vote by the sender to the given address
    /// @dev the transaction is sent from the guardian address
    /// @param subject is the subject guardian address
	function voteOut(address subject) external override onlyWhenActive {
		Settings memory _settings = settings;

		address voter = msg.sender;
		address prevSubject = voteOutVotes[voter];

		voteOutVotes[voter] = subject;
		emit VoteOutCasted(voter, subject);

		uint256 voterStake = delegationsContract.getDelegatedStake(voter);

		if (prevSubject == address(0)) {
			votersStake[voter] = voterStake;
		}

		if (subject == address(0)) {
			delete votersStake[voter];
		}

		uint totalStake = delegationsContract.getTotalDelegatedStake();

		if (prevSubject != address(0) && prevSubject != subject) {
			applyVoteOutVotesFor(prevSubject, 0, voterStake, totalStake, _settings);
		}

		if (subject != address(0)) {
			uint voteStakeAdded = prevSubject != subject ? voterStake : 0;
			applyVoteOutVotesFor(subject, voteStakeAdded, 0, totalStake, _settings); // recheck also if not new
		}
	}

    /// Returns the subject address the addr has voted-out against
    /// @param voter is the voting guardian address
    /// @return subject is the subject the voter has voted out
	function getVoteOutVote(address voter) external override view returns (address) {
		return voteOutVotes[voter];
	}

    /// Returns the governance voteOut status of a guardian.
    /// @dev A guardian is voted out if votedStake / totalDelegatedStake (in percent mille) > threshold
    /// @param subject is the subject guardian address
    /// @return votedOut indicates whether the subject was voted out
    /// @return votedStake is the total stake voting against the subject
    /// @return totalDelegatedStake is the total delegated stake
	function getVoteOutStatus(address subject) external override view returns (bool votedOut, uint votedStake, uint totalDelegatedStake) {
		votedOut = isVotedOut(subject);
		votedStake = accumulatedStakesForVoteOut[subject];
		totalDelegatedStake = delegationsContract.getTotalDelegatedStake();
	}

	/*
	 * Notification functions from other PoS contracts
	 */

    /// Notifies a delegated stake change event
    /// @dev Called by: delegation contract
    /// @param delegate is the delegate to update
    /// @param selfDelegatedStake is the delegate self stake (0 if not self-delegating)
    /// @param delegatedStake is the delegate delegated stake (0 if not self-delegating)
    /// @param totalDelegatedStake is the total delegated stake
	function delegatedStakeChange(address delegate, uint256 selfDelegatedStake, uint256 delegatedStake, uint256 totalDelegatedStake) external override onlyDelegationsContract onlyWhenActive {
		Settings memory _settings = settings;

		uint effectiveStake = calcEffectiveStake(selfDelegatedStake, delegatedStake, _settings);
		emit StakeChanged(delegate, selfDelegatedStake, delegatedStake, effectiveStake);

		committeeContract.memberWeightChange(delegate, effectiveStake);

		applyStakesToVoteOutBy(delegate, delegatedStake, totalDelegatedStake, _settings);
	}

    /// Notifies a new guardian was unregistered
    /// @dev Called by: guardian registration contract
    /// @dev when a guardian unregisters its status is updated to not ready to sync and is removed from the committee
    /// @param guardian is the address of the guardian that unregistered
	function guardianUnregistered(address guardian) external override onlyGuardiansRegistrationContract onlyWhenActive {
		emit GuardianStatusUpdated(guardian, false, false);
		committeeContract.removeMember(guardian);
	}

    /// Notifies on a guardian certification change
    /// @dev Called by: guardian registration contract
    /// @param guardian is the address of the guardian to update
    /// @param isCertified indicates whether the guardian is certified
	function guardianCertificationChanged(address guardian, bool isCertified) external override onlyCertificationContract onlyWhenActive {
		committeeContract.memberCertificationChange(guardian, isCertified);
	}

	/*
     * Governance functions
	 */

    /// Sets the minimum self stake requirement for the effective stake
    /// @dev governance function called only by the functional manager
    /// @param minSelfStakePercentMille is the minimum self stake in percent-mille (0-100,000) 
	function setMinSelfStakePercentMille(uint32 minSelfStakePercentMille) public override onlyFunctionalManager {
		require(minSelfStakePercentMille <= PERCENT_MILLIE_BASE, "minSelfStakePercentMille must be 100000 at most");
		emit MinSelfStakePercentMilleChanged(minSelfStakePercentMille, settings.minSelfStakePercentMille);
		settings.minSelfStakePercentMille = minSelfStakePercentMille;
	}

    /// Returns the minimum self-stake required for the effective stake
    /// @return minSelfStakePercentMille is the minimum self stake in percent-mille 
	function getMinSelfStakePercentMille() external override view returns (uint32) {
		return settings.minSelfStakePercentMille;
	}

    /// Sets the vote-out threshold
    /// @dev governance function called only by the functional manager
    /// @param voteOutPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000)
	function setVoteOutPercentMilleThreshold(uint32 voteOutPercentMilleThreshold) public override onlyFunctionalManager {
		require(voteOutPercentMilleThreshold <= PERCENT_MILLIE_BASE, "voteOutPercentMilleThreshold must not be larger than 100000");
		emit VoteOutPercentMilleThresholdChanged(voteOutPercentMilleThreshold, settings.voteOutPercentMilleThreshold);
		settings.voteOutPercentMilleThreshold = voteOutPercentMilleThreshold;
	}

    /// Returns the vote-out threshold
    /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille
	function getVoteOutPercentMilleThreshold() external override view returns (uint32) {
		return settings.voteOutPercentMilleThreshold;
	}

    /// Sets the vote-unready threshold
    /// @dev governance function called only by the functional manager
    /// @param voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille (0-100,000)
	function setVoteUnreadyPercentMilleThreshold(uint32 voteUnreadyPercentMilleThreshold) public override onlyFunctionalManager {
		require(voteUnreadyPercentMilleThreshold <= PERCENT_MILLIE_BASE, "voteUnreadyPercentMilleThreshold must not be larger than 100000");
		emit VoteUnreadyPercentMilleThresholdChanged(voteUnreadyPercentMilleThreshold, settings.voteUnreadyPercentMilleThreshold);
		settings.voteUnreadyPercentMilleThreshold = voteUnreadyPercentMilleThreshold;
	}

    /// Returns the vote-unready threshold
    /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille
	function getVoteUnreadyPercentMilleThreshold() external override view returns (uint32) {
		return settings.voteUnreadyPercentMilleThreshold;
	}

    /// Returns the contract's settings 
    /// @return minSelfStakePercentMille is the minimum self stake in percent-mille
    /// @return voteUnreadyPercentMilleThreshold is the minimum threshold in percent-mille
    /// @return voteOutPercentMilleThreshold is the minimum threshold in percent-mille
	function getSettings() external override view returns (
		uint32 minSelfStakePercentMille,
		uint32 voteUnreadyPercentMilleThreshold,
		uint32 voteOutPercentMilleThreshold
	) {
		Settings memory _settings = settings;
		minSelfStakePercentMille = _settings.minSelfStakePercentMille;
		voteUnreadyPercentMilleThreshold = _settings.voteUnreadyPercentMilleThreshold;
		voteOutPercentMilleThreshold = _settings.voteOutPercentMilleThreshold;
	}

    /// Initializes the ready for committee notification for the committee guardians
    /// @dev governance function called only by the initialization admin during migration 
    /// @dev identical behaviour as if each guardian sent readyForCommittee() 
    /// @param guardians a list of guardians addresses to update
	function initReadyForCommittee(address[] calldata guardians) external override onlyInitializationAdmin {
		for (uint i = 0; i < guardians.length; i++) {
			_readyForCommittee(guardians[i]);
		}
	}

	/*
     * Private functions
	 */


    /// Handles a readyForCommittee notification
    /// @dev may be called with either the guardian address or the guardian's orbs address
    /// @dev notifies the committee contract that will add the guardian if qualified
    /// @param guardian is the guardian ready for committee
	function _readyForCommittee(address guardian) private {
		guardian = guardianRegistrationContract.resolveGuardianAddress(guardian); // this validates registration
		require(!isVotedOut(guardian), "caller is voted-out");

		emit GuardianStatusUpdated(guardian, true, true);

		uint256 effectiveStake = getGuardianEffectiveStake(guardian, settings);
		committeeContract.addMember(guardian, effectiveStake, certificationContract.isGuardianCertified(guardian));
	}

    /// Calculates a guardian effective stake based on its self-stake and delegated stake
	function calcEffectiveStake(uint256 selfStake, uint256 delegatedStake, Settings memory _settings) private pure returns (uint256) {
		if (selfStake.mul(PERCENT_MILLIE_BASE) >= delegatedStake.mul(_settings.minSelfStakePercentMille)) {
			return delegatedStake;
		}
		return selfStake.mul(PERCENT_MILLIE_BASE).div(_settings.minSelfStakePercentMille); // never overflows or divides by zero
	}

    /// Returns the effective state of a guardian 
    /// @dev calls the delegation contract to retrieve the guardian current stake and delegated stake
    /// @param guardian is the guardian to query
    /// @param _settings is the contract settings struct
    /// @return effectiveStake is the guardian's effective stake
	function getGuardianEffectiveStake(address guardian, Settings memory _settings) private view returns (uint256 effectiveStake) {
		IDelegations _delegationsContract = delegationsContract;
		(,uint256 selfStake) = _delegationsContract.getDelegationInfo(guardian);
		uint256 delegatedStake = _delegationsContract.getDelegatedStake(guardian);
		return calcEffectiveStake(selfStake, delegatedStake, _settings);
	}

	// Vote-unready

    /// Checks if the vote unready threshold was reached for a given subject
    /// @dev a subject is voted-unready if either it reaches the threshold in the general committee or a certified subject reaches the threshold in the certified committee
    /// @param committee is a list of the current committee members
    /// @param weights is a list of the current committee members weight
    /// @param certification is a list of bool indicating the committee members certification
    /// @param subject is the subject guardian address
    /// @return thresholdReached is a bool indicating that the threshold was reached
	function isCommitteeVoteUnreadyThresholdReached(address[] memory committee, uint256[] memory weights, bool[] memory certification, address subject) private returns (bool) {
		Settings memory _settings = settings;

		uint256 totalCommitteeStake = 0;
		uint256 totalVoteUnreadyStake = 0;
		uint256 totalCertifiedStake = 0;
		uint256 totalCertifiedVoteUnreadyStake = 0;

		address member;
		uint256 memberStake;
		bool isSubjectCertified;
		for (uint i = 0; i < committee.length; i++) {
			member = committee[i];
			memberStake = weights[i];

			if (member == subject && certification[i]) {
				isSubjectCertified = true;
			}

			totalCommitteeStake = totalCommitteeStake.add(memberStake);
			if (certification[i]) {
				totalCertifiedStake = totalCertifiedStake.add(memberStake);
			}

			(bool valid, uint256 expiration) = getVoteUnreadyVote(member, subject);
			if (valid) {
				totalVoteUnreadyStake = totalVoteUnreadyStake.add(memberStake);
				if (certification[i]) {
					totalCertifiedVoteUnreadyStake = totalCertifiedVoteUnreadyStake.add(memberStake);
				}
			} else if (expiration != 0) {
				// Vote is stale, delete from state
				delete voteUnreadyVotes[member][subject];
			}
		}

		return (
			totalCommitteeStake > 0 &&
			totalVoteUnreadyStake.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteUnreadyPercentMilleThreshold).mul(totalCommitteeStake)
		) || (
			isSubjectCertified &&
			totalCertifiedStake > 0 &&
			totalCertifiedVoteUnreadyStake.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteUnreadyPercentMilleThreshold).mul(totalCertifiedStake)
		);
	}

    /// Clears the committee members vote-unready state upon declaring a guardian unready
    /// @param committee is a list of the current committee members
    /// @param subject is the subject guardian address
	function clearCommitteeUnreadyVotes(address[] memory committee, address subject) private {
		for (uint i = 0; i < committee.length; i++) {
			voteUnreadyVotes[committee[i]][subject] = 0; // clear vote-outs
		}
	}

	// Vote-out

    /// Updates the vote-out state upon a stake change notification
    /// @param voter is the voter address
    /// @param currentVoterStake is the voter delegated stake
    /// @param totalDelegatedStake is the total delegated stake
    /// @param _settings is the contract settings struct
	function applyStakesToVoteOutBy(address voter, uint256 currentVoterStake, uint256 totalDelegatedStake, Settings memory _settings) private {
		address subject = voteOutVotes[voter];
		if (subject == address(0)) return;

		uint256 prevVoterStake = votersStake[voter];
		votersStake[voter] = currentVoterStake;

		applyVoteOutVotesFor(subject, currentVoterStake, prevVoterStake, totalDelegatedStake, _settings);
	}

    /// Applies updates in a vote-out subject state and checks whether its threshold was reached
    /// @param subject is the vote-out subject
    /// @param voteOutStakeAdded is the added votes against the subject
    /// @param voteOutStakeRemoved is the removed votes against the subject
    /// @param totalDelegatedStake is the total delegated stake used to check the vote-out threshold
    /// @param _settings is the contract settings struct
    function applyVoteOutVotesFor(address subject, uint256 voteOutStakeAdded, uint256 voteOutStakeRemoved, uint256 totalDelegatedStake, Settings memory _settings) private {
		if (isVotedOut(subject)) {
			return;
		}

		uint256 accumulated = accumulatedStakesForVoteOut[subject].
			sub(voteOutStakeRemoved).
			add(voteOutStakeAdded);

		bool shouldBeVotedOut = totalDelegatedStake > 0 && accumulated.mul(PERCENT_MILLIE_BASE) >= uint256(_settings.voteOutPercentMilleThreshold).mul(totalDelegatedStake);
		if (shouldBeVotedOut) {
			votedOutGuardians[subject] = true;
			emit GuardianVotedOut(subject);

			emit GuardianStatusUpdated(subject, false, false);
			committeeContract.removeMember(subject);
		}

		accumulatedStakesForVoteOut[subject] = accumulated;
	}

    /// Checks whether a guardian was voted out
	function isVotedOut(address guardian) private view returns (bool) {
		return votedOutGuardians[guardian];
	}

	/*
     * Contracts topology / registry interface
     */

	ICommittee committeeContract;
	IDelegations delegationsContract;
	IGuardiansRegistration guardianRegistrationContract;
	ICertification certificationContract;

    /// Refreshes the address of the other contracts the contract interacts with
    /// @dev called by the registry contract upon an update of a contract in the registry
	function refreshContracts() external override {
		committeeContract = ICommittee(getCommitteeContract());
		delegationsContract = IDelegations(getDelegationsContract());
		guardianRegistrationContract = IGuardiansRegistration(getGuardiansRegistrationContract());
		certificationContract = ICertification(getCertificationContract());
	}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IContractRegistry","name":"_contractRegistry","type":"address"},{"internalType":"address","name":"_registryAdmin","type":"address"},{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"},{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"},{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ContractRegistryAddressUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"},{"indexed":false,"internalType":"bool","name":"readyToSync","type":"bool"},{"indexed":false,"internalType":"bool","name":"readyForCommittee","type":"bool"}],"name":"GuardianStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianVotedOut","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianVotedUnready","type":"event"},{"anonymous":false,"inputs":[],"name":"InitializationComplete","type":"event"},{"anonymous":false,"inputs":[],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"MinSelfStakePercentMilleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousRegistryAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"RegistryManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"selfDelegatedStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveStake","type":"uint256"}],"name":"StakeChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"subject","type":"address"}],"name":"VoteOutCasted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteOutPercentMilleThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":true,"internalType":"address","name":"subject","type":"address"},{"indexed":false,"internalType":"uint256","name":"expiration","type":"uint256"}],"name":"VoteUnreadyCasted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteUnreadyPercentMilleThresholdChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newValue","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"oldValue","type":"uint32"}],"name":"VoteUnreadyTimeoutSecondsChanged","type":"event"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"canJoinCommittee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegate","type":"address"},{"internalType":"uint256","name":"selfDelegatedStake","type":"uint256"},{"internalType":"uint256","name":"delegatedStake","type":"uint256"},{"internalType":"uint256","name":"totalDelegatedStake","type":"uint256"}],"name":"delegatedStakeChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCommittee","outputs":[{"internalType":"address[]","name":"committee","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"address[]","name":"orbsAddrs","type":"address[]"},{"internalType":"bool[]","name":"certification","type":"bool[]"},{"internalType":"bytes4[]","name":"ips","type":"bytes4[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractRegistry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"getEffectiveStake","outputs":[{"internalType":"uint256","name":"effectiveStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinSelfStakePercentMille","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSettings","outputs":[{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"},{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"},{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteOutPercentMilleThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteOutStatus","outputs":[{"internalType":"bool","name":"votedOut","type":"bool"},{"internalType":"uint256","name":"votedStake","type":"uint256"},{"internalType":"uint256","name":"totalDelegatedStake","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"}],"name":"getVoteOutVote","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteUnreadyPercentMilleThreshold","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteUnreadyStatus","outputs":[{"internalType":"address[]","name":"committee","type":"address[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"bool[]","name":"certification","type":"bool[]"},{"internalType":"bool[]","name":"votes","type":"bool[]"},{"internalType":"bool","name":"subjectInCommittee","type":"bool"},{"internalType":"bool","name":"subjectInCertifiedCommittee","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"voter","type":"address"},{"internalType":"address","name":"subject","type":"address"}],"name":"getVoteUnreadyVote","outputs":[{"internalType":"bool","name":"valid","type":"bool"},{"internalType":"uint256","name":"expiration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"},{"internalType":"bool","name":"isCertified","type":"bool"}],"name":"guardianCertificationChanged","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"guardianUnregistered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"guardians","type":"address[]"}],"name":"initReadyForCommittee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializationAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializationComplete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitializationComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRegistryAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRegistryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readyForCommittee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"readyToSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IContractRegistry","name":"newContractRegistry","type":"address"}],"name":"setContractRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"minSelfStakePercentMille","type":"uint32"}],"name":"setMinSelfStakePercentMille","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registryAdmin","type":"address"}],"name":"setRegistryAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"voteOutPercentMilleThreshold","type":"uint32"}],"name":"setVoteOutPercentMilleThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"voteUnreadyPercentMilleThreshold","type":"uint32"}],"name":"setVoteUnreadyPercentMilleThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"transferRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"}],"name":"voteOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"subject","type":"address"},{"internalType":"uint256","name":"voteExpiration","type":"uint256"}],"name":"voteUnready","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"votersStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162004e4538038062004e45833981810160405260a08110156200003757600080fd5b508051602082015160408301516060840151608090940151929391929091908484818181816000620000686200015d565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062004e25833981519152908290a350600280546001600160a01b031916331790556001600160a01b0382166200010f576040805162461bcd60e51b815260206004820152601d60248201527f5f636f6e747261637452656769737472792063616e6e6f742062652030000000604482015290519081900360640190fd5b6200011a8262000161565b6200012581620002b9565b5050505050506200013c836200034a60201b60201c565b62000147816200043c565b62000152826200054a565b50505050506200082c565b3390565b6200016b62000650565b620001a85760405162461bcd60e51b815260040180806020018281038252603e81526020018062004ca5603e913960400191505060405180910390fd5b600354604080516301e32edf60e21b815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015620001f057600080fd5b505afa15801562000205573d6000803e3d6000fd5b505050506040513d60208110156200021c57600080fd5b50516001600160a01b031614620002655760405162461bcd60e51b815260040180806020018281038252604181526020018062004ce36041913960600191505060405180910390fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b6001600160a01b038116620003005760405162461bcd60e51b815260040180806020018281038252603481526020018062004df16034913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062004e2583398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b62000354620006b2565b620003915760405162461bcd60e51b815260040180806020018281038252602481526020018062004d5f6024913960400191505060405180910390fd5b620186a063ffffffff82161115620003db5760405162461bcd60e51b815260040180806020018281038252602f81526020018062004dc2602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a16009805463ffffffff191663ffffffff92909216919091179055565b62000446620006b2565b620004835760405162461bcd60e51b815260040180806020018281038252602481526020018062004d5f6024913960400191505060405180910390fd5b620186a063ffffffff82161115620004cd5760405162461bcd60e51b815260040180806020018281038252603b81526020018062004d24603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff909216680100000000000000000263ffffffff60401b19909216919091179055565b62000554620006b2565b620005915760405162461bcd60e51b815260040180806020018281038252602481526020018062004d5f6024913960400191505060405180910390fd5b620186a063ffffffff82161115620005db5760405162461bcd60e51b815260040180806020018281038252603f81526020018062004d83603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff9092166401000000000263ffffffff60201b19909216919091179055565b6003546000906001600160a01b031633148062000687575062000672620006ee565b6001600160a01b0316336001600160a01b0316145b80620006ad575062000698620006fd565b6001600160a01b0316336001600160a01b0316145b905090565b6000620006ad60405180604001604052806011815260200170333ab731ba34b7b730b626b0b730b3b2b960791b8152506200070c60201b60201c565b6000546001600160a01b031690565b6002546001600160a01b031690565b6003546000906001600160a01b03166200072562000650565b806200082557506001600160a01b03811615801590620008255750600354604051631ee441e960e01b815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015620007a057818101518382015260200162000786565b50505050905090810190601f168015620007ce5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015620007ec57600080fd5b505afa15801562000801573d6000803e3d6000fd5b505050506040513d60208110156200081857600080fd5b50516001600160a01b0316145b9392505050565b614469806200083c6000396000f3fe608060405234801561001057600080fd5b50600436106102c85760003560e01c8063a4e2d6341161017b578063d3705cb7116100d8578063e7366dc81161008c578063f27f3bb411610071578063f27f3bb414610998578063f83d08ba146109be578063fcd13d65146109c6576102c8565b8063e7366dc814610962578063eec0701f14610990576102c8565b8063daa00faa116100bd578063daa00faa146108ee578063dfc8fdd014610934578063e4e992221461095a576102c8565b8063d3705cb7146108a5578063d55c9bcf146108c8576102c8565b8063bac5e9911161012f578063ca0809c811610114578063ca0809c814610825578063cf30901214610895578063d25235261461089d576102c8565b8063bac5e991146107d6578063c7af3a94146107f9576102c8565b8063ab8f6ffe11610160578063ab8f6ffe14610677578063acdb8e04146107c6578063b364cc38146107ce576102c8565b8063a4e2d63414610667578063a69df4b51461066f576102c8565b806348106fe31161022957806374c16b23116101dd578063868ca49d116101c2578063868ca49d146104e157806394470457146104e9578063a0774f7514610644576102c8565b806374c16b23146104a957806385b4bb53146104b1576102c8565b80635f94cd9c1161020e5780635f94cd9c14610443578063615c25451461044b57806361885df814610471576102c8565b806348106fe3146104335780634fa293c31461043b576102c8565b8063245dcad3116102805780632a1fac72116102655780632a1fac72146103e1578063333df154146103e957806339069d8c1461040d576102c8565b8063245dcad3146103b35780632987cea0146103bb576102c8565b8063090b7f1f116102b1578063090b7f1f1461032d5780631a0b2c4f146103765780631ee2960e14610392576102c8565b806302211f5e146102cd57806307b490af14610305575b600080fd5b6102f3600480360360208110156102e357600080fd5b50356001600160a01b03166109ec565b60408051918252519081900360200190f35b61032b6004803603602081101561031b57600080fd5b50356001600160a01b0316610a3d565b005b61035b6004803603604081101561034357600080fd5b506001600160a01b0381358116916020013516610d50565b60408051921515835260208301919091528051918290030190f35b61037e610d8f565b604080519115158252519081900360200190f35b61039a610db3565b6040805163ffffffff9092168252519081900360200190f35b61032b610dc7565b61032b600480360360208110156103d157600080fd5b50356001600160a01b0316610e2c565b61032b610ea9565b6103f1610f53565b604080516001600160a01b039092168252519081900360200190f35b61032b6004803603602081101561042357600080fd5b50356001600160a01b0316610f62565b61037e610fc5565b61039a610fd5565b6103f1610fed565b6103f16004803603602081101561046157600080fd5b50356001600160a01b0316610ffc565b61032b6004803603608081101561048757600080fd5b506001600160a01b03813516906020810135906040810135906060013561101a565b6103f16111ee565b6104b96111fd565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b61032b611255565b61050f600480360360208110156104ff57600080fd5b50356001600160a01b0316611477565b60405180806020018060200180602001806020018715158152602001861515815260200185810385528b818151815260200191508051906020019060200280838360005b8381101561056b578181015183820152602001610553565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b838110156105aa578181015183820152602001610592565b50505050905001858103835289818151815260200191508051906020019060200280838360005b838110156105e95781810151838201526020016105d1565b50505050905001858103825288818151815260200191508051906020019060200280838360005b83811015610628578181015183820152602001610610565b505050509050019a505050505050505050505060405180910390f35b61032b6004803603602081101561065a57600080fd5b503563ffffffff166117d3565b61037e6118eb565b61032b61190c565b61067f6119a2565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b838110156106cf5781810151838201526020016106b7565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b8381101561070e5781810151838201526020016106f6565b50505050905001868103845289818151815260200191508051906020019060200280838360005b8381101561074d578181015183820152602001610735565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561078c578181015183820152602001610774565b5050505091909101878103835288518152885160209182019250818a01910280838360008315610628578181015183820152602001610610565b61032b611f07565b61039a611fac565b61032b600480360360208110156107ec57600080fd5b503563ffffffff16611fb8565b61032b6004803603604081101561080f57600080fd5b506001600160a01b0381351690602001356120d8565b61032b6004803603602081101561083b57600080fd5b81019060208101813564010000000081111561085657600080fd5b82018360208201111561086857600080fd5b8035906020019184602083028401116401000000008311171561088a57600080fd5b5090925090506125e8565b61037e612676565b61032b612697565b61032b600480360360208110156108bb57600080fd5b503563ffffffff1661271f565b61032b600480360360208110156108de57600080fd5b50356001600160a01b0316612826565b6109146004803603602081101561090457600080fd5b50356001600160a01b0316612974565b604080519315158452602084019290925282820152519081900360600190f35b61037e6004803603602081101561094a57600080fd5b50356001600160a01b0316612a2b565b6103f1612bc4565b61032b6004803603604081101561097857600080fd5b506001600160a01b0381351690602001351515612bd3565b61032b612cf9565b6102f3600480360360208110156109ae57600080fd5b50356001600160a01b0316612dfb565b61032b612e0d565b61032b600480360360208110156109dc57600080fd5b50356001600160a01b0316612eba565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090610a3590839061303a565b90505b919050565b60035474010000000000000000000000000000000000000000900460ff1615610a975760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610a9f6140f2565b506040805160608101825260095463ffffffff808216835264010000000082048116602080850191909152680100000000000000009092041682840152336000818152600690925283822080546001600160a01b038781167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355955194959294921692909184917f275bb5f10bdccb6cea621dfabf75682103f2392a02061d953ebe212cfa26ef0e91a3600b54604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291516000939290921691637c47c16d91602480820192602092909190829003018186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d6020811015610be357600080fd5b505190506001600160a01b038216610c11576001600160a01b03831660009081526005602052604090208190555b6001600160a01b038516610c39576001600160a01b0383166000908152600560205260408120555b600b54604080517fcf3b670b00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cf3b670b916004808301926020929190829003018186803b158015610c9757600080fd5b505afa158015610cab573d6000803e3d6000fd5b505050506040513d6020811015610cc157600080fd5b505190506001600160a01b03831615801590610cef5750856001600160a01b0316836001600160a01b031614155b15610d0257610d02836000848489613181565b6001600160a01b03861615610d48576000866001600160a01b0316846001600160a01b03161415610d34576000610d36565b825b9050610d4687826000858a613181565b505b505050505050565b6001600160a01b0380831660009081526004602090815260408083209385168352929052908120548015801590610d8657508042105b91509250929050565b600080546001600160a01b0316610da4613367565b6001600160a01b031614905090565b600954640100000000900463ffffffff1690565b60035474010000000000000000000000000000000000000000900460ff1615610e215760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610e2a3361336b565b565b610e34610d8f565b610e6f5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610eb1610f53565b6001600160a01b0316336001600160a01b031614610f005760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b610f6a610f53565b6001600160a01b0316336001600160a01b031614610fb95760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b610fc281613628565b50565b6002546001600160a01b03161590565b60095468010000000000000000900463ffffffff1690565b6001546001600160a01b031690565b6001600160a01b039081166000908152600660205260409020541690565b600b546001600160a01b031633146110635760405162461bcd60e51b81526004018080602001828103825260268152602001806143466026913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156110bd5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b6110c56140f2565b506040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600061110e8585846136e0565b604080518781526020810187905280820183905290519192506001600160a01b038816917fd5c5ef58495d970aa497140d952854435af4876c07e0735daaa3fc32874c3cf89181900360600190a2600a54604080517f68f52e500000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201859052915191909216916368f52e5091604480830192600092919082900301818387803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b50505050610d4886858585613748565b6000546001600160a01b031690565b600080600061120a6140f2565b50506040805160608101825260095463ffffffff8082168084526401000000008304821660208501819052680100000000000000009093049091169290930182905291949193509150565b60035474010000000000000000000000000000000000000000900460ff16156112af5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b15801561131357600080fd5b505afa158015611327573d6000803e3d6000fd5b505050506040513d602081101561133d57600080fd5b5051905061134a81613799565b1561139c576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b60408051600181526000602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d606081101561147257600080fd5b505050565b606080606080600080600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156114ce57600080fd5b505afa1580156114e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561152957600080fd5b810190808051604051939291908464010000000082111561154957600080fd5b90830190602082018581111561155e57600080fd5b825186602082028301116401000000008211171561157b57600080fd5b82525081516020918201928201910280838360005b838110156115a8578181015183820152602001611590565b50505050905001604052602001805160405193929190846401000000008211156115d157600080fd5b9083019060208201858111156115e657600080fd5b825186602082028301116401000000008211171561160357600080fd5b82525081516020918201928201910280838360005b83811015611630578181015183820152602001611618565b505050509050016040526020018051604051939291908464010000000082111561165957600080fd5b90830190602082018581111561166e57600080fd5b825186602082028301116401000000008211171561168b57600080fd5b82525081516020918201928201910280838360005b838110156116b85781810151838201526020016116a0565b50505050905001604052505050809650819750829850505050855167ffffffffffffffff811180156116e957600080fd5b50604051908082528060200260200182016040528015611713578160200160208202803683370190505b50925060005b86518110156117c957600087828151811061173057fe5b6020908102919091018101516001600160a01b038082166000908152600484526040808220928e168252919093529091205490915042101561178b57600185838151811061177a57fe5b911515602092830291909101909101525b886001600160a01b0316816001600160a01b031614156117c057600193508582815181106117b557fe5b602002602001015192505b50600101611719565b5091939550919395565b6117db6137b7565b6118165760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff8216111561185e5760405162461bcd60e51b815260040180806020018281038252603f815260200180614263603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1690565b6119146137fc565b61194f5760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b600c54600a54604080517fab8f6ffe000000000000000000000000000000000000000000000000000000008152905160609384938493849384936001600160a01b0390811693169163ab8f6ffe916004808301926000929190829003018186803b158015611a0f57600080fd5b505afa158015611a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526060811015611a6a57600080fd5b8101908080516040519392919084640100000000821115611a8a57600080fd5b908301906020820185811115611a9f57600080fd5b8251866020820283011164010000000082111715611abc57600080fd5b82525081516020918201928201910280838360005b83811015611ae9578181015183820152602001611ad1565b5050505090500160405260200180516040519392919084640100000000821115611b1257600080fd5b908301906020820185811115611b2757600080fd5b8251866020820283011164010000000082111715611b4457600080fd5b82525081516020918201928201910280838360005b83811015611b71578181015183820152602001611b59565b5050505090500160405260200180516040519392919084640100000000821115611b9a57600080fd5b908301906020820185811115611baf57600080fd5b8251866020820283011164010000000082111715611bcc57600080fd5b82525081516020918201928201910280838360005b83811015611bf9578181015183820152602001611be1565b505050509190910160408190527ffccea80d000000000000000000000000000000000000000000000000000000008152602060048201818152895160248401528951999f50979d50959a506001600160a01b0389169763fccea80d978f979096508695506044909201935081870192500280838360005b83811015611c88578181015183820152602001611c70565b505050509050019250505060006040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611d0657600080fd5b8101908080516040519392919084640100000000821115611d2657600080fd5b908301906020820185811115611d3b57600080fd5b8251866020820283011164010000000082111715611d5857600080fd5b82525081516020918201928201910280838360005b83811015611d85578181015183820152602001611d6d565b505050509050016040525050509350806001600160a01b031663c697a996876040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611df3578181015183820152602001611ddb565b505050509050019250505060006040518083038186803b158015611e1657600080fd5b505afa158015611e2a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611e7157600080fd5b8101908080516040519392919084640100000000821115611e9157600080fd5b908301906020820185811115611ea657600080fd5b8251866020820283011164010000000082111715611ec357600080fd5b82525081516020918201928201910280838360005b83811015611ef0578181015183820152602001611ed8565b505050509050016040525050509150509091929394565b611f0f610d8f565b611f4a5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60095463ffffffff1690565b611fc06137b7565b611ffb5760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156120435760405162461bcd60e51b815260040180806020018281038252603b8152602001806141de603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff16156121325760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b428110156121715760405162461bcd60e51b815260040180806020018281038252602c815260200180614408602c913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b1580156121d557600080fd5b505afa1580156121e9573d6000803e3d6000fd5b505050506040513d60208110156121ff57600080fd5b50516001600160a01b0380821660008181526004602090815260408083209489168084529482529182902087905581518781529151949550929391927fcb530db56313ef43bf663c10381c044eada437428b9644aabfff5f46b6f6605b92918290030190a36060806060600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156122b757600080fd5b505afa1580156122cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561231257600080fd5b810190808051604051939291908464010000000082111561233257600080fd5b90830190602082018581111561234757600080fd5b825186602082028301116401000000008211171561236457600080fd5b82525081516020918201928201910280838360005b83811015612391578181015183820152602001612379565b50505050905001604052602001805160405193929190846401000000008211156123ba57600080fd5b9083019060208201858111156123cf57600080fd5b82518660208202830111640100000000821117156123ec57600080fd5b82525081516020918201928201910280838360005b83811015612419578181015183820152602001612401565b505050509050016040526020018051604051939291908464010000000082111561244257600080fd5b90830190602082018581111561245757600080fd5b825186602082028301116401000000008211171561247457600080fd5b82525081516020918201928201910280838360005b838110156124a1578181015183820152602001612489565b5050505090500160405250505092509250925060006124c28484848a61383c565b90508015610d46576124d48488613a6a565b6040516001600160a01b038816907fc808d7f6285926a53d708653414e2d2a88e3c1715debb80fb09ca41d744e5ba690600090a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156125b357600080fd5b505af11580156125c7573d6000803e3d6000fd5b505050506040513d60608110156125dd57600080fd5b505050505050505050565b6125f0610f53565b6001600160a01b0316336001600160a01b03161461263f5760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b60005b818110156114725761266e83838381811061265957fe5b905060200201356001600160a01b031661336b565b600101612642565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146126e05760405162461bcd60e51b81526004018080602001828103825260278152602001806141b76027913960400191505060405180910390fd5b6001546126f5906001600160a01b0316613628565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6127276137b7565b6127625760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156127aa5760405162461bcd60e51b815260040180806020018281038252602f8152602001806142d3602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a1600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b600c546001600160a01b0316331461286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806142a26031913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156128c95760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b604080516000808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b600080600061298284613799565b6001600160a01b0380861660009081526007602090815260409182902054600b5483517fcf3b670b00000000000000000000000000000000000000000000000000000000815293519598509096509092169263cf3b670b92600480840193919291829003018186803b1580156129f757600080fd5b505afa158015612a0b573d6000803e3d6000fd5b505050506040513d6020811015612a2157600080fd5b5051929491935050565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916310b3b29391602480820192602092909190829003018186803b158015612a9557600080fd5b505afa158015612aa9573d6000803e3d6000fd5b505050506040513d6020811015612abf57600080fd5b50519150612acc82613799565b15612ad957506000610a38565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090612b2290849061303a565b600a54604080517f2e983ab00000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018590529151939450911691632e983ab091604480820192602092909190829003018186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d6020811015612bbb57600080fd5b50519392505050565b6003546001600160a01b031690565b600d546001600160a01b03163314612c1c5760405162461bcd60e51b815260040180806020018281038252602881526020018061436c6028913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff1615612c765760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600a54604080517fe66b9c1d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284151560248301529151919092169163e66b9c1d91604480830192600092919082900301818387803b158015612ce557600080fd5b505af1158015610d48573d6000803e3d6000fd5b612d01613ac5565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d41613b86565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d81613c16565b600c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612dc1613ca6565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60056020526000908152604090205481565b612e156137fc565b612e505760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b612ec2613d36565b612efd5760405162461bcd60e51b815260040180806020018281038252603e815260200180614138603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d6020811015612f8757600080fd5b50516001600160a01b031614612fce5760405162461bcd60e51b81526004018080602001828103825260418152602001806141766041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b600b54604080517ffab46d660000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152825160009491909116928492849263fab46d6692602480840193919291829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60408110156130cf57600080fd5b50602090810151604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152915192945060009391861692637c47c16d92602480840193919291829003018186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d602081101561316657600080fd5b505190506131758282876136e0565b93505050505b92915050565b61318a85613799565b1561319457613360565b6001600160a01b0385166000908152600760205260408120546131c39086906131bd9087613d91565b90613dd3565b9050600080841180156131fe57506131ee84846040015163ffffffff16613e2d90919063ffffffff16565b6131fb83620186a0613e2d565b10155b90508015613345576001600160a01b03871660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0bc20ba748c0b7a01e134c521b1e20764a53c3a6b4710a54cbbcf6c8bb3ba3079190a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561331857600080fd5b505af115801561332c573d6000803e3d6000fd5b505050506040513d606081101561334257600080fd5b50505b506001600160a01b0386166000908152600760205260409020555b5050505050565b3390565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915191909216916310b3b293916024808301926020929190829003018186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b5051905061340881613799565b1561345a576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b604080516001808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a26040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000906134e690839061303a565b600a54600d54604080517fdc8b6d730000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291519495509281169363e272079f9387938793169163dc8b6d7391602480820192602092909190829003018186803b15801561355e57600080fd5b505afa158015613572573d6000803e3d6000fd5b505050506040513d602081101561358857600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526001600160a01b0390941660048501526024840192909252151560448301525160648083019260209291908290030181600087803b1580156135f857600080fd5b505af115801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b50505050565b6001600160a01b03811661366d5760405162461bcd60e51b81526004018080602001828103825260348152602001806143946034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006136ff826000015163ffffffff1684613e2d90919063ffffffff16565b61370c85620186a0613e2d565b10613718575081613741565b815161373e9063ffffffff90811690613738908790620186a090613e2d16565b90613e86565b90505b9392505050565b6001600160a01b03808516600090815260066020526040902054168061376e5750613622565b6001600160a01b0385166000908152600560205260409020805490859055610d488286838787613181565b6001600160a01b031660009081526008602052604090205460ff1690565b60006137f76040518060400160405280601181526020017f66756e6374696f6e616c4d616e61676572000000000000000000000000000000815250613ec8565b905090565b60006137f76040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250613ec8565b60006138466140f2565b506040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000808080808080805b8d518110156139d9578d81815181106138a157fe5b602002602001015193508c81815181106138b757fe5b602002602001015192508a6001600160a01b0316846001600160a01b03161480156138f257508b81815181106138e957fe5b60200260200101515b156138fc57600191505b6139068884613dd3565b97508b818151811061391457fe5b60200260200101511561392e5761392b8684613dd3565b95505b60008061393b868e610d50565b91509150811561397c5761394f8986613dd3565b98508d838151811061395d57fe5b602002602001015115613977576139748786613dd3565b96505b6139cf565b80156139cf5760046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020600090555b505060010161388c565b50600087118015613a125750613a0287896020015163ffffffff16613e2d90919063ffffffff16565b613a0f87620186a0613e2d565b10155b80613a595750808015613a255750600085115b8015613a595750613a4985896020015163ffffffff16613e2d90919063ffffffff16565b613a5685620186a0613e2d565b10155b9d9c50505050505050505050505050565b60005b825181101561147257600060046000858481518110613a8857fe5b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209387168152929052902055600101613a6d565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f636f6d6d69747465650000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b505afa158015613b69573d6000803e3d6000fd5b505050506040513d6020811015613b7f57600080fd5b5051905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f677561726469616e73526567697374726174696f6e0000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600d60248301527f63657274696669636174696f6e00000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b6003546000906001600160a01b0316331480613d6a5750613d556111ee565b6001600160a01b0316336001600160a01b0316145b806137f75750613d78610f53565b6001600160a01b0316336001600160a01b031614905090565b600061374183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ff6565b600082820183811015613741576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613e3c5750600061317b565b82820282848281613e4957fe5b04146137415760405162461bcd60e51b81526004018080602001828103825260218152602001806143256021913960400191505060405180910390fd5b600061374183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061408d565b6003546000906001600160a01b0316613edf613d36565b8061374157506001600160a01b0381161580159061374157506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015613f6f578181015183820152602001613f57565b50505050905090810190601f168015613f9c5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015613fb957600080fd5b505afa158015613fcd573d6000803e3d6000fd5b505050506040513d6020811015613fe357600080fd5b50516001600160a01b0316149392505050565b600081848411156140855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561404a578181015183820152602001614032565b50505050905090810190601f1680156140775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561404a578181015183820152602001614032565b5060008385816140e857fe5b0495945050505050565b60408051606081018252600080825260208201819052918101919091529056fe636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303063616c6c6572206973206e6f742074686520677561726469616e20726567697374726174696f6e7320636f6e74726163746d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f737473656e646572206973206e6f7420746865206d6967726174696f6e206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206973206e6f74207468652064656c65676174696f6e7320636f6e747261637463616c6c6572206973206e6f74207468652063657274696669636174696f6e20636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e766f74652065787069726174696f6e2074696d65206d757374206e6f7420626520696e207468652070617374a2646970667358221220e2643d8debe01ae4182e08ac333b74b50c649fb45d8fb6b9be0f1cfff5d8d5ce64736f6c634300060c003373656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e7472616374207265676973747279766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e203130303030306d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f7374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f20616464726573731f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb920000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000111700000000000000000000000000000000000000000000000000000000000011170

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102c85760003560e01c8063a4e2d6341161017b578063d3705cb7116100d8578063e7366dc81161008c578063f27f3bb411610071578063f27f3bb414610998578063f83d08ba146109be578063fcd13d65146109c6576102c8565b8063e7366dc814610962578063eec0701f14610990576102c8565b8063daa00faa116100bd578063daa00faa146108ee578063dfc8fdd014610934578063e4e992221461095a576102c8565b8063d3705cb7146108a5578063d55c9bcf146108c8576102c8565b8063bac5e9911161012f578063ca0809c811610114578063ca0809c814610825578063cf30901214610895578063d25235261461089d576102c8565b8063bac5e991146107d6578063c7af3a94146107f9576102c8565b8063ab8f6ffe11610160578063ab8f6ffe14610677578063acdb8e04146107c6578063b364cc38146107ce576102c8565b8063a4e2d63414610667578063a69df4b51461066f576102c8565b806348106fe31161022957806374c16b23116101dd578063868ca49d116101c2578063868ca49d146104e157806394470457146104e9578063a0774f7514610644576102c8565b806374c16b23146104a957806385b4bb53146104b1576102c8565b80635f94cd9c1161020e5780635f94cd9c14610443578063615c25451461044b57806361885df814610471576102c8565b806348106fe3146104335780634fa293c31461043b576102c8565b8063245dcad3116102805780632a1fac72116102655780632a1fac72146103e1578063333df154146103e957806339069d8c1461040d576102c8565b8063245dcad3146103b35780632987cea0146103bb576102c8565b8063090b7f1f116102b1578063090b7f1f1461032d5780631a0b2c4f146103765780631ee2960e14610392576102c8565b806302211f5e146102cd57806307b490af14610305575b600080fd5b6102f3600480360360208110156102e357600080fd5b50356001600160a01b03166109ec565b60408051918252519081900360200190f35b61032b6004803603602081101561031b57600080fd5b50356001600160a01b0316610a3d565b005b61035b6004803603604081101561034357600080fd5b506001600160a01b0381358116916020013516610d50565b60408051921515835260208301919091528051918290030190f35b61037e610d8f565b604080519115158252519081900360200190f35b61039a610db3565b6040805163ffffffff9092168252519081900360200190f35b61032b610dc7565b61032b600480360360208110156103d157600080fd5b50356001600160a01b0316610e2c565b61032b610ea9565b6103f1610f53565b604080516001600160a01b039092168252519081900360200190f35b61032b6004803603602081101561042357600080fd5b50356001600160a01b0316610f62565b61037e610fc5565b61039a610fd5565b6103f1610fed565b6103f16004803603602081101561046157600080fd5b50356001600160a01b0316610ffc565b61032b6004803603608081101561048757600080fd5b506001600160a01b03813516906020810135906040810135906060013561101a565b6103f16111ee565b6104b96111fd565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b61032b611255565b61050f600480360360208110156104ff57600080fd5b50356001600160a01b0316611477565b60405180806020018060200180602001806020018715158152602001861515815260200185810385528b818151815260200191508051906020019060200280838360005b8381101561056b578181015183820152602001610553565b5050505090500185810384528a818151815260200191508051906020019060200280838360005b838110156105aa578181015183820152602001610592565b50505050905001858103835289818151815260200191508051906020019060200280838360005b838110156105e95781810151838201526020016105d1565b50505050905001858103825288818151815260200191508051906020019060200280838360005b83811015610628578181015183820152602001610610565b505050509050019a505050505050505050505060405180910390f35b61032b6004803603602081101561065a57600080fd5b503563ffffffff166117d3565b61037e6118eb565b61032b61190c565b61067f6119a2565b60405180806020018060200180602001806020018060200186810386528b818151815260200191508051906020019060200280838360005b838110156106cf5781810151838201526020016106b7565b5050505090500186810385528a818151815260200191508051906020019060200280838360005b8381101561070e5781810151838201526020016106f6565b50505050905001868103845289818151815260200191508051906020019060200280838360005b8381101561074d578181015183820152602001610735565b50505050905001868103835288818151815260200191508051906020019060200280838360005b8381101561078c578181015183820152602001610774565b5050505091909101878103835288518152885160209182019250818a01910280838360008315610628578181015183820152602001610610565b61032b611f07565b61039a611fac565b61032b600480360360208110156107ec57600080fd5b503563ffffffff16611fb8565b61032b6004803603604081101561080f57600080fd5b506001600160a01b0381351690602001356120d8565b61032b6004803603602081101561083b57600080fd5b81019060208101813564010000000081111561085657600080fd5b82018360208201111561086857600080fd5b8035906020019184602083028401116401000000008311171561088a57600080fd5b5090925090506125e8565b61037e612676565b61032b612697565b61032b600480360360208110156108bb57600080fd5b503563ffffffff1661271f565b61032b600480360360208110156108de57600080fd5b50356001600160a01b0316612826565b6109146004803603602081101561090457600080fd5b50356001600160a01b0316612974565b604080519315158452602084019290925282820152519081900360600190f35b61037e6004803603602081101561094a57600080fd5b50356001600160a01b0316612a2b565b6103f1612bc4565b61032b6004803603604081101561097857600080fd5b506001600160a01b0381351690602001351515612bd3565b61032b612cf9565b6102f3600480360360208110156109ae57600080fd5b50356001600160a01b0316612dfb565b61032b612e0d565b61032b600480360360208110156109dc57600080fd5b50356001600160a01b0316612eba565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090610a3590839061303a565b90505b919050565b60035474010000000000000000000000000000000000000000900460ff1615610a975760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610a9f6140f2565b506040805160608101825260095463ffffffff808216835264010000000082048116602080850191909152680100000000000000009092041682840152336000818152600690925283822080546001600160a01b038781167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355955194959294921692909184917f275bb5f10bdccb6cea621dfabf75682103f2392a02061d953ebe212cfa26ef0e91a3600b54604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015291516000939290921691637c47c16d91602480820192602092909190829003018186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d6020811015610be357600080fd5b505190506001600160a01b038216610c11576001600160a01b03831660009081526005602052604090208190555b6001600160a01b038516610c39576001600160a01b0383166000908152600560205260408120555b600b54604080517fcf3b670b00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163cf3b670b916004808301926020929190829003018186803b158015610c9757600080fd5b505afa158015610cab573d6000803e3d6000fd5b505050506040513d6020811015610cc157600080fd5b505190506001600160a01b03831615801590610cef5750856001600160a01b0316836001600160a01b031614155b15610d0257610d02836000848489613181565b6001600160a01b03861615610d48576000866001600160a01b0316846001600160a01b03161415610d34576000610d36565b825b9050610d4687826000858a613181565b505b505050505050565b6001600160a01b0380831660009081526004602090815260408083209385168352929052908120548015801590610d8657508042105b91509250929050565b600080546001600160a01b0316610da4613367565b6001600160a01b031614905090565b600954640100000000900463ffffffff1690565b60035474010000000000000000000000000000000000000000900460ff1615610e215760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b610e2a3361336b565b565b610e34610d8f565b610e6f5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b610eb1610f53565b6001600160a01b0316336001600160a01b031614610f005760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b610f6a610f53565b6001600160a01b0316336001600160a01b031614610fb95760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b610fc281613628565b50565b6002546001600160a01b03161590565b60095468010000000000000000900463ffffffff1690565b6001546001600160a01b031690565b6001600160a01b039081166000908152600660205260409020541690565b600b546001600160a01b031633146110635760405162461bcd60e51b81526004018080602001828103825260268152602001806143466026913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156110bd5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b6110c56140f2565b506040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600061110e8585846136e0565b604080518781526020810187905280820183905290519192506001600160a01b038816917fd5c5ef58495d970aa497140d952854435af4876c07e0735daaa3fc32874c3cf89181900360600190a2600a54604080517f68f52e500000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015260248201859052915191909216916368f52e5091604480830192600092919082900301818387803b1580156111ca57600080fd5b505af11580156111de573d6000803e3d6000fd5b50505050610d4886858585613748565b6000546001600160a01b031690565b600080600061120a6140f2565b50506040805160608101825260095463ffffffff8082168084526401000000008304821660208501819052680100000000000000009093049091169290930182905291949193509150565b60035474010000000000000000000000000000000000000000900460ff16156112af5760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b15801561131357600080fd5b505afa158015611327573d6000803e3d6000fd5b505050506040513d602081101561133d57600080fd5b5051905061134a81613799565b1561139c576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b60408051600181526000602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b505af115801561145c573d6000803e3d6000fd5b505050506040513d606081101561147257600080fd5b505050565b606080606080600080600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156114ce57600080fd5b505afa1580156114e2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561152957600080fd5b810190808051604051939291908464010000000082111561154957600080fd5b90830190602082018581111561155e57600080fd5b825186602082028301116401000000008211171561157b57600080fd5b82525081516020918201928201910280838360005b838110156115a8578181015183820152602001611590565b50505050905001604052602001805160405193929190846401000000008211156115d157600080fd5b9083019060208201858111156115e657600080fd5b825186602082028301116401000000008211171561160357600080fd5b82525081516020918201928201910280838360005b83811015611630578181015183820152602001611618565b505050509050016040526020018051604051939291908464010000000082111561165957600080fd5b90830190602082018581111561166e57600080fd5b825186602082028301116401000000008211171561168b57600080fd5b82525081516020918201928201910280838360005b838110156116b85781810151838201526020016116a0565b50505050905001604052505050809650819750829850505050855167ffffffffffffffff811180156116e957600080fd5b50604051908082528060200260200182016040528015611713578160200160208202803683370190505b50925060005b86518110156117c957600087828151811061173057fe5b6020908102919091018101516001600160a01b038082166000908152600484526040808220928e168252919093529091205490915042101561178b57600185838151811061177a57fe5b911515602092830291909101909101525b886001600160a01b0316816001600160a01b031614156117c057600193508582815181106117b557fe5b602002602001015192505b50600101611719565b5091939550919395565b6117db6137b7565b6118165760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff8216111561185e5760405162461bcd60e51b815260040180806020018281038252603f815260200180614263603f913960400191505060405180910390fd5b6009546040805163ffffffff8481168252640100000000909304909216602083015280517ff85225604b27cb71d925b3e5e40561ca03066d501e90ac8bfaa6784f1cd878679281900390910190a16009805463ffffffff909216640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff1690565b6119146137fc565b61194f5760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b600c54600a54604080517fab8f6ffe000000000000000000000000000000000000000000000000000000008152905160609384938493849384936001600160a01b0390811693169163ab8f6ffe916004808301926000929190829003018186803b158015611a0f57600080fd5b505afa158015611a23573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526060811015611a6a57600080fd5b8101908080516040519392919084640100000000821115611a8a57600080fd5b908301906020820185811115611a9f57600080fd5b8251866020820283011164010000000082111715611abc57600080fd5b82525081516020918201928201910280838360005b83811015611ae9578181015183820152602001611ad1565b5050505090500160405260200180516040519392919084640100000000821115611b1257600080fd5b908301906020820185811115611b2757600080fd5b8251866020820283011164010000000082111715611b4457600080fd5b82525081516020918201928201910280838360005b83811015611b71578181015183820152602001611b59565b5050505090500160405260200180516040519392919084640100000000821115611b9a57600080fd5b908301906020820185811115611baf57600080fd5b8251866020820283011164010000000082111715611bcc57600080fd5b82525081516020918201928201910280838360005b83811015611bf9578181015183820152602001611be1565b505050509190910160408190527ffccea80d000000000000000000000000000000000000000000000000000000008152602060048201818152895160248401528951999f50979d50959a506001600160a01b0389169763fccea80d978f979096508695506044909201935081870192500280838360005b83811015611c88578181015183820152602001611c70565b505050509050019250505060006040518083038186803b158015611cab57600080fd5b505afa158015611cbf573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611d0657600080fd5b8101908080516040519392919084640100000000821115611d2657600080fd5b908301906020820185811115611d3b57600080fd5b8251866020820283011164010000000082111715611d5857600080fd5b82525081516020918201928201910280838360005b83811015611d85578181015183820152602001611d6d565b505050509050016040525050509350806001600160a01b031663c697a996876040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019060200280838360005b83811015611df3578181015183820152602001611ddb565b505050509050019250505060006040518083038186803b158015611e1657600080fd5b505afa158015611e2a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526020811015611e7157600080fd5b8101908080516040519392919084640100000000821115611e9157600080fd5b908301906020820185811115611ea657600080fd5b8251866020820283011164010000000082111715611ec357600080fd5b82525081516020918201928201910280838360005b83811015611ef0578181015183820152602001611ed8565b505050509050016040525050509150509091929394565b611f0f610d8f565b611f4a5760405162461bcd60e51b81526004018080602001828103825260408152602001806143c86040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60095463ffffffff1690565b611fc06137b7565b611ffb5760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156120435760405162461bcd60e51b815260040180806020018281038252603b8152602001806141de603b913960400191505060405180910390fd5b6009546040805163ffffffff848116825268010000000000000000909304909216602083015280517f1d5d5428459ec4611f1aa061bef9eeb6e83fb6f5408c6dc5c2f022ba9ef4715c9281900390910190a16009805463ffffffff90921668010000000000000000027fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff909216919091179055565b60035474010000000000000000000000000000000000000000900460ff16156121325760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b428110156121715760405162461bcd60e51b815260040180806020018281038252602c815260200180614408602c913960400191505060405180910390fd5b600c54604080517f10b3b29300000000000000000000000000000000000000000000000000000000815233600482015290516000926001600160a01b0316916310b3b293916024808301926020929190829003018186803b1580156121d557600080fd5b505afa1580156121e9573d6000803e3d6000fd5b505050506040513d60208110156121ff57600080fd5b50516001600160a01b0380821660008181526004602090815260408083209489168084529482529182902087905581518781529151949550929391927fcb530db56313ef43bf663c10381c044eada437428b9644aabfff5f46b6f6605b92918290030190a36060806060600a60009054906101000a90046001600160a01b03166001600160a01b031663ab8f6ffe6040518163ffffffff1660e01b815260040160006040518083038186803b1580156122b757600080fd5b505afa1580156122cb573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052606081101561231257600080fd5b810190808051604051939291908464010000000082111561233257600080fd5b90830190602082018581111561234757600080fd5b825186602082028301116401000000008211171561236457600080fd5b82525081516020918201928201910280838360005b83811015612391578181015183820152602001612379565b50505050905001604052602001805160405193929190846401000000008211156123ba57600080fd5b9083019060208201858111156123cf57600080fd5b82518660208202830111640100000000821117156123ec57600080fd5b82525081516020918201928201910280838360005b83811015612419578181015183820152602001612401565b505050509050016040526020018051604051939291908464010000000082111561244257600080fd5b90830190602082018581111561245757600080fd5b825186602082028301116401000000008211171561247457600080fd5b82525081516020918201928201910280838360005b838110156124a1578181015183820152602001612489565b5050505090500160405250505092509250925060006124c28484848a61383c565b90508015610d46576124d48488613a6a565b6040516001600160a01b038816907fc808d7f6285926a53d708653414e2d2a88e3c1715debb80fb09ca41d744e5ba690600090a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b1580156125b357600080fd5b505af11580156125c7573d6000803e3d6000fd5b505050506040513d60608110156125dd57600080fd5b505050505050505050565b6125f0610f53565b6001600160a01b0316336001600160a01b03161461263f5760405162461bcd60e51b81526004018080602001828103825260268152602001806142196026913960400191505060405180910390fd5b60005b818110156114725761266e83838381811061265957fe5b905060200201356001600160a01b031661336b565b600101612642565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b031633146126e05760405162461bcd60e51b81526004018080602001828103825260278152602001806141b76027913960400191505060405180910390fd5b6001546126f5906001600160a01b0316613628565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6127276137b7565b6127625760405162461bcd60e51b815260040180806020018281038252602481526020018061423f6024913960400191505060405180910390fd5b620186a063ffffffff821611156127aa5760405162461bcd60e51b815260040180806020018281038252602f8152602001806142d3602f913960400191505060405180910390fd5b6009546040805163ffffffff8085168252909216602083015280517f5f1e6a4b65e5b155a39124570a9d52d1a94b94d17b9cefb044afd83367344f739281900390910190a1600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff92909216919091179055565b600c546001600160a01b0316331461286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806142a26031913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff16156128c95760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b604080516000808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561144857600080fd5b600080600061298284613799565b6001600160a01b0380861660009081526007602090815260409182902054600b5483517fcf3b670b00000000000000000000000000000000000000000000000000000000815293519598509096509092169263cf3b670b92600480840193919291829003018186803b1580156129f757600080fd5b505afa158015612a0b573d6000803e3d6000fd5b505050506040513d6020811015612a2157600080fd5b5051929491935050565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915160009392909216916310b3b29391602480820192602092909190829003018186803b158015612a9557600080fd5b505afa158015612aa9573d6000803e3d6000fd5b505050506040513d6020811015612abf57600080fd5b50519150612acc82613799565b15612ad957506000610a38565b6040805160608101825260095463ffffffff8082168352640100000000820481166020840152680100000000000000009091041691810191909152600090612b2290849061303a565b600a54604080517f2e983ab00000000000000000000000000000000000000000000000000000000081526001600160a01b038781166004830152602482018590529151939450911691632e983ab091604480820192602092909190829003018186803b158015612b9157600080fd5b505afa158015612ba5573d6000803e3d6000fd5b505050506040513d6020811015612bbb57600080fd5b50519392505050565b6003546001600160a01b031690565b600d546001600160a01b03163314612c1c5760405162461bcd60e51b815260040180806020018281038252602881526020018061436c6028913960400191505060405180910390fd5b60035474010000000000000000000000000000000000000000900460ff1615612c765760405162461bcd60e51b81526004018080602001828103825260258152602001806141136025913960400191505060405180910390fd5b600a54604080517fe66b9c1d0000000000000000000000000000000000000000000000000000000081526001600160a01b03858116600483015284151560248301529151919092169163e66b9c1d91604480830192600092919082900301818387803b158015612ce557600080fd5b505af1158015610d48573d6000803e3d6000fd5b612d01613ac5565b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d41613b86565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612d81613c16565b600c80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612dc1613ca6565b600d80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60056020526000908152604090205481565b612e156137fc565b612e505760405162461bcd60e51b81526004018080602001828103825260238152602001806143026023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b612ec2613d36565b612efd5760405162461bcd60e51b815260040180806020018281038252603e815260200180614138603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015612f5d57600080fd5b505afa158015612f71573d6000803e3d6000fd5b505050506040513d6020811015612f8757600080fd5b50516001600160a01b031614612fce5760405162461bcd60e51b81526004018080602001828103825260418152602001806141766041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b600b54604080517ffab46d660000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152825160009491909116928492849263fab46d6692602480840193919291829003018186803b1580156130a557600080fd5b505afa1580156130b9573d6000803e3d6000fd5b505050506040513d60408110156130cf57600080fd5b50602090810151604080517f7c47c16d0000000000000000000000000000000000000000000000000000000081526001600160a01b038981166004830152915192945060009391861692637c47c16d92602480840193919291829003018186803b15801561313c57600080fd5b505afa158015613150573d6000803e3d6000fd5b505050506040513d602081101561316657600080fd5b505190506131758282876136e0565b93505050505b92915050565b61318a85613799565b1561319457613360565b6001600160a01b0385166000908152600760205260408120546131c39086906131bd9087613d91565b90613dd3565b9050600080841180156131fe57506131ee84846040015163ffffffff16613e2d90919063ffffffff16565b6131fb83620186a0613e2d565b10155b90508015613345576001600160a01b03871660008181526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0bc20ba748c0b7a01e134c521b1e20764a53c3a6b4710a54cbbcf6c8bb3ba3079190a2604080516000808252602082015281516001600160a01b038a16927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a2600a54604080517f0b1ca49a0000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015291519190921691630b1ca49a9160248083019260609291908290030181600087803b15801561331857600080fd5b505af115801561332c573d6000803e3d6000fd5b505050506040513d606081101561334257600080fd5b50505b506001600160a01b0386166000908152600760205260409020555b5050505050565b3390565b600c54604080517f10b3b2930000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152915191909216916310b3b293916024808301926020929190829003018186803b1580156133d157600080fd5b505afa1580156133e5573d6000803e3d6000fd5b505050506040513d60208110156133fb57600080fd5b5051905061340881613799565b1561345a576040805162461bcd60e51b815260206004820152601360248201527f63616c6c657220697320766f7465642d6f757400000000000000000000000000604482015290519081900360640190fd5b604080516001808252602082015281516001600160a01b038416927ff2de790499b85c5800832caf02f18e7ddecfa1d20b3ddc6a8c44be78838d1cec928290030190a26040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000906134e690839061303a565b600a54600d54604080517fdc8b6d730000000000000000000000000000000000000000000000000000000081526001600160a01b03878116600483015291519495509281169363e272079f9387938793169163dc8b6d7391602480820192602092909190829003018186803b15801561355e57600080fd5b505afa158015613572573d6000803e3d6000fd5b505050506040513d602081101561358857600080fd5b5051604080517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526001600160a01b0390941660048501526024840192909252151560448301525160648083019260209291908290030181600087803b1580156135f857600080fd5b505af115801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b50505050565b6001600160a01b03811661366d5760405162461bcd60e51b81526004018080602001828103825260348152602001806143946034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006136ff826000015163ffffffff1684613e2d90919063ffffffff16565b61370c85620186a0613e2d565b10613718575081613741565b815161373e9063ffffffff90811690613738908790620186a090613e2d16565b90613e86565b90505b9392505050565b6001600160a01b03808516600090815260066020526040902054168061376e5750613622565b6001600160a01b0385166000908152600560205260409020805490859055610d488286838787613181565b6001600160a01b031660009081526008602052604090205460ff1690565b60006137f76040518060400160405280601181526020017f66756e6374696f6e616c4d616e61676572000000000000000000000000000000815250613ec8565b905090565b60006137f76040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250613ec8565b60006138466140f2565b506040805160608101825260095463ffffffff80821683526401000000008204811660208401526801000000000000000090910416918101919091526000808080808080805b8d518110156139d9578d81815181106138a157fe5b602002602001015193508c81815181106138b757fe5b602002602001015192508a6001600160a01b0316846001600160a01b03161480156138f257508b81815181106138e957fe5b60200260200101515b156138fc57600191505b6139068884613dd3565b97508b818151811061391457fe5b60200260200101511561392e5761392b8684613dd3565b95505b60008061393b868e610d50565b91509150811561397c5761394f8986613dd3565b98508d838151811061395d57fe5b602002602001015115613977576139748786613dd3565b96505b6139cf565b80156139cf5760046000876001600160a01b03166001600160a01b0316815260200190815260200160002060008e6001600160a01b03166001600160a01b03168152602001908152602001600020600090555b505060010161388c565b50600087118015613a125750613a0287896020015163ffffffff16613e2d90919063ffffffff16565b613a0f87620186a0613e2d565b10155b80613a595750808015613a255750600085115b8015613a595750613a4985896020015163ffffffff16613e2d90919063ffffffff16565b613a5685620186a0613e2d565b10155b9d9c50505050505050505050505050565b60005b825181101561147257600060046000858481518110613a8857fe5b6020908102919091018101516001600160a01b03908116835282820193909352604091820160009081209387168152929052902055600101613a6d565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600960248301527f636f6d6d69747465650000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b505afa158015613b69573d6000803e3d6000fd5b505050506040513d6020811015613b7f57600080fd5b5051905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052601560248301527f677561726469616e73526567697374726174696f6e0000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600d60248301527f63657274696669636174696f6e00000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b158015613b5557600080fd5b6003546000906001600160a01b0316331480613d6a5750613d556111ee565b6001600160a01b0316336001600160a01b0316145b806137f75750613d78610f53565b6001600160a01b0316336001600160a01b031614905090565b600061374183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613ff6565b600082820183811015613741576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082613e3c5750600061317b565b82820282848281613e4957fe5b04146137415760405162461bcd60e51b81526004018080602001828103825260218152602001806143256021913960400191505060405180910390fd5b600061374183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061408d565b6003546000906001600160a01b0316613edf613d36565b8061374157506001600160a01b0381161580159061374157506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b83811015613f6f578181015183820152602001613f57565b50505050905090810190601f168015613f9c5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b158015613fb957600080fd5b505afa158015613fcd573d6000803e3d6000fd5b505050506040513d6020811015613fe357600080fd5b50516001600160a01b0316149392505050565b600081848411156140855760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561404a578181015183820152602001614032565b50505050905090810190601f1680156140775780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836140dc5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561404a578181015183820152602001614032565b5060008385816140e857fe5b0495945050505050565b60408051606081018252600080825260208201819052918101919091529056fe636f6e7472616374206973206c6f636b656420666f722074686973206f7065726174696f6e73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e766f74654f757450657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303073656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f74207468652066756e6374696f6e616c206d616e61676572766f7465556e726561647950657263656e744d696c6c655468726573686f6c64206d757374206e6f74206265206c6172676572207468616e2031303030303063616c6c6572206973206e6f742074686520677561726469616e20726567697374726174696f6e7320636f6e74726163746d696e53656c665374616b6550657263656e744d696c6c65206d75737420626520313030303030206174206d6f737473656e646572206973206e6f7420746865206d6967726174696f6e206d616e61676572536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7763616c6c6572206973206e6f74207468652064656c65676174696f6e7320636f6e747261637463616c6c6572206973206e6f74207468652063657274696669636174696f6e20636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696e766f74652065787069726174696f6e2074696d65206d757374206e6f7420626520696e207468652070617374a2646970667358221220e2643d8debe01ae4182e08ac333b74b50c649fb45d8fb6b9be0f1cfff5d8d5ce64736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb920000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000111700000000000000000000000000000000000000000000000000000000000011170

-----Decoded View---------------
Arg [0] : _contractRegistry (address): 0xD859701C81119aB12A1e62AF6270aD2AE05c7AB3
Arg [1] : _registryAdmin (address): 0xf1fD5233E60E7Ef797025FE9DD066d60d59BcB92
Arg [2] : minSelfStakePercentMille (uint32): 8000
Arg [3] : voteUnreadyPercentMilleThreshold (uint32): 70000
Arg [4] : voteOutPercentMilleThreshold (uint32): 70000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3
Arg [1] : 000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [3] : 0000000000000000000000000000000000000000000000000000000000011170
Arg [4] : 0000000000000000000000000000000000000000000000000000000000011170


Deployed Bytecode Sourcemap

53390:24346:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57303:160;;;;;;;;;;;;;;;;-1:-1:-1;57303:160:0;-1:-1:-1;;;;;57303:160:0;;:::i;:::-;;;;;;;;;;;;;;;;61962:914;;;;;;;;;;;;;;;;-1:-1:-1;61962:914:0;-1:-1:-1;;;;;61962:914:0;;:::i;:::-;;60080:237;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60080:237:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;40727:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;68656:145;;;:::i;:::-;;;;;;;;;;;;;;;;;;;56189:102;;;:::i;42288:146::-;;;;;;;;;;;;;;;;-1:-1:-1;42288:146:0;-1:-1:-1;;;;;42288:146:0;;:::i;43814:159::-;;;:::i;43619:107::-;;;:::i;:::-;;;;-1:-1:-1;;;;;43619:107:0;;;;;;;;;;;;;;49688:154;;;;;;;;;;;;;;;;-1:-1:-1;49688:154:0;-1:-1:-1;;;;;49688:154:0;;:::i;44033:123::-;;;:::i;67685:137::-;;;:::i;42802:110::-;;;:::i;63066:116::-;;;;;;;;;;;;;;;;-1:-1:-1;63066:116:0;-1:-1:-1;;;;;63066:116:0;;:::i;64378:566::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64378:566:0;;;;;;;;;;;;;;;;;;:::i;40281:95::-;;;:::i;69113:447::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55690:340;;;:::i;61077:679::-;;;;;;;;;;;;;;;;-1:-1:-1;61077:679:0;-1:-1:-1;;;;;61077:679:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68043:472;;;;;;;;;;;;;;;;-1:-1:-1;68043:472:0;;;;:::i;52395:90::-;;;:::i;52155:116::-;;;:::i;57953:503::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;57953:503:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57953:503:0;;;;;;;;;;;;;;;;;;;;;;;;;41231:182;;;:::i;66774:129::-;;;:::i;67116:436::-;;;;;;;;;;;;;;;;-1:-1:-1;67116:436:0;;;;:::i;58881:882::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;58881:882:0;;;;;;;;:::i;69889:200::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69889:200:0;;-1:-1:-1;69889:200:0;-1:-1:-1;69889:200:0;:::i;51120:18::-;;;:::i;42540:183::-;;;:::i;66218:392::-;;;;;;;;;;;;;;;;-1:-1:-1;66218:392:0;;;;:::i;65248:220::-;;;;;;;;;;;;;;;;-1:-1:-1;65248:220:0;-1:-1:-1;;;;;65248:220:0;;:::i;63620:298::-;;;;;;;;;;;;;;;;-1:-1:-1;63620:298:0;-1:-1:-1;;;;;63620:298:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56701:398;;;;;;;;;;;;;;;;-1:-1:-1;56701:398:0;-1:-1:-1;;;;;56701:398:0;;:::i;49558:122::-;;;:::i;65720:209::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;65720:209:0;;;;;;;;;;:::i;77391:340::-;;;:::i;53620:46::-;;;;;;;;;;;;;;;;-1:-1:-1;53620:46:0;-1:-1:-1;;;;;53620:46:0;;:::i;51829:111::-;;;:::i;49018:394::-;;;;;;;;;;;;;;;;-1:-1:-1;49018:394:0;-1:-1:-1;;;;;49018:394:0;;:::i;57303:160::-;57413:45;;;;;;;;57449:8;57413:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;57380:19;;57413:45;;57439:8;;57413:25;:45::i;:::-;57406:52;;57303:160;;;;:::o;61962:914::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62034:25:::1;;:::i;:::-;-1:-1:-1::0;62034:36:0::1;::::0;;::::1;::::0;::::1;::::0;;62062:8:::1;62034:36:::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;;;;;::::1;;::::0;;;;62093:10:::1;-1:-1:-1::0;62130:19:0;;;:12:::1;:19:::0;;;;;;;;-1:-1:-1;;;;;62156:29:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;62195;;62034:36;;62093:10;;62130:19;::::1;::::0;62156:29;;62093:10;;62195:29:::1;::::0;::::1;62252:19;::::0;:44:::1;::::0;;;;;-1:-1:-1;;;;;62252:44:0;;::::1;;::::0;::::1;::::0;;;62231:18:::1;::::0;62252:19;;;::::1;::::0;:37:::1;::::0;:44;;;;;::::1;::::0;;;;;;;;;:19;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;62252:44:0;;-1:-1:-1;;;;;;62307:25:0;::::1;62303:74;;-1:-1:-1::0;;;;;62340:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;:31;;;62303:74:::1;-1:-1:-1::0;;;;;62387:21:0;::::1;62383:64;;-1:-1:-1::0;;;;;62423:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;62416:25;62383:64:::1;62471:19;::::0;:44:::1;::::0;;;;;;;62453:15:::1;::::0;-1:-1:-1;;;;;62471:19:0::1;::::0;:42:::1;::::0;:44:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:19;:44;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;62471:44:0;;-1:-1:-1;;;;;;62526:25:0;::::1;::::0;;::::1;::::0;:51:::1;;;62570:7;-1:-1:-1::0;;;;;62555:22:0::1;:11;-1:-1:-1::0;;;;;62555:22:0::1;;;62526:51;62522:140;;;62585:71;62606:11;62619:1;62622:10;62634;62646:9;62585:20;:71::i;:::-;-1:-1:-1::0;;;;;62672:21:0;::::1;::::0;62668:204:::1;;62701:19;62738:7;-1:-1:-1::0;;;;;62723:22:0::1;:11;-1:-1:-1::0;;;;;62723:22:0::1;;;:39;;62761:1;62723:39;;;62748:10;62723:39;62701:61;;62768:71;62789:7;62798:14;62814:1;62817:10;62829:9;62768:20;:71::i;:::-;62668:204;;52600:1;;;;;61962:914:::0;:::o;60080:237::-;-1:-1:-1;;;;;60220:23:0;;;60170:10;60220:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;;60265:15;;;;;:47;;;60302:10;60284:15;:28;60265:47;60257:55;;60080:237;;;;;:::o;40727:110::-;40775:4;40815:14;;-1:-1:-1;;;;;40815:14:0;40799:12;:10;:12::i;:::-;-1:-1:-1;;;;;40799:30:0;;40792:37;;40727:110;:::o;68656:145::-;68755:8;:41;;;;;;;68656:145::o;56189:102::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56256:30:::1;56275:10;56256:18;:30::i;:::-;56189:102::o:0;42288:146::-;40525:17;:15;:17::i;:::-;40517:94;;;;-1:-1:-1;;;40517:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42386:21:::1;:40:::0;;;::::1;-1:-1:-1::0;;;;;42386:40:0;;;::::1;::::0;;;::::1;::::0;;42288:146::o;43814:159::-;43432:21;:19;:21::i;:::-;-1:-1:-1;;;;;43418:35:0;:10;-1:-1:-1;;;;;43418:35:0;;43410:86;;;;-1:-1:-1;;;43410:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43892:20:::1;:33:::0;;;::::1;::::0;;43941:24:::1;::::0;::::1;::::0;43923:1:::1;::::0;43941:24:::1;43814:159::o:0;43619:107::-;43698:20;;-1:-1:-1;;;;;43698:20:0;43619:107;:::o;49688:154::-;43432:21;:19;:21::i;:::-;-1:-1:-1;;;;;43418:35:0;:10;-1:-1:-1;;;;;43418:35:0;;43410:86;;;;-1:-1:-1;;;43410:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49791:43:::1;49819:14;49791:27;:43::i;:::-;49688:154:::0;:::o;44033:123::-;44114:20;;-1:-1:-1;;;;;44114:20:0;:34;44033:123;:::o;67685:137::-;67780:8;:37;;;;;;;67685:137::o;42802:110::-;42881:21;;-1:-1:-1;;;;;42881:21:0;42802:110;:::o;63066:116::-;-1:-1:-1;;;;;63158:19:0;;;63137:7;63158:19;;;:12;:19;;;;;;;;63066:116::o;64378:566::-;55013:19;;-1:-1:-1;;;;;55013:19:0;54991:10;:42;54983:93;;;;-1:-1:-1;;;54983:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52539:6:::1;::::0;;;::::1;;;52538:7;52530:57;;;;-1:-1:-1::0;;;52530:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64569:25:::2;;:::i;:::-;-1:-1:-1::0;64569:36:0::2;::::0;;::::2;::::0;::::2;::::0;;64597:8:::2;64569:36:::0;::::2;::::0;;::::2;::::0;;;;::::2;::::0;::::2;;::::0;::::2;::::0;;;;::::2;;::::0;;;;;;;-1:-1:-1;64634:65:0::2;64653:18:::0;64673:14;64569:36;64634:18:::2;:65::i;:::-;64709:74;::::0;;;;;::::2;::::0;::::2;::::0;;;;;;;;;;;64612:87;;-1:-1:-1;;;;;;64709:74:0;::::2;::::0;::::2;::::0;;;;;;;::::2;64790:17;::::0;:62:::2;::::0;;;;;-1:-1:-1;;;;;64790:62:0;;::::2;;::::0;::::2;::::0;;;;;;;;;:17;;;::::2;::::0;:36:::2;::::0;:62;;;;;:17:::2;::::0;:62;;;;;;;:17;;:62;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;64859:80;64882:8;64892:14;64908:19;64929:9;64859:22;:80::i;40281:95::-:0;40327:7;40354:14;-1:-1:-1;;;;;40354:14:0;40281:95;:::o;69113:447::-;69172:31;69208:39;69252:35;69297:25;;:::i;:::-;-1:-1:-1;;69297:36:0;;;;;;;;69325:8;69297:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69297:36:0;-1:-1:-1;69113:447:0:o;55690:340::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55770:28:::1;::::0;:63:::1;::::0;;;;;55822:10:::1;55770:63;::::0;::::1;::::0;;;55751:16:::1;::::0;-1:-1:-1;;;;;55770:28:0::1;::::0;:51:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;:28;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;55770:63:0;;-1:-1:-1;55878:20:0::1;55770:63:::0;55878:10:::1;:20::i;:::-;55877:21;55869:53;;;::::0;;-1:-1:-1;;;55869:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;55934:44;::::0;;55966:4:::1;55934:44:::0;;55972:5:::1;55934:44;::::0;::::1;::::0;;;-1:-1:-1;;;;;55934:44:0;::::1;::::0;::::1;::::0;;;;;;::::1;55985:17;::::0;:40:::1;::::0;;;;;-1:-1:-1;;;;;55985:40:0;;::::1;;::::0;::::1;::::0;;;:17;;;::::1;::::0;:30:::1;::::0;:40;;;;;::::1;::::0;;;;;;;;:17:::1;::::0;:40;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;55690:340:0:o;61077:679::-;61156:26;61184:24;61210:27;61239:19;61260:23;61285:32;61362:17;;;;;;;;;-1:-1:-1;;;;;61362:17:0;-1:-1:-1;;;;;61362:30:0;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61362:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61362:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61362:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61324:70;;;;;;;;;;;;61420:9;:16;61409:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61409:28:0;;61401:36;;61447:6;61442:310;61463:9;:16;61459:1;:20;61442:310;;;61492:18;61513:9;61523:1;61513:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61553:28:0;;;;;;;:16;:28;;;;;;:37;;;;;;;;;;;;;61513:12;;-1:-1:-1;61535:15:0;:55;61531:90;;;61610:4;61599:5;61605:1;61599:8;;;;;;;;:15;;;:8;;;;;;;;;;;:15;61531:90;61646:7;-1:-1:-1;;;;;61632:21:0;:10;-1:-1:-1;;;;;61632:21:0;;61628:119;;;61683:4;61662:25;;61724:13;61738:1;61724:16;;;;;;;;;;;;;;61694:46;;61628:119;-1:-1:-1;61481:3:0;;61442:310;;;;61077:679;;;;;;;:::o;68043:472::-;45196:21;:19;:21::i;:::-;45188:70;;;;-1:-1:-1;;;45188:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53514:6:::1;68180:55;::::0;::::1;;;68172:131;;;;-1:-1:-1::0;;;68172:131:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68387:8;:41:::0;68313:116:::1;::::0;;68387:41:::1;68313:116:::0;;::::1;::::0;;68387:41;;;::::1;::::0;;::::1;68313:116;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;68434:8;:76:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;68043:472::o;52395:90::-;52471:6;;;;;;;;52395:90::o;52155:116::-;45056:20;:18;:20::i;:::-;45048:68;;;;-1:-1:-1;;;45048:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52223:6:::1;:14:::0;;;::::1;::::0;;52253:10:::1;::::0;::::1;::::0;52232:5:::1;::::0;52253:10:::1;52155:116::o:0;57953:503::-;58201:28;;58272:17;;:32;;;;;;;;58009:26;;;;;;;;;;-1:-1:-1;;;;;58201:28:0;;;;58272:17;;:30;;:32;;;;;58146:52;;58272:32;;;;;;;:17;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;58272:32:0;;;;;;;;58321:64;;;;;;;;;;;;;;;;;;58234:70;;-1:-1:-1;58234:70:0;;-1:-1:-1;58234:70:0;;-1:-1:-1;;;;;;58321:53:0;;;;;58234:70;;58321:64;;-1:-1:-1;58321:64:0;;-1:-1:-1;58321:64:0;;;;;-1:-1:-1;58321:64:0;;;;-1:-1:-1;58321:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58321:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58309:76;;58396:29;-1:-1:-1;;;;;58396:44:0;;58441:9;58396:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58396:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58390:61;;57953:503;;;;;;:::o;41231:182::-;40525:17;:15;:17::i;:::-;40517:94;;;;-1:-1:-1;;;40517:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41364:1:::1;41340:14:::0;;41310:57:::1;::::0;-1:-1:-1;;;;;41340:14:0;;::::1;::::0;41310:57:::1;::::0;41364:1;;41310:57:::1;41403:1;41378:27:::0;;;::::1;::::0;;41231:182::o;66774:129::-;66865:8;:33;;;66774:129;:::o;67116:436::-;45196:21;:19;:21::i;:::-;45188:70;;;;-1:-1:-1;;;45188:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53514:6:::1;67245:51;::::0;::::1;;;67237:123;;;;-1:-1:-1::0;;;67237:123:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67436:8;:37:::0;67370:104:::1;::::0;;67436:37:::1;67370:104:::0;;::::1;::::0;;67436:37;;;::::1;::::0;;::::1;67370:104;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;67479:8;:68:::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;67116:436::o;58881:882::-;52539:6;;;;;;;52538:7;52530:57;;;;-1:-1:-1;;;52530:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59004:15:::1;58986:14;:33;;58978:90;;;;-1:-1:-1::0;;;58978:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59091:28;::::0;:63:::1;::::0;;;;;59143:10:::1;59091:63;::::0;::::1;::::0;;;59075:13:::1;::::0;-1:-1:-1;;;;;59091:28:0::1;::::0;:51:::1;::::0;:63;;;;;::::1;::::0;;;;;;;;:28;:63;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;59091:63:0;-1:-1:-1;;;;;59159:23:0;;::::1;;::::0;;;:16:::1;59091:63;59159:23:::0;;;;;;;:32;;::::1;::::0;;;;;;;;;;:49;;;59218;;;;;;;59091:63;;-1:-1:-1;59159:32:0;;:23;;59218:49:::1;::::0;;;;;;;::::1;59275:33;59310:31:::0;59343:27:::1;59374:17;;;;;;;;;-1:-1:-1::0;;;;;59374:17:0::1;-1:-1:-1::0;;;;;59374:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;;::::0;::::1;::::0;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;59374:32:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;59374:32:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;::::0;;-1:-1:-1;59374:32:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;::::0;::::1;;59274:132;;;;;;59413:17;59433:96;59472:16;59490:14;59506:13;59521:7;59433:38;:96::i;:::-;59413:116;;59538:12;59534:225;;;59558:53;59585:16;59603:7;59558:26;:53::i;:::-;59622:29;::::0;-1:-1:-1;;;;;59622:29:0;::::1;::::0;::::1;::::0;;;::::1;59664:44;::::0;;59695:5:::1;59664:44:::0;;;::::1;::::0;::::1;::::0;;;-1:-1:-1;;;;;59664:44:0;::::1;::::0;::::1;::::0;;;;;;::::1;59714:17;::::0;:39:::1;::::0;;;;;-1:-1:-1;;;;;59714:39:0;;::::1;;::::0;::::1;::::0;;;:17;;;::::1;::::0;:30:::1;::::0;:39;;;;;::::1;::::0;;;;;;;;:17:::1;::::0;:39;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;52600:1:0::1;;;;;58881:882:::0;;:::o;69889:200::-;43432:21;:19;:21::i;:::-;-1:-1:-1;;;;;43418:35:0;:10;-1:-1:-1;;;;;43418:35:0;;43410:86;;;;-1:-1:-1;;;43410:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70002:6:::1;69997:88;70014:20:::0;;::::1;69997:88;;;70047:32;70066:9;;70076:1;70066:12;;;;;;;;;;;;;-1:-1:-1::0;;;;;70066:12:0::1;70047:18;:32::i;:::-;70036:3;;69997:88;;51120:18:::0;;;;;;;;;:::o;42540:183::-;42019:21;;-1:-1:-1;;;;;42019:21:0;42005:10;:35;41997:87;;;;-1:-1:-1;;;41997:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42648:21:::1;::::0;42620:50:::1;::::0;-1:-1:-1;;;;;42648:21:0::1;42620:27;:50::i;:::-;42681:21;:34:::0;;;::::1;::::0;;42540:183::o;66218:392::-;45196:21;:19;:21::i;:::-;45188:70;;;;-1:-1:-1;;;45188:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53514:6:::1;66339:47;::::0;::::1;;;66331:107;;;;-1:-1:-1::0;;;66331:107:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66506:8;:33:::0;66448:92:::1;::::0;;66506:33:::1;66448:92:::0;;::::1;::::0;;66506:33;;::::1;66448:92;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;66545:8;:60:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;66218:392::o;65248:220::-;55174:28;;-1:-1:-1;;;;;55174:28:0;55152:10;:51;55144:113;;;;-1:-1:-1;;;55144:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52539:6:::1;::::0;;;::::1;;;52538:7;52530:57;;;;-1:-1:-1::0;;;52530:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65373:45:::2;::::0;;65405:5:::2;65373:45:::0;;;::::2;::::0;::::2;::::0;;;-1:-1:-1;;;;;65373:45:0;::::2;::::0;::::2;::::0;;;;;;::::2;65423:17;::::0;:40:::2;::::0;;;;;-1:-1:-1;;;;;65423:40:0;;::::2;;::::0;::::2;::::0;;;:17;;;::::2;::::0;:30:::2;::::0;:40;;;;;::::2;::::0;;;;;;;;:17:::2;::::0;:40;::::2;;::::0;::::2;;;;::::0;::::2;63620:298:::0;63695:13;63710:15;63727:24;63769:19;63780:7;63769:10;:19::i;:::-;-1:-1:-1;;;;;63806:36:0;;;;;;;:27;:36;;;;;;;;;;63869:19;;:44;;;;;;;63758:30;;-1:-1:-1;63806:36:0;;-1:-1:-1;63869:19:0;;;;:42;;:44;;;;;63806:36;;63869:44;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63869:44:0;63620:298;;;;-1:-1:-1;;63620:298:0:o;56701:398::-;56799:28;;:61;;;;;;-1:-1:-1;;;;;56799:61:0;;;;;;;;;56777:4;;56799:28;;;;;:51;;:61;;;;;;;;;;;;;;;:28;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56799:61:0;;-1:-1:-1;56902:20:0;56799:61;56902:10;:20::i;:::-;56898:50;;;-1:-1:-1;56937:5:0;56930:12;;56898:50;56979:45;;;;;;;;57015:8;56979:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;56954:22;;56979:45;;57005:8;;56979:25;:45::i;:::-;57036:17;;:58;;;;;;-1:-1:-1;;;;;57036:58:0;;;;;;;;;;;;;;;56954:70;;-1:-1:-1;57036:17:0;;;:32;;:58;;;;;;;;;;;;;;;:17;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57036:58:0;;56701:398;-1:-1:-1;;;56701:398:0:o;49558:122::-;49656:16;;-1:-1:-1;;;;;49656:16:0;49558:122;:::o;65720:209::-;55347:21;;-1:-1:-1;;;;;55347:21:0;55325:10;:44;55317:97;;;;-1:-1:-1;;;55317:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52539:6:::1;::::0;;;::::1;;;52538:7;52530:57;;;;-1:-1:-1::0;;;52530:57:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65858:17:::2;::::0;:66:::2;::::0;;;;;-1:-1:-1;;;;;65858:66:0;;::::2;;::::0;::::2;::::0;;::::2;;::::0;;;;;;:17;;;::::2;::::0;:43:::2;::::0;:66;;;;;:17:::2;::::0;:66;;;;;;;:17;;:66;::::2;;::::0;::::2;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;77391:340:::0;77473:22;:20;:22::i;:::-;77442:17;:54;;;;-1:-1:-1;;;;;77442:54:0;;;;;;;;;;77536:24;:22;:24::i;:::-;77501:19;:60;;;;-1:-1:-1;;;;;77501:60:0;;;;;;;;;;77620:34;:32;:34::i;:::-;77566:28;:89;;;;-1:-1:-1;;;;;77566:89:0;;;;;;;;;;77699:26;:24;:26::i;:::-;77660:21;:66;;;;-1:-1:-1;;;;;77660:66:0;;;;;;;;;;77391:340::o;53620:46::-;;;;;;;;;;;;;:::o;51829:111::-;45056:20;:18;:20::i;:::-;45048:68;;;;-1:-1:-1;;;45048:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51895:6:::1;:13:::0;;;::::1;::::0;::::1;::::0;;51924:8:::1;::::0;::::1;::::0;51895:13;;51924:8:::1;51829:111::o:0;49018:394::-;44901:9;:7;:9::i;:::-;44893:84;;;;-1:-1:-1;;;44893:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49192:16:::1;::::0;49131:49:::1;::::0;;;;;;;-1:-1:-1;;;;;49192:16:0;;::::1;::::0;49131:47;::::1;::::0;::::1;::::0;:49:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:47;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;49131:49:0;-1:-1:-1;;;;;49131:78:0::1;;49123:156;;;;-1:-1:-1::0;;;49123:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49290:16;:38:::0;;-1:-1:-1;;;;;49290:38:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;49344:60:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;49018:394:::0;:::o;71715:413::-;71882:19;;71929:48;;;;;;-1:-1:-1;;;;;71929:48:0;;;;;;;;;71817:22;;71882:19;;;;;71817:22;;71882:19;;71929:38;;:48;;;;;;;;;;;;;71882:19;71929:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71929:48:0;;;;;;72007;;;;;-1:-1:-1;;;;;72007:48:0;;;;;;;;;71929;;-1:-1:-1;71982:22:0;;72007:38;;;;;;:48;;;;;71929;;72007;;;;;;:38;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72007:48:0;;-1:-1:-1;72067:56:0;72086:9;72007:48;72113:9;72067:18;:56::i;:::-;72060:63;;;;;71715:413;;;;;:::o;76042:778::-;76218:19;76229:7;76218:10;:19::i;:::-;76214:43;;;76245:7;;76214:43;-1:-1:-1;;;;;76285:36:0;;76263:19;76285:36;;;:27;:36;;;;;;:94;;76361:17;;76285:66;;76331:19;76285:45;:66::i;:::-;:75;;:94::i;:::-;76263:116;;76386:21;76432:1;76410:19;:23;:139;;;;;76477:72;76529:19;76485:9;:38;;;76477:47;;:51;;:72;;;;:::i;:::-;76437:36;:11;53514:6;76437:15;:36::i;:::-;:112;;76410:139;76386:163;;76558:16;76554:205;;;-1:-1:-1;;;;;76582:26:0;;;;;;:17;:26;;;;;;:33;;;;76611:4;76582:33;;;76626:25;;;76582:26;76626:25;76664:44;;;76695:5;76664:44;;;;;;;;;-1:-1:-1;;;;;76664:44:0;;;;;;;;;;;76714:17;;:39;;;;;;-1:-1:-1;;;;;76714:39:0;;;;;;;;;:17;;;;;:30;;:39;;;;;;;;;;;;;;:17;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;76554:205:0;-1:-1:-1;;;;;;76765:36:0;;;;;;:27;:36;;;;;:50;76042:778;;;;;;:::o;39026:106::-;39114:10;39026:106;:::o;70424:468::-;70494:28;;:61;;;;;;-1:-1:-1;;;;;70494:61:0;;;;;;;;;:28;;;;;:51;;:61;;;;;;;;;;;;;;:28;:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70494:61:0;;-1:-1:-1;70600:20:0;70494:61;70600:10;:20::i;:::-;70599:21;70591:53;;;;;-1:-1:-1;;;70591:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;70656:43;;;70688:4;70656:43;;;;;;;;;-1:-1:-1;;;;;70656:43:0;;;;;;;;;;;70731:45;;;;;;;;70767:8;70731:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;70706:22;;70731:45;;70757:8;;70731:25;:45::i;:::-;70781:17;;70835:21;;:51;;;;;;-1:-1:-1;;;;;70835:51:0;;;;;;;;;70706:70;;-1:-1:-1;70781:17:0;;;;:27;;70809:8;;70706:70;;70835:21;;:41;;:51;;;;;;;;;;;;;;;:21;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70835:51:0;70781:106;;;;;;;;;;;-1:-1:-1;;;;;70781:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;70835:51;;70781:106;;;;;;;-1:-1:-1;70781:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;70424:468:0:o;41530:309::-;-1:-1:-1;;;;;41621:30:0;;41613:95;;;;-1:-1:-1;;;41613:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41754:14;;;41724:63;;-1:-1:-1;;;;;41724:63:0;;;;41754:14;;;41724:63;;;41798:14;:33;;;;-1:-1:-1;;;;;41798:33:0;;;;;;;;;;41530:309::o;70988:393::-;71108:7;71164:54;71183:9;:34;;;71164:54;;:14;:18;;:54;;;;:::i;:::-;71126:34;:9;53514:6;71126:13;:34::i;:::-;:92;71122:131;;-1:-1:-1;71233:14:0;71226:21;;71122:131;71303:34;;71264:74;;;;;;;:34;;:9;;53514:6;;71264:13;:34;:::i;:::-;:38;;:74::i;:::-;71257:81;;70988:393;;;;;;:::o;75159:419::-;-1:-1:-1;;;;;75320:19:0;;;75302:15;75320:19;;;:12;:19;;;;;;;75348:21;75344:34;;75371:7;;;75344:34;-1:-1:-1;;;;;75409:18:0;;75384:22;75409:18;;;:11;:18;;;;;;;75432:38;;;;75477:96;75498:7;75453:17;75409:18;75542:19;75563:9;75477:20;:96::i;76874:110::-;-1:-1:-1;;;;;76952:27:0;76934:4;76952:27;;;:17;:27;;;;;;;;;76874:110::o;46276:116::-;46330:4;46354:30;;;;;;;;;;;;;;;;;;:9;:30::i;:::-;46347:37;;46276:116;:::o;46093:114::-;46146:4;46170:29;;;;;;;;;;;;;;;;;;:9;:29::i;72784:1619::-;72949:4;72960:25;;:::i;:::-;-1:-1:-1;72960:36:0;;;;;;;;72988:8;72960:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;73233:777:0;73254:9;:16;73250:1;:20;73233:777;;;73292:9;73302:1;73292:12;;;;;;;;;;;;;;73283:21;;73324:7;73332:1;73324:10;;;;;;;;;;;;;;73310:24;;73356:7;-1:-1:-1;;;;;73346:17:0;:6;-1:-1:-1;;;;;73346:17:0;;:37;;;;;73367:13;73381:1;73367:16;;;;;;;;;;;;;;73346:37;73342:82;;;73413:4;73392:25;;73342:82;73453:36;:19;73477:11;73453:23;:36::i;:::-;73431:58;;73499:13;73513:1;73499:16;;;;;;;;;;;;;;73495:94;;;73546:36;:19;73570:11;73546:23;:36::i;:::-;73524:58;;73495:94;73597:10;73609:18;73631:35;73650:6;73658:7;73631:18;:35::i;:::-;73596:70;;;;73676:5;73672:333;;;73714:38;:21;73740:11;73714:25;:38::i;:::-;73690:62;;73763:13;73777:1;73763:16;;;;;;;;;;;;;;73759:118;;;73822:47;:30;73857:11;73822:34;:47::i;:::-;73789:80;;73759:118;73672:333;;;73893:15;;73889:116;;73965:16;:24;73982:6;-1:-1:-1;;;;;73965:24:0;-1:-1:-1;;;;;73965:24:0;;;;;;;;;;;;:33;73990:7;-1:-1:-1;;;;;73965:33:0;-1:-1:-1;;;;;73965:33:0;;;;;;;;;;;;73958:40;;;73889:116;-1:-1:-1;;73272:3:0;;73233:777;;;;74051:1;74029:19;:23;:157;;;;;74110:76;74166:19;74118:9;:42;;;74110:51;;:55;;:76;;;;:::i;:::-;74060:46;:21;53514:6;74060:25;:46::i;:::-;:126;;74029:157;74023:375;;;;74201:18;:49;;;;;74249:1;74227:19;:23;74201:49;:192;;;;;74317:76;74373:19;74325:9;:42;;;74317:51;;:55;;:76;;;;:::i;:::-;74258:55;:30;53514:6;74258:34;:55::i;:::-;:135;;74201:192;74016:382;72784:1619;-1:-1:-1;;;;;;;;;;;;;72784:1619:0:o;74624:216::-;74723:6;74718:118;74739:9;:16;74735:1;:20;74718:118;;;74810:1;74768:16;:30;74785:9;74795:1;74785:12;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;74768:30:0;;;;;;;;;;;;;;;;-1:-1:-1;74768:30:0;;;:39;;;;;;;;;;:43;74757:3;;74718:118;;46967:131;47049:16;;:41;;;;;;;;;;;;;;;;;;;;;;;;;47022:7;;-1:-1:-1;;;;;47049:16:0;;:28;;:41;;;;;;;;;;;:16;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47049:41:0;;-1:-1:-1;46967:131:0;:::o;47245:135::-;47329:16;;:43;;;;;;;;;;;;;;;;;;;;;;;;;47302:7;;-1:-1:-1;;;;;47329:16:0;;:28;;:43;;;;;;;;;;;:16;:43;;;;;;;;;;47388:155;47482:16;;:53;;;;;;;;;;;;;;;;;;;;;;;;;47455:7;;-1:-1:-1;;;;;47482:16:0;;:28;;:53;;;;;;;;;;;:16;:53;;;;;;;;;;47551:139;47637:16;;:45;;;;;;;;;;;;;;;;;;;;;;;;;47610:7;;-1:-1:-1;;;;;47637:16:0;;:28;;:45;;;;;;;;;;;:16;:45;;;;;;;;;;45411:185;45499:16;;45453:4;;-1:-1:-1;;;;;45499:16:0;45477:10;:39;;:72;;;45534:15;:13;:15::i;:::-;-1:-1:-1;;;;;45520:29:0;:10;-1:-1:-1;;;;;45520:29:0;;45477:72;:111;;;;45567:21;:19;:21::i;:::-;-1:-1:-1;;;;;45553:35:0;:10;-1:-1:-1;;;;;45553:35:0;;45470:118;;45411:185;:::o;1420:136::-;1478:7;1505:43;1509:1;1512;1505:43;;;;;;;;;;;;;;;;;:3;:43::i;956:181::-;1014:7;1046:5;;;1070:6;;;;1062:46;;;;;-1:-1:-1;;;1062:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:471;2368:7;2613:6;2609:47;;-1:-1:-1;2643:1:0;2636:8;;2609:47;2680:5;;;2684:1;2680;:5;:1;2704:5;;;;;:10;2696:56;;;;-1:-1:-1;;;2696:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3257:132;3315:7;3342:39;3346:1;3349;3342:39;;;;;;;;;;;;;;;;;:3;:39::i;45761:264::-;45878:16;;45823:4;;-1:-1:-1;;;;;45878:16:0;45912:9;:7;:9::i;:::-;:105;;;-1:-1:-1;;;;;;45925:41:0;;;;;;:92;;-1:-1:-1;45970:16:0;;:33;;;;;;;;;;;;;;;;;;;;46007:10;;-1:-1:-1;;;;;45970:16:0;;:27;;45998:4;;45970:33;;;;;;;;;;;;:16;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45970:33:0;-1:-1:-1;;;;;45970:47:0;;45905:112;45761:264;-1:-1:-1;;;45761:264:0:o;1859:192::-;1945:7;1981:12;1973:6;;;;1965:29;;;;-1:-1:-1;;;1965:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2017:5:0;;;1859:192::o;3885:278::-;3971:7;4006:12;3999:5;3991:28;;;;-1:-1:-1;;;3991:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4030:9;4046:1;4042;:5;;;;;;;3885:278;-1:-1:-1;;;;;3885:278:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://e2643d8debe01ae4182e08ac333b74b50c649fb45d8fb6b9be0f1cfff5d8d5ce

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.