ETH Price: $2,608.06 (-6.35%)

Contract

0x97072A4340467D6d2012140f1Dc425a16Bec6a0c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BalanceManager

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-16
*/

// SPDX-License-Identifier: (c) Armor.Fi DAO, 2021

pragma solidity ^0.6.6;

interface IKeeperRecipient {
    function keep() external;
}

interface IArmorMaster {
    function registerModule(bytes32 _key, address _module) external;
    function getModule(bytes32 _key) external view returns(address);
    function keep() external;
}

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 * 
 * @dev Completely default OpenZeppelin.
 */
contract Ownable {
    address private _owner;
    address private _pendingOwner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    function initializeOwnable() internal {
        require(_owner == address(0), "already initialized");
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), msg.sender);
    }


    /**
     * @return the address of the owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "msg.sender is not owner");
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;

    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _pendingOwner = newOwner;
    }

    function receiveOwnership() public {
        require(msg.sender == _pendingOwner, "only pending owner can call this function");
        _transferOwnership(_pendingOwner);
        _pendingOwner = address(0);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    uint256[50] private __gap;
}

library Bytes32 {
    function toString(bytes32 x) internal pure returns (string memory) {
        bytes memory bytesString = new bytes(32);
        uint charCount = 0;
        for (uint256 j = 0; j < 32; j++) {
            byte char = byte(bytes32(uint(x) * 2 ** (8 * j)));
            if (char != 0) {
                bytesString[charCount] = char;
                charCount++;
            }
        }
        bytes memory bytesStringTrimmed = new bytes(charCount);
        for (uint256 j = 0; j < charCount; j++) {
            bytesStringTrimmed[j] = bytesString[j];
        }
        return string(bytesStringTrimmed);
    }
}

/**
 * @dev Each arCore contract is a module to enable simple communication and interoperability. ArmorMaster.sol is master.
**/
contract ArmorModule {
    IArmorMaster internal _master;

    using Bytes32 for bytes32;

    modifier onlyOwner() {
        require(msg.sender == Ownable(address(_master)).owner(), "only owner can call this function");
        _;
    }

    modifier doKeep() {
        _master.keep();
        _;
    }

    modifier onlyModule(bytes32 _module) {
        string memory message = string(abi.encodePacked("only module ", _module.toString()," can call this function"));
        require(msg.sender == getModule(_module), message);
        _;
    }

    /**
     * @dev Used when multiple can call.
    **/
    modifier onlyModules(bytes32 _moduleOne, bytes32 _moduleTwo) {
        string memory message = string(abi.encodePacked("only module ", _moduleOne.toString()," or ", _moduleTwo.toString()," can call this function"));
        require(msg.sender == getModule(_moduleOne) || msg.sender == getModule(_moduleTwo), message);
        _;
    }

    function initializeModule(address _armorMaster) internal {
        require(address(_master) == address(0), "already initialized");
        require(_armorMaster != address(0), "master cannot be zero address");
        _master = IArmorMaster(_armorMaster);
    }

    function changeMaster(address _newMaster) external onlyOwner {
        _master = IArmorMaster(_newMaster);
    }

    function getModule(bytes32 _key) internal view returns(address) {
        return _master.getModule(_key);
    }
}

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 * 
 * @dev Default OpenZeppelin
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, reverts on 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-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
     * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Adds two unsigned integers, reverts on overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
     * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
     * reverts when dividing by zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}


