Token PaintSwap Token

 

Overview ERC-20

Price
$0.00 @ 0.000000 FTM
Fully Diluted Market Cap
Total Supply:
286,003,461.568619 BRUSH

Holders:
11,218 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

PaintSwap is an open NFT marketplace supporting all NFTs, as well as a decentralized exchange and yield farming platform on Fantom.


Update? Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BrushToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-26
*/

// SPDX-License-Identifier: GPL-3.0-or-later Or MIT
pragma solidity >=0.8.0 <0.9.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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



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

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









/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}




interface IBEP20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the token decimals.
     */
    function decimals() external view returns (uint8);

    /**
     * @dev Returns the token symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the token name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external view returns (address);

    /**
     * @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);
}










/**
 * @dev Implementation of the {IBEP20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {BEP20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-BEP20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of BEP20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IBEP20-approve}.
 */
contract BEP20 is Context, IBEP20, Ownable {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the bep token owner.
     */
    function getOwner() external override view returns (address) {
        return owner();
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public override view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public override view returns (string memory) {
        return _symbol;
    }

    /**
    * @dev Returns the number of decimals used to get its user representation.
    */
    function decimals() public override view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {BEP20-totalSupply}.
     */
    function totalSupply() public override view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {BEP20-balanceOf}.
     */
    function balanceOf(address account) public override view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {BEP20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {BEP20-allowance}.
     */
    function allowance(address owner, address spender) public override view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {BEP20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {BEP20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {BEP20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom (address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(amount, 'BEP20: transfer amount exceeds allowance')
        );
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {BEP20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {BEP20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, 'BEP20: decreased allowance below zero'));
        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing
     * the total supply.
     *
     * Requirements
     *
     * - `msg.sender` must be the token owner
     */
    function mint(uint256 amount) public onlyOwner returns (bool) {
        _mint(_msgSender(), amount);
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer (address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), 'BEP20: transfer from the zero address');
        require(recipient != address(0), 'BEP20: transfer to the zero address');

        _balances[sender] = _balances[sender].sub(amount, 'BEP20: transfer amount exceeds balance');
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), 'BEP20: mint to the zero address');

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), 'BEP20: burn from the zero address');

        _balances[account] = _balances[account].sub(amount, 'BEP20: burn amount exceeds balance');
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve (address owner, address spender, uint256 amount) internal {
        require(owner != address(0), 'BEP20: approve from the zero address');
        require(spender != address(0), 'BEP20: approve to the zero address');

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, 'BEP20: burn amount exceeds allowance'));
    }
}

