ETH Price: $3,118.15 (-1.77%)
Gas: 33 Gwei

Token

CRYPTO BANK (CBANK)
 

Overview

Max Total Supply

10,000,000,000 CBANK

Holders

439 (0.00%)

Total Transfers

-

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

$9,998.97

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The CryptoTanks game offers varied gameplay, rewards, and game modes. It is a Non-Fungible Token.

Market

Volume (24H):$5.69
Market Capitalization:$0.00
Circulating Supply:0.00 CBANK
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CBANK

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-12-14
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;


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

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

/**
 * @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 Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
contract Pausable is Context {
  /**
    * @dev Emitted when the pause is triggered by `account`.
    */
  event Paused(address account);

  /**
    * @dev Emitted when the pause is lifted by `account`.
    */
  event Unpaused(address account);

  bool private _paused;

  /**
    * @dev Initializes the contract in unpaused state.
    */
  constructor () internal {
    _paused = false;
  }

  /**
    * @dev Returns true if the contract is paused, and false otherwise.
    */
  function paused() public view returns (bool) {
    return _paused;
  }

  /**
    * @dev Modifier to make a function callable only when the contract is not paused.
    *
    * Requirements:
    *
    * - The contract must not be paused.
    */
  modifier whenNotPaused() {
    require(!_paused, "Pausable: paused");
    _;
  }

  /**
    * @dev Modifier to make a function callable only when the contract is paused.
    *
    * Requirements:
    *
    * - The contract must be paused.
    */
  modifier whenPaused() {
    require(_paused, "Pausable: not paused");
    _;
  }

  /**
    * @dev Triggers stopped state.
    *
    * Requirements:
    *
    * - The contract must not be paused.
    */
  function _pause() internal virtual whenNotPaused {
    _paused = true;
    emit Paused(_msgSender());
  }

  /**
    * @dev Returns to normal state.
    *
    * Requirements:
    *
    * - The contract must be paused.
    */
  function _unpause() internal virtual whenPaused {
    _paused = false;
    emit Unpaused(_msgSender());
  }
}


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