/**
 * @title Balance Expire Traker
 * @dev Keeps track of expiration of user balances.
**/
contract BalanceExpireTracker {
    
    using SafeMath for uint64;
    using SafeMath for uint256;
    
    // Don't want to keep typing address(0). Typecasting just for clarity.
    uint160 private constant EMPTY = uint160(address(0));
    
    // 3 days for each step.
    uint64 public constant BUCKET_STEP = 3 days;

    // indicates where to start from 
    // points where TokenInfo with (expiredAt / BUCKET_STEP) == index
    mapping(uint64 => Bucket) public checkPoints;

    struct Bucket {
        uint160 head;
        uint160 tail;
    }

    // points first active nft
    uint160 public head;
    // points last active nft
    uint160 public tail;

    // maps expireId to deposit info
    mapping(uint160 => ExpireMetadata) public infos; 
    
    // pack data to reduce gas
    struct ExpireMetadata {
        uint160 next; // zero if there is no further information
        uint160 prev;
        uint64 expiresAt;
    }

    function expired() internal view returns(bool) {
        if(infos[head].expiresAt == 0) {
            return false;
        }

        if(infos[head].expiresAt <= uint64(now)){
            return true;
        }

        return false;
    }

    // using typecasted expireId to save gas
    function push(uint160 expireId, uint64 expiresAt) 
      internal 
    {
        require(expireId != EMPTY, "info id address(0) cannot be supported");

        // If this is a replacement for a current balance, remove it's current link first.
        if (infos[expireId].expiresAt > 0) pop(expireId);

        uint64 bucket = uint64( (expiresAt.div(BUCKET_STEP)).mul(BUCKET_STEP) );
        if (head == EMPTY) {
            // all the nfts are expired. so just add
            head = expireId;
            tail = expireId;
            checkPoints[bucket] = Bucket(expireId, expireId);
            infos[expireId] = ExpireMetadata(EMPTY,EMPTY,expiresAt);
            
            return;
        }
            
        // there is active nft. we need to find where to push
        // first check if this expires faster than head
        if (infos[head].expiresAt >= expiresAt) {
            // pushing nft is going to expire first
            // update head
            infos[head].prev = expireId;
            infos[expireId] = ExpireMetadata(head, EMPTY,expiresAt);
            head = expireId;
            
            // update head of bucket
            Bucket storage b = checkPoints[bucket];
            b.head = expireId;
                
            if(b.tail == EMPTY) {
                // if tail is zero, this bucket was empty should fill tail with expireId
                b.tail = expireId;
            }
                
            // this case can end now
            return;
        }
          
        // then check if depositing nft will last more than latest
        if (infos[tail].expiresAt <= expiresAt) {
            infos[tail].next = expireId;
            // push nft at tail
            infos[expireId] = ExpireMetadata(EMPTY,tail,expiresAt);
            tail = expireId;
            
            // update tail of bucket
            Bucket storage b = checkPoints[bucket];
            b.tail = expireId;
            
            if(b.head == EMPTY) {
              // if head is zero, this bucket was empty should fill head with expireId
              b.head = expireId;
            }
            
            // this case is done now
            return;
        }
          
        // so our nft is somewhere in between
        if (checkPoints[bucket].head != EMPTY) {
            //bucket is not empty
            //we just need to find our neighbor in the bucket
            uint160 cursor = checkPoints[bucket].head;
        
            // iterate until we find our nft's next
            while(infos[cursor].expiresAt < expiresAt){
                cursor = infos[cursor].next;
            }
        
            infos[expireId] = ExpireMetadata(cursor, infos[cursor].prev, expiresAt);
            infos[infos[cursor].prev].next = expireId;
            infos[cursor].prev = expireId;
        
            //now update bucket's head/tail data
            Bucket storage b = checkPoints[bucket];
            
            if (infos[b.head].prev == expireId){
                b.head = expireId;
            }
            
            if (infos[b.tail].next == expireId){
                b.tail = expireId;
            }
        } else {
            //bucket is empty
            //should find which bucket has depositing nft's closest neighbor
            // step 1 find prev bucket
            uint64 prevCursor = uint64( bucket.sub(BUCKET_STEP) );
            
            while(checkPoints[prevCursor].tail == EMPTY){
              prevCursor = uint64( prevCursor.sub(BUCKET_STEP) );
            }
    
            uint160 prev = checkPoints[prevCursor].tail;
            uint160 next = infos[prev].next;
    
            // step 2 link prev buckets tail - nft - next buckets head
            infos[expireId] = ExpireMetadata(next,prev,expiresAt);
            infos[prev].next = expireId;
            infos[next].prev = expireId;
    
            checkPoints[bucket].head = expireId;
            checkPoints[bucket].tail = expireId;
        }
    }

    function pop(uint160 expireId) internal {
        uint64 expiresAt = infos[expireId].expiresAt;
        uint64 bucket = uint64( (expiresAt.div(BUCKET_STEP)).mul(BUCKET_STEP) );
        // check if bucket is empty
        // if bucket is empty, end
        if(checkPoints[bucket].head == EMPTY){
            return;
        }
        // if bucket is not empty, iterate through
        // if expiresAt of current cursor is larger than expiresAt of parameter, reverts
        for(uint160 cursor = checkPoints[bucket].head; infos[cursor].expiresAt <= expiresAt; cursor = infos[cursor].next) {
            ExpireMetadata memory info = infos[cursor];
            // if expiresAt is same of paramter, check if expireId is same
            if(info.expiresAt == expiresAt && cursor == expireId) {
                // if yes, delete it
                // if cursor was head, move head to cursor.next
                if(head == cursor) {
                    head = info.next;
                }
                // if cursor was tail, move tail to cursor.prev
                if(tail == cursor) {
                    tail = info.prev;
                }
                // if cursor was head of bucket
                if(checkPoints[bucket].head == cursor){
                    // and cursor.next is still in same bucket, move head to cursor.next
                    if(infos[info.next].expiresAt.div(BUCKET_STEP) == bucket.div(BUCKET_STEP)){
                        checkPoints[bucket].head = info.next;
                    } else {
                        // delete whole checkpoint if bucket is now empty
                        delete checkPoints[bucket];
                    }
                } else if(checkPoints[bucket].tail == cursor){
                    // since bucket.tail == bucket.haed == cursor case is handled at the above,
                    // we only have to handle bucket.tail == cursor != bucket.head
                    checkPoints[bucket].tail = info.prev;
                }
                // now we handled all tail/head situation, we have to connect prev and next
                infos[info.prev].next = info.next;
                infos[info.next].prev = info.prev;
                // delete info and end
                delete infos[cursor];
                return;
            }
            // if not, continue -> since there can be same expires at with multiple expireId
        }
        //changed to return for consistency
        return;
        //revert("Info does not exist");
    }

    uint256[50] private __gap;
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IBalanceManager {
  event Deposit(address indexed user, uint256 amount);
  event Withdraw(address indexed user, uint256 amount);
  event Loss(address indexed user, uint256 amount);
  event PriceChange(address indexed user, uint256 price);
  event AffiliatePaid(address indexed affiliate, address indexed referral, uint256 amount, uint256 timestamp);
  event ReferralAdded(address indexed affiliate, address indexed referral, uint256 timestamp);
  function deposit(address _referrer) external payable;
  function withdraw(uint256 _amount) external;
  function initialize(address _armormaster, address _devWallet) external;
  function balanceOf(address _user) external view returns (uint256);
  function perSecondPrice(address _user) external view returns(uint256);
  function changePrice(address user, uint64 _newPricePerSec) external;
}

interface IPlanManager {
  // Event to notify frontend of plan update.
  event PlanUpdate(address indexed user, address[] protocols, uint256[] amounts, uint256 endTime);
  function initialize(address _armorManager) external;
  function changePrice(address _scAddress, uint256 _pricePerAmount) external;
  function updatePlan(address[] calldata _protocols, uint256[] calldata _coverAmounts) external;
  function checkCoverage(address _user, address _protocol, uint256 _hacktime, uint256 _amount) external view returns (uint256, bool);
  function coverageLeft(address _protocol) external view returns(uint256);
  function getCurrentPlan(address _user) external view returns(uint128 start, uint128 end);
  function updateExpireTime(address _user, uint256 _expiry) external;
  function planRedeemed(address _user, uint256 _planIndex, address _protocol) external;
  function totalUsedCover(address _scAddress) external view returns (uint256);
}

interface IRewardDistributionRecipient {
    function notifyRewardAmount(uint256 reward) payable external;
}

interface IRewardManager is IRewardDistributionRecipient {
  function initialize(address _rewardToken, address _stakeManager) external;
  function stake(address _user, uint256 _coverPrice, uint256 _nftId) external;
  function withdraw(address _user, uint256 _coverPrice, uint256 _nftId) external;
  function getReward(address payable _user) external;
}

interface IUtilizationFarm is IRewardDistributionRecipient {
  function initialize(address _rewardToken, address _stakeManager) external;
  function stake(address _user, uint256 _coverPrice) external;
  function withdraw(address _user, uint256 _coverPrice) external;
  function getReward(address payable _user) external;
}
/**
 * @dev BorrowManager is where borrowers do all their interaction and it holds funds
 *      until they're sent to the StakeManager.
 **/
contract BalanceManager is ArmorModule, IBalanceManager, BalanceExpireTracker {

    using SafeMath for uint256;
    using SafeMath for uint128;

    // Wallet of the developers for if a developer fee is being paid.
    address public devWallet;

    // With lastTime and secondPrice we can determine balance by second.
    struct Balance {
        uint64 lastTime;
        uint64 perSecondPrice;
        uint128 lastBalance;
    }
    
    // keep track of monthly payments and start/end of those
    mapping (address => Balance) public balances;

    // user => referrer
    mapping (address => address) public referrers;

    // Percent of funds that go to development--start with 0 and can change.
    uint128 public devPercent;

    // Percent of funds referrers receive. 20 = 2%.
    uint128 public refPercent;

    // Percent of funds given to governance stakers.
    uint128 public govPercent;

    // Denominator used to when distributing tokens 1000 == 100%
    uint128 public constant DENOMINATOR = 1000;

    // True if utilization farming is still ongoing
    bool public ufOn;

    // Mapping of shields so we don't reward them for U.F.
    mapping (address => bool) public arShields;
     
    // Block withdrawals within 1 hour of depositing.
    modifier onceAnHour {
        require(block.timestamp >= balances[msg.sender].lastTime.add(1 hours), "You must wait an hour after your last update to withdraw.");
        _;
    }

    /**
     * @dev Call updateBalance before any action is taken by a user.
     * @param _user The user whose balance we need to update.
     **/
    modifier update(address _user)
    {
        uint256 _oldBal = _updateBalance(_user);
        _;
        _updateBalanceActions(_user, _oldBal);
    }

    /**
     * @dev Keep function can be called by anyone to balances that have been expired. This pays out addresses and removes used cover.
     *      This is external because the doKeep modifier calls back to ArmorMaster, which then calls back to here (and elsewhere).
    **/
    function keep() external {
        // Restrict each keep to 2 removes max.
        for (uint256 i = 0; i < 2; i++) {
        
            if (infos[head].expiresAt != 0 && infos[head].expiresAt <= now) {
                address oldHead = address(head);
                uint256 oldBal = _updateBalance(oldHead);
                _updateBalanceActions(oldHead, oldBal);
            } else return;
            
        }
    }

    /**
     * @param _armorMaster Address of the ArmorMaster contract.
     **/
    function initialize(address _armorMaster, address _devWallet)
      external
      override
    {
        initializeModule(_armorMaster);
        devWallet = _devWallet;
        devPercent = 0;     // 0 %
        refPercent = 25;    // 2.5%
        govPercent = 0;     // 0%
        ufOn = true;
    }

    /**
     * @dev Borrower deposits an amount of ETH to pay for coverage.
     * @param _referrer User who referred the depositor.
    **/
    function deposit(address _referrer) 
      external
      payable
      override
      doKeep
      update(msg.sender)
    {
        if ( referrers[msg.sender] == address(0) ) {
            referrers[msg.sender] = _referrer != address(0) ? _referrer : devWallet;
            emit ReferralAdded(_referrer, msg.sender, block.timestamp);
        }
        
        require(msg.value > 0, "No Ether was deposited.");

        balances[msg.sender].lastBalance = uint128(balances[msg.sender].lastBalance.add(msg.value));
        emit Deposit(msg.sender, msg.value);
    }

    /**
     * @dev Borrower withdraws ETH from their balance.
     * @param _amount The amount of ETH to withdraw.
    **/
    function withdraw(uint256 _amount)
      external
      override
      onceAnHour
      doKeep
      update(msg.sender)
    {
        require(_amount > 0, "Must withdraw more than 0.");
        Balance memory balance = balances[msg.sender];

        // Since cost increases per second, it's difficult to estimate the correct amount. Withdraw it all in that case.
        if (balance.lastBalance > _amount) {
            balance.lastBalance = uint128( balance.lastBalance.sub(_amount) );
        } else {
            _amount = balance.lastBalance;
            balance.lastBalance = 0;
        }
        
        balances[msg.sender] = balance;
        msg.sender.transfer(_amount);
        emit Withdraw(msg.sender, _amount);
    }

    /**
     * @dev Find the current balance of a user to the second.
     * @param _user The user whose balance to find.
     **/
    function balanceOf(address _user)
      public
      view
      override
    returns (uint256)
    {
        Balance memory balance = balances[_user];

        // We adjust balance on chain based on how many blocks have passed.
        uint256 lastBalance = balance.lastBalance;

        uint256 timeElapsed = block.timestamp.sub(balance.lastTime);
        uint256 cost = timeElapsed.mul(balance.perSecondPrice);

        // If the elapsed time has brought balance to 0, make it 0.
        uint256 newBalance;
        if (lastBalance > cost) newBalance = lastBalance.sub(cost);
        else newBalance = 0;

        return newBalance;
    }

    /**
     * @dev Send funds to governanceStaker and rewardManager (don't want to have to send them with every transaction).
    **/
    function releaseFunds()
      public
    {
       uint256 govBalance = balances[getModule("GOVSTAKE")].lastBalance;
       // If staking contracts are sent too low of a reward, it can mess up distribution.
       if (govBalance >= 1 ether / 10) {
           IRewardManager(getModule("GOVSTAKE")).notifyRewardAmount{value: govBalance}(govBalance);
           balances[getModule("GOVSTAKE")].lastBalance = 0;
       }
       
       uint256 rewardBalance = balances[getModule("REWARD")].lastBalance;
       // If staking contracts are sent too low of a reward, it can mess up distribution.
       if (rewardBalance >= 1 ether / 10) {
           IRewardManager(getModule("REWARD")).notifyRewardAmount{value: rewardBalance}(rewardBalance);
           balances[getModule("REWARD")].lastBalance = 0;
       }
    }

    function perSecondPrice(address _user)
      external
      override
      view
    returns(uint256)
    {
        Balance memory balance = balances[_user];
        return balance.perSecondPrice;
    }
    
    /**
     * @dev PlanManager has the ability to change the price that a user is paying for their insurance.
     * @param _user The user whose price we are changing.
     * @param _newPrice the new price per second that the user will be paying.
     **/
    function changePrice(address _user, uint64 _newPrice)
      external
      override
      onlyModule("PLAN")
    {
        _updateBalance(_user);
        _priceChange(_user, _newPrice);
        if (_newPrice > 0) _adjustExpiry(_user, balances[_user].lastBalance.div(_newPrice).add(block.timestamp));
        else _adjustExpiry(_user, block.timestamp);
    }
    
    /**
     * @dev Update a borrower's balance to it's adjusted amount.
     * @param _user The address to be updated.
     **/
    function _updateBalance(address _user)
      internal
      returns (uint256 oldBalance)
    {
        Balance memory balance = balances[_user];

        oldBalance = balance.lastBalance;
        uint256 newBalance = balanceOf(_user);

        // newBalance should never be greater than last balance.
        uint256 loss = oldBalance.sub(newBalance);
    
        _payPercents(_user, uint128(loss));

        // Update storage balance.
        balance.lastBalance = uint128(newBalance);
        balance.lastTime = uint64(block.timestamp);
        emit Loss(_user, loss);
        
        balances[_user] = balance;
    }

    /**
     * @dev Actions relating to balance updates.
     * @param _user The user who we're updating.
     * @param _oldBal The original balance in the tx.
    **/
    function _updateBalanceActions(address _user, uint256 _oldBal)
      internal
    {
        Balance memory balance = balances[_user];
        if (_oldBal != balance.lastBalance && balance.perSecondPrice > 0) {
            _notifyBalanceChange(_user, balance.lastBalance, balance.perSecondPrice);
            _adjustExpiry(_user, balance.lastBalance.div(balance.perSecondPrice).add(block.timestamp));
        }
        if (balance.lastBalance == 0 && _oldBal != 0) {
            _priceChange(_user, 0);
        }
    }
    
    /**
     * @dev handle the user's balance change. this will interact with UFB
     * @param _user user's address
     * @param _newPrice user's new per sec price
     **/

    function _priceChange(address _user, uint64 _newPrice) 
      internal 
    {
        Balance memory balance = balances[_user];
        uint64 originalPrice = balance.perSecondPrice;
        
        if(originalPrice == _newPrice) {
            // no need to process
            return;
        }

        if (ufOn && !arShields[_user]) {
            if(originalPrice > _newPrice) {
                // price is decreasing
                IUtilizationFarm(getModule("UFB")).withdraw(_user, originalPrice.sub(_newPrice));
            } else {
                // price is increasing
                IUtilizationFarm(getModule("UFB")).stake(_user, _newPrice.sub(originalPrice));
            } 
        }
        
        balances[_user].perSecondPrice = _newPrice;
        emit PriceChange(_user, _newPrice);
    }
    
    /**
     * @dev Adjust when a balance expires.
     * @param _user Address of the user whose expiry we're adjusting.
     * @param _newExpiry New Unix timestamp of expiry.
    **/
    function _adjustExpiry(address _user, uint256 _newExpiry)
      internal
    {
        if (_newExpiry == block.timestamp) {
            BalanceExpireTracker.pop(uint160(_user));
        } else {
            BalanceExpireTracker.push(uint160(_user), uint64(_newExpiry));
        }
    }
    
    /**
     * @dev Balance has changed so PlanManager's expire time must be either increased or reduced.
    **/
    function _notifyBalanceChange(address _user, uint256 _newBalance, uint256 _newPerSec) 
      internal
    {
        uint256 expiry = _newBalance.div(_newPerSec).add(block.timestamp);
        IPlanManager(getModule("PLAN")).updateExpireTime(_user, expiry); 
    }
    
    /**
     * @dev Give rewards to different places.
     * @param _user User that's being charged.
     * @param _charged Amount of funds charged to the user.
    **/
    function _payPercents(address _user, uint128 _charged)
      internal
    {
        // percents: 20 = 2%.
        uint128 refAmount = referrers[_user] != address(0) ? _charged * refPercent / DENOMINATOR : 0;
        uint128 devAmount = _charged * devPercent / DENOMINATOR;
        uint128 govAmount = _charged * govPercent / DENOMINATOR;
        uint128 nftAmount = uint128( _charged.sub(refAmount).sub(devAmount).sub(govAmount) );
        
        if (refAmount > 0) {
            balances[ referrers[_user] ].lastBalance = uint128( balances[ referrers[_user] ].lastBalance.add(refAmount) );
            emit AffiliatePaid(referrers[_user], _user, refAmount, block.timestamp);
        }
        if (devAmount > 0) balances[devWallet].lastBalance = uint128( balances[devWallet].lastBalance.add(devAmount) );
        if (govAmount > 0) balances[getModule("GOVSTAKE")].lastBalance = uint128( balances[getModule("GOVSTAKE")].lastBalance.add(govAmount) );
        if (nftAmount > 0) balances[getModule("REWARD")].lastBalance = uint128( balances[getModule("REWARD")].lastBalance.add(nftAmount) );
    }
    
    /**
     * @dev Controller can change how much referrers are paid.
     * @param _newPercent New percent referrals receive from revenue. 100 == 10%.
    **/
    function changeRefPercent(uint128 _newPercent)
      external
      onlyOwner
    {
        require(_newPercent <= DENOMINATOR, "new percent cannot be bigger than DENOMINATOR");
        refPercent = _newPercent;
    }
    
    /**
     * @dev Controller can change how much governance is paid.
     * @param _newPercent New percent that governance will receive from revenue. 100 == 10%.
    **/
    function changeGovPercent(uint128 _newPercent)
      external
      onlyOwner
    {
        require(_newPercent <= DENOMINATOR, "new percent cannot be bigger than DENOMINATOR");
        govPercent = _newPercent;
    }
    
    /**
     * @dev Controller can change how much developers are paid.
     * @param _newPercent New percent that devs will receive from revenue. 100 == 10%.
    **/
    function changeDevPercent(uint128 _newPercent)
      external
      onlyOwner
    {
        require(_newPercent <= DENOMINATOR, "new percent cannot be bigger than DENOMINATOR");
        devPercent = _newPercent;
    }
    
    /**
     * @dev Toggle whether utilization farming should be on or off.
    **/
    function toggleUF()
      external
      onlyOwner
    {
        ufOn = !ufOn;
    }
    
    /**
     * @dev Toggle whether address is a shield.
    **/
    function toggleShield(address _shield)
      external
      onlyOwner
    {
        arShields[_shield] = !arShields[_shield];
    }

    // to reset the buckets
    function resetExpiry(uint160[] calldata _idxs) external onlyOwner {
        for(uint256 i = 0; i<_idxs.length; i++) {
            require(infos[_idxs[i]].expiresAt != 0, "not in linkedlist");
            BalanceExpireTracker.pop(_idxs[i]);
            BalanceExpireTracker.push(_idxs[i], infos[_idxs[i]].expiresAt);
        }
    }

    // set desired head and tail
    function _resetBucket(uint64 _bucket, uint160 _head, uint160 _tail) internal {
        require(_bucket % BUCKET_STEP == 0, "INVALID BUCKET");

        require(
            infos[infos[_tail].next].expiresAt >= _bucket + BUCKET_STEP &&
            infos[_tail].expiresAt < _bucket + BUCKET_STEP &&
            infos[_tail].expiresAt >= _bucket,
            "tail is not tail");
        require(
            infos[infos[_head].prev].expiresAt < _bucket &&
            infos[_head].expiresAt < _bucket + BUCKET_STEP &&
            infos[_head].expiresAt >= _bucket,
            "head is not head");
        checkPoints[_bucket].tail = _tail;
        checkPoints[_bucket].head = _head;
    }

    function resetBuckets(uint64[] calldata _buckets, uint160[] calldata _heads, uint160[] calldata _tails) external onlyOwner{
        for(uint256 i = 0 ; i < _buckets.length; i++){
            _resetBucket(_buckets[i], _heads[i], _tails[i]);
        }
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"address","name":"referral","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AffiliatePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Loss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"PriceChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"address","name":"referral","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ReferralAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"BUCKET_STEP","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DENOMINATOR","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"arShields","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint64","name":"lastTime","type":"uint64"},{"internalType":"uint64","name":"perSecondPrice","type":"uint64"},{"internalType":"uint128","name":"lastBalance","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newPercent","type":"uint128"}],"name":"changeDevPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newPercent","type":"uint128"}],"name":"changeGovPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMaster","type":"address"}],"name":"changeMaster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint64","name":"_newPrice","type":"uint64"}],"name":"changePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_newPercent","type":"uint128"}],"name":"changeRefPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"","type":"uint64"}],"name":"checkPoints","outputs":[{"internalType":"uint160","name":"head","type":"uint160"},{"internalType":"uint160","name":"tail","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"devPercent","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"govPercent","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"head","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint160","name":"","type":"uint160"}],"name":"infos","outputs":[{"internalType":"uint160","name":"next","type":"uint160"},{"internalType":"uint160","name":"prev","type":"uint160"},{"internalType":"uint64","name":"expiresAt","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_armorMaster","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"keep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"perSecondPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refPercent","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64[]","name":"_buckets","type":"uint64[]"},{"internalType":"uint160[]","name":"_heads","type":"uint160[]"},{"internalType":"uint160[]","name":"_tails","type":"uint160[]"}],"name":"resetBuckets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160[]","name":"_idxs","type":"uint160[]"}],"name":"resetExpiry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tail","outputs":[{"internalType":"uint160","name":"","type":"uint160"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_shield","type":"address"}],"name":"toggleShield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleUF","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ufOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506137fe806100206000396000f3fe6080604052600436106101cd5760003560e01c80638ea5220f116100f7578063d0ecab1511610095578063f340fa0111610064578063f340fa0114610805578063f4ff78bf1461082b578063f887f8621461085e578063fc3c28af14610891576101cd565b8063d0ecab1514610775578063d7693c07146107a8578063e4d06d82146107bd578063e55e8be9146107d2576101cd565b8063b4f54382116100d1578063b4f5438214610665578063bfdb8a4a14610698578063c6448410146106ad578063ce584bfa1461070f576101cd565b80638ea5220f146106265780638f7dcfa31461063b578063918f867414610650576101cd565b80634a3b68cc1161016f5780637115dc331161013e5780637115dc3314610448578063732986671461045d57806376ac760b1461049057806381beb60a1461050b576101cd565b80634a3b68cc1461038a57806359d5335b146103bd57806369d89575146103ee57806370a0823114610403576101cd565b80631c8b453f116101ab5780631c8b453f1461028e57806327e235e3146102bf5780632e1a7d4d14610325578063485cc9551461034f576101cd565b806313d8c840146101d2578063152b36e01461020357806319277b7d1461024a575b600080fd5b3480156101de57600080fd5b506101e76108a6565b604080516001600160a01b039092168252519081900360200190f35b34801561020f57600080fd5b506102366004803603602081101561022657600080fd5b50356001600160a01b03166108b5565b604080519115158252519081900360200190f35b34801561025657600080fd5b5061028c6004803603604081101561026d57600080fd5b5080356001600160a01b031690602001356001600160401b03166108ca565b005b34801561029a57600080fd5b506102a3610ab7565b604080516001600160401b039092168252519081900360200190f35b3480156102cb57600080fd5b506102f2600480360360208110156102e257600080fd5b50356001600160a01b0316610abe565b604080516001600160401b0394851681529290931660208301526001600160801b03168183015290519081900360600190f35b34801561033157600080fd5b5061028c6004803603602081101561034857600080fd5b5035610af7565b34801561035b57600080fd5b5061028c6004803603604081101561037257600080fd5b506001600160a01b0381358116916020013516610d97565b34801561039657600080fd5b506101e7600480360360208110156103ad57600080fd5b50356001600160a01b0316610dec565b3480156103c957600080fd5b506103d2610e07565b604080516001600160801b039092168252519081900360200190f35b3480156103fa57600080fd5b5061028c610e1d565b34801561040f57600080fd5b506104366004803603602081101561042657600080fd5b50356001600160a01b0316611047565b60408051918252519081900360200190f35b34801561045457600080fd5b506103d2611109565b34801561046957600080fd5b5061028c6004803603602081101561048057600080fd5b50356001600160801b0316611118565b34801561049c57600080fd5b5061028c600480360360208110156104b357600080fd5b810190602081018135600160201b8111156104cd57600080fd5b8201836020820111156104df57600080fd5b803590602001918460208302840111600160201b8311171561050057600080fd5b50909250905061123f565b34801561051757600080fd5b5061028c6004803603606081101561052e57600080fd5b810190602081018135600160201b81111561054857600080fd5b82018360208201111561055a57600080fd5b803590602001918460208302840111600160201b8311171561057b57600080fd5b919390929091602081019035600160201b81111561059857600080fd5b8201836020820111156105aa57600080fd5b803590602001918460208302840111600160201b831117156105cb57600080fd5b919390929091602081019035600160201b8111156105e857600080fd5b8201836020820111156105fa57600080fd5b803590602001918460208302840111600160201b8311171561061b57600080fd5b50909250905061143a565b34801561063257600080fd5b506101e7611570565b34801561064757600080fd5b506101e761157f565b34801561065c57600080fd5b506103d261158e565b34801561067157600080fd5b5061028c6004803603602081101561068857600080fd5b50356001600160801b0316611594565b3480156106a457600080fd5b506102366116be565b3480156106b957600080fd5b506106e0600480360360208110156106d057600080fd5b50356001600160401b03166116ce565b60405180836001600160a01b03168152602001826001600160a01b031681526020019250505060405180910390f35b34801561071b57600080fd5b506107426004803603602081101561073257600080fd5b50356001600160a01b03166116f4565b604080516001600160a01b0394851681529290931660208301526001600160401b03168183015290519081900360600190f35b34801561078157600080fd5b5061028c6004803603602081101561079857600080fd5b50356001600160a01b031661172c565b3480156107b457600080fd5b5061028c611813565b3480156107c957600080fd5b5061028c6118f2565b3480156107de57600080fd5b5061028c600480360360208110156107f557600080fd5b50356001600160801b03166119a9565b61028c6004803603602081101561081b57600080fd5b50356001600160a01b0316611ad3565b34801561083757600080fd5b5061028c6004803603602081101561084e57600080fd5b50356001600160a01b0316611cc7565b34801561086a57600080fd5b506104366004803603602081101561088157600080fd5b50356001600160a01b0316611da7565b34801561089d57600080fd5b506103d2611e0c565b6003546001600160a01b031681565b603c6020526000908152604090205460ff1681565b63282620a760e11b60606108dd82611e1b565b60405160200180806b037b7363c9036b7b23ab632960a51b815250600c0182805190602001908083835b602083106109265780518252601f199092019160209182019101610907565b6001836020036101000a038019825116818451168082178552505050505050905001807f2063616e2063616c6c20746869732066756e6374696f6e000000000000000000815250601701915050604051602081830303815290604052905061098d82611f36565b6001600160a01b0316336001600160a01b0316148190610a2b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109f05781810151838201526020016109d8565b50505050905090810190601f168015610a1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610a3584611fb5565b50610a40848461211a565b6001600160401b03831615610aa7576001600160a01b038416600090815260386020526040902054610aa2908590610a9d904290610a9790600160801b90046001600160801b03166001600160401b038916612385565b906123a9565b6123c2565b610ab1565b610ab184426123c2565b50505050565b6203f48081565b6038602052600090815260409020546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b33600090815260386020526040902054610b1c906001600160401b0316610e106123a9565b421015610b5a5760405162461bcd60e51b815260040180806020018281038252603981526020018061376a6039913960400191505060405180910390fd5b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015610b9b57600080fd5b505af1158015610baf573d6000803e3d6000fd5b50505050336000610bbf82611fb5565b905060008311610c16576040805162461bcd60e51b815260206004820152601a60248201527f4d757374207769746864726177206d6f7265207468616e20302e000000000000604482015290519081900360640190fd5b610c1e6136fb565b5033600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b031691810182905290841015610ca2576040810151610c8f906001600160801b0316856123e2565b6001600160801b03166040820152610cb9565b60408101805160009091526001600160801b031693505b33600081815260386020908152604080832085518154938701518784015167ffffffffffffffff199095166001600160401b039283161767ffffffffffffffff60401b1916600160401b9290911691909102176001600160801b03908116600160801b919094160292909217909155516108fc87150291879190818181858888f19350505050158015610d50573d6000803e3d6000fd5b5060408051858152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a250610d9282826123f7565b505050565b610da0826124ff565b603780546001600160a01b039092166001600160a01b031990921691909117905550601960801b603a55603b805470ffffffffffffffffffffffffffffffffff1916600160801b179055565b6039602052600090815260409020546001600160a01b031681565b603a54600160801b90046001600160801b031681565b600060386000610e3767474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a00008110610f3357610e8667474f565354414b4560c01b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b5050505050600060386000610efe67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b600060386000610f4b65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a0000811061104357610f9865149155d0549160d21b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610fdd57600080fd5b505af1158015610ff1573d6000803e3d6000fd5b505050505060006038600061100e65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b5050565b60006110516136fb565b506001600160a01b0382166000908152603860209081526040808320815160608101835290546001600160401b03808216808452600160401b830490911694830194909452600160801b90046001600160801b03169181018290529290916110ba9042906123e2565b905060006110de84602001516001600160401b0316836125ae90919063ffffffff16565b90506000818411156110fb576110f484836123e2565b90506110ff565b5060005b9695505050505050565b603b546001600160801b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116457600080fd5b505afa158015611178573d6000803e3d6000fd5b505050506040513d602081101561118e57600080fd5b50516001600160a01b031633146111d65760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b03821611156112205760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b03928316600160801b029216919091179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128b57600080fd5b505afa15801561129f573d6000803e3d6000fd5b505050506040513d60208110156112b557600080fd5b50516001600160a01b031633146112fd5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b81811015610d92576004600084848481811061131857fe5b602090810292909201356001600160a01b031683525081019190915260400160002060010154600160a01b90046001600160401b0316611393576040805162461bcd60e51b81526020600482015260116024820152701b9bdd081a5b881b1a5b9ad9591b1a5cdd607a1b604482015290519081900360640190fd5b6113b78383838181106113a257fe5b905060200201356001600160a01b03166125d5565b6114328383838181106113c657fe5b905060200201356001600160a01b0316600460008686868181106113e657fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060010160149054906101000a90046001600160401b031661299d565b600101611300565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d60208110156114b057600080fd5b50516001600160a01b031633146114f85760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b858110156115675761155f87878381811061151257fe5b905060200201356001600160401b031686868481811061152e57fe5b905060200201356001600160a01b031685858581811061154a57fe5b905060200201356001600160a01b031661309e565b6001016114fb565b50505050505050565b6037546001600160a01b031681565b6002546001600160a01b031681565b6103e881565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e057600080fd5b505afa1580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b50516001600160a01b031633146116525760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b038216111561169c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603b80546001600160801b0319166001600160801b0392909216919091179055565b603b54600160801b900460ff1681565b600160208190526000918252604090912080549101546001600160a01b03918216911682565b600460205260009081526040902080546001909101546001600160a01b0391821691811690600160a01b90046001600160401b031683565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177857600080fd5b505afa15801561178c573d6000803e3d6000fd5b505050506040513d60208110156117a257600080fd5b50516001600160a01b031633146117ea5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6001600160a01b03166000908152603c60205260409020805460ff19811660ff90911615179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d602081101561188957600080fd5b50516001600160a01b031633146118d15760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b603b805460ff60801b198116600160801b9182900460ff1615909102179055565b60005b60028110156119a5576002546001600160a01b0316600090815260046020526040902060010154600160a01b90046001600160401b03161580159061196857506002546001600160a01b031660009081526004602052604090206001015442600160a01b9091046001600160401b031611155b15611997576002546001600160a01b0316600061198482611fb5565b905061199082826123f7565b505061199d565b506119a7565b6001016118f5565b505b565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119f557600080fd5b505afa158015611a09573d6000803e3d6000fd5b505050506040513d6020811015611a1f57600080fd5b50516001600160a01b03163314611a675760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b0382161115611ab15760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b0319166001600160801b0392909216919091179055565b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050336000611b3882611fb5565b336000908152603960205260409020549091506001600160a01b0316611bdd576001600160a01b038316611b77576037546001600160a01b0316611b79565b825b3360008181526039602090815260409182902080546001600160a01b0319166001600160a01b039586161790558151428152915192938716927f3b54244fd9f24308e8af20c841d18d51e8bf31c6d418e821cbac2448146004569281900390910190a35b60003411611c32576040805162461bcd60e51b815260206004820152601760248201527f4e6f20457468657220776173206465706f73697465642e000000000000000000604482015290519081900360640190fd5b33600090815260386020526040902054611c5c90600160801b90046001600160801b0316346123a9565b3360008181526038602090815260409182902080546001600160801b03958616600160801b029516949094179093558051348152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a2610d9282826123f7565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1357600080fd5b505afa158015611d27573d6000803e3d6000fd5b505050506040513d6020811015611d3d57600080fd5b50516001600160a01b03163314611d855760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611db16136fb565b50506001600160a01b0316600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b820416928201839052600160801b90046001600160801b031692019190915290565b603a546001600160801b031681565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b6020811015611e99576008810260020a85026001600160f81b0319811615611e905780848481518110611e7257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101611e43565b506060816001600160401b0381118015611eb257600080fd5b506040519080825280601f01601f191660200182016040528015611edd576020820181803683370190505b50905060005b82811015611f2d57838181518110611ef757fe5b602001015160f81c60f81b828281518110611f0e57fe5b60200101906001600160f81b031916908160001a905350600101611ee3565b50949350505050565b60008054604080516385acd64160e01b81526004810185905290516001600160a01b03909216916385acd64191602480820192602092909190829003018186803b158015611f8357600080fd5b505afa158015611f97573d6000803e3d6000fd5b505050506040513d6020811015611fad57600080fd5b505192915050565b6000611fbf6136fb565b50506001600160a01b0381166000908152603860209081526040808320815160608101835290546001600160401b038082168352600160401b82041693820193909352600160801b9092046001600160801b03169082018190529161202384611047565b9050600061203184836123e2565b905061203d858261333a565b6001600160801b0382166040808501919091526001600160401b0342168452805182815290516001600160a01b038716917f72fba0ba07d937c660a3130fca36005c0e476cb97b6f00de413976e37eba9501919081900360200190a250506001600160a01b03929092166000908152603860209081526040918290208451815492860151939095015167ffffffffffffffff199092166001600160401b039586161767ffffffffffffffff60401b1916600160401b9590931694909402919091176001600160801b03908116600160801b91909216021790915590565b6121226136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82048116938301849052600160801b9091046001600160801b03169382019390935291831681141561218e575050611043565b603b54600160801b900460ff1680156121c057506001600160a01b0384166000908152603c602052604090205460ff16155b1561230957826001600160401b0316816001600160401b03161115612276576121ee622aa32160e91b611f36565b6001600160a01b031663f3fef3a3856122136001600160401b038581169088166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561225957600080fd5b505af115801561226d573d6000803e3d6000fd5b50505050612309565b612285622aa32160e91b611f36565b6001600160a01b031663adc9772e856122aa6001600160401b038781169086166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156122f057600080fd5b505af1158015612304573d6000803e3d6000fd5b505050505b6001600160a01b038416600081815260386020908152604091829020805467ffffffffffffffff60401b1916600160401b6001600160401b03891690810291909117909155825190815291517ffb97d390102d99a2a0210c7da4d6e15528ca897324a726106755393058ae27199281900390910190a250505050565b600080821161239357600080fd5b600082848161239e57fe5b049150505b92915050565b6000828201838110156123bb57600080fd5b9392505050565b428114156123d8576123d3826125d5565b611043565b611043828261299d565b6000828211156123f157600080fd5b50900390565b6123ff6136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b03169181018290529082148015906124765750600081602001516001600160401b0316115b156124d5576124a08382604001516001600160801b031683602001516001600160401b0316613665565b6124d583610a9d42610a9785602001516001600160401b031686604001516001600160801b031661238590919063ffffffff16565b60408101516001600160801b03161580156124ef57508115155b15610d9257610d9283600061211a565b6000546001600160a01b031615612553576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b6001600160a01b038116611d85576040805162461bcd60e51b815260206004820152601d60248201527f6d61737465722063616e6e6f74206265207a65726f2061646472657373000000604482015290519081900360640190fd5b6000826125bd575060006123a3565b828202828482816125ca57fe5b04146123bb57600080fd5b6001600160a01b038116600090815260046020526040812060010154600160a01b90046001600160401b0316906126196203f4806126138482612385565b906125ae565b6001600160401b0381166000908152600160205260409020549091506001600160a01b03166126495750506119a5565b6001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041611610ab1576126a96136fb565b506001600160a01b038082166000908152600460209081526040918290208251606081018452815485168152600190910154938416918101919091526001600160401b03600160a01b909304831691810182905291851614801561271e5750846001600160a01b0316826001600160a01b0316145b1561297c576002546001600160a01b038381169116141561275b578051600280546001600160a01b0319166001600160a01b039092169190911790555b6003546001600160a01b0383811691161415612796576020810151600380546001600160a01b0319166001600160a01b039092169190911790555b6001600160401b0383166000908152600160205260409020546001600160a01b038381169116141561288e576127d86001600160401b0384166203f480612385565b81516001600160a01b031660009081526004602052604090206001015461281290600160a01b90046001600160401b03166203f480612385565b14156128545780516001600160401b038416600090815260016020526040902080546001600160a01b0319166001600160a01b03909216919091179055612889565b6001600160401b038316600090815260016020819052604090912080546001600160a01b031990811682559101805490911690555b6128fe565b6001600160401b038316600090815260016020819052604090912001546001600160a01b03838116911614156128fe576020818101516001600160401b03851660009081526001928390526040902090910180546001600160a01b0319166001600160a01b039092169190911790555b8051602080830180516001600160a01b0390811660009081526004909352604080842080549583166001600160a01b03199687161790559151945181168352818320600190810180549683169686169690961790955594909416815292909220805490921682550180546001600160e01b0319169055506119a59050565b506001600160a01b039081166000908152600460205260409020541661266c565b6001600160a01b0382166129e25760405162461bcd60e51b81526004018080602001828103825260268152602001806137a36026913960400191505060405180910390fd5b6001600160a01b038216600090815260046020526040902060010154600160a01b90046001600160401b031615612a1c57612a1c826125d5565b6000612a386203f4806126136001600160401b03851682612385565b6002549091506001600160a01b0316612b2757600280546001600160a01b038086166001600160a01b031992831681179093556003805483168417905560408051808201825284815260208082018681526001600160401b039788166000908152600180845285822094518554908816908916178555915193820180549487169488169490941790935583516060810185528381528083018481528a8a168287019081529885526004909352939092209251835490851690861617835551910180549451909516600160a01b0267ffffffffffffffff60a01b1991909216939092169290921716179055611043565b6002546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041610612c5057600280546001600160a01b03908116600090815260046020818152604080842060019081018054878c166001600160a01b0319918216811790925583516060810185528954891681528086018881526001600160401b03808e16838801908152858b52988852868a2092518354908c169085161783559051918501805498518216600160a01b0267ffffffffffffffff60a01b19938c169985169990991792909216979097179055885481168217909855938816855291829052909220805490941617835582015416612c49576001810180546001600160a01b0319166001600160a01b0386161790555b5050611043565b6003546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041611612d7657600380546001600160a01b0390811660009081526004602081815260408084208054868b166001600160a01b031991821681179092558251606081018452868152885488168186019081526001600160401b03808d16838701908152858a5297875285892092518354908b1690851617835590516001928301805498518316600160a01b0267ffffffffffffffff60a01b19928c1699861699909917919091169790971790965588548216831790985593881685529186905290922093840180549091169091179055815416612c495780546001600160a01b0319166001600160a01b03851617905550611043565b6001600160401b0381166000908152600160205260409020546001600160a01b031615612f59576001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b909204161015612e16576001600160a01b0390811660009081526004602052604090205416612dc0565b604080516060810182526001600160a01b038084168083526000908152600460208181528583206001908101805486168388019081526001600160401b03808d16898b019081528e89168089528787528b89209a518b54908b166001600160a01b0319918216178c5593519a8601805492518416600160a01b0267ffffffffffffffff60a01b199c8c16938616939093179b909b1691909117909955825488168752898720805483168a1790558254909116881790915589168452808252868420805486168552929091529490912090930154161415612f0a5780546001600160a01b0319166001600160a01b0386161781555b60018101546001600160a01b0390811660009081526004602052604090205481169086161415612f52576001810180546001600160a01b0319166001600160a01b0387161790555b5050610d92565b6000612f716001600160401b0383166203f4806123e2565b90505b6001600160401b038116600090815260016020819052604090912001546001600160a01b0316612fbb57612fb46001600160401b0382166203f4806123e2565b9050612f74565b6001600160401b0390811660009081526001602081815260408084208301546001600160a01b039081168086526004808552838720805485516060810187529085168082528188019485528c8b168288019081528e8716808c52948952878b20925183549088166001600160a01b03199182161784559551928a01805491518d16600160a01b0267ffffffffffffffff60a01b199490981691871691909117929092169590951790558054831682179055918652828620850180548216831790559587168552918390529092208054841683178155018054909216179055505050565b6203f4806001600160401b038416066001600160401b03166000146130fb576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125108109550d2d15560921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526004602052604080822054909216815220600101546001600160401b036203f48085018116600160a01b909204161080159061317957506001600160a01b0381166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156131b357506001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6131f7576040805162461bcd60e51b815260206004820152601060248201526f1d185a5b081a5cc81b9bdd081d185a5b60821b604482015290519081900360640190fd5b6001600160a01b038083166000908152600460205260408082206001908101549093168252902001546001600160401b03808516600160a01b9092041610801561327357506001600160a01b0382166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156132ad57506001600160a01b0382166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6132f1576040805162461bcd60e51b815260206004820152601060248201526f1a195859081a5cc81b9bdd081a19585960821b604482015290519081900360640190fd5b6001600160401b0392909216600090815260016020819052604090912090810180546001600160a01b03199081166001600160a01b039586161790915581541691909216179055565b6001600160a01b03828116600090815260396020526040812054909116613362576000613380565b603a546103e890600160801b90046001600160801b03908116840216045b603a54603b549192506103e86001600160801b03918216850282168190049282168502821604906000906133cd90838116906133c7908681169082908a8116908a166123e2565b906123e2565b90506001600160801b038416156134b1576001600160a01b03808716600090815260396020908152604080832054909316825260389052205461342490600160801b90046001600160801b039081169086166123a9565b6001600160a01b0380881660008181526039602081815260408084208054871685526038835281852080546001600160801b03998a16600160801b02908a161790559385905291815291548151958a16865242928601929092528051929491909316927fe9e95d6b3dc15e526a9ab8a4879c79c909fd2e3bcf54e63be438051baba8487692918290030190a35b6001600160801b0383161561352f576037546001600160a01b03166000908152603860205260409020546134f990600160801b90046001600160801b039081169085166123a9565b6037546001600160a01b0316600090815260386020526040902080546001600160801b03928316600160801b0292169190911790555b6001600160801b038216156135e057613593826001600160801b03166038600061356367474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316906123a9565b603860006135ab67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b6001600160801b0381161561365d57613612816001600160801b03166038600061356365149155d0549160d21b611f36565b6038600061362865149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b505050505050565b600061367542610a978585612385565b905061368763282620a760e11b611f36565b6001600160a01b031663e2872fd685836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b5050505050505050565b60408051606081018252600080825260208201819052918101919091529056fe6e65772070657263656e742063616e6e6f7420626520626967676572207468616e2044454e4f4d494e41544f526f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e596f75206d757374207761697420616e20686f757220616674657220796f7572206c6173742075706461746520746f2077697468647261772e696e666f20696420616464726573732830292063616e6e6f7420626520737570706f72746564a26469706673582212206c80c0fe53f2b25936fd840944caa4ac8a12a493707317615caaadb96ab3aa2a64736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80638ea5220f116100f7578063d0ecab1511610095578063f340fa0111610064578063f340fa0114610805578063f4ff78bf1461082b578063f887f8621461085e578063fc3c28af14610891576101cd565b8063d0ecab1514610775578063d7693c07146107a8578063e4d06d82146107bd578063e55e8be9146107d2576101cd565b8063b4f54382116100d1578063b4f5438214610665578063bfdb8a4a14610698578063c6448410146106ad578063ce584bfa1461070f576101cd565b80638ea5220f146106265780638f7dcfa31461063b578063918f867414610650576101cd565b80634a3b68cc1161016f5780637115dc331161013e5780637115dc3314610448578063732986671461045d57806376ac760b1461049057806381beb60a1461050b576101cd565b80634a3b68cc1461038a57806359d5335b146103bd57806369d89575146103ee57806370a0823114610403576101cd565b80631c8b453f116101ab5780631c8b453f1461028e57806327e235e3146102bf5780632e1a7d4d14610325578063485cc9551461034f576101cd565b806313d8c840146101d2578063152b36e01461020357806319277b7d1461024a575b600080fd5b3480156101de57600080fd5b506101e76108a6565b604080516001600160a01b039092168252519081900360200190f35b34801561020f57600080fd5b506102366004803603602081101561022657600080fd5b50356001600160a01b03166108b5565b604080519115158252519081900360200190f35b34801561025657600080fd5b5061028c6004803603604081101561026d57600080fd5b5080356001600160a01b031690602001356001600160401b03166108ca565b005b34801561029a57600080fd5b506102a3610ab7565b604080516001600160401b039092168252519081900360200190f35b3480156102cb57600080fd5b506102f2600480360360208110156102e257600080fd5b50356001600160a01b0316610abe565b604080516001600160401b0394851681529290931660208301526001600160801b03168183015290519081900360600190f35b34801561033157600080fd5b5061028c6004803603602081101561034857600080fd5b5035610af7565b34801561035b57600080fd5b5061028c6004803603604081101561037257600080fd5b506001600160a01b0381358116916020013516610d97565b34801561039657600080fd5b506101e7600480360360208110156103ad57600080fd5b50356001600160a01b0316610dec565b3480156103c957600080fd5b506103d2610e07565b604080516001600160801b039092168252519081900360200190f35b3480156103fa57600080fd5b5061028c610e1d565b34801561040f57600080fd5b506104366004803603602081101561042657600080fd5b50356001600160a01b0316611047565b60408051918252519081900360200190f35b34801561045457600080fd5b506103d2611109565b34801561046957600080fd5b5061028c6004803603602081101561048057600080fd5b50356001600160801b0316611118565b34801561049c57600080fd5b5061028c600480360360208110156104b357600080fd5b810190602081018135600160201b8111156104cd57600080fd5b8201836020820111156104df57600080fd5b803590602001918460208302840111600160201b8311171561050057600080fd5b50909250905061123f565b34801561051757600080fd5b5061028c6004803603606081101561052e57600080fd5b810190602081018135600160201b81111561054857600080fd5b82018360208201111561055a57600080fd5b803590602001918460208302840111600160201b8311171561057b57600080fd5b919390929091602081019035600160201b81111561059857600080fd5b8201836020820111156105aa57600080fd5b803590602001918460208302840111600160201b831117156105cb57600080fd5b919390929091602081019035600160201b8111156105e857600080fd5b8201836020820111156105fa57600080fd5b803590602001918460208302840111600160201b8311171561061b57600080fd5b50909250905061143a565b34801561063257600080fd5b506101e7611570565b34801561064757600080fd5b506101e761157f565b34801561065c57600080fd5b506103d261158e565b34801561067157600080fd5b5061028c6004803603602081101561068857600080fd5b50356001600160801b0316611594565b3480156106a457600080fd5b506102366116be565b3480156106b957600080fd5b506106e0600480360360208110156106d057600080fd5b50356001600160401b03166116ce565b60405180836001600160a01b03168152602001826001600160a01b031681526020019250505060405180910390f35b34801561071b57600080fd5b506107426004803603602081101561073257600080fd5b50356001600160a01b03166116f4565b604080516001600160a01b0394851681529290931660208301526001600160401b03168183015290519081900360600190f35b34801561078157600080fd5b5061028c6004803603602081101561079857600080fd5b50356001600160a01b031661172c565b3480156107b457600080fd5b5061028c611813565b3480156107c957600080fd5b5061028c6118f2565b3480156107de57600080fd5b5061028c600480360360208110156107f557600080fd5b50356001600160801b03166119a9565b61028c6004803603602081101561081b57600080fd5b50356001600160a01b0316611ad3565b34801561083757600080fd5b5061028c6004803603602081101561084e57600080fd5b50356001600160a01b0316611cc7565b34801561086a57600080fd5b506104366004803603602081101561088157600080fd5b50356001600160a01b0316611da7565b34801561089d57600080fd5b506103d2611e0c565b6003546001600160a01b031681565b603c6020526000908152604090205460ff1681565b63282620a760e11b60606108dd82611e1b565b60405160200180806b037b7363c9036b7b23ab632960a51b815250600c0182805190602001908083835b602083106109265780518252601f199092019160209182019101610907565b6001836020036101000a038019825116818451168082178552505050505050905001807f2063616e2063616c6c20746869732066756e6374696f6e000000000000000000815250601701915050604051602081830303815290604052905061098d82611f36565b6001600160a01b0316336001600160a01b0316148190610a2b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156109f05781810151838201526020016109d8565b50505050905090810190601f168015610a1d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50610a3584611fb5565b50610a40848461211a565b6001600160401b03831615610aa7576001600160a01b038416600090815260386020526040902054610aa2908590610a9d904290610a9790600160801b90046001600160801b03166001600160401b038916612385565b906123a9565b6123c2565b610ab1565b610ab184426123c2565b50505050565b6203f48081565b6038602052600090815260409020546001600160401b0380821691600160401b810490911690600160801b90046001600160801b031683565b33600090815260386020526040902054610b1c906001600160401b0316610e106123a9565b421015610b5a5760405162461bcd60e51b815260040180806020018281038252603981526020018061376a6039913960400191505060405180910390fd5b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015610b9b57600080fd5b505af1158015610baf573d6000803e3d6000fd5b50505050336000610bbf82611fb5565b905060008311610c16576040805162461bcd60e51b815260206004820152601a60248201527f4d757374207769746864726177206d6f7265207468616e20302e000000000000604482015290519081900360640190fd5b610c1e6136fb565b5033600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b031691810182905290841015610ca2576040810151610c8f906001600160801b0316856123e2565b6001600160801b03166040820152610cb9565b60408101805160009091526001600160801b031693505b33600081815260386020908152604080832085518154938701518784015167ffffffffffffffff199095166001600160401b039283161767ffffffffffffffff60401b1916600160401b9290911691909102176001600160801b03908116600160801b919094160292909217909155516108fc87150291879190818181858888f19350505050158015610d50573d6000803e3d6000fd5b5060408051858152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a250610d9282826123f7565b505050565b610da0826124ff565b603780546001600160a01b039092166001600160a01b031990921691909117905550601960801b603a55603b805470ffffffffffffffffffffffffffffffffff1916600160801b179055565b6039602052600090815260409020546001600160a01b031681565b603a54600160801b90046001600160801b031681565b600060386000610e3767474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a00008110610f3357610e8667474f565354414b4560c01b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610ecb57600080fd5b505af1158015610edf573d6000803e3d6000fd5b5050505050600060386000610efe67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b600060386000610f4b65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316905067016345785d8a0000811061104357610f9865149155d0549160d21b611f36565b6001600160a01b0316633c6b16ab82836040518363ffffffff1660e01b8152600401808281526020019150506000604051808303818588803b158015610fdd57600080fd5b505af1158015610ff1573d6000803e3d6000fd5b505050505060006038600061100e65149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b5050565b60006110516136fb565b506001600160a01b0382166000908152603860209081526040808320815160608101835290546001600160401b03808216808452600160401b830490911694830194909452600160801b90046001600160801b03169181018290529290916110ba9042906123e2565b905060006110de84602001516001600160401b0316836125ae90919063ffffffff16565b90506000818411156110fb576110f484836123e2565b90506110ff565b5060005b9695505050505050565b603b546001600160801b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561116457600080fd5b505afa158015611178573d6000803e3d6000fd5b505050506040513d602081101561118e57600080fd5b50516001600160a01b031633146111d65760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b03821611156112205760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b03928316600160801b029216919091179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561128b57600080fd5b505afa15801561129f573d6000803e3d6000fd5b505050506040513d60208110156112b557600080fd5b50516001600160a01b031633146112fd5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b81811015610d92576004600084848481811061131857fe5b602090810292909201356001600160a01b031683525081019190915260400160002060010154600160a01b90046001600160401b0316611393576040805162461bcd60e51b81526020600482015260116024820152701b9bdd081a5b881b1a5b9ad9591b1a5cdd607a1b604482015290519081900360640190fd5b6113b78383838181106113a257fe5b905060200201356001600160a01b03166125d5565b6114328383838181106113c657fe5b905060200201356001600160a01b0316600460008686868181106113e657fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060010160149054906101000a90046001600160401b031661299d565b600101611300565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561148657600080fd5b505afa15801561149a573d6000803e3d6000fd5b505050506040513d60208110156114b057600080fd5b50516001600160a01b031633146114f85760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b60005b858110156115675761155f87878381811061151257fe5b905060200201356001600160401b031686868481811061152e57fe5b905060200201356001600160a01b031685858581811061154a57fe5b905060200201356001600160a01b031661309e565b6001016114fb565b50505050505050565b6037546001600160a01b031681565b6002546001600160a01b031681565b6103e881565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e057600080fd5b505afa1580156115f4573d6000803e3d6000fd5b505050506040513d602081101561160a57600080fd5b50516001600160a01b031633146116525760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b038216111561169c5760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603b80546001600160801b0319166001600160801b0392909216919091179055565b603b54600160801b900460ff1681565b600160208190526000918252604090912080549101546001600160a01b03918216911682565b600460205260009081526040902080546001909101546001600160a01b0391821691811690600160a01b90046001600160401b031683565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561177857600080fd5b505afa15801561178c573d6000803e3d6000fd5b505050506040513d60208110156117a257600080fd5b50516001600160a01b031633146117ea5760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6001600160a01b03166000908152603c60205260409020805460ff19811660ff90911615179055565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d602081101561188957600080fd5b50516001600160a01b031633146118d15760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b603b805460ff60801b198116600160801b9182900460ff1615909102179055565b60005b60028110156119a5576002546001600160a01b0316600090815260046020526040902060010154600160a01b90046001600160401b03161580159061196857506002546001600160a01b031660009081526004602052604090206001015442600160a01b9091046001600160401b031611155b15611997576002546001600160a01b0316600061198482611fb5565b905061199082826123f7565b505061199d565b506119a7565b6001016118f5565b505b565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119f557600080fd5b505afa158015611a09573d6000803e3d6000fd5b505050506040513d6020811015611a1f57600080fd5b50516001600160a01b03163314611a675760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b6103e86001600160801b0382161115611ab15760405162461bcd60e51b815260040180806020018281038252602d81526020018061371c602d913960400191505060405180910390fd5b603a80546001600160801b0319166001600160801b0392909216919091179055565b600080546040805163726836c160e11b815290516001600160a01b039092169263e4d06d829260048084019382900301818387803b158015611b1457600080fd5b505af1158015611b28573d6000803e3d6000fd5b50505050336000611b3882611fb5565b336000908152603960205260409020549091506001600160a01b0316611bdd576001600160a01b038316611b77576037546001600160a01b0316611b79565b825b3360008181526039602090815260409182902080546001600160a01b0319166001600160a01b039586161790558151428152915192938716927f3b54244fd9f24308e8af20c841d18d51e8bf31c6d418e821cbac2448146004569281900390910190a35b60003411611c32576040805162461bcd60e51b815260206004820152601760248201527f4e6f20457468657220776173206465706f73697465642e000000000000000000604482015290519081900360640190fd5b33600090815260386020526040902054611c5c90600160801b90046001600160801b0316346123a9565b3360008181526038602090815260409182902080546001600160801b03958616600160801b029516949094179093558051348152905191927fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c92918290030190a2610d9282826123f7565b60008054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611d1357600080fd5b505afa158015611d27573d6000803e3d6000fd5b505050506040513d6020811015611d3d57600080fd5b50516001600160a01b03163314611d855760405162461bcd60e51b81526004018080602001828103825260218152602001806137496021913960400191505060405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000611db16136fb565b50506001600160a01b0316600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b820416928201839052600160801b90046001600160801b031692019190915290565b603a546001600160801b031681565b6040805160208082528183019092526060918291906020820181803683370190505090506000805b6020811015611e99576008810260020a85026001600160f81b0319811615611e905780848481518110611e7257fe5b60200101906001600160f81b031916908160001a9053506001909201915b50600101611e43565b506060816001600160401b0381118015611eb257600080fd5b506040519080825280601f01601f191660200182016040528015611edd576020820181803683370190505b50905060005b82811015611f2d57838181518110611ef757fe5b602001015160f81c60f81b828281518110611f0e57fe5b60200101906001600160f81b031916908160001a905350600101611ee3565b50949350505050565b60008054604080516385acd64160e01b81526004810185905290516001600160a01b03909216916385acd64191602480820192602092909190829003018186803b158015611f8357600080fd5b505afa158015611f97573d6000803e3d6000fd5b505050506040513d6020811015611fad57600080fd5b505192915050565b6000611fbf6136fb565b50506001600160a01b0381166000908152603860209081526040808320815160608101835290546001600160401b038082168352600160401b82041693820193909352600160801b9092046001600160801b03169082018190529161202384611047565b9050600061203184836123e2565b905061203d858261333a565b6001600160801b0382166040808501919091526001600160401b0342168452805182815290516001600160a01b038716917f72fba0ba07d937c660a3130fca36005c0e476cb97b6f00de413976e37eba9501919081900360200190a250506001600160a01b03929092166000908152603860209081526040918290208451815492860151939095015167ffffffffffffffff199092166001600160401b039586161767ffffffffffffffff60401b1916600160401b9590931694909402919091176001600160801b03908116600160801b91909216021790915590565b6121226136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82048116938301849052600160801b9091046001600160801b03169382019390935291831681141561218e575050611043565b603b54600160801b900460ff1680156121c057506001600160a01b0384166000908152603c602052604090205460ff16155b1561230957826001600160401b0316816001600160401b03161115612276576121ee622aa32160e91b611f36565b6001600160a01b031663f3fef3a3856122136001600160401b038581169088166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561225957600080fd5b505af115801561226d573d6000803e3d6000fd5b50505050612309565b612285622aa32160e91b611f36565b6001600160a01b031663adc9772e856122aa6001600160401b038781169086166123e2565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156122f057600080fd5b505af1158015612304573d6000803e3d6000fd5b505050505b6001600160a01b038416600081815260386020908152604091829020805467ffffffffffffffff60401b1916600160401b6001600160401b03891690810291909117909155825190815291517ffb97d390102d99a2a0210c7da4d6e15528ca897324a726106755393058ae27199281900390910190a250505050565b600080821161239357600080fd5b600082848161239e57fe5b049150505b92915050565b6000828201838110156123bb57600080fd5b9392505050565b428114156123d8576123d3826125d5565b611043565b611043828261299d565b6000828211156123f157600080fd5b50900390565b6123ff6136fb565b506001600160a01b038216600090815260386020908152604091829020825160608101845290546001600160401b038082168352600160401b82041692820192909252600160801b9091046001600160801b03169181018290529082148015906124765750600081602001516001600160401b0316115b156124d5576124a08382604001516001600160801b031683602001516001600160401b0316613665565b6124d583610a9d42610a9785602001516001600160401b031686604001516001600160801b031661238590919063ffffffff16565b60408101516001600160801b03161580156124ef57508115155b15610d9257610d9283600061211a565b6000546001600160a01b031615612553576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b6001600160a01b038116611d85576040805162461bcd60e51b815260206004820152601d60248201527f6d61737465722063616e6e6f74206265207a65726f2061646472657373000000604482015290519081900360640190fd5b6000826125bd575060006123a3565b828202828482816125ca57fe5b04146123bb57600080fd5b6001600160a01b038116600090815260046020526040812060010154600160a01b90046001600160401b0316906126196203f4806126138482612385565b906125ae565b6001600160401b0381166000908152600160205260409020549091506001600160a01b03166126495750506119a5565b6001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041611610ab1576126a96136fb565b506001600160a01b038082166000908152600460209081526040918290208251606081018452815485168152600190910154938416918101919091526001600160401b03600160a01b909304831691810182905291851614801561271e5750846001600160a01b0316826001600160a01b0316145b1561297c576002546001600160a01b038381169116141561275b578051600280546001600160a01b0319166001600160a01b039092169190911790555b6003546001600160a01b0383811691161415612796576020810151600380546001600160a01b0319166001600160a01b039092169190911790555b6001600160401b0383166000908152600160205260409020546001600160a01b038381169116141561288e576127d86001600160401b0384166203f480612385565b81516001600160a01b031660009081526004602052604090206001015461281290600160a01b90046001600160401b03166203f480612385565b14156128545780516001600160401b038416600090815260016020526040902080546001600160a01b0319166001600160a01b03909216919091179055612889565b6001600160401b038316600090815260016020819052604090912080546001600160a01b031990811682559101805490911690555b6128fe565b6001600160401b038316600090815260016020819052604090912001546001600160a01b03838116911614156128fe576020818101516001600160401b03851660009081526001928390526040902090910180546001600160a01b0319166001600160a01b039092169190911790555b8051602080830180516001600160a01b0390811660009081526004909352604080842080549583166001600160a01b03199687161790559151945181168352818320600190810180549683169686169690961790955594909416815292909220805490921682550180546001600160e01b0319169055506119a59050565b506001600160a01b039081166000908152600460205260409020541661266c565b6001600160a01b0382166129e25760405162461bcd60e51b81526004018080602001828103825260268152602001806137a36026913960400191505060405180910390fd5b6001600160a01b038216600090815260046020526040902060010154600160a01b90046001600160401b031615612a1c57612a1c826125d5565b6000612a386203f4806126136001600160401b03851682612385565b6002549091506001600160a01b0316612b2757600280546001600160a01b038086166001600160a01b031992831681179093556003805483168417905560408051808201825284815260208082018681526001600160401b039788166000908152600180845285822094518554908816908916178555915193820180549487169488169490941790935583516060810185528381528083018481528a8a168287019081529885526004909352939092209251835490851690861617835551910180549451909516600160a01b0267ffffffffffffffff60a01b1991909216939092169290921716179055611043565b6002546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041610612c5057600280546001600160a01b03908116600090815260046020818152604080842060019081018054878c166001600160a01b0319918216811790925583516060810185528954891681528086018881526001600160401b03808e16838801908152858b52988852868a2092518354908c169085161783559051918501805498518216600160a01b0267ffffffffffffffff60a01b19938c169985169990991792909216979097179055885481168217909855938816855291829052909220805490941617835582015416612c49576001810180546001600160a01b0319166001600160a01b0386161790555b5050611043565b6003546001600160a01b03166000908152600460205260409020600101546001600160401b03808416600160a01b9092041611612d7657600380546001600160a01b0390811660009081526004602081815260408084208054868b166001600160a01b031991821681179092558251606081018452868152885488168186019081526001600160401b03808d16838701908152858a5297875285892092518354908b1690851617835590516001928301805498518316600160a01b0267ffffffffffffffff60a01b19928c1699861699909917919091169790971790965588548216831790985593881685529186905290922093840180549091169091179055815416612c495780546001600160a01b0319166001600160a01b03851617905550611043565b6001600160401b0381166000908152600160205260409020546001600160a01b031615612f59576001600160401b0381166000908152600160205260409020546001600160a01b03165b6001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b909204161015612e16576001600160a01b0390811660009081526004602052604090205416612dc0565b604080516060810182526001600160a01b038084168083526000908152600460208181528583206001908101805486168388019081526001600160401b03808d16898b019081528e89168089528787528b89209a518b54908b166001600160a01b0319918216178c5593519a8601805492518416600160a01b0267ffffffffffffffff60a01b199c8c16938616939093179b909b1691909117909955825488168752898720805483168a1790558254909116881790915589168452808252868420805486168552929091529490912090930154161415612f0a5780546001600160a01b0319166001600160a01b0386161781555b60018101546001600160a01b0390811660009081526004602052604090205481169086161415612f52576001810180546001600160a01b0319166001600160a01b0387161790555b5050610d92565b6000612f716001600160401b0383166203f4806123e2565b90505b6001600160401b038116600090815260016020819052604090912001546001600160a01b0316612fbb57612fb46001600160401b0382166203f4806123e2565b9050612f74565b6001600160401b0390811660009081526001602081815260408084208301546001600160a01b039081168086526004808552838720805485516060810187529085168082528188019485528c8b168288019081528e8716808c52948952878b20925183549088166001600160a01b03199182161784559551928a01805491518d16600160a01b0267ffffffffffffffff60a01b199490981691871691909117929092169590951790558054831682179055918652828620850180548216831790559587168552918390529092208054841683178155018054909216179055505050565b6203f4806001600160401b038416066001600160401b03166000146130fb576040805162461bcd60e51b815260206004820152600e60248201526d1253959053125108109550d2d15560921b604482015290519081900360640190fd5b6001600160a01b0380821660009081526004602052604080822054909216815220600101546001600160401b036203f48085018116600160a01b909204161080159061317957506001600160a01b0381166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156131b357506001600160a01b0381166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6131f7576040805162461bcd60e51b815260206004820152601060248201526f1d185a5b081a5cc81b9bdd081d185a5b60821b604482015290519081900360640190fd5b6001600160a01b038083166000908152600460205260408082206001908101549093168252902001546001600160401b03808516600160a01b9092041610801561327357506001600160a01b0382166000908152600460205260409020600101546001600160401b036203f48085018116600160a01b90920416105b80156132ad57506001600160a01b0382166000908152600460205260409020600101546001600160401b03808516600160a01b9092041610155b6132f1576040805162461bcd60e51b815260206004820152601060248201526f1a195859081a5cc81b9bdd081a19585960821b604482015290519081900360640190fd5b6001600160401b0392909216600090815260016020819052604090912090810180546001600160a01b03199081166001600160a01b039586161790915581541691909216179055565b6001600160a01b03828116600090815260396020526040812054909116613362576000613380565b603a546103e890600160801b90046001600160801b03908116840216045b603a54603b549192506103e86001600160801b03918216850282168190049282168502821604906000906133cd90838116906133c7908681169082908a8116908a166123e2565b906123e2565b90506001600160801b038416156134b1576001600160a01b03808716600090815260396020908152604080832054909316825260389052205461342490600160801b90046001600160801b039081169086166123a9565b6001600160a01b0380881660008181526039602081815260408084208054871685526038835281852080546001600160801b03998a16600160801b02908a161790559385905291815291548151958a16865242928601929092528051929491909316927fe9e95d6b3dc15e526a9ab8a4879c79c909fd2e3bcf54e63be438051baba8487692918290030190a35b6001600160801b0383161561352f576037546001600160a01b03166000908152603860205260409020546134f990600160801b90046001600160801b039081169085166123a9565b6037546001600160a01b0316600090815260386020526040902080546001600160801b03928316600160801b0292169190911790555b6001600160801b038216156135e057613593826001600160801b03166038600061356367474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002054600160801b90046001600160801b0316906123a9565b603860006135ab67474f565354414b4560c01b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b6001600160801b0381161561365d57613612816001600160801b03166038600061356365149155d0549160d21b611f36565b6038600061362865149155d0549160d21b611f36565b6001600160a01b03168152602081019190915260400160002080546001600160801b03928316600160801b0292169190911790555b505050505050565b600061367542610a978585612385565b905061368763282620a760e11b611f36565b6001600160a01b031663e2872fd685836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156136dd57600080fd5b505af11580156136f1573d6000803e3d6000fd5b5050505050505050565b60408051606081018252600080825260208201819052918101919091529056fe6e65772070657263656e742063616e6e6f7420626520626967676572207468616e2044454e4f4d494e41544f526f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e596f75206d757374207761697420616e20686f757220616674657220796f7572206c6173742075706461746520746f2077697468647261772e696e666f20696420616464726573732830292063616e6e6f7420626520737570706f72746564a26469706673582212206c80c0fe53f2b25936fd840944caa4ac8a12a493707317615caaadb96ab3aa2a64736f6c634300060c0033

Deployed Bytecode Sourcemap

20274:14898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7486:19;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;7486:19:0;;;;;;;;;;;;;;21466:42;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21466:42:0;-1:-1:-1;;;;;21466:42:0;;:::i;:::-;;;;;;;;;;;;;;;;;;27087:366;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27087:366:0;;-1:-1:-1;;;;;27087:366:0;;;;;-1:-1:-1;;;;;27087:366:0;;:::i;:::-;;7106:43;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;7106:43:0;;;;;;;;;;;;;;20792:44;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20792:44:0;-1:-1:-1;;;;;20792:44:0;;:::i;:::-;;;;-1:-1:-1;;;;;20792:44:0;;;;;;;;;;;;;-1:-1:-1;;;;;20792:44:0;;;;;;;;;;;;;;;24072:751;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24072:751:0;;:::i;22891:311::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;22891:311:0;;;;;;;;;;:::i;20870:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20870:45:0;-1:-1:-1;;;;;20870:45:0;;:::i;21089:25::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;21089:25:0;;;;;;;;;;;;;;25772:824;;;;;;;;;;;;;:::i;24966:660::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24966:660:0;-1:-1:-1;;;;;24966:660:0;;:::i;:::-;;;;;;;;;;;;;;;;21177:25;;;;;;;;;;;;;:::i;32341:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32341:223:0;-1:-1:-1;;;;;32341:223:0;;:::i;33821:337::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33821:337:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33821:337:0;;;;;;;;;;-1:-1:-1;33821:337:0;;-1:-1:-1;33821:337:0;-1:-1:-1;33821:337:0;:::i;34910:259::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34910:259:0;;;;;;;;;;-1:-1:-1;34910:259:0;;-1:-1:-1;34910:259:0;-1:-1:-1;34910:259:0;:::i;20500:24::-;;;;;;;;;;;;;:::i;7429:19::-;;;;;;;;;;;;;:::i;21277:42::-;;;;;;;;;;;;;:::i;32752:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32752:223:0;-1:-1:-1;;;;;32752:223:0;;:::i;21381:16::-;;;;;;;;;;;;;:::i;7268:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7268:44:0;-1:-1:-1;;;;;7268:44:0;;:::i;:::-;;;;;-1:-1:-1;;;;;7268:44:0;;;;;;-1:-1:-1;;;;;7268:44:0;;;;;;;;;;;;;;;;7552:47;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7552:47:0;-1:-1:-1;;;;;7552:47:0;;:::i;:::-;;;;-1:-1:-1;;;;;7552:47:0;;;;;;;;;;;;;-1:-1:-1;;;;;7552:47:0;;;;;;;;;;;;;;;33648:136;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33648:136:0;-1:-1:-1;;;;;33648:136:0;;:::i;33480:89::-;;;;;;;;;;;;;:::i;22366:433::-;;;;;;;;;;;;;:::i;33158:223::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33158:223:0;-1:-1:-1;;;;;33158:223:0;;:::i;23355:581::-;;;;;;;;;;;;;;;;-1:-1:-1;23355:581:0;-1:-1:-1;;;;;23355:581:0;;:::i;4543:114::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4543:114:0;-1:-1:-1;;;;;4543:114:0;;:::i;26604:209::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26604:209:0;-1:-1:-1;;;;;26604:209:0;;:::i;21002:25::-;;;;;;;;;;;;;:::i;7486:19::-;;;-1:-1:-1;;;;;7486:19:0;;:::o;21466:42::-;;;;;;;;;;;;;;;:::o;27087:366::-;-1:-1:-1;;;3666:21:0;3730:18;:7;:16;:18::i;:::-;3697:78;;;;;;-1:-1:-1;;;3697:78:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3697:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3666:110;;3809:18;3819:7;3809:9;:18::i;:::-;-1:-1:-1;;;;;3795:32:0;:10;-1:-1:-1;;;;;3795:32:0;;3829:7;3787:50;;;;;-1:-1:-1;;;3787:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27215:21:::1;27230:5;27215:14;:21::i;:::-;;27247:30;27260:5;27267:9;27247:12;:30::i;:::-;-1:-1:-1::0;;;;;27292:13:0;::::1;::::0;27288:157:::1;;-1:-1:-1::0;;;;;27328:15:0;::::1;;::::0;;;:8:::1;:15;::::0;;;;:27;27307:85:::1;::::0;27328:15;;:63:::1;::::0;27375:15:::1;::::0;27328:42:::1;::::0;-1:-1:-1;;;27328:27:0;::::1;-1:-1:-1::0;;;;;27328:27:0::1;-1:-1:-1::0;;;;;27328:42:0;::::1;:31;:42::i;:::-;:46:::0;::::1;:63::i;:::-;27307:13;:85::i;:::-;27288:157;;;27408:37;27422:5;27429:15;27408:13;:37::i;:::-;27087:366:::0;;;;:::o;7106:43::-;7143:6;7106:43;:::o;20792:44::-;;;;;;;;;;;;-1:-1:-1;;;;;20792:44:0;;;;-1:-1:-1;;;20792:44:0;;;;;;-1:-1:-1;;;20792:44:0;;-1:-1:-1;;;;;20792:44:0;;:::o;24072:751::-;21644:10;21635:20;;;;:8;:20;;;;;:29;:42;;-1:-1:-1;;;;;21635:29:0;21669:7;21635:33;:42::i;:::-;21616:15;:61;;21608:131;;;;-1:-1:-1;;;21608:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:7:::1;::::0;;:14:::1;::::0;;-1:-1:-1;;;3576:14:0;;;;-1:-1:-1;;;;;3576:7:0;;::::1;::::0;:12:::1;::::0;:14:::1;::::0;;::::1;::::0;;;;;;:7;;:14;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;24185:10:::2;21966:15;21984:21;21999:5;21984:14;:21::i;:::-;21966:39;;24231:1:::3;24221:7;:11;24213:50;;;::::0;;-1:-1:-1;;;24213:50:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;24274:22;;:::i;:::-;-1:-1:-1::0;24308:10:0::3;24299:20;::::0;;;:8:::3;:20;::::0;;;;;;;;24274:45;;::::3;::::0;::::3;::::0;;;;-1:-1:-1;;;;;24274:45:0;;::::3;::::0;;-1:-1:-1;;;24274:45:0;::::3;;::::0;;::::3;::::0;;;;-1:-1:-1;;;24274:45:0;;::::3;-1:-1:-1::0;;;;;24274:45:0::3;::::0;;;;;;;-1:-1:-1;;24454:227:0::3;;;24535:19;::::0;::::3;::::0;:32:::3;::::0;-1:-1:-1;;;;;24535:23:0::3;24559:7:::0;24535:23:::3;:32::i;:::-;-1:-1:-1::0;;;;;24504:65:0::3;:19;::::0;::::3;:65:::0;24454:227:::3;;;24612:19;::::0;::::3;::::0;;24668:1:::3;24646:23:::0;;;-1:-1:-1;;;;;24602:29:0::3;::::0;-1:-1:-1;24454:227:0::3;24710:10;24701:20;::::0;;;:8:::3;:20;::::0;;;;;;;:30;;;;;;::::3;::::0;;;::::3;::::0;-1:-1:-1;;24701:30:0;;::::3;-1:-1:-1::0;;;;;24701:30:0;;::::3;;-1:-1:-1::0;;;;24701:30:0::3;-1:-1:-1::0;;;24701:30:0;;;::::3;::::0;;;::::3;;-1:-1:-1::0;;;;;24701:30:0;;::::3;-1:-1:-1::0;;;24701:30:0;;;::::3;;::::0;;;::::3;::::0;;;24742:28;::::3;::::0;::::3;;::::0;;;;;24701:20;24742:28;;24710:10;24742:28;::::3;;;;;;;;;;;;;::::0;::::3;;;;;-1:-1:-1::0;24786:29:0::3;::::0;;;;;;;24795:10:::3;::::0;24786:29:::3;::::0;;;;;::::3;::::0;;::::3;22016:1;22028:37:::2;22050:5;22057:7;22028:21;:37::i;:::-;3601:1;;24072:751:::0;:::o;22891:311::-;23001:30;23018:12;23001:16;:30::i;:::-;23042:9;:22;;-1:-1:-1;;;;;23042:22:0;;;-1:-1:-1;;;;;;23042:22:0;;;;;;;;;-1:-1:-1;;;;23075:10:0;23111:15;23148:10;:14;;-1:-1:-1;;23183:11:0;-1:-1:-1;;;23183:11:0;;;22891:311::o;20870:45::-;;;;;;;;;;;;-1:-1:-1;;;;;20870:45:0;;:::o;21089:25::-;;;-1:-1:-1;;;21089:25:0;;-1:-1:-1;;;;;21089:25:0;;:::o;25772:824::-;25825:18;25846:8;:31;25855:21;-1:-1:-1;;;25855:9:0;:21::i;:::-;-1:-1:-1;;;;;25846:31:0;;;;;;;;;;;;-1:-1:-1;25846:31:0;:43;-1:-1:-1;;;25846:43:0;;-1:-1:-1;;;;;25846:43:0;;-1:-1:-1;26008:12:0;25994:26;;25990:205;;26051:21;-1:-1:-1;;;26051:9:0;:21::i;:::-;-1:-1:-1;;;;;26036:56:0;;26100:10;26112;26036:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26183:1;26137:8;:31;26146:21;-1:-1:-1;;;26146:9:0;:21::i;:::-;-1:-1:-1;;;;;26137:31:0;;;;;;;;;;;;-1:-1:-1;26137:31:0;:47;;-1:-1:-1;;;;;26137:47:0;;;-1:-1:-1;;;26137:47:0;;;;;;;;;25990:205;26213:21;26237:8;:29;26246:19;-1:-1:-1;;;26246:9:0;:19::i;:::-;-1:-1:-1;;;;;26237:29:0;;;;;;;;;;;;-1:-1:-1;26237:29:0;:41;-1:-1:-1;;;26237:41:0;;-1:-1:-1;;;;;26237:41:0;;-1:-1:-1;26400:12:0;26383:29;;26379:210;;26443:19;-1:-1:-1;;;26443:9:0;:19::i;:::-;-1:-1:-1;;;;;26428:54:0;;26490:13;26505;26428:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26577:1;26533:8;:29;26542:19;-1:-1:-1;;;26542:9:0;:19::i;:::-;-1:-1:-1;;;;;26533:29:0;;;;;;;;;;;;-1:-1:-1;26533:29:0;:45;;-1:-1:-1;;;;;26533:45:0;;;-1:-1:-1;;;26533:45:0;;;;;;;;;26379:210;25772:824;;:::o;24966:660::-;25056:7;25081:22;;:::i;:::-;-1:-1:-1;;;;;;25106:15:0;;;;;;:8;:15;;;;;;;;25081:40;;;;;;;;;-1:-1:-1;;;;;25081:40:0;;;;;;-1:-1:-1;;;25081:40:0;;;;;;;;;;;;-1:-1:-1;;;25081:40:0;;-1:-1:-1;;;;;25081:40:0;;;;;;;;;;25287:37;;:15;;:19;:37::i;:::-;25265:59;;25335:12;25350:39;25366:7;:22;;;-1:-1:-1;;;;;25350:39:0;:11;:15;;:39;;;;:::i;:::-;25335:54;;25471:18;25518:4;25504:11;:18;25500:88;;;25537:21;:11;25553:4;25537:15;:21::i;:::-;25524:34;;25500:88;;;-1:-1:-1;25587:1:0;25500:88;25608:10;24966:660;-1:-1:-1;;;;;;24966:660:0:o;21177:25::-;;;-1:-1:-1;;;;;21177:25:0;;:::o;32341:223::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21315:4:::1;-1:-1:-1::0;;;;;32445:26:0;::::1;;;32437:84;;;;-1:-1:-1::0;;;32437:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32532:10;:24:::0;;-1:-1:-1;;;;;32532:24:0;;::::1;-1:-1:-1::0;;;32532:24:0::1;::::0;::::1;::::0;;;::::1;::::0;;32341:223::o;33821:337::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33902:9:::1;33898:253;33917:14:::0;;::::1;33898:253;;;33961:5;:15;33967:5;;33973:1;33967:8;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;33967:8:0::1;33961:15:::0;;-1:-1:-1;33961:15:0;::::1;::::0;;;;;;-1:-1:-1;33961:15:0;:25:::1;;::::0;-1:-1:-1;;;33961:25:0;::::1;-1:-1:-1::0;;;;;33961:25:0::1;33953:60;;;::::0;;-1:-1:-1;;;33953:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;33953:60:0;;;;;;;;;;;;;::::1;;34028:34;34053:5;;34059:1;34053:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;34053:8:0::1;34028:24;:34::i;:::-;34077:62;34103:5;;34109:1;34103:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;34103:8:0::1;34113:5;:15;34119:5;;34125:1;34119:8;;;;;;;;;;;;;-1:-1:-1::0;;;;;34119:8:0::1;-1:-1:-1::0;;;;;34113:15:0::1;-1:-1:-1::0;;;;;34113:15:0::1;;;;;;;;;;;;:25;;;;;;;;;;-1:-1:-1::0;;;;;34113:25:0::1;34077;:62::i;:::-;33933:3;;33898:253;;34910:259:::0;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35047:9:::1;35043:119;35063:19:::0;;::::1;35043:119;;;35103:47;35116:8;;35125:1;35116:11;;;;;;;;;;;;;-1:-1:-1::0;;;;;35116:11:0::1;35129:6;;35136:1;35129:9;;;;;;;;;;;;;-1:-1:-1::0;;;;;35129:9:0::1;35140:6;;35147:1;35140:9;;;;;;;;;;;;;-1:-1:-1::0;;;;;35140:9:0::1;35103:12;:47::i;:::-;35084:3;;35043:119;;;;34910:259:::0;;;;;;:::o;20500:24::-;;;-1:-1:-1;;;;;20500:24:0;;:::o;7429:19::-;;;-1:-1:-1;;;;;7429:19:0;;:::o;21277:42::-;21315:4;21277:42;:::o;32752:223::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21315:4:::1;-1:-1:-1::0;;;;;32856:26:0;::::1;;;32848:84;;;;-1:-1:-1::0;;;32848:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32943:10;:24:::0;;-1:-1:-1;;;;;;32943:24:0::1;-1:-1:-1::0;;;;;32943:24:0;;;::::1;::::0;;;::::1;::::0;;32752:223::o;21381:16::-;;;-1:-1:-1;;;21381:16:0;;;;;:::o;7268:44::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7268:44:0;;;;;;:::o;7552:47::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7552:47:0;;;;;;;-1:-1:-1;;;7552:47:0;;-1:-1:-1;;;;;7552:47:0;;:::o;33648:136::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33758:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;;;-1:-1:-1;;33736:40:0;::::1;33758:18;::::0;;::::1;33757:19;33736:40;::::0;;33648:136::o;33480:89::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33557:4:::1;::::0;;-1:-1:-1;;;;33549:12:0;::::1;-1:-1:-1::0;;;33557:4:0;;;::::1;;;33556:5;33549:12:::0;;::::1;;::::0;;33480:89::o;22366:433::-;22456:9;22451:341;22475:1;22471;:5;22451:341;;;22518:4;;-1:-1:-1;;;;;22518:4:0;22512:11;;;;:5;:11;;;;;22518:4;22512:21;;-1:-1:-1;;;22512:21:0;;-1:-1:-1;;;;;22512:21:0;:26;;;;:58;;-1:-1:-1;22548:4:0;;-1:-1:-1;;;;;22548:4:0;22542:11;;;;:5;:11;;;;;22548:4;22542:21;;22567:3;-1:-1:-1;;;22542:21:0;;;-1:-1:-1;;;;;22542:21:0;:28;;22512:58;22508:259;;;22617:4;;-1:-1:-1;;;;;22617:4:0;22591:15;22658:23;22617:4;22658:14;:23::i;:::-;22641:40;;22700:38;22722:7;22731:6;22700:21;:38::i;:::-;22508:259;;;;;22760:7;;;22508:259;22478:3;;22451:341;;;;22366:433;:::o;33158:223::-;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21315:4:::1;-1:-1:-1::0;;;;;33262:26:0;::::1;;;33254:84;;;;-1:-1:-1::0;;;33254:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33349:10;:24:::0;;-1:-1:-1;;;;;;33349:24:0::1;-1:-1:-1::0;;;;;33349:24:0;;;::::1;::::0;;;::::1;::::0;;33158:223::o;23355:581::-;3576:7;;;:14;;;-1:-1:-1;;;3576:14:0;;;;-1:-1:-1;;;;;3576:7:0;;;;:12;;:14;;;;;;;;;;:7;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23467:10:::1;21966:15;21984:21;21999:5;21984:14;:21::i;:::-;23510:10:::2;23533:1;23500:21:::0;;;:9:::2;:21;::::0;;;;;21966:39;;-1:-1:-1;;;;;;23500:21:0::2;23495:214;;-1:-1:-1::0;;;;;23577:23:0;::::2;:47;;23615:9;::::0;-1:-1:-1;;;;;23615:9:0::2;23577:47;;;23603:9;23577:47;23563:10;23553:21;::::0;;;:9:::2;:21;::::0;;;;;;;;:71;;-1:-1:-1;;;;;;23553:71:0::2;-1:-1:-1::0;;;;;23553:71:0;;::::2;;::::0;;23644:53;;23681:15:::2;23644:53:::0;;;;23563:10;;23644:53;::::2;::::0;::::2;::::0;;;;;;;;::::2;23495:214;23749:1;23737:9;:13;23729:49;;;::::0;;-1:-1:-1;;;23729:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;23843:10;23834:20;::::0;;;:8:::2;:20;::::0;;;;:32;:47:::2;::::0;-1:-1:-1;;;23834:32:0;::::2;-1:-1:-1::0;;;;;23834:32:0::2;23871:9;23834:36;:47::i;:::-;23800:10;23791:20;::::0;;;:8:::2;:20;::::0;;;;;;;;:91;;-1:-1:-1;;;;;23791:91:0;;::::2;-1:-1:-1::0;;;23791:91:0::2;::::0;::::2;::::0;;;::::2;::::0;;;23898:30;;23918:9:::2;23898:30:::0;;;;23800:10;;23898:30:::2;::::0;;;;;;;::::2;22028:37:::1;22050:5;22057:7;22028:21;:37::i;4543:114::-:0;3464:7;;;;;;;;-1:-1:-1;;;;;3464:7:0;-1:-1:-1;;;;;3448:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3448:33:0;-1:-1:-1;;;;;3434:47:0;:10;:47;3426:93;;;;-1:-1:-1;;;3426:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4615:7:::1;:34:::0;;-1:-1:-1;;;;;;4615:34:0::1;-1:-1:-1::0;;;;;4615:34:0;;;::::1;::::0;;;::::1;::::0;;4543:114::o;26604:209::-;26700:7;26725:22;;:::i;:::-;-1:-1:-1;;;;;;;26750:15:0;;;;;:8;:15;;;;;;;;;26725:40;;;;;;;;;-1:-1:-1;;;;;26725:40:0;;;;;-1:-1:-1;;;26725:40:0;;;;;;;;;-1:-1:-1;;;26725:40:0;;-1:-1:-1;;;;;26725:40:0;;;;;;;;26604:209::o;21002:25::-;;;-1:-1:-1;;;;;21002:25:0;;:::o;2534:621::-;2639:13;;;2649:2;2639:13;;;;;;;;;2586;;;;2639;;;;;;;;;;;-1:-1:-1;2639:13:0;2612:40;;2663:14;2697:9;2692:232;2716:2;2712:1;:6;2692:232;;;2781:1;:5;;2775:1;:12;2765:22;;-1:-1:-1;;;;;;2808:9:0;;;2804:109;;2863:4;2838:11;2850:9;2838:22;;;;;;;;;;;:29;-1:-1:-1;;;;;2838:29:0;;;;;;;;-1:-1:-1;2886:11:0;;;;;2804:109;-1:-1:-1;2720:3:0;;2692:232;;;;2934:31;2978:9;-1:-1:-1;;;;;2968:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2968:20:0;;2934:54;;3004:9;2999:105;3023:9;3019:1;:13;2999:105;;;3078:11;3090:1;3078:14;;;;;;;;;;;;;;;;3054:18;3073:1;3054:21;;;;;;;;;;;:38;-1:-1:-1;;;;;3054:38:0;;;;;;;;-1:-1:-1;3034:3:0;;2999:105;;;-1:-1:-1;3128:18:0;2534:621;-1:-1:-1;;;;2534:621:0:o;4665:113::-;4720:7;4747;;:23;;;-1:-1:-1;;;4747:23:0;;;;;;;;;;-1:-1:-1;;;;;4747:7:0;;;;:17;;:23;;;;;;;;;;;;;;;:7;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4747:23:0;;4665:113;-1:-1:-1;;4665:113:0:o;27598:641::-;27669:18;27705:22;;:::i;:::-;-1:-1:-1;;;;;;;27730:15:0;;;;;;:8;:15;;;;;;;;27705:40;;;;;;;;;-1:-1:-1;;;;;27705:40:0;;;;;-1:-1:-1;;;27705:40:0;;;;;;;;;;-1:-1:-1;;;27705:40:0;;;-1:-1:-1;;;;;27705:40:0;;;;;;;;27822:16;27730:15;27822:9;:16::i;:::-;27801:37;-1:-1:-1;27917:12:0;27932:26;:10;27801:37;27932:14;:26::i;:::-;27917:41;;27975:34;27988:5;28003:4;27975:12;:34::i;:::-;-1:-1:-1;;;;;28058:41:0;;:19;;;;:41;;;;-1:-1:-1;;;;;28136:15:0;28110:42;;;28168:17;;;;;;;-1:-1:-1;;;;;28168:17:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;28206:15:0;;;;;;;;:8;:15;;;;;;;;;:25;;;;;;;;;;;;;-1:-1:-1;;28206:25:0;;;-1:-1:-1;;;;;28206:25:0;;;;-1:-1:-1;;;;28206:25:0;-1:-1:-1;;;28206:25:0;;;;;;;;;;;;-1:-1:-1;;;;;28206:25:0;;;-1:-1:-1;;;28206:25:0;;;;;;;;;;27598:641::o;29142:833::-;29231:22;;:::i;:::-;-1:-1:-1;;;;;;29256:15:0;;;;;;:8;:15;;;;;;;;;29231:40;;;;;;;;;-1:-1:-1;;;;;29231:40:0;;;;;-1:-1:-1;;;29231:40:0;;;;;;;;;;-1:-1:-1;;;29231:40:0;;;-1:-1:-1;;;;;29231:40:0;;;;;;;;;29351:26;;;;29348:99;;;29429:7;;;;29348:99;29463:4;;-1:-1:-1;;;29463:4:0;;;;:25;;;;-1:-1:-1;;;;;;29472:16:0;;;;;;:9;:16;;;;;;;;29471:17;29463:25;29459:401;;;29524:9;-1:-1:-1;;;;;29508:25:0;:13;-1:-1:-1;;;;;29508:25:0;;29505:343;;;29611:16;-1:-1:-1;;;29611:9:0;:16::i;:::-;-1:-1:-1;;;;;29594:43:0;;29638:5;29645:28;-1:-1:-1;;;;;29645:17:0;;;;:28;;:17;:28::i;:::-;29594:80;;;;;;;;;;;;;-1:-1:-1;;;;;29594:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29505:343;;;29772:16;-1:-1:-1;;;29772:9:0;:16::i;:::-;-1:-1:-1;;;;;29755:40:0;;29796:5;29803:28;-1:-1:-1;;;;;29803:13:0;;;;:28;;:13;:28::i;:::-;29755:77;;;;;;;;;;;;;-1:-1:-1;;;;;29755:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29505:343;-1:-1:-1;;;;;29880:15:0;;;;;;:8;:15;;;;;;;;;:42;;-1:-1:-1;;;;29880:42:0;-1:-1:-1;;;;;;;;29880:42:0;;;;;;;;;;;;29938:29;;;;;;;;;;;;;;;;;29142:833;;;;:::o;5602:303::-;5660:7;5759:1;5755;:5;5747:14;;;;;;5772:9;5788:1;5784;:5;;;;;;;-1:-1:-1;;5602:303:0;;;;;:::o;6281:150::-;6339:7;6371:5;;;6395:6;;;;6387:15;;;;;;6422:1;6281:150;-1:-1:-1;;;6281:150:0:o;30176:293::-;30284:15;30270:10;:29;30266:196;;;30316:40;30349:5;30316:24;:40::i;:::-;30266:196;;;30389:61;30423:5;30438:10;30389:25;:61::i;6043:150::-;6101:7;6134:1;6129;:6;;6121:15;;;;;;-1:-1:-1;6159:5:0;;;6043:150::o;28420:528::-;28515:22;;:::i;:::-;-1:-1:-1;;;;;;28540:15:0;;;;;;:8;:15;;;;;;;;;28515:40;;;;;;;;;-1:-1:-1;;;;;28515:40:0;;;;;-1:-1:-1;;;28515:40:0;;;;;;;;;;-1:-1:-1;;;28515:40:0;;;-1:-1:-1;;;;;28515:40:0;;;;;;;;28570:30;;;;;:60;;;28629:1;28604:7;:22;;;-1:-1:-1;;;;;28604:26:0;;28570:60;28566:270;;;28647:72;28668:5;28675:7;:19;;;-1:-1:-1;;;;;28647:72:0;28696:7;:22;;;-1:-1:-1;;;;;28647:72:0;:20;:72::i;:::-;28734:90;28748:5;28755:68;28807:15;28755:47;28779:7;:22;;;-1:-1:-1;;;;;28755:47:0;:7;:19;;;-1:-1:-1;;;;;28755:23:0;;;:47;;;;:::i;28734:90::-;28850:19;;;;-1:-1:-1;;;;;28850:24:0;;:40;;;;-1:-1:-1;28878:12:0;;;28850:40;28846:95;;;28907:22;28920:5;28927:1;28907:12;:22::i;4271:264::-;4375:1;4355:7;-1:-1:-1;;;;;4355:7:0;4347:30;4339:62;;;;;-1:-1:-1;;;4339:62:0;;;;;;;;;;;;-1:-1:-1;;;4339:62:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;4420:26:0;;4412:68;;;;;-1:-1:-1;;;4412:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5034:433;5092:7;5336:6;5332:47;;-1:-1:-1;5366:1:0;5359:8;;5332:47;5403:5;;;5407:1;5403;:5;:1;5427:5;;;;;:10;5419:19;;;;;12200:2552;-1:-1:-1;;;;;12270:15:0;;12251:16;12270:15;;;:5;:15;;;;;:25;;;-1:-1:-1;;;12270:25:0;;-1:-1:-1;;;;;12270:25:0;;12330:45;7143:6;12331:26;12270:25;7143:6;12331:13;:26::i;:::-;12330:32;;:45::i;:::-;-1:-1:-1;;;;;12464:19:0;;7060:1;12464:19;;;:11;:19;;;;;:24;12306:71;;-1:-1:-1;;;;;;12464:24:0;12461:70;;12513:7;;;;12461:70;-1:-1:-1;;;;;12704:19:0;;12687:14;12704:19;;;:11;:19;;;;;:24;-1:-1:-1;;;;;12704:24:0;12683:1958;-1:-1:-1;;;;;12730:13:0;;;;;;:5;:13;;;;;:23;;;-1:-1:-1;;;;;12730:36:0;;;-1:-1:-1;;;12730:23:0;;;;:36;12683:1958;;12812:26;;:::i;:::-;-1:-1:-1;;;;;;12841:13:0;;;;;;;:5;:13;;;;;;;;;12812:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;12812:42:0;;;;;;;;;;;;12948:27;;;:49;;;;;12989:8;-1:-1:-1;;;;;12979:18:0;:6;-1:-1:-1;;;;;12979:18:0;;12948:49;12945:1591;;;13124:4;;-1:-1:-1;;;;;13124:14:0;;;:4;;:14;13121:78;;;13170:9;;13163:4;:16;;-1:-1:-1;;;;;;13163:16:0;-1:-1:-1;;;;;13163:16:0;;;;;;;;;13121:78;13285:4;;-1:-1:-1;;;;;13285:14:0;;;:4;;:14;13282:78;;;13331:9;;;;13324:4;:16;;-1:-1:-1;;;;;;13324:16:0;-1:-1:-1;;;;;13324:16:0;;;;;;;;;13282:78;-1:-1:-1;;;;;13430:19:0;;;;;;:11;:19;;;;;:24;-1:-1:-1;;;;;13430:34:0;;;:24;;:34;13427:793;;;13628:23;-1:-1:-1;;;;;13628:10:0;;7143:6;13628:10;:23::i;:::-;13587:9;;-1:-1:-1;;;;;13581:16:0;;;;;:5;:16;;;;;:26;;;:43;;-1:-1:-1;;;13581:26:0;;-1:-1:-1;;;;;13581:26:0;7143:6;13581:30;:43::i;:::-;:70;13578:319;;;13706:9;;-1:-1:-1;;;;;13679:19:0;;13706:9;13679:19;;;:11;:19;;;;;:36;;-1:-1:-1;;;;;;13679:36:0;-1:-1:-1;;;;;13679:36:0;;;;;;;;;13578:319;;;-1:-1:-1;;;;;13854:19:0;;;;;;:11;:19;;;;;;;;13847:26;;-1:-1:-1;;;;;;13847:26:0;;;;;;;;;;;;;;13578:319;13427:793;;;-1:-1:-1;;;;;13925:19:0;;;;;;:11;:19;;;;;;;;:24;;-1:-1:-1;;;;;13925:34:0;;;:24;;:34;13922:298;;;14191:9;;;;;-1:-1:-1;;;;;14164:19:0;;;;;;:11;:19;;;;;;;:24;;;:36;;-1:-1:-1;;;;;;14164:36:0;-1:-1:-1;;;;;14164:36:0;;;;;;;;;13922:298;14355:9;;14337;;;;;;-1:-1:-1;;;;;14331:16:0;;;14355:9;14331:16;;;:5;:16;;;;;;;:33;;;;;-1:-1:-1;;;;;;14331:33:0;;;;;;14407:9;;14389;;14383:16;;;;;;;14331:33;14383:21;;;:33;;;;;;;;;;;;;;;14482:13;;;;;;;;;;14475:20;;;;;;;;;;-1:-1:-1;;;;;;14475:20:0;;;-1:-1:-1;14514:7:0;;-1:-1:-1;14514:7:0;12945:1591;-1:-1:-1;;;;;;12777:13:0;;;;;;;:5;:13;;;;;:18;;12683:1958;;8103:4089;-1:-1:-1;;;;;8195:17:0;;8187:68;;;;-1:-1:-1;;;8187:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8364:15:0;;8392:1;8364:15;;;:5;:15;;;;;:25;;;-1:-1:-1;;;8364:25:0;;-1:-1:-1;;;;;8364:25:0;:29;8360:48;;8395:13;8399:8;8395:3;:13::i;:::-;8421;8445:45;7143:6;8446:26;-1:-1:-1;;;;;8446:13:0;;7143:6;8446:13;:26::i;8445:45::-;8507:4;;8421:71;;-1:-1:-1;;;;;;8507:4:0;8503:313;;8591:4;:15;;-1:-1:-1;;;;;8591:15:0;;;-1:-1:-1;;;;;;8591:15:0;;;;;;;;8621:4;:15;;;;;;;;8673:26;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8651:19:0;;;8591:4;8651:19;;;8591:15;8651:19;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8732:37;;;;;;;;;;;;;;;;;;;;;;;;;8714:15;;;:5;:15;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8714:55:0;-1:-1:-1;;;;8714:55:0;;;;;;;;;;;;;;;;8798:7;;8503:313;8970:4;;-1:-1:-1;;;;;8970:4:0;8964:11;;;;:5;:11;;;;;8970:4;8964:21;;-1:-1:-1;;;;;8964:34:0;;;-1:-1:-1;;;8964:21:0;;;;:34;8960:683;;9102:4;;;-1:-1:-1;;;;;9102:4:0;;;9096:11;;;;:5;:11;;;;;;;;9102:4;9096:16;;;:27;;;;;-1:-1:-1;;;;;;9096:27:0;;;;;;;;9156:37;;;;;;;9171:4;;;;9156:37;;;;;;;;-1:-1:-1;;;;;9156:37:0;;;;;;;;;9138:15;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;9138:55:0;-1:-1:-1;;;;9138:55:0;;;;;;;;;;;;;;;;;;;;9208:15;;;;;;;;;9309:19;;;;;;;;;;;;9343:17;;;;;;;;9396:6;;;;9393:162;;9522:6;;;:17;;-1:-1:-1;;;;;;9522:17:0;-1:-1:-1;;;;;9522:17:0;;;;;9393:162;9625:7;;;;8960:683;9743:4;;-1:-1:-1;;;;;9743:4:0;9737:11;;;;:5;:11;;;;;9743:4;9737:21;;-1:-1:-1;;;;;9737:34:0;;;-1:-1:-1;;;9737:21:0;;;;:34;9733:622;;9794:4;;;-1:-1:-1;;;;;9794:4:0;;;9788:11;;;;:5;:11;;;;;;;;:27;;;;;-1:-1:-1;;;;;;9788:27:0;;;;;;;;9881:36;;;;;;;;;;9902:4;;;;9881:36;;;;;;-1:-1:-1;;;;;9881:36:0;;;;;;;;;9863:15;;;;;;;;;:54;;;;;;;;;;;;;;;9794:4;9863:54;;;;;;;;;-1:-1:-1;;;9863:54:0;-1:-1:-1;;;;9863:54:0;;;;;;;;;;;;;;;;;;;;;9932:15;;;;;;;;;10033:19;;;;;;;;;;;;10067:6;;;:17;;;;;;;;;;10116:6;;;10113:158;;10238:17;;-1:-1:-1;;;;;;10238:17:0;-1:-1:-1;;;;;10238:17:0;;;;;-1:-1:-1;10337:7:0;;9733:622;-1:-1:-1;;;;;10428:19:0;;7060:1;10428:19;;;:11;:19;;;;;:24;-1:-1:-1;;;;;10428:24:0;:33;10424:1761;;-1:-1:-1;;;;;10593:19:0;;10576:14;10593:19;;;:11;:19;;;;;:24;-1:-1:-1;;;;;10593:24:0;10695:104;-1:-1:-1;;;;;10701:13:0;;;;;;:5;:13;;;;;:23;;;-1:-1:-1;;;;;10701:35:0;;;-1:-1:-1;;;10701:23:0;;;;:35;10695:104;;;-1:-1:-1;;;;;10765:13:0;;;;;;;:5;:13;;;;;:18;;10695:104;;;10841:53;;;;;;;;-1:-1:-1;;;;;10841:53:0;;;;;;-1:-1:-1;10864:13:0;;;:5;10841:53;10864:13;;;;;;:18;;;;;;;;10841:53;;;;;;-1:-1:-1;;;;;10841:53:0;;;;;;;;;10823:15;;;;;;;;;;;;:71;;;;;;;-1:-1:-1;;;;;;10823:71:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;10823:71:0;-1:-1:-1;;;;10823:71:0;;;;;;;;;;;;;;;;;;;;;10915:18;;;;10909:25;;;;;:41;;;;;;;;10965:29;;;;;;;;;;11088:19;;;;;;;;;;11146:6;;;;11140:13;;;;;;;;;;:18;;;;;:30;11136:87;;;11190:17;;-1:-1:-1;;;;;;11190:17:0;-1:-1:-1;;;;;11190:17:0;;;;;11136:87;11261:6;;;;-1:-1:-1;;;;;11261:6:0;;;11255:13;;;;:5;:13;;;;;:18;;;:30;;;;11251:87;;;11305:6;;;:17;;-1:-1:-1;;;;;;11305:17:0;-1:-1:-1;;;;;11305:17:0;;;;;11251:87;10424:1761;;;;;11519:17;11547:23;-1:-1:-1;;;;;11547:10:0;;7143:6;11547:10;:23::i;:::-;11519:53;;11601:127;-1:-1:-1;;;;;11607:23:0;;7060:1;11607:23;;;:11;:23;;;;;;;;:28;;-1:-1:-1;;;;;11607:28:0;11601:127;;11683:27;-1:-1:-1;;;;;11683:14:0;;7143:6;11683:14;:27::i;:::-;11662:50;;11601:127;;;-1:-1:-1;;;;;11763:23:0;;;11748:12;11763:23;;;:11;:23;;;;;;;;:28;;;-1:-1:-1;;;;;11763:28:0;;;11821:11;;;:5;:11;;;;;;:16;;11948:35;;;;;;;11821:16;;;11948:35;;;;;;;;;;;;;;;;;;11930:15;;;;;;;;;;;;:53;;;;;;;-1:-1:-1;;;;;;11930:53:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;11930:53:0;-1:-1:-1;;;;11930:53:0;;;;;;;;;;;;;;;;;;;;;11998:27;;;;;;;;12040:11;;;;;;:16;;:27;;;;;;;;12088:19;;;;;;;;;;;;:35;;;;;;;;12138:24;:35;;;;;;;;8103:4089;;;:::o;34200:702::-;7143:6;-1:-1:-1;;;;;34296:21:0;;;-1:-1:-1;;;;;34296:26:0;34321:1;34296:26;34288:53;;;;;-1:-1:-1;;;34288:53:0;;;;;;;;;;;;-1:-1:-1;;;34288:53:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34382:12:0;;;34376:24;34382:12;;;34376:5;34382:12;;;;;;:17;;;;34376:24;;;34382:17;34376:34;;-1:-1:-1;;;;;7143:6:0;34414:21;;34376:59;;-1:-1:-1;;;34376:34:0;;;;:59;;;;:122;;-1:-1:-1;;;;;;34452:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;7143:6:0;34477:21;;34452:46;;-1:-1:-1;;;34452:22:0;;;;:46;34376:122;:172;;;;-1:-1:-1;;;;;;34515:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;34515:33:0;;;-1:-1:-1;;;34515:22:0;;;;:33;;34376:172;34354:228;;;;;-1:-1:-1;;;34354:228:0;;;;;;;;;;;;-1:-1:-1;;;34354:228:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34621:12:0;;;34615:24;34621:12;;;34615:5;34621:12;;;;;;:17;;;;;;;;34615:24;;;;:34;;-1:-1:-1;;;;;34615:44:0;;;-1:-1:-1;;;34615:34:0;;;;:44;:107;;;;-1:-1:-1;;;;;;34676:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;7143:6:0;34701:21;;34676:46;;-1:-1:-1;;;34676:22:0;;;;:46;34615:107;:157;;;;-1:-1:-1;;;;;;34739:12:0;;;;;;:5;:12;;;;;:22;;;-1:-1:-1;;;;;34739:33:0;;;-1:-1:-1;;;34739:22:0;;;;:33;;34615:157;34593:213;;;;;-1:-1:-1;;;34593:213:0;;;;;;;;;;;;-1:-1:-1;;;34593:213:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;34817:20:0;;;;;;;;:11;:20;;;;;;;;:25;;;:33;;-1:-1:-1;;;;;;34817:33:0;;;-1:-1:-1;;;;;34817:33:0;;;;;;;34861;;;;;;;;;;34200:702::o;31051:1113::-;-1:-1:-1;;;;;31189:16:0;;;31169:17;31189:16;;;:9;:16;;;;;;31169:17;;31189:16;:72;;31260:1;31189:72;;;31233:10;;21315:4;;-1:-1:-1;;;31233:10:0;;-1:-1:-1;;;;;31233:10:0;;;31222:21;;:35;;31189:72;31303:10;;31369;;31169:92;;-1:-1:-1;21315:4:0;-1:-1:-1;;;;;31303:10:0;;;31292:21;;:35;;;;;;31369:10;;31358:21;;:35;;;;31272:17;;31433:53;;;;;;:38;;;;;;;;:12;;;;:23;;:12;:23::i;:::-;:27;;:38::i;:53::-;31404:84;-1:-1:-1;;;;;;31513:13:0;;;31509:241;;-1:-1:-1;;;;;31605:16:0;;;31595:28;31605:16;;;:9;:16;;;;;;;;;;;;31595:28;;:8;:28;;;:40;:55;;-1:-1:-1;;;31595:40:0;;-1:-1:-1;;;;;31595:40:0;;;;:55;;:44;:55::i;:::-;-1:-1:-1;;;;;31553:16:0;;;31543:28;31553:16;;;:9;:16;;;;;;;;;;;;31543:28;;:8;:28;;;;;:109;;-1:-1:-1;;;;;31543:109:0;;;-1:-1:-1;;;31543:109:0;;;;;;;31686:16;;;;;;;;;31672:66;;;;;;;31722:15;31672:66;;;;;;;;;31553:16;;31686;;;;;31672:66;;;;;;;;;31509:241;-1:-1:-1;;;;;31764:13:0;;;31760:110;;31831:9;;-1:-1:-1;;;;;31831:9:0;31822:19;;;;:8;:19;;;;;:31;:46;;-1:-1:-1;;;31822:31:0;;-1:-1:-1;;;;;31822:31:0;;;;:46;;:35;:46::i;:::-;31788:9;;-1:-1:-1;;;;;31788:9:0;31779:19;;;;:8;:19;;;;;:91;;-1:-1:-1;;;;;31779:91:0;;;-1:-1:-1;;;31779:91:0;;;;;;;;;31760:110;-1:-1:-1;;;;;31885:13:0;;;31881:134;;31955:58;32003:9;-1:-1:-1;;;;;31955:58:0;:8;:31;31964:21;-1:-1:-1;;;31964:9:0;:21::i;:::-;-1:-1:-1;;;;;31955:31:0;;;;;;;;;;;;-1:-1:-1;31955:31:0;:43;-1:-1:-1;;;31955:43:0;;-1:-1:-1;;;;;31955:43:0;;:47;:58::i;:::-;31900:8;:31;31909:21;-1:-1:-1;;;31909:9:0;:21::i;:::-;-1:-1:-1;;;;;31900:31:0;;;;;;;;;;;;-1:-1:-1;31900:31:0;:115;;-1:-1:-1;;;;;31900:115:0;;;-1:-1:-1;;;31900:115:0;;;;;;;;;31881:134;-1:-1:-1;;;;;32030:13:0;;;32026:130;;32098:56;32144:9;-1:-1:-1;;;;;32098:56:0;:8;:29;32107:19;-1:-1:-1;;;32107:9:0;:19::i;32098:56::-;32045:8;:29;32054:19;-1:-1:-1;;;32054:9:0;:19::i;:::-;-1:-1:-1;;;;;32045:29:0;;;;;;;;;;;;-1:-1:-1;32045:29:0;:111;;-1:-1:-1;;;;;32045:111:0;;;-1:-1:-1;;;32045:111:0;;;;;;;;;32026:130;31051:1113;;;;;;:::o;30598:267::-;30717:14;30734:48;30766:15;30734:27;:11;30750:10;30734:15;:27::i;:48::-;30717:65;;30806:17;-1:-1:-1;;;30806:9:0;:17::i;:::-;-1:-1:-1;;;;;30793:48:0;;30842:5;30849:6;30793:63;;;;;;;;;;;;;-1:-1:-1;;;;;30793:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30598:267;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://6c80c0fe53f2b25936fd840944caa4ac8a12a493707317615caaadb96ab3aa2a

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

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.