// BrushToken with Governance.
contract BrushToken is BEP20('PaintSwap Token', 'BRUSH') {
    /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (Decorator).
    function mint(address _to, uint256 _amount) public onlyOwner {
        _mint(_to, _amount);
        _moveDelegates(address(0), _delegates[_to], _amount);
    }

    /// @notice Destroys  `_amount` token from `_from`. Must only be called by the owner (Decorator).
    function burn(address _from ,uint256 _amount) public onlyOwner {
        _burn(_from, _amount);
        _moveDelegates(_delegates[_from], address(0), _amount);
    }

    function burn(uint256 _amount) external {
        _burn(msg.sender, _amount);
        _moveDelegates(_delegates[msg.sender], address(0), _amount);
    }

    // Copied and modified from YAM code:
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol
    // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol
    // Which is copied and modified from COMPOUND:
    // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol

    /// @notice A record of each accounts delegate
    mapping (address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

      /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator)
        external
        view
        returns (address)
    {
        return _delegates[delegator];
    }

   /**
    * @notice Delegate votes from `msg.sender` to `delegatee`
    * @param delegatee The address to delegate votes to
    */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
    {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                block.chainid,
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                DELEGATION_TYPEHASH,
                delegatee,
                nonce,
                expiry
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                structHash
            )
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "BRUSH::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "BRUSH::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "BRUSH::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account)
        external
        view
        returns (uint256)
    {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "BRUSH::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee)
        internal
    {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying BRUSHs (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld - (amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld + (amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    )
        internal
    {
        uint32 blockNumber = safe32(block.number, "BRUSH::_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600f81526020016e2830b4b73a29bbb0b8102a37b5b2b760891b81525060405180604001604052806005815260200164084a4aaa6960db1b81525060006200006a620000f560201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000c9906004906020850190620000f9565b508051620000df906005906020840190620000f9565b50506006805460ff1916601217905550620001dc565b3390565b82805462000107906200019f565b90600052602060002090601f0160209004810192826200012b576000855562000176565b82601f106200014657805160ff191683800117855562000176565b8280016001018555821562000176579182015b828111156200017657825182559160200191906001019062000159565b506200018492915062000188565b5090565b5b8082111562000184576000815560010162000189565b600181811c90821680620001b457607f821691505b60208210811415620001d657634e487b7160e01b600052602260045260246000fd5b50919050565b611c2b80620001ec6000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063782d6fe111610104578063a457c2d7116100a2578063dd62ed3e11610071578063dd62ed3e14610432578063e7a324dc1461046b578063f1127ed814610492578063f2fde38b146104e957600080fd5b8063a457c2d7146103e6578063a9059cbb146103f9578063b4b5ea571461040c578063c3cda5201461041f57600080fd5b80638da5cb5b116100de5780638da5cb5b146103a757806395d89b41146103b85780639dc29fac146103c0578063a0712d68146103d357600080fd5b8063782d6fe1146103745780637ecebe0014610387578063893d20e8146103a757600080fd5b806340c10f19116101715780635c19a95c1161014b5780635c19a95c146102f55780636fcfff451461030857806370a0823114610343578063715018a61461036c57600080fd5b806340c10f191461028957806342966c681461029e578063587cde1e146102b157600080fd5b806320606b70116101ad57806320606b701461022757806323b872dd1461024e578063313ce56714610261578063395093511461027657600080fd5b806306fdde03146101d4578063095ea7b3146101f257806318160ddd14610215575b600080fd5b6101dc6104fc565b6040516101e9919061198c565b60405180910390f35b6102056102003660046118af565b61058e565b60405190151581526020016101e9565b6003545b6040519081526020016101e9565b6102197f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b61020561025c366004611874565b6105a5565b60065460405160ff90911681526020016101e9565b6102056102843660046118af565b61060e565b61029c6102973660046118af565b610644565b005b61029c6102ac366004611974565b6106aa565b6102dd6102bf366004611828565b6001600160a01b039081166000908152600760205260409020541690565b6040516001600160a01b0390911681526020016101e9565b61029c610303366004611828565b6106dd565b61032e610316366004611828565b60096020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016101e9565b610219610351366004611828565b6001600160a01b031660009081526001602052604090205490565b61029c6106e7565b6102196103823660046118af565b61075b565b610219610395366004611828565b600a6020526000908152604090205481565b6000546001600160a01b03166102dd565b6101dc6109c1565b61029c6103ce3660046118af565b6109d0565b6102056103e1366004611974565b610a2a565b6102056103f43660046118af565b610a68565b6102056104073660046118af565b610ab7565b61021961041a366004611828565b610ac4565b61029c61042d3660046118d8565b610b39565b610219610440366004611842565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6102197fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b6104cd6104a0366004611936565b60086020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016101e9565b61029c6104f7366004611828565b610e01565b60606004805461050b90611abf565b80601f016020809104026020016040519081016040528092919081815260200182805461053790611abf565b80156105845780601f1061055957610100808354040283529160200191610584565b820191906000526020600020905b81548152906001019060200180831161056757829003601f168201915b5050505050905090565b600061059b338484610eeb565b5060015b92915050565b60006105b2848484611010565b61060484336105ff85604051806060016040528060288152602001611b2c602891396001600160a01b038a1660009081526002602090815260408083203384529091529020549190611196565b610eeb565b5060019392505050565b3360008181526002602090815260408083206001600160a01b0387168452909152812054909161059b9185906105ff90866111d0565b6000546001600160a01b031633146106775760405162461bcd60e51b815260040161066e906119df565b60405180910390fd5b610681828261122f565b6001600160a01b038083166000908152600760205260408120546106a6921683611315565b5050565b6106b43382611479565b336000908152600760205260408120546106da916001600160a01b039091169083611315565b50565b6106da338261157d565b6000546001600160a01b031633146107115760405162461bcd60e51b815260040161066e906119df565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60004382106107bd5760405162461bcd60e51b815260206004820152602860248201527f42525553483a3a6765745072696f72566f7465733a206e6f74207965742064656044820152671d195c9b5a5b995960c21b606482015260840161066e565b6001600160a01b03831660009081526009602052604090205463ffffffff16806107eb57600091505061059f565b6001600160a01b03841660009081526008602052604081208491610810600185611a9a565b63ffffffff90811682526020820192909252604001600020541611610879576001600160a01b038416600090815260086020526040812090610853600184611a9a565b63ffffffff1663ffffffff1681526020019081526020016000206001015491505061059f565b6001600160a01b038416600090815260086020908152604080832083805290915290205463ffffffff168310156108b457600091505061059f565b6000806108c2600184611a9a565b90505b8163ffffffff168163ffffffff16111561098a57600060026108e78484611a9a565b6108f19190611a54565b6108fb9083611a9a565b6001600160a01b038816600090815260086020908152604080832063ffffffff808616855290835292819020815180830190925280549093168082526001909301549181019190915291925087141561095e5760200151945061059f9350505050565b805163ffffffff1687111561097557819350610983565b610980600183611a9a565b92505b50506108c5565b506001600160a01b038516600090815260086020908152604080832063ffffffff9094168352929052206001015491505092915050565b60606005805461050b90611abf565b6000546001600160a01b031633146109fa5760405162461bcd60e51b815260040161066e906119df565b610a048282611479565b6001600160a01b038083166000908152600760205260408120546106a692169083611315565b600080546001600160a01b03163314610a555760405162461bcd60e51b815260040161066e906119df565b610a5f338361122f565b5060015b919050565b600061059b33846105ff85604051806060016040528060258152602001611baf602591393360009081526002602090815260408083206001600160a01b038d1684529091529020549190611196565b600061059b338484611010565b6001600160a01b03811660009081526009602052604081205463ffffffff1680610aef576000610b32565b6001600160a01b038316600090815260086020526040812090610b13600184611a9a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866610b646104fc565b8051602091820120604080518084019490945283810191909152466060840152306080808501919091528151808503909101815260a0840182528051908301207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08501526001600160a01b038b1660e085015261010084018a90526101208085018a90528251808603909101815261014085019092528151919092012061190160f01b61016084015261016283018290526101828301819052909250906000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015610c95573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610d085760405162461bcd60e51b815260206004820152602760248201527f42525553483a3a64656c656761746542795369673a20696e76616c6964207369604482015266676e617475726560c81b606482015260840161066e565b6001600160a01b0381166000908152600a60205260408120805491610d2c83611afa565b919050558914610d8a5760405162461bcd60e51b815260206004820152602360248201527f42525553483a3a64656c656761746542795369673a20696e76616c6964206e6f6044820152626e636560e81b606482015260840161066e565b87421115610dea5760405162461bcd60e51b815260206004820152602760248201527f42525553483a3a64656c656761746542795369673a207369676e617475726520604482015266195e1c1a5c995960ca1b606482015260840161066e565b610df4818b61157d565b505050505b505050505050565b6000546001600160a01b03163314610e2b5760405162461bcd60e51b815260040161066e906119df565b6001600160a01b038116610e905760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161066e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316610f4d5760405162461bcd60e51b8152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161066e565b6001600160a01b038216610fae5760405162461bcd60e51b815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161066e565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166110745760405162461bcd60e51b815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161066e565b6001600160a01b0382166110d65760405162461bcd60e51b815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161066e565b61111381604051806060016040528060268152602001611b89602691396001600160a01b0386166000908152600160205260409020549190611196565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461114290826111d0565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110039085815260200190565b600081848411156111ba5760405162461bcd60e51b815260040161066e919061198c565b5060006111c78486611a83565b95945050505050565b6000806111dd8385611a14565b905083811015610b325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161066e565b6001600160a01b0382166112855760405162461bcd60e51b815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161066e565b60035461129290826111d0565b6003556001600160a01b0382166000908152600160205260409020546112b890826111d0565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906113099085815260200190565b60405180910390a35050565b816001600160a01b0316836001600160a01b0316141580156113375750600081115b15611474576001600160a01b038316156113da576001600160a01b03831660009081526009602052604081205463ffffffff1690816113775760006113ba565b6001600160a01b03851660009081526008602052604081209061139b600185611a9a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006113c88483611a83565b90506113d6868484846115fd565b5050505b6001600160a01b03821615611474576001600160a01b03821660009081526009602052604081205463ffffffff169081611415576000611458565b6001600160a01b038416600090815260086020526040812090611439600185611a9a565b63ffffffff1663ffffffff168152602001908152602001600020600101545b905060006114668483611a14565b9050610df9858484846115fd565b505050565b6001600160a01b0382166114d95760405162461bcd60e51b815260206004820152602160248201527f42455032303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161066e565b61151681604051806060016040528060228152602001611bd4602291396001600160a01b0385166000908152600160205260409020549190611196565b6001600160a01b03831660009081526001602052604090205560035461153c908261179f565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611309565b6001600160a01b03828116600081815260076020818152604080842080546001845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a46115f7828483611315565b50505050565b600061162143604051806060016040528060358152602001611b54603591396117e1565b905060008463ffffffff1611801561167b57506001600160a01b038516600090815260086020526040812063ffffffff83169161165f600188611a9a565b63ffffffff908116825260208201929092526040016000205416145b156116c4576001600160a01b038516600090815260086020526040812083916116a5600188611a9a565b63ffffffff168152602081019190915260400160002060010155611754565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152600883528581208a851682529092529390209151825463ffffffff191691161781559051600191820155611723908590611a2c565b6001600160a01b0386166000908152600960205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000610b3283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611196565b60008164010000000084106118095760405162461bcd60e51b815260040161066e919061198c565b509192915050565b80356001600160a01b0381168114610a6357600080fd5b600060208284031215611839578081fd5b610b3282611811565b60008060408385031215611854578081fd5b61185d83611811565b915061186b60208401611811565b90509250929050565b600080600060608486031215611888578081fd5b61189184611811565b925061189f60208501611811565b9150604084013590509250925092565b600080604083850312156118c1578182fd5b6118ca83611811565b946020939093013593505050565b60008060008060008060c087890312156118f0578182fd5b6118f987611811565b95506020870135945060408701359350606087013560ff8116811461191c578283fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215611948578182fd5b61195183611811565b9150602083013563ffffffff81168114611969578182fd5b809150509250929050565b600060208284031215611985578081fd5b5035919050565b6000602080835283518082850152825b818110156119b85785810183015185820160400152820161199c565b818111156119c95783604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115611a2757611a27611b15565b500190565b600063ffffffff808316818516808303821115611a4b57611a4b611b15565b01949350505050565b600063ffffffff80841680611a7757634e487b7160e01b83526012600452602483fd5b92169190910492915050565b600082821015611a9557611a95611b15565b500390565b600063ffffffff83811690831681811015611ab757611ab7611b15565b039392505050565b600181811c90821680611ad357607f821691505b60208210811415611af457634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611b0e57611b0e611b15565b5060010190565b634e487b7160e01b600052601160045260246000fdfe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542525553483a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d6265722065786365656473203332206269747342455032303a207472616e7366657220616d6f756e7420657863656564732062616c616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e20616d6f756e7420657863656564732062616c616e6365a26469706673582212202c83092cb3c7c5aae9915de574fd345b9b91c70f220b0b0fb3142ccea200ada964736f6c63430008040033

Deployed ByteCode Sourcemap

21650:9217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13879:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15458:161;;;;;;:::i;:::-;;:::i;:::-;;;3263:14:1;;3256:22;3238:41;;3226:2;3211:18;15458:161:0;3193:92:1;14447:100:0;14527:12;;14447:100;;;3436:25:1;;;3424:2;3409:18;14447:100:0;3391:76:1;23433:122:0;;23475:80;23433:122;;16090:364;;;;;;:::i;:::-;;:::i;14291:92::-;14366:9;;14291:92;;14366:9;;;;11502:36:1;;11490:2;11475:18;14291:92:0;11457:87:1;16862:210:0;;;;;;:::i;:::-;;:::i;21811:162::-;;;;;;:::i;:::-;;:::i;:::-;;22260:155;;;;;;:::i;:::-;;:::i;24416:149::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24536:21:0;;;24504:7;24536:21;;;:10;:21;;;;;;;;24416:149;;;;-1:-1:-1;;;;;3054:32:1;;;3036:51;;3024:2;3009:18;24416:149:0;2991:102:1;24709:104:0;;;;;;:::i;:::-;;:::i;23311:49::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11069:10:1;11057:23;;;11039:42;;11027:2;11012:18;23311:49:0;10994:93:1;14609:119:0;;;;;;:::i;:::-;-1:-1:-1;;;;;14702:18:0;14675:7;14702:18;;;:9;:18;;;;;;;14609:119;7958:148;;;:::i;27328:1254::-;;;;;;:::i;:::-;;:::i;23847:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;13715:94;13767:7;7381:6;-1:-1:-1;;;;;7381:6:0;13715:94;;14090:96;;;:::i;22084:168::-;;;;;;:::i;:::-;;:::i;18053:130::-;;;;;;:::i;:::-;;:::i;17574:261::-;;;;;;:::i;:::-;;:::i;14940:167::-;;;;;;:::i;:::-;;:::i;26642:255::-;;;;;;:::i;:::-;;:::i;25247:1194::-;;;;;;:::i;:::-;;:::i;15169:143::-;;;;;;:::i;:::-;-1:-1:-1;;;;;15277:18:0;;;15250:7;15277:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15169:143;23649:117;;23695:71;23649:117;;23172:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11294:10:1;11282:23;;;11264:42;;11337:2;11322:18;;11315:34;;;;11237:18;23172:70:0;11219:136:1;8261:244:0;;;;;;:::i;:::-;;:::i;13879:92::-;13925:13;13958:5;13951:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13879:92;:::o;15458:161::-;15533:4;15550:39;6026:10;15573:7;15582:6;15550:8;:39::i;:::-;-1:-1:-1;15607:4:0;15458:161;;;;;:::o;16090:364::-;16189:4;16206:36;16216:6;16224:9;16235:6;16206:9;:36::i;:::-;16253:171;16276:6;6026:10;16324:89;16362:6;16324:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16324:19:0;;;;;;:11;:19;;;;;;;;6026:10;16324:33;;;;;;;;;;:37;:89::i;:::-;16253:8;:171::i;:::-;-1:-1:-1;16442:4:0;16090:364;;;;;:::o;16862:210::-;6026:10;16942:4;16991:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16991:34:0;;;;;;;;;;16942:4;;16959:83;;16982:7;;16991:50;;17030:10;16991:38;:50::i;21811:162::-;7528:6;;-1:-1:-1;;;;;7528:6:0;6026:10;7528:22;7520:67;;;;-1:-1:-1;;;7520:67:0;;;;;;;:::i;:::-;;;;;;;;;21883:19:::1;21889:3;21894:7;21883:5;:19::i;:::-;-1:-1:-1::0;;;;;21940:15:0;;::::1;21936:1;21940:15:::0;;;:10:::1;:15;::::0;;;;;21913:52:::1;::::0;21940:15:::1;21957:7:::0;21913:14:::1;:52::i;:::-;21811:162:::0;;:::o;22260:155::-;22311:26;22317:10;22329:7;22311:5;:26::i;:::-;22374:10;22363:22;;;;:10;:22;;;;;;22348:59;;-1:-1:-1;;;;;22363:22:0;;;;22399:7;22348:14;:59::i;:::-;22260:155;:::o;24709:104::-;24773:32;24783:10;24795:9;24773;:32::i;7958:148::-;7528:6;;-1:-1:-1;;;;;7528:6:0;6026:10;7528:22;7520:67;;;;-1:-1:-1;;;7520:67:0;;;;;;;:::i;:::-;8065:1:::1;8049:6:::0;;8028:40:::1;::::0;-1:-1:-1;;;;;8049:6:0;;::::1;::::0;8028:40:::1;::::0;8065:1;;8028:40:::1;8096:1;8079:19:::0;;-1:-1:-1;;;;;;8079:19:0::1;::::0;;7958:148::o;27328:1254::-;27436:7;27483:12;27469:11;:26;27461:79;;;;-1:-1:-1;;;27461:79:0;;10253:2:1;27461:79:0;;;10235:21:1;10292:2;10272:18;;;10265:30;10331:34;10311:18;;;10304:62;-1:-1:-1;;;10382:18:1;;;10375:38;10430:19;;27461:79:0;10225:230:1;27461:79:0;-1:-1:-1;;;;;27575:23:0;;27553:19;27575:23;;;:14;:23;;;;;;;;27613:17;27609:58;;27654:1;27647:8;;;;;27609:58;-1:-1:-1;;;;;27727:20:0;;;;;;:11;:20;;;;;27779:11;;27748:16;27763:1;27748:12;:16;:::i;:::-;27727:38;;;;;;;;;;;;;;;-1:-1:-1;27727:38:0;:48;;:63;27723:147;;-1:-1:-1;;;;;27814:20:0;;;;;;:11;:20;;;;;;27835:16;27850:1;27835:12;:16;:::i;:::-;27814:38;;;;;;;;;;;;;;;:44;;;27807:51;;;;;27723:147;-1:-1:-1;;;;;27931:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;27927:88:0;;;28002:1;27995:8;;;;;27927:88;28027:12;;28069:16;28084:1;28069:12;:16;:::i;:::-;28054:31;;28096:428;28111:5;28103:13;;:5;:13;;;28096:428;;;28133:13;28175:1;28158:13;28166:5;28158;:13;:::i;:::-;28157:19;;;;:::i;:::-;28149:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;28241:20:0;;28218;28241;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;28218:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;28133:43;;-1:-1:-1;28288:27:0;;28284:229;;;28343:8;;;;-1:-1:-1;28336:15:0;;-1:-1:-1;;;;28336:15:0;28284:229;28377:12;;:26;;;-1:-1:-1;28373:140:0;;;28432:6;28424:14;;28373:140;;;28487:10;28496:1;28487:6;:10;:::i;:::-;28479:18;;28373:140;28096:428;;;;;-1:-1:-1;;;;;;28541:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;27328:1254:0;;;;:::o;14090:96::-;14138:13;14171:7;14164:14;;;;;:::i;22084:168::-;7528:6;;-1:-1:-1;;;;;7528:6:0;6026:10;7528:22;7520:67;;;;-1:-1:-1;;;7520:67:0;;;;;;;:::i;:::-;22158:21:::1;22164:5;22171:7;22158:5;:21::i;:::-;-1:-1:-1::0;;;;;22205:17:0;;::::1;;::::0;;;:10:::1;:17;::::0;;;;;22190:54:::1;::::0;22205:17:::1;::::0;22236:7;22190:14:::1;:54::i;18053:130::-:0;18109:4;7528:6;;-1:-1:-1;;;;;7528:6:0;6026:10;7528:22;7520:67;;;;-1:-1:-1;;;7520:67:0;;;;;;;:::i;:::-;18126:27:::1;6026:10:::0;18146:6:::1;18126:5;:27::i;:::-;-1:-1:-1::0;18171:4:0::1;7598:1;18053:130:::0;;;:::o;17574:261::-;17659:4;17676:129;6026:10;17699:7;17708:96;17747:15;17708:96;;;;;;;;;;;;;;;;;6026:10;17708:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17708:34:0;;;;;;;;;;;;:38;:96::i;14940:167::-;15018:4;15035:42;6026:10;15059:9;15070:6;15035:9;:42::i;26642:255::-;-1:-1:-1;;;;;26781:23:0;;26734:7;26781:23;;;:14;:23;;;;;;;;26822:16;:67;;26888:1;26822:67;;;-1:-1:-1;;;;;26841:20:0;;;;;;:11;:20;;;;;;26862:16;26877:1;26862:12;:16;:::i;:::-;26841:38;;;;;;;;;;;;;;;:44;;;26822:67;26815:74;26642:255;-1:-1:-1;;;26642:255:0:o;25247:1194::-;25440:23;23475:80;25569:6;:4;:6::i;:::-;25553:24;;;;;;;25490:166;;;;;;4125:25:1;;;;4166:18;;;4159:34;;;;25596:13:0;4209:18:1;;;4202:34;25636:4:0;4252:18:1;;;;4245:60;;;;25490:166:0;;;;;;;;;;4097:19:1;;;25490:166:0;;25466:201;;;;;;23695:71;25725:140;;;3703:25:1;-1:-1:-1;;;;;3764:32:1;;3744:18;;;3737:60;3813:18;;;3806:34;;;3856:18;;;;3849:34;;;25725:140:0;;;;;;;;;;3675:19:1;;;25725:140:0;;;25701:175;;;;;;;-1:-1:-1;;;25930:123:0;;;2751:27:1;2794:11;;;2787:27;;;2830:12;;;2823:28;;;25466:201:0;;-1:-1:-1;25701:175:0;-1:-1:-1;;2867:12:1;;25930:123:0;;;-1:-1:-1;;25930:123:0;;;;;;;;;25906:158;;25930:123;25906:158;;;;26077:17;26097:26;;;;;;;;;4543:25:1;;;4616:4;4604:17;;4584:18;;;4577:45;;;;4638:18;;;4631:34;;;4681:18;;;4674:34;;;25906:158:0;;-1:-1:-1;26077:17:0;26097:26;;4515:19:1;;26097:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26097:26:0;;-1:-1:-1;;26097:26:0;;;-1:-1:-1;;;;;;;26142:23:0;;26134:75;;;;-1:-1:-1;;;26134:75:0;;7103:2:1;26134:75:0;;;7085:21:1;7142:2;7122:18;;;7115:30;7181:34;7161:18;;;7154:62;-1:-1:-1;;;7232:18:1;;;7225:37;7279:19;;26134:75:0;7075:229:1;26134:75:0;-1:-1:-1;;;;;26237:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;26228:5;:28;26220:76;;;;-1:-1:-1;;;26220:76:0;;7511:2:1;26220:76:0;;;7493:21:1;7550:2;7530:18;;;7523:30;7589:34;7569:18;;;7562:62;-1:-1:-1;;;7640:18:1;;;7633:33;7683:19;;26220:76:0;7483:225:1;26220:76:0;26334:6;26315:15;:25;;26307:77;;;;-1:-1:-1;;;26307:77:0;;9442:2:1;26307:77:0;;;9424:21:1;9481:2;9461:18;;;9454:30;9520:34;9500:18;;;9493:62;-1:-1:-1;;;9571:18:1;;;9564:37;9618:19;;26307:77:0;9414:229:1;26307:77:0;26402:31;26412:9;26423;26402;:31::i;:::-;26395:38;;;;25247:1194;;;;;;;:::o;8261:244::-;7528:6;;-1:-1:-1;;;;;7528:6:0;6026:10;7528:22;7520:67;;;;-1:-1:-1;;;7520:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8350:22:0;::::1;8342:73;;;::::0;-1:-1:-1;;;8342:73:0;;6340:2:1;8342:73:0::1;::::0;::::1;6322:21:1::0;6379:2;6359:18;;;6352:30;6418:34;6398:18;;;6391:62;-1:-1:-1;;;6469:18:1;;;6462:36;6515:19;;8342:73:0::1;6312:228:1::0;8342:73:0::1;8452:6;::::0;;8431:38:::1;::::0;-1:-1:-1;;;;;8431:38:0;;::::1;::::0;8452:6;::::1;::::0;8431:38:::1;::::0;::::1;8480:6;:17:::0;;-1:-1:-1;;;;;;8480:17:0::1;-1:-1:-1::0;;;;;8480:17:0;;;::::1;::::0;;;::::1;::::0;;8261:244::o;20854:339::-;-1:-1:-1;;;;;20949:19:0;;20941:68;;;;-1:-1:-1;;;20941:68:0;;5935:2:1;20941:68:0;;;5917:21:1;5974:2;5954:18;;;5947:30;6013:34;5993:18;;;5986:62;-1:-1:-1;;;6064:18:1;;;6057:34;6108:19;;20941:68:0;5907:226:1;20941:68:0;-1:-1:-1;;;;;21028:21:0;;21020:68;;;;-1:-1:-1;;;21020:68:0;;9850:2:1;21020:68:0;;;9832:21:1;9889:2;9869:18;;;9862:30;9928:34;9908:18;;;9901:62;-1:-1:-1;;;9979:18:1;;;9972:32;10021:19;;21020:68:0;9822:224:1;21020:68:0;-1:-1:-1;;;;;21101:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21153:32;;3436:25:1;;;21153:32:0;;3409:18:1;21153:32:0;;;;;;;;20854:339;;;:::o;18673:472::-;-1:-1:-1;;;;;18772:20:0;;18764:70;;;;-1:-1:-1;;;18764:70:0;;5529:2:1;18764:70:0;;;5511:21:1;5568:2;5548:18;;;5541:30;5607:34;5587:18;;;5580:62;-1:-1:-1;;;5658:18:1;;;5651:35;5703:19;;18764:70:0;5501:227:1;18764:70:0;-1:-1:-1;;;;;18853:23:0;;18845:71;;;;-1:-1:-1;;;18845:71:0;;8636:2:1;18845:71:0;;;8618:21:1;8675:2;8655:18;;;8648:30;8714:34;8694:18;;;8687:62;-1:-1:-1;;;8765:18:1;;;8758:33;8808:19;;18845:71:0;8608:225:1;18845:71:0;18949;18971:6;18949:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18949:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;18929:17:0;;;;;;;:9;:17;;;;;;:91;;;;19054:20;;;;;;;:32;;19079:6;19054:24;:32::i;:::-;-1:-1:-1;;;;;19031:20:0;;;;;;;:9;:20;;;;;;;:55;;;;19102:35;;;;;;;;;;19130:6;3436:25:1;;3424:2;3409:18;;3391:76;1831:192:0;1917:7;1953:12;1945:6;;;;1937:29;;;;-1:-1:-1;;;1937:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1977:9:0;1989:5;1993:1;1989;:5;:::i;:::-;1977:17;1831:192;-1:-1:-1;;;;;1831:192:0:o;928:181::-;986:7;;1018:5;1022:1;1018;:5;:::i;:::-;1006:17;;1047:1;1042;:6;;1034:46;;;;-1:-1:-1;;;1034:46:0;;6747:2:1;1034:46:0;;;6729:21:1;6786:2;6766:18;;;6759:30;6825:29;6805:18;;;6798:57;6872:18;;1034:46:0;6719:177:1;19426:308:0;-1:-1:-1;;;;;19502:21:0;;19494:65;;;;-1:-1:-1;;;19494:65:0;;7915:2:1;19494:65:0;;;7897:21:1;7954:2;7934:18;;;7927:30;7993:33;7973:18;;;7966:61;8044:18;;19494:65:0;7887:181:1;19494:65:0;19587:12;;:24;;19604:6;19587:16;:24::i;:::-;19572:12;:39;-1:-1:-1;;;;;19643:18:0;;;;;;:9;:18;;;;;;:30;;19666:6;19643:22;:30::i;:::-;-1:-1:-1;;;;;19622:18:0;;;;;;:9;:18;;;;;;:51;;;;19689:37;;19622:18;;;19689:37;;;;19719:6;3436:25:1;;3424:2;3409:18;;3391:76;19689:37:0;;;;;;;;19426:308;;:::o;29037:945::-;29143:6;-1:-1:-1;;;;;29133:16:0;:6;-1:-1:-1;;;;;29133:16:0;;;:30;;;;;29162:1;29153:6;:10;29133:30;29129:846;;;-1:-1:-1;;;;;29184:20:0;;;29180:384;;-1:-1:-1;;;;;29292:22:0;;29273:16;29292:22;;;:14;:22;;;;;;;;;29353:13;:60;;29412:1;29353:60;;;-1:-1:-1;;;;;29369:19:0;;;;;;:11;:19;;;;;;29389:13;29401:1;29389:9;:13;:::i;:::-;29369:34;;;;;;;;;;;;;;;:40;;;29353:60;29333:80;-1:-1:-1;29432:17:0;29452:20;29465:6;29333:80;29452:20;:::i;:::-;29432:40;;29491:57;29508:6;29516:9;29527;29538;29491:16;:57::i;:::-;29180:384;;;;-1:-1:-1;;;;;29584:20:0;;;29580:384;;-1:-1:-1;;;;;29692:22:0;;29673:16;29692:22;;;:14;:22;;;;;;;;;29753:13;:60;;29812:1;29753:60;;;-1:-1:-1;;;;;29769:19:0;;;;;;:11;:19;;;;;;29789:13;29801:1;29789:9;:13;:::i;:::-;29769:34;;;;;;;;;;;;;;;:40;;;29753:60;29733:80;-1:-1:-1;29832:17:0;29852:20;29865:6;29733:80;29852:20;:::i;:::-;29832:40;;29891:57;29908:6;29916:9;29927;29938;29891:16;:57::i;29580:384::-;29037:945;;;:::o;20066:348::-;-1:-1:-1;;;;;20142:21:0;;20134:67;;;;-1:-1:-1;;;20134:67:0;;9040:2:1;20134:67:0;;;9022:21:1;9079:2;9059:18;;;9052:30;9118:34;9098:18;;;9091:62;-1:-1:-1;;;9169:18:1;;;9162:31;9210:19;;20134:67:0;9012:223:1;20134:67:0;20235:68;20258:6;20235:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20235:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;20214:18:0;;;;;;:9;:18;;;;;:89;20329:12;;:24;;20346:6;20329:16;:24::i;:::-;20314:12;:39;20369:37;;3436:25:1;;;20395:1:0;;-1:-1:-1;;;;;20369:37:0;;;;;3424:2:1;3409:18;20369:37:0;3391:76:1;28590:439:0;-1:-1:-1;;;;;28707:21:0;;;28681:23;28707:21;;;:10;:21;;;;;;;;;;14702:9;:18;;;;;;28843:21;;;;:33;;;-1:-1:-1;;;;;;28843:33:0;;;;;;;28894:54;;28707:21;;;;;14702:18;;28843:33;;28707:21;;;28894:54;;28681:23;28894:54;28961:60;28976:15;28993:9;29004:16;28961:14;:60::i;:::-;28590:439;;;;:::o;29990:705::-;30169:18;30190:77;30197:12;30190:77;;;;;;;;;;;;;;;;;:6;:77::i;:::-;30169:98;;30299:1;30284:12;:16;;;:85;;;;-1:-1:-1;;;;;;30304:22:0;;;;;;:11;:22;;;;;:65;;;;30327:16;30342:1;30327:12;:16;:::i;:::-;30304:40;;;;;;;;;;;;;;;-1:-1:-1;30304:40:0;:50;;:65;30284:85;30280:339;;;-1:-1:-1;;;;;30386:22:0;;;;;;:11;:22;;;;;30435:8;;30409:16;30424:1;30409:12;:16;:::i;:::-;30386:40;;;;;;;;;;;;;-1:-1:-1;30386:40:0;:46;;:57;30280:339;;;30515:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30476:22:0;;-1:-1:-1;30476:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;30476:72:0;;;;;;;;-1:-1:-1;30476:72:0;;;;30591:16;;30476:36;;30591:16;:::i;:::-;-1:-1:-1;;;;;30563:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;30563:44:0;;;;;;;;;;;;30280:339;30636:51;;;10816:25:1;;;10872:2;10857:18;;10850:34;;;-1:-1:-1;;;;;30636:51:0;;;;;10789:18:1;30636:51:0;;;;;;;29990:705;;;;;:::o;1392:136::-;1450:7;1477:43;1481:1;1484;1477:43;;;;;;;;;;;;;;;;;:3;:43::i;30703:161::-;30778:6;30816:12;30809:5;30805:9;;30797:32;;;;-1:-1:-1;;;30797:32:0;;;;;;;;:::i;:::-;-1:-1:-1;30854:1:0;;30703:161;-1:-1:-1;;30703:161:0:o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:196;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;393:270::-;461:6;469;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;745:6;753;761;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:264::-;1079:6;1087;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;1161:6;1153;1146:22;1108:2;1189:29;1208:9;1189:29;:::i;:::-;1179:39;1265:2;1250:18;;;;1237:32;;-1:-1:-1;;;1098:177:1:o;1280:638::-;1382:6;1390;1398;1406;1414;1422;1475:3;1463:9;1454:7;1450:23;1446:33;1443:2;;;1497:6;1489;1482:22;1443:2;1525:29;1544:9;1525:29;:::i;:::-;1515:39;;1601:2;1590:9;1586:18;1573:32;1563:42;;1652:2;1641:9;1637:18;1624:32;1614:42;;1706:2;1695:9;1691:18;1678:32;1750:4;1743:5;1739:16;1732:5;1729:27;1719:2;;1775:6;1767;1760:22;1719:2;1433:485;;;;-1:-1:-1;1433:485:1;;1855:3;1840:19;;1827:33;;1907:3;1892:19;;;1879:33;;-1:-1:-1;1433:485:1;-1:-1:-1;;1433:485:1:o;1923:370::-;1990:6;1998;2051:2;2039:9;2030:7;2026:23;2022:32;2019:2;;;2072:6;2064;2057:22;2019:2;2100:29;2119:9;2100:29;:::i;:::-;2090:39;;2179:2;2168:9;2164:18;2151:32;2223:10;2216:5;2212:22;2205:5;2202:33;2192:2;;2254:6;2246;2239:22;2192:2;2282:5;2272:15;;;2009:284;;;;;:::o;2298:190::-;2357:6;2410:2;2398:9;2389:7;2385:23;2381:32;2378:2;;;2431:6;2423;2416:22;2378:2;-1:-1:-1;2459:23:1;;2368:120;-1:-1:-1;2368:120:1:o;4719:603::-;4831:4;4860:2;4889;4878:9;4871:21;4921:6;4915:13;4964:6;4959:2;4948:9;4944:18;4937:34;4989:4;5002:140;5016:6;5013:1;5010:13;5002:140;;;5111:14;;;5107:23;;5101:30;5077:17;;;5096:2;5073:26;5066:66;5031:10;;5002:140;;;5160:6;5157:1;5154:13;5151:2;;;5230:4;5225:2;5216:6;5205:9;5201:22;5197:31;5190:45;5151:2;-1:-1:-1;5306:2:1;5285:15;-1:-1:-1;;5281:29:1;5266:45;;;;5313:2;5262:54;;4840:482;-1:-1:-1;;;4840:482:1:o;8073:356::-;8275:2;8257:21;;;8294:18;;;8287:30;8353:34;8348:2;8333:18;;8326:62;8420:2;8405:18;;8247:182::o;11549:128::-;11589:3;11620:1;11616:6;11613:1;11610:13;11607:2;;;11626:18;;:::i;:::-;-1:-1:-1;11662:9:1;;11597:80::o;11682:228::-;11721:3;11749:10;11786:2;11783:1;11779:10;11816:2;11813:1;11809:10;11847:3;11843:2;11839:12;11834:3;11831:21;11828:2;;;11855:18;;:::i;:::-;11891:13;;11729:181;-1:-1:-1;;;;11729:181:1:o;11915:288::-;11954:1;11980:10;12017:2;12014:1;12010:10;12039:3;12029:2;;-1:-1:-1;;;12066:31:1;;12120:4;12117:1;12110:15;12148:4;12073:1;12138:15;12029:2;12181:10;;12177:20;;;;;11960:243;-1:-1:-1;;11960:243:1:o;12208:125::-;12248:4;12276:1;12273;12270:8;12267:2;;;12281:18;;:::i;:::-;-1:-1:-1;12318:9:1;;12257:76::o;12338:221::-;12377:4;12406:10;12466;;;;12436;;12488:12;;;12485:2;;;12503:18;;:::i;:::-;12540:13;;12386:173;-1:-1:-1;;;12386:173:1:o;12564:380::-;12643:1;12639:12;;;;12686;;;12707:2;;12761:4;12753:6;12749:17;12739:27;;12707:2;12814;12806:6;12803:14;12783:18;12780:38;12777:2;;;12860:10;12855:3;12851:20;12848:1;12841:31;12895:4;12892:1;12885:15;12923:4;12920:1;12913:15;12777:2;;12619:325;;;:::o;12949:135::-;12988:3;-1:-1:-1;;13009:17:1;;13006:2;;;13029:18;;:::i;:::-;-1:-1:-1;13076:1:1;13065:13;;12996:88::o;13089:127::-;13150:10;13145:3;13141:20;13138:1;13131:31;13181:4;13178:1;13171:15;13205:4;13202:1;13195:15

Swarm Source

ipfs://2c83092cb3c7c5aae9915de574fd345b9b91c70f220b0b0fb3142ccea200ada9
Loading