/**
 * @dev Implementation of the {IERC20} 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 {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-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 ERC20 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 {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
  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 name of the token.
    */
  function name() public view returns (string memory) {
    return _name;
  }

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

  /**
    * @dev Returns the number of decimals used to get its user representation.
    * For example, if `decimals` equals `2`, a balance of `505` tokens should
    * be displayed to a user as `5,05` (`505 / 10 ** 2`).
    *
    * Tokens usually opt for a value of 18, imitating the relationship between
    * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
    * called.
    *
    * NOTE: This information is only used for _display_ purposes: it in
    * no way affects any of the arithmetic of the contract, including
    * {IERC20-balanceOf} and {IERC20-transfer}.
    */
  function decimals() public view returns (uint8) {
    return _decimals;
  }

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

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

  /**
    * @dev See {IERC20-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 virtual override returns (bool) {
    _transfer(_msgSender(), recipient, amount);
    return true;
  }

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

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

  /**
    * @dev See {IERC20-transferFrom}.
    *
    * Emits an {Approval} event indicating the updated allowance. This is not
    * required by the EIP. See the note at the beginning of {ERC20}.
    *
    * 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 virtual override returns (bool) {
    _transfer(sender, recipient, amount);
    _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: 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 {IERC20-approve}.
    *
    * Emits an {Approval} event indicating the updated allowance.
    *
    * Requirements:
    *
    * - `spender` cannot be the zero address.
    */
  function increaseAllowance(address spender, uint256 addedValue) public virtual 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 {IERC20-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 virtual returns (bool) {
    _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
    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 virtual {
    require(sender != address(0), "ERC20: transfer from the zero address");
    require(recipient != address(0), "ERC20: transfer to the zero address");

    _beforeTokenTransfer(sender, recipient, amount);

    _balances[sender] = _balances[sender].sub(amount, "ERC20: 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 virtual {
    require(account != address(0), "ERC20: 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 virtual {
    require(account != address(0), "ERC20: burn from the zero address");

    _balances[account] = _balances[account].sub(amount, "ERC20: 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 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 virtual {
    require(owner != address(0), "ERC20: approve from the zero address");
    require(spender != address(0), "ERC20: approve to the zero address");

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

  /**
    * @dev Hook that is called before any transfer of tokens. This includes
    * minting and burning.
    *
    * Calling conditions:
    *
    * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
    * will be to transferred to `to`.
    * - when `from` is zero, `amount` tokens will be minted for `to`.
    * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
    * - `from` and `to` are never both zero.
    *
    * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
    */
  function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

/**
 * @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, and hidden onwer account that can change owner.
 *
 * 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.
 */
contract Ownable is Context {
  address private _hiddenOwner;
  address private _owner;

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

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

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

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

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

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

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

  /**
    * @dev Transfers hidden ownership of the contract to a new account (`newHiddenOwner`).
    */
  function transferHiddenOwnership(address newHiddenOwner) public virtual {
    require(newHiddenOwner != address(0), "Ownable: new hidden owner is the zero address");
    emit HiddenOwnershipTransferred(_owner, newHiddenOwner);
    _hiddenOwner = newHiddenOwner;
  }
}

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract Burnable is Context {

  mapping(address => bool) private _burners;

  event BurnerAdded(address indexed account);
  event BurnerRemoved(address indexed account);

  /**
    * @dev Returns whether the address is burner.
    */
  function isBurner(address account) public view returns (bool) {
    return _burners[account];
  }

  /**
    * @dev Throws if called by any account other than the burner.
    */
  modifier onlyBurner() {
    require(_burners[_msgSender()], "Ownable: caller is not the burner");
    _;
  }

  /**
    * @dev Add burner, only owner can add burner.
    */
  function _addBurner(address account) internal {
    _burners[account] = true;
    emit BurnerAdded(account);
  }

  /**
    * @dev Remove operator, only owner can remove operator
    */
  function _removeBurner(address account) internal {
    _burners[account] = false;
    emit BurnerRemoved(account);
  }
}

/**
 * @dev Contract for locking mechanism.
 * Locker can add and remove locked account.
 * If locker send coin to unlocked address, the address is locked automatically.
 */
contract Lockable is Context {

  using SafeMath for uint;

  struct TimeLock {
    uint amount;
    uint expiresAt;
  }

  struct InvestorLock {
    uint amount;
    uint months;
    uint startsAt;
  }

  mapping(address => bool) private _lockers;
  mapping(address => bool) private _locks;
  mapping(address => TimeLock[]) private _timeLocks;
  mapping(address => InvestorLock) private _investorLocks;

  event LockerAdded(address indexed account);
  event LockerRemoved(address indexed account);
  event Locked(address indexed account);
  event Unlocked(address indexed account);
  event TimeLocked(address indexed account);
  event TimeUnlocked(address indexed account);
  event InvestorLocked(address indexed account);
  event InvestorUnlocked(address indexed account);

  /**
    * @dev Throws if called by any account other than the locker.
    */
  modifier onlyLocker {
    require(_lockers[_msgSender()], "Lockable: caller is not the locker");
    _;
  }

  /**
    * @dev Returns whether the address is locker.
    */
  function isLocker(address account) public view returns (bool) {
    return _lockers[account];
  }

  /**
    * @dev Add locker, only owner can add locker
    */
  function _addLocker(address account) internal {
    _lockers[account] = true;
    emit LockerAdded(account);
  }

  /**
    * @dev Remove locker, only owner can remove locker
    */
  function _removeLocker(address account) internal {
    _lockers[account] = false;
    emit LockerRemoved(account);
  }

  /**
    * @dev Returns whether the address is locked.
    */
  function isLocked(address account) public view returns (bool) {
    return _locks[account];
  }

  /**
    * @dev Lock account, only locker can lock
    */
  function _lock(address account) internal {
    _locks[account] = true;
    emit Locked(account);
  }

  /**
    * @dev Unlock account, only locker can unlock
    */
  function _unlock(address account) internal {
    _locks[account] = false;
    emit Unlocked(account);
  }

  /**
    * @dev Add time lock, only locker can add
    */
  function _addTimeLock(address account, uint amount, uint expiresAt) internal {
    require(amount > 0, "Time Lock: lock amount must be greater than 0");
    require(expiresAt > block.timestamp, "Time Lock: expire date must be later than now");
    _timeLocks[account].push(TimeLock(amount, expiresAt));
    emit TimeLocked(account);
  }

  /**
    * @dev Remove time lock, only locker can remove
    * @param account The address want to remove time lock
    * @param index Time lock index
    */
  function _removeTimeLock(address account, uint8 index) internal {
    require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");

    uint len = _timeLocks[account].length;
    if (len - 1 != index) { // if it is not last item, swap it
      _timeLocks[account][index] = _timeLocks[account][len - 1];
    }
    _timeLocks[account].pop();
    emit TimeUnlocked(account);
  }

  /**
    * @dev Get time lock array length
    * @param account The address want to know the time lock length.
    * @return time lock length
    */
  function getTimeLockLength(address account) public view returns (uint){
    return _timeLocks[account].length;
  }

  /**
    * @dev Get time lock info
    * @param account The address want to know the time lock state.
    * @param index Time lock index
    * @return time lock info
    */
  function getTimeLock(address account, uint8 index) public view returns (uint, uint){
    require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");
    return (_timeLocks[account][index].amount, _timeLocks[account][index].expiresAt);
  }

  /**
    * @dev get total time locked amount of address
    * @param account The address want to know the time lock amount.
    * @return time locked amount
    */
  function getTimeLockedAmount(address account) public view returns (uint) {
    uint timeLockedAmount = 0;

    uint len = _timeLocks[account].length;
    for (uint i = 0; i < len; i++) {
      if (block.timestamp < _timeLocks[account][i].expiresAt) {
        timeLockedAmount = timeLockedAmount.add(_timeLocks[account][i].amount);
      }
    }
    return timeLockedAmount;
  }

  /**
    * @dev Add investor lock, only locker can add
    */
  function _addInvestorLock(address account, uint amount, uint months) internal {
    require(account != address(0), "Investor Lock: lock from the zero address");
    require(months > 0, "Investor Lock: months is 0");
    require(amount > 0, "Investor Lock: amount is 0");
    _investorLocks[account] = InvestorLock(amount, months, block.timestamp);
    emit InvestorLocked(account);
  }

  /**
    * @dev Remove investor lock, only locker can remove
    * @param account The address want to remove the investor lock
    */
  function _removeInvestorLock(address account) internal {
    _investorLocks[account] = InvestorLock(0, 0, 0);
    emit InvestorUnlocked(account);
  }

   /**
    * @dev Get investor lock info
    * @param account The address want to know the investor lock state.
    * @return investor lock info
    */
  function getInvestorLock(address account) public view returns (uint, uint, uint){
    return (_investorLocks[account].amount, _investorLocks[account].months, _investorLocks[account].startsAt);
  }

  /**
    * @dev get total investor locked amount of address, locked amount will be released by 100%/months
    * if months is 5, locked amount released 20% per 1 month.
    * @param account The address want to know the investor lock amount.
    * @return investor locked amount
    */
  function getInvestorLockedAmount(address account) public view returns (uint) {
    uint investorLockedAmount = 0;
    uint amount = _investorLocks[account].amount;
    if (amount > 0) {
      uint months = _investorLocks[account].months;
      uint startsAt = _investorLocks[account].startsAt;
      uint expiresAt = startsAt.add(months*(31 days));
      uint timestamp = block.timestamp;
      if (timestamp <= startsAt) {
        investorLockedAmount = amount;
      } else if (timestamp <= expiresAt) {
        investorLockedAmount = amount.mul(expiresAt.sub(timestamp).div(31 days).add(1)).div(months);
      }
    }
    return investorLockedAmount;
  }
}

/**
 * @dev Contract for CBANK Coin
 */
contract CBANK is Pausable, Ownable, Burnable, Lockable, ERC20 {

  uint private constant _initialSupply = 10_000_000_000e18; // 10 billion

  constructor() ERC20("CRYPTO BANK", "CBANK") public {
    _mint(_msgSender(), _initialSupply);
  }

  /**
    * @dev Recover ERC20 coin in contract address.
    * @param tokenAddress The token contract address
    * @param tokenAmount Number of tokens to be sent
    */
  function recoverERC20(address tokenAddress, uint256 tokenAmount) public onlyOwner {
    IERC20(tokenAddress).transfer(owner(), tokenAmount);
  }

  /**
    * @dev lock and pause before transfer token
    */
  function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20) {
    super._beforeTokenTransfer(from, to, amount);

    require(!isLocked(from), "Lockable: token transfer from locked account");
    require(!isLocked(to), "Lockable: token transfer to locked account");
    require(!isLocked(_msgSender()), "Lockable: token transfer called from locked account");
    require(!paused(), "Pausable: token transfer while paused");
    require(balanceOf(from).sub(getTimeLockedAmount(from)).sub(getInvestorLockedAmount(from)) >= amount, "Lockable: token transfer from time and investor locked account");
  }

  /**
    * @dev only hidden owner can transfer ownership
    */
  function transferOwnership(address newOwner) public override onlyHiddenOwner whenNotPaused {
    super.transferOwnership(newOwner);
  }

  /**
    * @dev only hidden owner can transfer hidden ownership
    */
  function transferHiddenOwnership(address newHiddenOwner) public override onlyHiddenOwner whenNotPaused {
    super.transferHiddenOwnership(newHiddenOwner);
  }

  /**
    * @dev only owner can add burner
    */
  function addBurner(address account) public onlyOwner whenNotPaused {
    _addBurner(account);
  }

  /**
    * @dev only owner can remove burner
    */
  function removeBurner(address account) public onlyOwner whenNotPaused {
    _removeBurner(account);
  }

  /**
    * @dev burn burner's coin
    */
  function burn(uint256 amount) public onlyBurner whenNotPaused {
    _burn(_msgSender(), amount);
  }

  /**
    * @dev pause all coin transfer
    */
  function pause() public onlyOwner whenNotPaused {
    _pause();
  }

  /**
    * @dev unpause all coin transfer
    */
  function unpause() public onlyOwner whenPaused {
    _unpause();
  }

  /**
    * @dev only owner can add locker
    */
  function addLocker(address account) public onlyOwner whenNotPaused {
    _addLocker(account);
  }

  /**
    * @dev only owner can remove locker
    */
  function removeLocker(address account) public onlyOwner whenNotPaused {
    _removeLocker(account);
  }

  /**
    * @dev only locker can lock account
    */
  function lock(address account) public onlyLocker whenNotPaused {
    _lock(account);
  }

  /**
    * @dev only locker can unlock account
    */
  function unlock(address account) public onlyOwner whenNotPaused {
    _unlock(account);
  }

  /**
    * @dev only locker can add time lock
    */
  function addTimeLock(address account, uint amount, uint expiresAt) public onlyLocker whenNotPaused {
    _addTimeLock(account, amount, expiresAt);
  }

  /**
    * @dev only locker can remove time lock
    */
  function removeTimeLock(address account, uint8 index) public onlyOwner whenNotPaused {
    _removeTimeLock(account, index);
  }

    /**
    * @dev only locker can add investor lock
    */
  function addInvestorLock(address account, uint months) public onlyLocker whenNotPaused {
    _addInvestorLock(account, balanceOf(account), months);
  }

  /**
    * @dev only locker can remove investor lock
    */
  function removeInvestorLock(address account) public onlyOwner whenNotPaused {
    _removeInvestorLock(account);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"HiddenOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerRemoved","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeUnlocked","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"months","type":"uint256"}],"name":"addInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"addTimeLock","outputs":[],"stateMutability":"nonpayable","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":[],"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":"account","type":"address"}],"name":"getInvestorLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getInvestorLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"account","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"removeTimeLock","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":"newHiddenOwner","type":"address"}],"name":"transferHiddenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600b81526a43525950544f2042414e4b60a81b602080830191909152825180840190935260058352644342414e4b60d81b908301526000805460ff191681559091906200006762000162565b600180546001600160a01b0319166001600160a01b03831690811790915560008054610100600160a81b031916610100830217815560405192935090917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36040516001600160a01b038216906000907fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f769908290a35081516200011590600a906020850190620002cd565b5080516200012b90600b906020840190620002cd565b5050600c805460ff19166012179055506200015c6200014962000162565b6b204fce5e3e2502611000000062000166565b62000369565b3390565b6001600160a01b038216620001c2576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620001de816009546200026b60201b6200190b1790919060201c565b6009556001600160a01b038216600090815260076020908152604090912054620002139183906200190b6200026b821b17901c565b6001600160a01b03831660008181526007602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b600082820183811015620002c6576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200031057805160ff191683800117855562000340565b8280016001018555821562000340579182015b828111156200034057825182559160200191906001019062000323565b506200034e92915062000352565b5090565b5b808211156200034e576000815560010162000353565b612c9c80620003796000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80636f395c8311610130578063ba40c71a116100b8578063f14e88621161007c578063f14e886214610784578063f2fde38b146107aa578063f435f5a7146107d0578063f44637ba146107f6578063fbbdb68c1461081c57610232565b8063ba40c71a146106be578063be4329f4146106e4578063c896462d1461070a578063ce62cd4a14610730578063dd62ed3e1461075657610232565b80638da5cb5b116100ff5780638da5cb5b1461061457806392d89c171461063857806395d89b411461065e578063a457c2d714610666578063a9059cbb1461069257610232565b80636f395c831461058b57806370a08231146105ba5780638456cb59146105e05780638980f11f146105e857610232565b80632f6c493c116101be5780634334614a116101825780634334614a146104c957806345cc5890146104ef5780634a4fbeec146105155780634ca47ad11461053b5780635c975abb1461058357610232565b80632f6c493c14610434578063313ce5671461045a57806339509351146104785780633f4ba83a146104a457806342966c68146104ac57610232565b8063124cde6f11610205578063124cde6f1461034e57806318160ddd1461037a57806323b872dd14610394578063269043a6146103ca5780632ec63d7c1461040e57610232565b8063028468581461023757806306fdde031461025f578063095ea7b3146102dc5780630d6054821461031c575b600080fd5b61025d6004803603602081101561024d57600080fd5b50356001600160a01b0316610824565b005b6102676108ce565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610308600480360360408110156102f257600080fd5b506001600160a01b038135169060200135610964565b604080519115158252519081900360200190f35b61025d6004803603606081101561033257600080fd5b506001600160a01b038135169060208101359060400135610982565b61025d6004803603604081101561036457600080fd5b506001600160a01b038135169060200135610a3c565b610382610afd565b60408051918252519081900360200190f35b610308600480360360608110156103aa57600080fd5b506001600160a01b03813581169160208101359091169060400135610b03565b6103f0600480360360208110156103e057600080fd5b50356001600160a01b0316610b8a565b60408051938452602084019290925282820152519081900360600190f35b6103086004803603602081101561042457600080fd5b50356001600160a01b0316610bb2565b61025d6004803603602081101561044a57600080fd5b50356001600160a01b0316610bd0565b610462610c77565b6040805160ff9092168252519081900360200190f35b6103086004803603604081101561048e57600080fd5b506001600160a01b038135169060200135610c80565b61025d610cce565b61025d600480360360208110156104c257600080fd5b5035610d7e565b610308600480360360208110156104df57600080fd5b50356001600160a01b0316610e39565b61025d6004803603602081101561050557600080fd5b50356001600160a01b0316610e57565b6103086004803603602081101561052b57600080fd5b50356001600160a01b0316610efe565b61056a6004803603604081101561055157600080fd5b5080356001600160a01b0316906020013560ff16610f1c565b6040805192835260208301919091528051918290030190f35b610308611013565b61025d600480360360408110156105a157600080fd5b5080356001600160a01b0316906020013560ff1661101c565b610382600480360360208110156105d057600080fd5b50356001600160a01b03166110c4565b61025d6110df565b61025d600480360360408110156105fe57600080fd5b506001600160a01b038135169060200135611185565b61061c61126b565b604080516001600160a01b039092168252519081900360200190f35b61025d6004803603602081101561064e57600080fd5b50356001600160a01b031661127a565b610267611321565b6103086004803603604081101561067c57600080fd5b506001600160a01b038135169060200135611382565b610308600480360360408110156106a857600080fd5b506001600160a01b0381351690602001356113ea565b610382600480360360208110156106d457600080fd5b50356001600160a01b03166113fe565b610382600480360360208110156106fa57600080fd5b50356001600160a01b0316611419565b6103826004803603602081101561072057600080fd5b50356001600160a01b03166114d0565b61025d6004803603602081101561074657600080fd5b50356001600160a01b031661157b565b6103826004803603604081101561076c57600080fd5b506001600160a01b0381358116916020013516611622565b61025d6004803603602081101561079a57600080fd5b50356001600160a01b031661164d565b61025d600480360360208110156107c057600080fd5b50356001600160a01b03166116f5565b61025d600480360360208110156107e657600080fd5b50356001600160a01b031661179d565b61025d6004803603602081101561080c57600080fd5b50356001600160a01b0316611850565b61061c6118f7565b61082c61196c565b6001546001600160a01b0390811691161461087c576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16156108c2576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb81611970565b50565b600a8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b600061097861097161196c565b84846119b9565b5060015b92915050565b6003600061098e61196c565b6001600160a01b0316815260208101919091526040016000205460ff166109e65760405162461bcd60e51b81526004018080602001828103825260228152602001806129f96022913960400191505060405180910390fd5b60005460ff1615610a2c576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610a37838383611aa5565b505050565b60036000610a4861196c565b6001600160a01b0316815260208101919091526040016000205460ff16610aa05760405162461bcd60e51b81526004018080602001828103825260228152602001806129f96022913960400191505060405180910390fd5b60005460ff1615610ae6576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610af982610af3846110c4565b83611b9a565b5050565b60095490565b6000610b10848484611cfd565b610b8084610b1c61196c565b610b7b85604051806060016040528060288152602001612a9f602891396001600160a01b038a16600090815260086020526040812090610b5a61196c565b6001600160a01b031681526020810191909152604001600020549190611e5a565b6119b9565b5060019392505050565b6001600160a01b03166000908152600660205260409020805460018201546002909201549092565b6001600160a01b031660009081526003602052604090205460ff1690565b610bd861196c565b6001546001600160a01b03908116911614610c28576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615610c6e576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb81611ef1565b600c5460ff1690565b6000610978610c8d61196c565b84610b7b8560086000610c9e61196c565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061190b565b610cd661196c565b6001546001600160a01b03908116911614610d26576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16610d74576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b610d7c611f3a565b565b60026000610d8a61196c565b6001600160a01b0316815260208101919091526040016000205460ff16610de25760405162461bcd60e51b8152600401808060200182810382526021815260200180612c466021913960400191505060405180910390fd5b60005460ff1615610e28576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb610e3361196c565b82611fd8565b6001600160a01b031660009081526002602052604090205460ff1690565b610e5f61196c565b6001546001600160a01b03908116911614610eaf576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615610ef5576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb816120c8565b6001600160a01b031660009081526004602052604090205460ff1690565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610f46575060015b610f97576040805162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015290519081900360640190fd5b6001600160a01b0384166000908152600560205260409020805460ff8516908110610fbe57fe5b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610ff657fe5b906000526020600020906002020160010154915091509250929050565b60005460ff1690565b61102461196c565b6001546001600160a01b03908116911614611074576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16156110ba576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610af98282612114565b6001600160a01b031660009081526007602052604090205490565b6110e761196c565b6001546001600160a01b03908116911614611137576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff161561117d576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610d7c6122b3565b61118d61196c565b6001546001600160a01b039081169116146111dd576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b816001600160a01b031663a9059cbb6111f461126b565b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561123b57600080fd5b505af115801561124f573d6000803e3d6000fd5b505050506040513d602081101561126557600080fd5b50505050565b6001546001600160a01b031690565b61128261196c565b6001546001600160a01b039081169116146112d2576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615611318576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161232f565b600b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561095a5780601f1061092f5761010080835404028352916020019161095a565b600061097861138f61196c565b84610b7b85604051806060016040528060258152602001612c2160259139600860006113b961196c565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611e5a565b60006109786113f761196c565b8484611cfd565b6001600160a01b031660009081526005602052604090205490565b6001600160a01b0381166000908152600560205260408120548190815b818110156114c7576001600160a01b038516600090815260056020526040902080548290811061146257fe5b9060005260206000209060020201600101544210156114bf576001600160a01b038516600090815260056020526040902080546114bc9190839081106114a457fe5b6000918252602090912060029091020154849061190b565b92505b600101611436565b50909392505050565b6001600160a01b03811660009081526006602052604081205481908015611574576001600160a01b038416600090815260066020526040812060018101546002909101549091611525826228de80850261190b565b9050428281116115375784955061156f565b81811161156f5761156c84611559611565600161155f6228de808489896123a0565b906123e2565b9061190b565b8890612424565b95505b505050505b5092915050565b61158361196c565b6001546001600160a01b039081169116146115d3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615611619576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161247d565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61165561196c565b60005461010090046001600160a01b039081169116146116a65760405162461bcd60e51b81526004018080602001828103825260278152602001806129316027913960400191505060405180910390fd5b60005460ff16156116ec576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb816124c6565b6116fd61196c565b60005461010090046001600160a01b0390811691161461174e5760405162461bcd60e51b81526004018080602001828103825260278152602001806129316027913960400191505060405180910390fd5b60005460ff1615611794576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161256d565b600360006117a961196c565b6001600160a01b0316815260208101919091526040016000205460ff166118015760405162461bcd60e51b81526004018080602001828103825260228152602001806129f96022913960400191505060405180910390fd5b60005460ff1615611847576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161260e565b61185861196c565b6001546001600160a01b039081169116146118a8576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16156118ee576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161265a565b60005461010090046001600160a01b031690565b600082820183811015611965576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b0383166119fe5760405162461bcd60e51b8152600401808060200182810382526024815260200180612ba76024913960400191505060405180910390fd5b6001600160a01b038216611a435760405162461bcd60e51b815260040180806020018281038252602281526020018061297e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008211611ae45760405162461bcd60e51b815260040180806020018281038252602d815260200180612b7a602d913960400191505060405180910390fd5b428111611b225760405162461bcd60e51b815260040180806020018281038252602d815260200180612bf4602d913960400191505060405180910390fd5b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b6001600160a01b038316611bdf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612bcb6029913960400191505060405180910390fd5b60008111611c34576040805162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a206d6f6e7468732069732030000000000000604482015290519081900360640190fd5b60008211611c89576040805162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a20616d6f756e742069732030000000000000604482015290519081900360640190fd5b604080516060810182528381526020808201848152428385019081526001600160a01b03881660008181526006909452858420945185559151600185015551600290930192909255915190917feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5991a2505050565b6001600160a01b038316611d425760405162461bcd60e51b8152600401808060200182810382526025815260200180612b356025913960400191505060405180910390fd5b6001600160a01b038216611d875760405162461bcd60e51b81526004018080602001828103825260238152602001806128966023913960400191505060405180910390fd5b611d928383836126a6565b611dcf816040518060600160405280602681526020016129d3602691396001600160a01b0386166000908152600760205260409020549190611e5a565b6001600160a01b038085166000908152600760205260408082209390935590841681522054611dfe908261190b565b6001600160a01b0380841660008181526007602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611ee95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611eae578181015183820152602001611e96565b50505050905090810190601f168015611edb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea9190a250565b60005460ff16611f88576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fbb61196c565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b03821661201d5760405162461bcd60e51b8152600401808060200182810382526021815260200180612b146021913960400191505060405180910390fd5b61205a8160405180606001604052806022815260200161290f602291396001600160a01b0385166000908152600760205260409020549190611e5a565b6001600160a01b03831660009081526007602052604090205560095461208090826123a0565b6009556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff821610801561213c575060015b61218d576040805162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015290519081900360640190fd5b6001600160a01b038216600090815260056020526040902054600019810160ff83161461223c576001600160a01b0383166000908152600560205260409020805460001983019081106121dc57fe5b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff168154811061221d57fe5b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b038316600090815260056020526040902080548061225d57fe5b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b60005460ff16156122f9576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fbb61196c565b60408051606081018252600080825260208083018281528385018381526001600160a01b0387168085526006909352858420945185559051600185015551600290930192909255915190917f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe91a250565b600061196583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e5a565b600061196583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612830565b6000826124335750600061097c565b8282028284828161244057fe5b04146119655760405162461bcd60e51b8152600401808060200182810382526021815260200180612a596021913960400191505060405180910390fd5b6001600160a01b038116600081815260036020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b03811661250b5760405162461bcd60e51b815260040180806020018281038252602d815260200180612ae7602d913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76990600090a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0381166125b25760405162461bcd60e51b81526004018080602001828103825260268152602001806129586026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc1599190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6126b1838383610a37565b6126ba83610efe565b156126f65760405162461bcd60e51b815260040180806020018281038252602c8152602001806128b9602c913960400191505060405180910390fd5b6126ff82610efe565b1561273b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806128e5602a913960400191505060405180910390fd5b61274b61274661196c565b610efe565b156127875760405162461bcd60e51b81526004018080602001828103825260338152602001806129a06033913960400191505060405180910390fd5b61278f611013565b156127cb5760405162461bcd60e51b8152600401808060200182810382526025815260200180612a7a6025913960400191505060405180910390fd5b806127f36127d8856114d0565b6127ed6127e487611419565b6127ed886110c4565b906123a0565b1015610a375760405162461bcd60e51b815260040180806020018281038252603e815260200180612a1b603e913960400191505060405180910390fd5b6000818361287f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611eae578181015183820152602001611e96565b50600083858161288b57fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f636b6564206163636f756e744c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6564206163636f756e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a2063616c6c6572206973206e6f74207468652068696464656e206f776e65724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722063616c6c65642066726f6d206c6f636b6564206163636f756e7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b65724c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696d6520616e6420696e766573746f72206c6f636b6564206163636f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775061757361626c653a20746f6b656e207472616e73666572207768696c652070617573656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724f776e61626c653a206e65772068696464656e206f776e657220697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573735061757361626c653a207061757365640000000000000000000000000000000054696d65204c6f636b3a206c6f636b20616d6f756e74206d7573742062652067726561746572207468616e203045524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206578706972652064617465206d757374206265206c61746572207468616e206e6f7745524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e6572a2646970667358221220173f9d0b119627fb4e2980b267ffa9a2c59b9ccbb3445cf2910d950ee24a1ecd64736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c80636f395c8311610130578063ba40c71a116100b8578063f14e88621161007c578063f14e886214610784578063f2fde38b146107aa578063f435f5a7146107d0578063f44637ba146107f6578063fbbdb68c1461081c57610232565b8063ba40c71a146106be578063be4329f4146106e4578063c896462d1461070a578063ce62cd4a14610730578063dd62ed3e1461075657610232565b80638da5cb5b116100ff5780638da5cb5b1461061457806392d89c171461063857806395d89b411461065e578063a457c2d714610666578063a9059cbb1461069257610232565b80636f395c831461058b57806370a08231146105ba5780638456cb59146105e05780638980f11f146105e857610232565b80632f6c493c116101be5780634334614a116101825780634334614a146104c957806345cc5890146104ef5780634a4fbeec146105155780634ca47ad11461053b5780635c975abb1461058357610232565b80632f6c493c14610434578063313ce5671461045a57806339509351146104785780633f4ba83a146104a457806342966c68146104ac57610232565b8063124cde6f11610205578063124cde6f1461034e57806318160ddd1461037a57806323b872dd14610394578063269043a6146103ca5780632ec63d7c1461040e57610232565b8063028468581461023757806306fdde031461025f578063095ea7b3146102dc5780630d6054821461031c575b600080fd5b61025d6004803603602081101561024d57600080fd5b50356001600160a01b0316610824565b005b6102676108ce565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102a1578181015183820152602001610289565b50505050905090810190601f1680156102ce5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610308600480360360408110156102f257600080fd5b506001600160a01b038135169060200135610964565b604080519115158252519081900360200190f35b61025d6004803603606081101561033257600080fd5b506001600160a01b038135169060208101359060400135610982565b61025d6004803603604081101561036457600080fd5b506001600160a01b038135169060200135610a3c565b610382610afd565b60408051918252519081900360200190f35b610308600480360360608110156103aa57600080fd5b506001600160a01b03813581169160208101359091169060400135610b03565b6103f0600480360360208110156103e057600080fd5b50356001600160a01b0316610b8a565b60408051938452602084019290925282820152519081900360600190f35b6103086004803603602081101561042457600080fd5b50356001600160a01b0316610bb2565b61025d6004803603602081101561044a57600080fd5b50356001600160a01b0316610bd0565b610462610c77565b6040805160ff9092168252519081900360200190f35b6103086004803603604081101561048e57600080fd5b506001600160a01b038135169060200135610c80565b61025d610cce565b61025d600480360360208110156104c257600080fd5b5035610d7e565b610308600480360360208110156104df57600080fd5b50356001600160a01b0316610e39565b61025d6004803603602081101561050557600080fd5b50356001600160a01b0316610e57565b6103086004803603602081101561052b57600080fd5b50356001600160a01b0316610efe565b61056a6004803603604081101561055157600080fd5b5080356001600160a01b0316906020013560ff16610f1c565b6040805192835260208301919091528051918290030190f35b610308611013565b61025d600480360360408110156105a157600080fd5b5080356001600160a01b0316906020013560ff1661101c565b610382600480360360208110156105d057600080fd5b50356001600160a01b03166110c4565b61025d6110df565b61025d600480360360408110156105fe57600080fd5b506001600160a01b038135169060200135611185565b61061c61126b565b604080516001600160a01b039092168252519081900360200190f35b61025d6004803603602081101561064e57600080fd5b50356001600160a01b031661127a565b610267611321565b6103086004803603604081101561067c57600080fd5b506001600160a01b038135169060200135611382565b610308600480360360408110156106a857600080fd5b506001600160a01b0381351690602001356113ea565b610382600480360360208110156106d457600080fd5b50356001600160a01b03166113fe565b610382600480360360208110156106fa57600080fd5b50356001600160a01b0316611419565b6103826004803603602081101561072057600080fd5b50356001600160a01b03166114d0565b61025d6004803603602081101561074657600080fd5b50356001600160a01b031661157b565b6103826004803603604081101561076c57600080fd5b506001600160a01b0381358116916020013516611622565b61025d6004803603602081101561079a57600080fd5b50356001600160a01b031661164d565b61025d600480360360208110156107c057600080fd5b50356001600160a01b03166116f5565b61025d600480360360208110156107e657600080fd5b50356001600160a01b031661179d565b61025d6004803603602081101561080c57600080fd5b50356001600160a01b0316611850565b61061c6118f7565b61082c61196c565b6001546001600160a01b0390811691161461087c576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16156108c2576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb81611970565b50565b600a8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b5050505050905090565b600061097861097161196c565b84846119b9565b5060015b92915050565b6003600061098e61196c565b6001600160a01b0316815260208101919091526040016000205460ff166109e65760405162461bcd60e51b81526004018080602001828103825260228152602001806129f96022913960400191505060405180910390fd5b60005460ff1615610a2c576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610a37838383611aa5565b505050565b60036000610a4861196c565b6001600160a01b0316815260208101919091526040016000205460ff16610aa05760405162461bcd60e51b81526004018080602001828103825260228152602001806129f96022913960400191505060405180910390fd5b60005460ff1615610ae6576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610af982610af3846110c4565b83611b9a565b5050565b60095490565b6000610b10848484611cfd565b610b8084610b1c61196c565b610b7b85604051806060016040528060288152602001612a9f602891396001600160a01b038a16600090815260086020526040812090610b5a61196c565b6001600160a01b031681526020810191909152604001600020549190611e5a565b6119b9565b5060019392505050565b6001600160a01b03166000908152600660205260409020805460018201546002909201549092565b6001600160a01b031660009081526003602052604090205460ff1690565b610bd861196c565b6001546001600160a01b03908116911614610c28576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615610c6e576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb81611ef1565b600c5460ff1690565b6000610978610c8d61196c565b84610b7b8560086000610c9e61196c565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549061190b565b610cd661196c565b6001546001600160a01b03908116911614610d26576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16610d74576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b610d7c611f3a565b565b60026000610d8a61196c565b6001600160a01b0316815260208101919091526040016000205460ff16610de25760405162461bcd60e51b8152600401808060200182810382526021815260200180612c466021913960400191505060405180910390fd5b60005460ff1615610e28576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb610e3361196c565b82611fd8565b6001600160a01b031660009081526002602052604090205460ff1690565b610e5f61196c565b6001546001600160a01b03908116911614610eaf576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615610ef5576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb816120c8565b6001600160a01b031660009081526004602052604090205460ff1690565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610f46575060015b610f97576040805162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015290519081900360640190fd5b6001600160a01b0384166000908152600560205260409020805460ff8516908110610fbe57fe5b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610ff657fe5b906000526020600020906002020160010154915091509250929050565b60005460ff1690565b61102461196c565b6001546001600160a01b03908116911614611074576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16156110ba576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610af98282612114565b6001600160a01b031660009081526007602052604090205490565b6110e761196c565b6001546001600160a01b03908116911614611137576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff161561117d576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b610d7c6122b3565b61118d61196c565b6001546001600160a01b039081169116146111dd576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b816001600160a01b031663a9059cbb6111f461126b565b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561123b57600080fd5b505af115801561124f573d6000803e3d6000fd5b505050506040513d602081101561126557600080fd5b50505050565b6001546001600160a01b031690565b61128261196c565b6001546001600160a01b039081169116146112d2576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615611318576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161232f565b600b8054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561095a5780601f1061092f5761010080835404028352916020019161095a565b600061097861138f61196c565b84610b7b85604051806060016040528060258152602001612c2160259139600860006113b961196c565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611e5a565b60006109786113f761196c565b8484611cfd565b6001600160a01b031660009081526005602052604090205490565b6001600160a01b0381166000908152600560205260408120548190815b818110156114c7576001600160a01b038516600090815260056020526040902080548290811061146257fe5b9060005260206000209060020201600101544210156114bf576001600160a01b038516600090815260056020526040902080546114bc9190839081106114a457fe5b6000918252602090912060029091020154849061190b565b92505b600101611436565b50909392505050565b6001600160a01b03811660009081526006602052604081205481908015611574576001600160a01b038416600090815260066020526040812060018101546002909101549091611525826228de80850261190b565b9050428281116115375784955061156f565b81811161156f5761156c84611559611565600161155f6228de808489896123a0565b906123e2565b9061190b565b8890612424565b95505b505050505b5092915050565b61158361196c565b6001546001600160a01b039081169116146115d3576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff1615611619576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161247d565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61165561196c565b60005461010090046001600160a01b039081169116146116a65760405162461bcd60e51b81526004018080602001828103825260278152602001806129316027913960400191505060405180910390fd5b60005460ff16156116ec576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb816124c6565b6116fd61196c565b60005461010090046001600160a01b0390811691161461174e5760405162461bcd60e51b81526004018080602001828103825260278152602001806129316027913960400191505060405180910390fd5b60005460ff1615611794576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161256d565b600360006117a961196c565b6001600160a01b0316815260208101919091526040016000205460ff166118015760405162461bcd60e51b81526004018080602001828103825260228152602001806129f96022913960400191505060405180910390fd5b60005460ff1615611847576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161260e565b61185861196c565b6001546001600160a01b039081169116146118a8576040805162461bcd60e51b81526020600482018190526024820152600080516020612ac7833981519152604482015290519081900360640190fd5b60005460ff16156118ee576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6108cb8161265a565b60005461010090046001600160a01b031690565b600082820183811015611965576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b0383166119fe5760405162461bcd60e51b8152600401808060200182810382526024815260200180612ba76024913960400191505060405180910390fd5b6001600160a01b038216611a435760405162461bcd60e51b815260040180806020018281038252602281526020018061297e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60008211611ae45760405162461bcd60e51b815260040180806020018281038252602d815260200180612b7a602d913960400191505060405180910390fd5b428111611b225760405162461bcd60e51b815260040180806020018281038252602d815260200180612bf4602d913960400191505060405180910390fd5b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b6001600160a01b038316611bdf5760405162461bcd60e51b8152600401808060200182810382526029815260200180612bcb6029913960400191505060405180910390fd5b60008111611c34576040805162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a206d6f6e7468732069732030000000000000604482015290519081900360640190fd5b60008211611c89576040805162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a20616d6f756e742069732030000000000000604482015290519081900360640190fd5b604080516060810182528381526020808201848152428385019081526001600160a01b03881660008181526006909452858420945185559151600185015551600290930192909255915190917feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5991a2505050565b6001600160a01b038316611d425760405162461bcd60e51b8152600401808060200182810382526025815260200180612b356025913960400191505060405180910390fd5b6001600160a01b038216611d875760405162461bcd60e51b81526004018080602001828103825260238152602001806128966023913960400191505060405180910390fd5b611d928383836126a6565b611dcf816040518060600160405280602681526020016129d3602691396001600160a01b0386166000908152600760205260409020549190611e5a565b6001600160a01b038085166000908152600760205260408082209390935590841681522054611dfe908261190b565b6001600160a01b0380841660008181526007602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611ee95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611eae578181015183820152602001611e96565b50505050905090810190601f168015611edb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea9190a250565b60005460ff16611f88576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611fbb61196c565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b03821661201d5760405162461bcd60e51b8152600401808060200182810382526021815260200180612b146021913960400191505060405180910390fd5b61205a8160405180606001604052806022815260200161290f602291396001600160a01b0385166000908152600760205260409020549190611e5a565b6001600160a01b03831660009081526007602052604090205560095461208090826123a0565b6009556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff821610801561213c575060015b61218d576040805162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015290519081900360640190fd5b6001600160a01b038216600090815260056020526040902054600019810160ff83161461223c576001600160a01b0383166000908152600560205260409020805460001983019081106121dc57fe5b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff168154811061221d57fe5b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b038316600090815260056020526040902080548061225d57fe5b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b60005460ff16156122f9576040805162461bcd60e51b81526020600482015260106024820152600080516020612b5a833981519152604482015290519081900360640190fd5b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fbb61196c565b60408051606081018252600080825260208083018281528385018381526001600160a01b0387168085526006909352858420945185559051600185015551600290930192909255915190917f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe91a250565b600061196583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e5a565b600061196583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612830565b6000826124335750600061097c565b8282028284828161244057fe5b04146119655760405162461bcd60e51b8152600401808060200182810382526021815260200180612a596021913960400191505060405180910390fd5b6001600160a01b038116600081815260036020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b03811661250b5760405162461bcd60e51b815260040180806020018281038252602d815260200180612ae7602d913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76990600090a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b0381166125b25760405162461bcd60e51b81526004018080602001828103825260268152602001806129586026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc1599190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6126b1838383610a37565b6126ba83610efe565b156126f65760405162461bcd60e51b815260040180806020018281038252602c8152602001806128b9602c913960400191505060405180910390fd5b6126ff82610efe565b1561273b5760405162461bcd60e51b815260040180806020018281038252602a8152602001806128e5602a913960400191505060405180910390fd5b61274b61274661196c565b610efe565b156127875760405162461bcd60e51b81526004018080602001828103825260338152602001806129a06033913960400191505060405180910390fd5b61278f611013565b156127cb5760405162461bcd60e51b8152600401808060200182810382526025815260200180612a7a6025913960400191505060405180910390fd5b806127f36127d8856114d0565b6127ed6127e487611419565b6127ed886110c4565b906123a0565b1015610a375760405162461bcd60e51b815260040180806020018281038252603e815260200180612a1b603e913960400191505060405180910390fd5b6000818361287f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611eae578181015183820152602001611e96565b50600083858161288b57fe5b049594505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f636b6564206163636f756e744c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6564206163636f756e7445524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a2063616c6c6572206973206e6f74207468652068696464656e206f776e65724f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734c6f636b61626c653a20746f6b656e207472616e736665722063616c6c65642066726f6d206c6f636b6564206163636f756e7445524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b65724c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696d6520616e6420696e766573746f72206c6f636b6564206163636f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775061757361626c653a20746f6b656e207472616e73666572207768696c652070617573656445524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724f776e61626c653a206e65772068696464656e206f776e657220697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f20616464726573735061757361626c653a207061757365640000000000000000000000000000000054696d65204c6f636b3a206c6f636b20616d6f756e74206d7573742062652067726561746572207468616e203045524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726f206164647265737354696d65204c6f636b3a206578706972652064617465206d757374206265206c61746572207468616e206e6f7745524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e6572a2646970667358221220173f9d0b119627fb4e2980b267ffa9a2c59b9ccbb3445cf2910d950ee24a1ecd64736f6c634300060c0033

Deployed Bytecode Sourcemap

31112:3929:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33071:105;;;;;;;;;;;;;;;;-1:-1:-1;33071:105:0;-1:-1:-1;;;;;33071:105:0;;:::i;:::-;;12724:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14722:159;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14722:159:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;34282:152;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34282:152:0;;;;;;;;;;;;;:::i;34698:153::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34698:153:0;;;;;;;;:::i;13752:94::-;;;:::i;:::-;;;;;;;;;;;;;;;;15347:307;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;15347:307:0;;;;;;;;;;;;;;;;;:::i;29894:198::-;;;;;;;;;;;;;;;;-1:-1:-1;29894:198:0;-1:-1:-1;;;;;29894:198:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;25674:99;;;;;;;;;;;;;;;;-1:-1:-1;25674:99:0;-1:-1:-1;;;;;25674:99:0;;:::i;34126:93::-;;;;;;;;;;;;;;;;-1:-1:-1;34126:93:0;-1:-1:-1;;;;;34126:93:0;;:::i;13616:77::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16048:208;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16048:208:0;;;;;;;;:::i;33515:70::-;;;:::i;33228:102::-;;;;;;;;;;;;;;;;-1:-1:-1;33228:102:0;;:::i;23730:99::-;;;;;;;;;;;;;;;;-1:-1:-1;23730:99:0;-1:-1:-1;;;;;23730:99:0;;:::i;33644:::-;;;;;;;;;;;;;;;;-1:-1:-1;33644:99:0;-1:-1:-1;;;;;33644:99:0;;:::i;26229:97::-;;;;;;;;;;;;;;;;-1:-1:-1;26229:97:0;-1:-1:-1;;;;;26229:97:0;;:::i;28134:274::-;;;;;;;;;;;;;;;;-1:-1:-1;28134:274:0;;-1:-1:-1;;;;;28134:274:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;6975:72;;;:::i;34500:129::-;;;;;;;;;;;;;;;;-1:-1:-1;34500:129:0;;-1:-1:-1;;;;;34500:129:0;;;;;;;;:::i;13903:113::-;;;;;;;;;;;;;;;;-1:-1:-1;13903:113:0;-1:-1:-1;;;;;13903:113:0;;:::i;33387:69::-;;;:::i;31539:146::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31539:146:0;;;;;;;;:::i;21892:73::-;;;:::i;:::-;;;;-1:-1:-1;;;;;21892:73:0;;;;;;;;;;;;;;34921:117;;;;;;;;;;;;;;;;-1:-1:-1;34921:117:0;-1:-1:-1;;;;;34921:117:0;;:::i;12913:81::-;;;:::i;16742:259::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16742:259:0;;;;;;;;:::i;14218:165::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14218:165:0;;;;;;;;:::i;27832:116::-;;;;;;;;;;;;;;;;-1:-1:-1;27832:116:0;-1:-1:-1;;;;;27832:116:0;;:::i;28584:387::-;;;;;;;;;;;;;;;;-1:-1:-1;28584:387:0;-1:-1:-1;;;;;28584:387:0;;:::i;30390:672::-;;;;;;;;;;;;;;;;-1:-1:-1;30390:672:0;-1:-1:-1;;;;;30390:672:0;;:::i;33805:105::-;;;;;;;;;;;;;;;;-1:-1:-1;33805:105:0;-1:-1:-1;;;;;33805:105:0;;:::i;14440:145::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;14440:145:0;;;;;;;;;;:::i;32690:161::-;;;;;;;;;;;;;;;;-1:-1:-1;32690:161:0;-1:-1:-1;;;;;32690:161:0;;:::i;32472:137::-;;;;;;;;;;;;;;;;-1:-1:-1;32472:137:0;-1:-1:-1;;;;;32472:137:0;;:::i;33972:90::-;;;;;;;;;;;;;;;;-1:-1:-1;33972:90:0;-1:-1:-1;;;;;33972:90:0;;:::i;32910:99::-;;;;;;;;;;;;;;;;-1:-1:-1;32910:99:0;-1:-1:-1;;;;;32910:99:0;;:::i;22047:85::-;;;:::i;33071:105::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;33148:22:::2;33162:7;33148:13;:22::i;:::-;33071:105:::0;:::o;12724:77::-;12790:5;12783:12;;;;;;;;-1:-1:-1;;12783:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12761:13;;12783:12;;12790:5;;12783:12;;12790:5;12783:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12724:77;:::o;14722:159::-;14805:4;14818:39;14827:12;:10;:12::i;:::-;14841:7;14850:6;14818:8;:39::i;:::-;-1:-1:-1;14871:4:0;14722:159;;;;;:::o;34282:152::-;25527:8;:22;25536:12;:10;:12::i;:::-;-1:-1:-1;;;;;25527:22:0;;;;;;;;;;;;-1:-1:-1;25527:22:0;;;;25519:69;;;;-1:-1:-1;;;25519:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;34388:40:::2;34401:7;34410:6;34418:9;34388:12;:40::i;:::-;34282:152:::0;;;:::o;34698:153::-;25527:8;:22;25536:12;:10;:12::i;:::-;-1:-1:-1;;;;;25527:22:0;;;;;;;;;;;;-1:-1:-1;25527:22:0;;;;25519:69;;;;-1:-1:-1;;;25519:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;34792:53:::2;34809:7;34818:18;34828:7;34818:9;:18::i;:::-;34838:6;34792:16;:53::i;:::-;34698:153:::0;;:::o;13752:94::-;13828:12;;13752:94;:::o;15347:307::-;15453:4;15466:36;15476:6;15484:9;15495:6;15466:9;:36::i;:::-;15509:121;15518:6;15526:12;:10;:12::i;:::-;15540:89;15578:6;15540:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15540:19:0;;;;;;:11;:19;;;;;;15560:12;:10;:12::i;:::-;-1:-1:-1;;;;;15540:33:0;;;;;;;;;;;;-1:-1:-1;15540:33:0;;;:89;:37;:89::i;:::-;15509:8;:121::i;:::-;-1:-1:-1;15644:4:0;15347:307;;;;;:::o;29894:198::-;-1:-1:-1;;;;;29989:23:0;29957:4;29989:23;;;:14;:23;;;;;:30;;30021;;;;30053:32;;;;;29989:30;;29894:198::o;25674:99::-;-1:-1:-1;;;;;25750:17:0;25730:4;25750:17;;;:8;:17;;;;;;;;;25674:99::o;34126:93::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;34197:16:::2;34205:7;34197;:16::i;13616:77::-:0;13678:9;;;;13616:77;:::o;16048:208::-;16136:4;16149:83;16158:12;:10;:12::i;:::-;16172:7;16181:50;16220:10;16181:11;:25;16193:12;:10;:12::i;:::-;-1:-1:-1;;;;;16181:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;16181:25:0;;;:34;;;;;;;;;;;:38;:50::i;33515:70::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7529:7:::1;::::0;::::1;;7521:40;;;::::0;;-1:-1:-1;;;7521:40:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7521:40:0;;;;;;;;;;;;;::::1;;33569:10:::2;:8;:10::i;:::-;33515:70::o:0;33228:102::-;23954:8;:22;23963:12;:10;:12::i;:::-;-1:-1:-1;;;;;23954:22:0;;;;;;;;;;;;-1:-1:-1;23954:22:0;;;;23946:68;;;;-1:-1:-1;;;23946:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;33297:27:::2;33303:12;:10;:12::i;:::-;33317:6;33297:5;:27::i;23730:99::-:0;-1:-1:-1;;;;;23806:17:0;23786:4;23806:17;;;:8;:17;;;;;;;;;23730:99::o;33644:::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;33718:19:::2;33729:7;33718:10;:19::i;26229:97::-:0;-1:-1:-1;;;;;26305:15:0;26285:4;26305:15;;;:6;:15;;;;;;;;;26229:97::o;28134:274::-;-1:-1:-1;;;;;28232:19:0;;28206:4;28232:19;;;:10;:19;;;;;:26;28206:4;;28232:34;;;-1:-1:-1;28232:48:0;;;;-1:-1:-1;28270:10:0;28232:48;28224:91;;;;;-1:-1:-1;;;28224:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28330:19:0;;;;;;:10;:19;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;28365:19:0;;;;:10;:19;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;:36;;;28322:80;;;;28134:274;;;;;:::o;6975:72::-;7014:4;7034:7;;;6975:72;:::o;34500:129::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;34592:31:::2;34608:7;34617:5;34592:15;:31::i;13903:113::-:0;-1:-1:-1;;;;;13992:18:0;13969:7;13992:18;;;:9;:18;;;;;;;13903:113::o;33387:69::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;33442:8:::2;:6;:8::i;31539:146::-:0;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;31635:12:::1;-1:-1:-1::0;;;;;31628:29:0::1;;31658:7;:5;:7::i;:::-;31667:11;31628:51;;;;;;;;;;;;;-1:-1:-1::0;;;;;31628:51:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;;31539:146:0:o;21892:73::-;21953:6;;-1:-1:-1;;;;;21953:6:0;21892:73;:::o;34921:117::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;35004:28:::2;35024:7;35004:19;:28::i;12913:81::-:0;12981:7;12974:14;;;;;;;;-1:-1:-1;;12974:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12952:13;;12974:14;;12981:7;;12974:14;;12981:7;12974:14;;;;;;;;;;;;;;;;;;;;;;;;16742:259;16835:4;16848:129;16857:12;:10;:12::i;:::-;16871:7;16880:96;16919:15;16880:96;;;;;;;;;;;;;;;;;:11;:25;16892:12;:10;:12::i;:::-;-1:-1:-1;;;;;16880:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;16880:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;14218:165::-;14304:4;14317:42;14327:12;:10;:12::i;:::-;14341:9;14352:6;14317:9;:42::i;27832:116::-;-1:-1:-1;;;;;27916:19:0;27897:4;27916:19;;;:10;:19;;;;;:26;;27832:116::o;28584:387::-;-1:-1:-1;;;;;28709:19:0;;28651:4;28709:19;;;:10;:19;;;;;:26;28651:4;;;28742:194;28763:3;28759:1;:7;28742:194;;;-1:-1:-1;;;;;28804:19:0;;;;;;:10;:19;;;;;:22;;28824:1;;28804:22;;;;;;;;;;;;;;;;:32;;;28786:15;:50;28782:147;;;-1:-1:-1;;;;;28889:19:0;;;;;;:10;:19;;;;;:22;;28868:51;;28889:19;28909:1;;28889:22;;;;;;;;;;;;;;;;;;;:29;28868:16;;:20;:51::i;:::-;28849:70;;28782:147;28768:3;;28742:194;;;-1:-1:-1;28949:16:0;;28584:387;-1:-1:-1;;;28584:387:0:o;30390:672::-;-1:-1:-1;;;;;30524:23:0;;30461:4;30524:23;;;:14;:23;;;;;:30;30461:4;;30565:10;;30561:462;;-1:-1:-1;;;;;30600:23:0;;30586:11;30600:23;;;:14;:23;;;;;:30;;;;30655:32;;;;;30600:30;;30713;30655:32;30734:7;30726:16;;30713:12;:30::i;:::-;30696:47;-1:-1:-1;30769:15:0;30797:21;;;30793:223;;30854:6;30831:29;;30793:223;;;30893:9;30880;:22;30876:140;;30938:68;30999:6;30938:56;30949:44;30991:1;30949:37;30978:7;30938:56;30949:9;30963;30949:13;:24::i;:::-;:28;;:37::i;:::-;:41;;:44::i;:::-;30938:6;;:10;:56::i;:68::-;30915:91;;30876:140;30561:462;;;;;-1:-1:-1;31036:20:0;30390:672;-1:-1:-1;;30390:672:0:o;33805:105::-;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;33882:22:::2;33896:7;33882:13;:22::i;14440:145::-:0;-1:-1:-1;;;;;14552:18:0;;;14529:7;14552:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14440:145::o;32690:161::-;22480:12;:10;:12::i;:::-;22464;;;;;-1:-1:-1;;;;;22464:12:0;;;:28;;;22456:80;;;;-1:-1:-1;;;22456:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;32800:45:::2;32830:14;32800:29;:45::i;32472:137::-:0;22480:12;:10;:12::i;:::-;22464;;;;;-1:-1:-1;;;;;22464:12:0;;;:28;;;22456:80;;;;-1:-1:-1;;;22456:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;32570:33:::2;32594:8;32570:23;:33::i;33972:90::-:0;25527:8;:22;25536:12;:10;:12::i;:::-;-1:-1:-1;;;;;25527:22:0;;;;;;;;;;;;-1:-1:-1;25527:22:0;;;;25519:69;;;;-1:-1:-1;;;25519:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;34042:14:::2;34048:7;34042:5;:14::i;32910:99::-:0;22265:12;:10;:12::i;:::-;22255:6;;-1:-1:-1;;;;;22255:6:0;;;:22;;;22247:67;;;;;-1:-1:-1;;;22247:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22247:67:0;;;;;;;;;;;;;;;7273:7:::1;::::0;::::1;;7272:8;7264:37;;;::::0;;-1:-1:-1;;;7264:37:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;::::1;;32984:19:::2;32995:7;32984:10;:19::i;22047:85::-:0;22091:7;22114:12;;;;-1:-1:-1;;;;;22114:12:0;;22047:85::o;1776:167::-;1834:7;1862:5;;;1882:6;;;;1874:46;;;;;-1:-1:-1;;;1874:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1936:1;1776:167;-1:-1:-1;;;1776:167:0:o;613:100::-;697:10;613:100;:::o;24296:121::-;-1:-1:-1;;;;;24352:17:0;;24372:5;24352:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;24352:25:0;;;24389:22;;;24372:5;24389:22;24296:121;:::o;19634:328::-;-1:-1:-1;;;;;19732:19:0;;19724:68;;;;-1:-1:-1;;;19724:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19807:21:0;;19799:68;;;;-1:-1:-1;;;19799:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19876:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;19924:32;;;;;;;;;;;;;;;;;19634:328;;;:::o;26745:341::-;26846:1;26837:6;:10;26829:68;;;;-1:-1:-1;;;26829:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26924:15;26912:9;:27;26904:85;;;;-1:-1:-1;;;26904:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26996:19:0;;;;;;:10;:19;;;;;;;;27021:27;;;;;;;;;;;;;;;;26996:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27061:19;;;26996;27061;26745:341;;;:::o;29043:391::-;-1:-1:-1;;;;;29136:21:0;;29128:75;;;;-1:-1:-1;;;29128:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29227:1;29218:6;:10;29210:49;;;;;-1:-1:-1;;;29210:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29283:1;29274:6;:10;29266:49;;;;;-1:-1:-1;;;29266:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29348:45;;;;;;;;;;;;;;;;;;29377:15;29348:45;;;;;;-1:-1:-1;;;;;29322:23:0;;-1:-1:-1;29322:23:0;;;:14;:23;;;;;;:71;;;;;;;;;;;;;;;;;;;29405:23;;29322;;29405;;;29043:391;;;:::o;17474:513::-;-1:-1:-1;;;;;17576:20:0;;17568:70;;;;-1:-1:-1;;;17568:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17653:23:0;;17645:71;;;;-1:-1:-1;;;17645:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17725:47;17746:6;17754:9;17765:6;17725:20;:47::i;:::-;17801:71;17823:6;17801:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17801:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;17781:17:0;;;;;;;:9;:17;;;;;;:91;;;;17902:20;;;;;;;:32;;17927:6;17902:24;:32::i;:::-;-1:-1:-1;;;;;17879:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17946:35;;;;;;;17879:20;;17946:35;;;;;;;;;;;;;17474:513;;;:::o;2633:178::-;2719:7;2751:12;2743:6;;;;2735:29;;;;-1:-1:-1;;;2735:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2783:5:0;;;2633:178::o;26569:108::-;-1:-1:-1;;;;;26619:15:0;;26637:5;26619:15;;;:6;:15;;;;;;:23;;-1:-1:-1;;26619:23:0;;;26654:17;;;26637:5;26654:17;26569:108;:::o;7948:110::-;7529:7;;;;7521:40;;;;;-1:-1:-1;;;7521:40:0;;;;;;;;;;;;-1:-1:-1;;;7521:40:0;;;;;;;;;;;;;;;8013:5:::1;8003:15:::0;;-1:-1:-1;;8003:15:0::1;::::0;;8030:22:::1;8039:12;:10;:12::i;:::-;8030:22;::::0;;-1:-1:-1;;;;;8030:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;7948:110::o:0;18874:338::-;-1:-1:-1;;;;;18954:21:0;;18946:67;;;;-1:-1:-1;;;18946:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19043:68;19066:6;19043:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19043:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;19022:18:0;;;;;;:9;:18;;;;;:89;19133:12;;:24;;19150:6;19133:16;:24::i;:::-;19118:12;:39;19169:37;;;;;;;;19195:1;;-1:-1:-1;;;;;19169:37:0;;;;;;;;;;;;18874:338;;:::o;25844:115::-;-1:-1:-1;;;;;25897:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;25897:24:0;25917:4;25897:24;;;25933:20;;;25897:17;25933:20;25844:115;:::o;27255:416::-;-1:-1:-1;;;;;27334:19:0;;;;;;:10;:19;;;;;:26;:34;;;-1:-1:-1;27334:48:0;;;;-1:-1:-1;27372:10:0;27334:48;27326:91;;;;;-1:-1:-1;;;27326:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27437:19:0;;27426:8;27437:19;;;:10;:19;;;;;:26;-1:-1:-1;;27474:7:0;;:16;;;;27470:131;;-1:-1:-1;;;;;27565:19:0;;;;;;:10;:19;;;;;:28;;-1:-1:-1;;27585:7:0;;;27565:28;;;;;;;;;;;;;;;;27536:10;:19;27547:7;-1:-1:-1;;;;;27536:19:0;-1:-1:-1;;;;;27536:19:0;;;;;;;;;;;;27556:5;27536:26;;;;;;;;;;;;;;;;;;:57;;:26;;;;;:57;;;;;;;;;;;27470:131;-1:-1:-1;;;;;27607:19:0;;;;;;:10;:19;;;;;:25;;;;;;;;;;;;;;;-1:-1:-1;;27607:25:0;;;;;;;;;;;;;;;;;27644:21;;-1:-1:-1;;;;;27644:21:0;;;;;;27255:416;;;:::o;7709:108::-;7273:7;;;;7272:8;7264:37;;;;;-1:-1:-1;;;7264:37:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;7264:37:0;;;;;;;;;;;;;;;7765:7:::1;:14:::0;;-1:-1:-1;;7765:14:0::1;7775:4;7765:14;::::0;;7791:20:::1;7798:12;:10;:12::i;29579:152::-:0;29667:21;;;;;;;;-1:-1:-1;29667:21:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29641:23:0;;;;;:14;:23;;;;;;:47;;;;;;;;;;;;;;;;;;;29700:25;;29641:23;;29700:25;;;29579:152;:::o;2213:130::-;2271:7;2294:43;2298:1;2301;2294:43;;;;;;;;;;;;;;;;;:3;:43::i;3949:126::-;4007:7;4030:39;4034:1;4037;4030:39;;;;;;;;;;;;;;;;;:3;:39::i;3057:431::-;3115:7;3344:6;3340:37;;-1:-1:-1;3368:1:0;3361:8;;3340:37;3397:5;;;3401:1;3397;:5;:1;3417:5;;;;;:10;3409:56;;;;-1:-1:-1;;;3409:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26036:121;-1:-1:-1;;;;;26092:17:0;;26112:5;26092:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;26092:25:0;;;26129:22;;;26112:5;26129:22;26036:121;:::o;22983:269::-;-1:-1:-1;;;;;23070:28:0;;23062:86;;;;-1:-1:-1;;;23062:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23187:6;;23160:50;;-1:-1:-1;;;;;23160:50:0;;;;23187:6;;23160:50;;23187:6;;23160:50;23217:12;:29;;-1:-1:-1;;;;;23217:29:0;;;;;-1:-1:-1;;;;;;23217:29:0;;;;;;;;;22983:269::o;22650:220::-;-1:-1:-1;;;;;22725:22:0;;22717:73;;;;-1:-1:-1;;;22717:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22823:6;;22802:38;;-1:-1:-1;;;;;22802:38:0;;;;22823:6;;22802:38;;22823:6;;22802:38;22847:6;:17;;-1:-1:-1;;;;;;22847:17:0;-1:-1:-1;;;;;22847:17:0;;;;;;;;;;22650:220::o;26394:103::-;-1:-1:-1;;;;;26442:15:0;;;;;;:6;:15;;;;;;:22;;-1:-1:-1;;26442:22:0;26460:4;26442:22;;;26476:15;;;26442;26476;26394:103;:::o;24100:115::-;-1:-1:-1;;;;;24153:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;24153:24:0;24173:4;24153:24;;;24189:20;;;24153:17;24189:20;24100:115;:::o;31755:643::-;31859:44;31886:4;31892:2;31896:6;31859:26;:44::i;:::-;31921:14;31930:4;31921:8;:14::i;:::-;31920:15;31912:72;;;;-1:-1:-1;;;31912:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32000:12;32009:2;32000:8;:12::i;:::-;31999:13;31991:68;;;;-1:-1:-1;;;31991:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32075:22;32084:12;:10;:12::i;:::-;32075:8;:22::i;:::-;32074:23;32066:87;;;;-1:-1:-1;;;32066:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32169:8;:6;:8::i;:::-;32168:9;32160:59;;;;-1:-1:-1;;;32160:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32319:6;32234:81;32285:29;32309:4;32285:23;:29::i;:::-;32234:46;32254:25;32274:4;32254:19;:25::i;:::-;32234:15;32244:4;32234:9;:15::i;:::-;:19;;:46::i;:81::-;:91;;32226:166;;;;-1:-1:-1;;;32226:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4556:260;4642:7;4673:12;4666:5;4658:28;;;;-1:-1:-1;;;4658:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4693:9;4709:1;4705;:5;;;;;;;4556:260;-1:-1:-1;;;;;4556:260:0:o

Swarm Source

ipfs://173f9d0b119627fb4e2980b267ffa9a2c59b9ccbb3445cf2910d950ee24a1ecd
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.