ETH Price: $2,305.77 (+1.03%)

Contract

0x00000000357646e36Fe575885Bb3e1A0772E64Cc
 
Transaction Hash
Method
Block
From
To
Defect133192282021-09-29 6:57:031075 days ago1632898623IN
0x00000000...0772E64Cc
0 ETH0.0053963355.85057691
Defect109483372020-09-28 2:19:591441 days ago1601259599IN
0x00000000...0772E64Cc
0 ETH0.0041915354.00000145
Defect105202402020-07-24 5:07:451507 days ago1595567265IN
0x00000000...0772E64Cc
0 ETH0.0045803459
Defect104726122020-07-16 20:14:391514 days ago1594930479IN
0x00000000...0772E64Cc
0 ETH0.0040758544
Defect104435412020-07-12 8:12:111519 days ago1594541531IN
0x00000000...0772E64Cc
0 ETH0.0020178326
Defect104215792020-07-08 22:29:491522 days ago1594247389IN
0x00000000...0772E64Cc
0 ETH0.0020186121.8
Defect101814322020-06-01 17:54:221559 days ago1591034062IN
0x00000000...0772E64Cc
0 ETH0.0017073922
Defect101646122020-05-30 3:06:291562 days ago1590807989IN
0x00000000...0772E64Cc
0 ETH0.0015519420
Defect99808792020-05-01 14:33:191590 days ago1588343599IN
0x00000000...0772E64Cc
0 ETH0.0012042213
Defect99765462020-04-30 22:30:021591 days ago1588285802IN
0x00000000...0772E64Cc
0 ETH0.000555656
Defect99755362020-04-30 18:27:431591 days ago1588271263IN
0x00000000...0772E64Cc
0 ETH0.000698489
Defect99607872020-04-28 11:37:131593 days ago1588073833IN
0x00000000...0772E64Cc
0 ETH0.000256183.3
Defect99298512020-04-23 16:35:011598 days ago1587659701IN
0x00000000...0772E64Cc
0 ETH0.000628538.1
Defect99102692020-04-20 16:07:521601 days ago1587398872IN
0x00000000...0772E64Cc
0 ETH0.000946858.8
Defect99098972020-04-20 14:42:341601 days ago1587393754IN
0x00000000...0772E64Cc
0 ETH0.0007149.2
Defect99098862020-04-20 14:41:111601 days ago1587393671IN
0x00000000...0772E64Cc
0 ETH0.000729419.4
Defect99042902020-04-19 17:45:041602 days ago1587318304IN
0x00000000...0772E64Cc
0 ETH0.000740878
Defect98972522020-04-18 15:36:291603 days ago1587224189IN
0x00000000...0772E64Cc
0 ETH0.000555656
Defect98956932020-04-18 9:39:391604 days ago1587202779IN
0x00000000...0772E64Cc
0 ETH0.0009263310
Enlist98875312020-04-17 3:25:271605 days ago1587093927IN
0x00000000...0772E64Cc
0 ETH0.000157527
Enlist98875272020-04-17 3:24:541605 days ago1587093894IN
0x00000000...0772E64Cc
0 ETH0.000202539
Enlist98875122020-04-17 3:20:461605 days ago1587093646IN
0x00000000...0772E64Cc
0 ETH0.0003375615
Enlist98874442020-04-17 3:04:401605 days ago1587092680IN
0x00000000...0772E64Cc
0 ETH0.0003375615
Enlist98874342020-04-17 3:03:281605 days ago1587092608IN
0x00000000...0772E64Cc
0 ETH0.000202539
Defect98824502020-04-16 8:39:401606 days ago1587026380IN
0x00000000...0772E64Cc
0 ETH0.0015562316.8
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
96978362020-03-18 20:44:131634 days ago1584564253  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DaiBackstopSyndicateV3

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-03-18
*/

pragma solidity 0.5.16; // optimization runs: 200


interface IDaiBackstopSyndicate {
  event AuctionEntered(uint256 auctionId, uint256 mkrAsk, uint256 daiBid);
  event AuctionFinalized(uint256 auctionId);

  enum Status {
    ACCEPTING_DEPOSITS,
    ACTIVATED,
    DEACTIVATED
  }

  // Anyone can deposit Dai up until the auctions have started at 1:1
  function enlist(uint256 daiAmount) external returns (uint256 backstopTokensMinted);

  // Anyone can withdraw at any point as long as Dai is not locked in auctions
  function defect(uint256 backstopTokenAmount) external returns (uint256 daiRedeemed, uint256 mkrRedeemed);

  // Anyone can enter an auction for the syndicate, bidding Dai in return for MKR
  function enterAuction(uint256 auctionId) external;

  // Anyone can finalize an auction, returning the Dai or MKR to the syndicate
  function finalizeAuction(uint256 auctionId) external;

  // An owner can halt all new deposits and auctions (but not withdrawals or ongoing auctions)
  function ceaseFire() external;
  
  /// Return total amount of DAI that is currently held by Syndicate
  function getDaiBalance() external view returns (uint256 combinedDaiInVat);

  /// Return total amount of DAI that is currently being used in auctions
  function getDaiBalanceForAuctions() external view returns (uint256 daiInVatForAuctions);

  /// Return total amount of DAI that is *not* currently being used in auctions
  function getAvailableDaiBalance() external view returns (uint256 daiInVat);

  /// Return total amount of MKR that is currently held by Syndicate
  function getMKRBalance() external view returns (uint256 mkr);

  /// Do a "dry-run" of a withdrawal of some amount of tokens
  function getDefectAmount(
    uint256 backstopTokenAmount
  ) external view returns (
    uint256 daiRedeemed, uint256 mkrRedeemed, bool redeemable
  );

  // Determine if the contract is accepting deposits (0), active (1), or deactivated (2).
  function getStatus() external view returns (Status status);

  // Return all auctions that the syndicate is currently participating in.
  function getActiveAuctions() external view returns (uint256[] memory activeAuctions);
}


interface IJoin {
    function join(address, uint256) external;
    function exit(address, uint256) external;
}


interface IVat {
    function dai(address) external view returns (uint256);
    function hope(address) external;
    function move(address, address, uint256) external;
}


interface IFlopper {
    // --- Auth ---
    // caller authorization (1 = authorized, 0 = not authorized)
    function wards(address) external view returns (uint256);
    // authorize caller
    function rely(address usr) external;
    // deauthorize caller
    function deny(address usr) external;

    // Bid objects
    function bids(uint256) external view returns (
        uint256 bid,
        uint256 lot,
        address guy,
        uint48 tic,
        uint48 end
    );

    // DAI contract address
    function vat() external view returns (address);
    // MKR contract address
    function gem() external view returns (address);

    // num decimals (constant)
    function ONE() external pure returns (uint256);

    // minimum bid increase (config - 5% initial)
    function beg() external view returns (uint256);
    // initial lot increase (config - 50% initial)
    function pad() external view returns (uint256);
    // bid lifetime (config - 3 hours initial)
    function ttl() external view returns (uint48);
    // total auction length (config - 2 days initial)
    function tau() external view returns (uint48);

    // number of auctions
    function kicks() external view returns (uint256);
    // status of the auction (1 = active, 0 = disabled)
    function live() external view returns (uint256);
    // user who shut down flopper mechanism and paid off last bid
    function vow() external view returns (address);

    // --- Events ---
    event Kick(uint256 id, uint256 lot, uint256 bid, address indexed gal);

    // --- Admin ---
    function file(bytes32 what, uint256 data) external;

    // --- Auction ---

    // create an auction 
    // access control: authed
    // state machine: after auction expired
    // gal - recipient of the dai
    // lot - amount of mkr to mint
    // bid - amount of dai to pay
    // id - id of the auction
    function kick(address gal, uint256 lot, uint256 bid) external returns (uint256 id);

    // extend the auction and increase minimum maker amount minted
    // access control: not-authed
    // state machine: after auction expiry, before first bid
    // id - id of the auction
    function tick(uint256 id) external;

    // bid up auction and refund locked up dai to previous bidder
    // access control: not-authed
    // state machine: before auction expired
    // id - id of the auction
    // lot - amount of mkr to mint
    // bid - amount of dai to pay
    function dent(uint256 id, uint256 lot, uint256 bid) external;

    // finalize auction
    // access control: not-authed
    // state machine: after auction expired
    // id - id of the auction
    function deal(uint256 id) external;

    // --- Shutdown ---

    // shutdown flopper mechanism
    // access control: authed
    // state machine: anytime
    function cage() external;

    // get cancelled bid back
    // access control: authed
    // state machine: after shutdown
    function yank(uint256 id) external;
}


/**
 * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}


/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
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.
     *
     * > 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 `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * 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 IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

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

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view 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 returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        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 `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        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 returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][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 returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

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

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

     /**
     * @dev Destoys `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 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

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

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

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

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


contract SimpleFlopper {

  // A "flopper" is a contract for auctioning off MKR in exchange for Dai.
  IFlopper internal constant _auction = IFlopper(
    0x4D95A049d5B0b7d32058cd3F2163015747522e99
  );

  // Getters //

  /// @notice Get the status of the flopper contract
  /// @return bool status true if auction contract is enabled
  function isEnabled() public view returns (bool status) {
    return (_auction.live() == 1) ? true : false;
  }

  /// @notice Get the id of the latest auction
  /// @return auctionID uint256 id
  function getTotalNumberOfAuctions() public view returns (uint256 auctionID) {
    return _auction.kicks();
  }

  /// @notice Get the address of the auction contract (Flopper)
  /// @return Auction address
  function getFlopperAddress() public pure returns (address flopper) {
    return address(_auction);
  }

  /// @notice Get the flopper contract config
  /// @return bidIncrement uint256 minimum bid increment as percentage (initial = 1.05E18)
  /// @return repriceIncrement uint256 reprice increment as percentage (initial = 1.50E18)
  /// @return bidDuration uint256 duration of a bid in seconds (initial = 3 hours)
  /// @return auctionDuration uint256 initial duration of an auction in seconds (initial = 2 days)
  function getAuctionInformation() public view returns (
    uint256 bidIncrement,
    uint256 repriceIncrement,
    uint256 bidDuration,
    uint256 auctionDuration
  ) {
    return (_auction.beg(), _auction.pad(), _auction.ttl(), _auction.tau());
  }

  /// @notice Get the winning bid for an auction
  /// @return amountDAI uint256 amount of DAI to be burned
  /// @return amountMKR uint256 amount of MKR to be minted
  /// @return bidder address account who placed bid
  /// @return bidDeadline uint48 deadline of bid
  /// @return auctionDeadline uint48 deadline of auction
  function getCurrentBid(uint256 auctionID) public view returns (
    uint256 amountDAI,
    uint256 amountMKR,
    address bidder,
    uint48 bidDeadline,
    uint48 auctionDeadline
  ) {
    return _auction.bids(auctionID);
  }

  // Setters //

  /// @notice Extend and reprice expired auction with no bid
  /// @dev state machine: after auction expiry, before first bid
  /// @param auctionID uint256 id of the auction
  function _reprice(uint256 auctionID) internal {
    _auction.tick(auctionID);
  }

  /// @notice Add bid to a live auction, if first bid this transfers DAI to vat
  /// @dev state machine: before auction expired
  /// @param auctionID uint256 id of the auction
  function _bid(uint256 auctionID, uint256 amountMKR, uint256 amountDAI) internal {
    _auction.dent(auctionID, amountMKR, amountDAI);
  }

  /// @notice Finalize an auction with a winning bid and release maker
  /// @dev state machine: after auction expired
  /// @param auctionID uint256 id of the auction
  function _finalize(uint256 auctionID) internal {
    _auction.deal(auctionID);
  }
}


/**
 * @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.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be aplied to your functions to restrict their use to
 * the owner.
 *
 * In order to transfer ownership, a recipient must be specified, at which point
 * the specified recipient can call `acceptOwnership` and take ownership.
 */
contract TwoStepOwnable {
  address private _owner;

  address private _newPotentialOwner;

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

  /**
   * @dev Initialize contract by setting transaction submitter as initial owner.
   */
  constructor() internal {
    _owner = tx.origin;
    emit OwnershipTransferred(address(0), _owner);
  }

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

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

  /**
   * @dev Returns true if the caller is the current owner.
   */
  function isOwner() public view returns (bool) {
    return msg.sender == _owner;
  }

  /**
   * @dev Allows a new account (`newOwner`) to accept ownership.
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(
      newOwner != address(0),
      "TwoStepOwnable: new potential owner is the zero address."
    );

    _newPotentialOwner = newOwner;
  }

  /**
   * @dev Cancel a transfer of ownership to a new account.
   * Can only be called by the current owner.
   */
  function cancelOwnershipTransfer() public onlyOwner {
    delete _newPotentialOwner;
  }

  /**
   * @dev Transfers ownership of the contract to the caller.
   * Can only be called by a new potential owner set by the current owner.
   */
  function acceptOwnership() public {
    require(
      msg.sender == _newPotentialOwner,
      "TwoStepOwnable: current owner must set caller as new potential owner."
    );

    delete _newPotentialOwner;

    emit OwnershipTransferred(_owner, msg.sender);

    _owner = msg.sender;
  }
}


/**
 * Adapted from OpenZeppelin's address version of the same, written by Alberto Cuesta Cañada:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/5dfe7215a9156465d550030eadc08770503b2b2f/
 *   contracts/utils/EnumerableSet.sol
 */
library EnumerableSet {

  struct AuctionIDSet {
    // Position of the value in the `values` array, plus 1 because index 0
    // means a value is not in the set.
    mapping (uint256 => uint256) index;
    uint256[] values;
  }

  /**
   * @dev Add a value to a set. O(1).
   * Returns false if the value was already in the set.
   */
  function add(AuctionIDSet storage set, uint256 value)
    internal
    returns (bool)
  {
    if (!contains(set, value)) {
      set.values.push(value);
      // The element is stored at length-1, but we add 1 to all indexes
      // and use 0 as a sentinel value
      set.index[value] = set.values.length;
      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Removes a value from a set. O(1).
   * Returns false if the value was not present in the set.
   */
  function remove(AuctionIDSet storage set, uint256 value)
    internal
    returns (bool)
  {
    if (contains(set, value)){
      uint256 toDeleteIndex = set.index[value] - 1;
      uint256 lastIndex = set.values.length - 1;

      // If the element we're deleting is the last one, we can just remove it without doing a swap
      if (lastIndex != toDeleteIndex) {
        uint256 lastValue = set.values[lastIndex];

        // Move the last value to the index where the deleted value is
        set.values[toDeleteIndex] = lastValue;
        // Update the index for the moved value
        set.index[lastValue] = toDeleteIndex + 1; // All indexes are 1-based
      }

      // Delete the index entry for the deleted value
      delete set.index[value];

      // Delete the old entry for the moved value
      set.values.pop();

      return true;
    } else {
      return false;
    }
  }

  /**
   * @dev Returns true if the value is in the set. O(1).
   */
  function contains(AuctionIDSet storage set, uint256 value)
    internal
    view
    returns (bool)
  {
    return set.index[value] != 0;
  }

  /**
   * @dev Returns an array with all values in the set. O(N).
   * Note that there are no guarantees on the ordering of values inside the
   * array, and it may change when more values are added or removed.
   * WARNING: This function may run out of gas on large sets: use {length} and
   * {get} instead in these cases.
   */
  function enumerate(AuctionIDSet storage set)
    internal
    view
    returns (uint256[] memory)
  {
    uint256[] memory output = new uint256[](set.values.length);
    for (uint256 i; i < set.values.length; i++){
      output[i] = set.values[i];
    }
    return output;
  }

  /**
   * @dev Returns the number of elements on the set. O(1).
   */
  function length(AuctionIDSet storage set)
    internal
    view
    returns (uint256)
  {
    return set.values.length;
  }

   /** @dev Returns the element stored at position `index` in the set. O(1).
  * Note that there are no guarantees on the ordering of values inside the
  * array, and it may change when more values are added or removed.
  *
  * Requirements:
  *
  * - `index` must be strictly less than {length}.
  */
  function get(AuctionIDSet storage set, uint256 index)
    internal
    view
    returns (uint256)
  {
    return set.values[index];
  }
}


/// @notice See https://github.com/backstop-syndicate/dai-backstop-syndicate
contract DaiBackstopSyndicateV3 is
  IDaiBackstopSyndicate,
  SimpleFlopper,
  TwoStepOwnable,
  ERC20
{
  using SafeMath for uint256;
  using EnumerableSet for EnumerableSet.AuctionIDSet;

  // Track the status of the Syndicate.
  Status internal _status;

  // Track each active auction as an enumerable set.
  EnumerableSet.AuctionIDSet internal _activeAuctions;

  IERC20 internal constant _DAI = IERC20(
    0x6B175474E89094C44Da98b954EedeAC495271d0F
  );

  IERC20 internal constant _MKR = IERC20(
    0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2
  );

  IJoin internal constant _DAI_JOIN = IJoin(
    0x9759A6Ac90977b93B58547b4A71c78317f391A28
  );

  IVat internal constant _VAT = IVat(
    0x35D1b3F3D7966A1DFe207aa4514C12a259A0492B
  );

  constructor() public {
    // Begin in the "accepting deposits" state.
    _status = Status.ACCEPTING_DEPOSITS;
 
    // Enable "dai-join" to take vatDai in order mint ERC20 Dai.
    _VAT.hope(address(_DAI_JOIN));

    // Enable creation of "vat dai" by approving dai-join.
    _DAI.approve(address(_DAI_JOIN), uint256(-1));

    // Enable entry into auctions by approving the "flopper".
    _VAT.hope(SimpleFlopper.getFlopperAddress());
  }

  /// @notice User deposits DAI in the BackStop Syndicate and receives Syndicate shares
  /// @param daiAmount Amount of DAI to deposit
  /// @return Amount of Backstop Syndicate shares participant receives
  function enlist(
    uint256 daiAmount
  ) external notWhenDeactivated returns (uint256 backstopTokensMinted) {
    require(daiAmount > 0, "DaiBackstopSyndicate/enlist: No Dai amount supplied.");  
      
    require(
      _status == Status.ACCEPTING_DEPOSITS,
      "DaiBackstopSyndicate/enlist: Cannot deposit once the first auction bid has been made."
    );

    require(
      _DAI.transferFrom(msg.sender, address(this), daiAmount),
      "DaiBackstopSyndicate/enlist: Could not transfer Dai amount from caller."
    );

    // Place the supplied Dai into the central Maker ledger for use in auctions.
    _DAI_JOIN.join(address(this), daiAmount);

    // Mint tokens 1:1 to the caller in exchange for the supplied Dai.
    backstopTokensMinted = daiAmount;
    _mint(msg.sender, backstopTokensMinted);
  }

  /// @notice User withdraws DAI and MKR from BackStop Syndicate based on Syndicate shares owned
  /// @param backstopTokenAmount Amount of shares to burn
  /// @return daiRedeemed: Amount of DAI withdrawn
  /// @return mkrRedeemed: Amount of MKR withdrawn
  function defect(
    uint256 backstopTokenAmount
  ) external returns (uint256 daiRedeemed, uint256 mkrRedeemed) {
    require(
      backstopTokenAmount > 0, "DaiBackstopSyndicate/defect: No token amount supplied."
    );
      
    // Determine the % ownership. (scaled up by 1e18)
    uint256 shareFloat = (backstopTokenAmount.mul(1e18)).div(totalSupply());

    // Burn the tokens.
    _burn(msg.sender, backstopTokenAmount);

    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    uint256 combinedVatDai = vatDaiLockedInAuctions.add(vatDaiBalance);

    // Determine the Maker currently held by the contract.
    uint256 makerBalance = _MKR.balanceOf(address(this));

    // Determine the amount of Dai and MKR to redeem based on the share.
    uint256 vatDaiRedeemed = combinedVatDai.mul(shareFloat) / 1e18;
    mkrRedeemed = makerBalance.mul(shareFloat) / 1e18;

    // daiRedeemed is the e18 version of vatDaiRedeemed (e45).
    // Needed for dai ERC20 token, otherwise keep decimals of vatDai.
    daiRedeemed = vatDaiRedeemed / 1e27;

    // Ensure that something is returned in exchange for burned tokens.
    require(
      mkrRedeemed != 0 || daiRedeemed != 0,
      "DaiBackstopSyndicate/defect: Nothing returned after burning tokens."
    );

    // Ensure that sufficient Dai liquidity is currently available to withdraw.
    require(
      vatDaiRedeemed <= vatDaiBalance,
      "DaiBackstopSyndicate/defect: Insufficient Dai (in use in auctions)"
    );

    // Redeem the Dai and MKR, giving user vatDai if global settlement, otherwise, tokens
    if (vatDaiRedeemed > 0) {
      if (SimpleFlopper.isEnabled()) {
        _DAI_JOIN.exit(msg.sender, daiRedeemed);
      } else {
        _VAT.move(address(this), msg.sender, vatDaiRedeemed);
      }
    }

    if (mkrRedeemed > 0) {
      require(
        _MKR.transfer(msg.sender, mkrRedeemed),
        "DaiBackstopSyndicate/defect: MKR redemption failed."
      );      
    }
  }

  /// @notice Triggers syndicate participation in an auction, bidding 50k DAI for 500 MKR
  /// @param auctionId ID of the auction to participate in
  function enterAuction(uint256 auctionId) external notWhenDeactivated {
    require(
      !_activeAuctions.contains(auctionId),
      "DaiBackstopSyndicate/enterAuction: Auction already active."
    );

    // dai has 45 decimal places
    (uint256 amountDai, , , , ) = SimpleFlopper.getCurrentBid(auctionId);

    // lot needs to have 18 decimal places, and we're expecting 1 mkr == 100 dai
    uint256 expectedLot = (amountDai / 1e27) / 100;

    // Place the bid, reverting on failure.
    SimpleFlopper._bid(auctionId, expectedLot, amountDai);

    // Prevent further deposits.
    if (_status != Status.ACTIVATED) {
      _status = Status.ACTIVATED;
    }

    // Register auction if successful participation.
    _activeAuctions.add(auctionId);

    // Emit an event to signal that the auction was entered.
    emit AuctionEntered(auctionId, expectedLot, amountDai);
  }

  // Anyone can finalize an auction if it's ready
  function finalizeAuction(uint256 auctionId) external {
    require(
      _activeAuctions.contains(auctionId),
      "DaiBackstopSyndicate/finalizeAuction: Auction already finalized"
    );

    // If auction was finalized, end should be 0x0.
    (,, address bidder,, uint48 end) = SimpleFlopper.getCurrentBid(auctionId);

    // If auction isn't closed, we try to close it ourselves
    if (end != 0) {
      // If we are the winning bidder, we finalize the auction
      // Otherwise we got outbid and we withdraw DAI
      if (bidder == address(this)) {
        SimpleFlopper._finalize(auctionId);
      }
    }

    // Remove the auction from the set of active auctions.
    _activeAuctions.remove(auctionId);

    // Emit an event to signal that the auction was finalized.
    emit AuctionFinalized(auctionId);
  }

  /// @notice The owner can pause new deposits and auctions. Existing auctions
  /// and withdrawals will be unaffected.
  function ceaseFire() external onlyOwner {
    _status = Status.DEACTIVATED;
  }

  function getStatus() external view returns (Status status) {
    status = _status;
  }

  function getActiveAuctions() external view returns (
    uint256[] memory activeAuctions
  ) {
    activeAuctions = _activeAuctions.enumerate();
  }

  /**
   * @dev Returns the name of the token.
   */
  function name() external view returns (string memory) {
    return "Dai Backstop Syndicate v3-100";
  }

  /**
   * @dev Returns the symbol of the token, usually a shorter version of the
   * name.
   */
  function symbol() external view returns (string memory) {
    return "DBSv3-100";
  }

  /**
   * @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.
   *
   * > Note that 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() external view returns (uint8) {
    return 18;
  }

  /// @notice Return total amount of DAI that is currently held by Syndicate
  function getDaiBalance() external view returns (uint256 combinedDaiInVat) {
    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    combinedDaiInVat = vatDaiLockedInAuctions.add(vatDaiBalance) / 1e27;
  }

  /// @notice Return total amount of DAI that is currently being used in auctions
  function getDaiBalanceForAuctions() external view returns (uint256 daiInVatForAuctions) {
    // Determine the Dai currently locked up in auctions.
    daiInVatForAuctions = _getActiveAuctionVatDaiTotal() / 1e27;
  }

  /// @notice Return total amount of DAI that is currently withdrawable
  function getAvailableDaiBalance() external view returns (uint256 daiInVat) {
    // Determine the Dai currently locked up on behalf of this contract.
    daiInVat = _VAT.dai(address(this)) / 1e27;
  }

  /// @notice Return total amount of MKR that is currently in this contract.
  function getMKRBalance() external view returns (uint256 mkr) {
    // Determine the MKR currently in this contract.
    mkr = _MKR.balanceOf(address(this));
  }

  /// @notice Dry-run of DAI and MKR withdrawal based on Syndicate shares owned
  /// @param backstopTokenAmount Amount of shares to burn
  /// @return daiRedeemed: Amount of DAI withdrawn
  /// @return mkrRedeemed: Amount of MKR withdrawn
  /// @return redeemable: Whether there's enough Dai not in auctions to withdraw
  function getDefectAmount(
    uint256 backstopTokenAmount
  ) external view returns (
    uint256 daiRedeemed, uint256 mkrRedeemed, bool redeemable
  ) {
    if (backstopTokenAmount == 0) {
      return (0, 0, false);
    }

    if (backstopTokenAmount > totalSupply()) {
      revert("Supplied token amount is greater than total supply.");
    }

    // Determine the % ownership. (scaled up by 1e18)
    uint256 shareFloat = (backstopTokenAmount.mul(1e18)).div(totalSupply());

    // Determine the Dai currently being used to bid in auctions.
    uint256 vatDaiLockedInAuctions = _getActiveAuctionVatDaiTotal();

    // Determine the Dai currently locked up on behalf of this contract.
    uint256 vatDaiBalance = _VAT.dai(address(this));

    // Combine Dai locked in auctions with the balance on the contract.
    uint256 combinedVatDai = vatDaiLockedInAuctions.add(vatDaiBalance);

    // Determine the Maker currently held by the contract.
    uint256 makerBalance = _MKR.balanceOf(address(this));

    // Determine the amount of Dai and MKR to redeem based on the share.
    uint256 vatDaiRedeemed = combinedVatDai.mul(shareFloat) / 1e18;
    mkrRedeemed = makerBalance.mul(shareFloat) / 1e18;

    // daiRedeemed is the e18 version of vatDaiRedeemed (e45).
    // Needed for dai ERC20 token, otherwise keep decimals of vatDai.
    daiRedeemed = vatDaiRedeemed / 1e27;

    // Check that sufficient Dai liquidity is currently available to withdraw.
    redeemable = (vatDaiRedeemed <= vatDaiBalance);
  }

  function _getActiveAuctionVatDaiTotal() internal view returns (uint256 vatDai) {
    vatDai = 0;
    uint256[] memory activeAuctions = _activeAuctions.enumerate();

    uint256 auctionVatDai;
    address bidder;
    for (uint256 i = 0; i < activeAuctions.length; i++) {
      // Dai bid size is returned from getCurrentBid with 45 decimals
      (auctionVatDai,, bidder,,) = SimpleFlopper.getCurrentBid(activeAuctions[i]);
      if (bidder == address(this)) {
        // we are keeping the 45 decimals in case we need to return vatDai
        vatDai = vatDai.add(auctionVatDai);
      }
    }
  }

  modifier notWhenDeactivated() {
    require(
      _status != Status.DEACTIVATED,
      "DaiBackstopSyndicate/notWhenDeactivated: Syndicate is deactivated, please withdraw."
    );
    _;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"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":false,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mkrAsk","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiBid","type":"uint256"}],"name":"AuctionEntered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"AuctionFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ceaseFire","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"backstopTokenAmount","type":"uint256"}],"name":"defect","outputs":[{"internalType":"uint256","name":"daiRedeemed","type":"uint256"},{"internalType":"uint256","name":"mkrRedeemed","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiAmount","type":"uint256"}],"name":"enlist","outputs":[{"internalType":"uint256","name":"backstopTokensMinted","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"enterAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"finalizeAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getActiveAuctions","outputs":[{"internalType":"uint256[]","name":"activeAuctions","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAuctionInformation","outputs":[{"internalType":"uint256","name":"bidIncrement","type":"uint256"},{"internalType":"uint256","name":"repriceIncrement","type":"uint256"},{"internalType":"uint256","name":"bidDuration","type":"uint256"},{"internalType":"uint256","name":"auctionDuration","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailableDaiBalance","outputs":[{"internalType":"uint256","name":"daiInVat","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"name":"getCurrentBid","outputs":[{"internalType":"uint256","name":"amountDAI","type":"uint256"},{"internalType":"uint256","name":"amountMKR","type":"uint256"},{"internalType":"address","name":"bidder","type":"address"},{"internalType":"uint48","name":"bidDeadline","type":"uint48"},{"internalType":"uint48","name":"auctionDeadline","type":"uint48"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDaiBalance","outputs":[{"internalType":"uint256","name":"combinedDaiInVat","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDaiBalanceForAuctions","outputs":[{"internalType":"uint256","name":"daiInVatForAuctions","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"backstopTokenAmount","type":"uint256"}],"name":"getDefectAmount","outputs":[{"internalType":"uint256","name":"daiRedeemed","type":"uint256"},{"internalType":"uint256","name":"mkrRedeemed","type":"uint256"},{"internalType":"bool","name":"redeemable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFlopperAddress","outputs":[{"internalType":"address","name":"flopper","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"getMKRBalance","outputs":[{"internalType":"uint256","name":"mkr","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStatus","outputs":[{"internalType":"enum IDaiBackstopSyndicate.Status","name":"status","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalNumberOfAuctions","outputs":[{"internalType":"uint256","name":"auctionID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50600080546001600160a01b03191632178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36005805460ff19169055604080516328ec8bf160e21b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163a3b22fc491602480830192600092919082900301818387803b158015620000cc57600080fd5b505af1158015620000e1573d6000803e3d6000fd5b50506040805163095ea7b360e01b8152739759a6ac90977b93b58547b4a71c78317f391a28600482015260001960248201529051736b175474e89094c44da98b954eedeac495271d0f935063095ea7b3925060448083019260209291908290030181600087803b1580156200015557600080fd5b505af11580156200016a573d6000803e3d6000fd5b505050506040513d60208110156200018157600080fd5b507335d1b3f3d7966a1dfe207aa4514c12a259a0492b905063a3b22fc4620001b46200021c602090811b6200167217901c565b6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b158015620001fd57600080fd5b505af115801562000212573d6000803e3d6000fd5b5050505062000234565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6127aa80620002446000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638a5399721161011a578063bafebc6f116100ad578063dd62ed3e1161007c578063dd62ed3e146105f0578063e80838631461061e578063e918ad911461063b578063f2fde38b14610658578063feab50cb1461067e576101fb565b8063bafebc6f1461052d578063c49c2eb614610535578063cf44b5d51461053d578063da4e364f14610595576101fb565b80639d64087f116100e95780639d64087f14610490578063a457c2d7146104cd578063a9059cbb146104f9578063b2a8c6fe14610525576101fb565b80638a539972146104265780638da5cb5b1461045c5780638f32d59b1461048057806395d89b4114610488576101fb565b80633d8b7894116101925780636aa633b6116101615780636aa633b6146103e857806370a08231146103f0578063746fed731461041657806379ba50971461041e576101fb565b80633d8b7894146103695780633f1fc678146103865780634e69d560146103b45780635ddc916a146103e0576101fb565b806323452b9c116101ce57806323452b9c146102df57806323b872dd146102e9578063313ce5671461031f578063395093511461033d576101fb565b8063045f9f8a1461020057806306fdde031461021a578063095ea7b31461029757806318160ddd146102d7575b600080fd5b610208610686565b60408051918252519081900360200190f35b610222610721565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c3600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610758565b604080519115158252519081900360200190f35b61020861076f565b6102e7610775565b005b6102c3600480360360608110156102ff57600080fd5b506001600160a01b038135811691602081013590911690604001356107ca565b610327610821565b6040805160ff9092168252519081900360200190f35b6102c36004803603604081101561035357600080fd5b506001600160a01b038135169060200135610826565b6102086004803603602081101561037f57600080fd5b5035610862565b61038e610a8c565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6103bc610c8a565b604051808260028111156103cc57fe5b60ff16815260200191505060405180910390f35b610208610c93565b6102c3610d4f565b6102086004803603602081101561040657600080fd5b50356001600160a01b0316610de0565b610208610dfb565b6102e7610e81565b6104436004803603602081101561043c57600080fd5b5035610f26565b6040805192835260208301919091528051918290030190f35b61046461137e565b604080516001600160a01b039092168252519081900360200190f35b6102c361138d565b61022261139e565b6104ad600480360360208110156104a657600080fd5b50356113c1565b604080519384526020840192909252151582820152519081900360600190f35b6102c3600480360360408110156104e357600080fd5b506001600160a01b0381351690602001356115d7565b6102c36004803603604081101561050f57600080fd5b506001600160a01b038135169060200135611613565b6102e7611620565b610464611672565b61020861168a565b6105456116d9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610581578181015183820152602001610569565b505050509050019250505060405180910390f35b6105b2600480360360208110156105ab57600080fd5b50356116e5565b6040805195865260208601949094526001600160a01b039092168484015265ffffffffffff9081166060850152166080830152519081900360a00190f35b6102086004803603604081101561060657600080fd5b506001600160a01b0381358116916020013516611798565b6102e76004803603602081101561063457600080fd5b50356117c3565b6102e76004803603602081101561065157600080fd5b5035611896565b6102e76004803603602081101561066e57600080fd5b50356001600160a01b03166119f0565b610208611a9a565b60408051633612d9a360e11b815230600482015290516000916b033b2e3c9fd0803ce8000000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156106e857600080fd5b505afa1580156106fc573d6000803e3d6000fd5b505050506040513d602081101561071257600080fd5b50518161071b57fe5b04905090565b60408051808201909152601d81527f446169204261636b73746f702053796e6469636174652076332d313030000000602082015290565b6000610765338484611ab8565b5060015b92915050565b60045490565b61077d61138d565b6107b85760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b60006107d7848484611ba4565b6001600160a01b038416600090815260036020908152604080832033808552925290912054610817918691610812908663ffffffff611ce816565b611ab8565b5060019392505050565b601290565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611d4516565b6000600260055460ff16600281111561087757fe5b14156108b45760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b600082116108f35760405162461bcd60e51b815260040180806020018281038252603481526020018061265e6034913960400191505060405180910390fd5b600060055460ff16600281111561090657fe5b146109425760405162461bcd60e51b81526004018080602001828103825260558152602001806124986055913960600191505060405180910390fd5b604080516323b872dd60e01b8152336004820152306024820152604481018490529051736b175474e89094c44da98b954eedeac495271d0f916323b872dd9160648083019260209291908290030181600087803b1580156109a257600080fd5b505af11580156109b6573d6000803e3d6000fd5b505050506040513d60208110156109cc57600080fd5b5051610a095760405162461bcd60e51b81526004018080602001828103825260478152602001806124516047913960600191505060405180910390fd5b60408051633b4da69f60e01b8152306004820152602481018490529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b50505050819050610a873382611da6565b919050565b600080600080734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637d780d826040518163ffffffff1660e01b815260040160206040518083038186803b158015610adf57600080fd5b505afa158015610af3573d6000803e3d6000fd5b505050506040513d6020811015610b0957600080fd5b5051604080516324d8499b60e21b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991639361266c916004808301926020929190829003018186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b505160408051634e8b1dd560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991634e8b1dd5916004808301926020929190829003018186803b158015610bcd57600080fd5b505afa158015610be1573d6000803e3d6000fd5b505050506040513d6020811015610bf757600080fd5b50516040805163cfc4af5560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e999163cfc4af55916004808301926020929190829003018186803b158015610c4457600080fd5b505afa158015610c58573d6000803e3d6000fd5b505050506040513d6020811015610c6e57600080fd5b5051929791965065ffffffffffff908116955090911692509050565b60055460ff1690565b600080610c9e611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d6020811015610d1f57600080fd5b505190506b033b2e3c9fd0803ce8000000610d40838363ffffffff611d4516565b81610d4757fe5b049250505090565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663957aa58c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9e57600080fd5b505afa158015610db2573d6000803e3d6000fd5b505050506040513d6020811015610dc857600080fd5b5051600114610dd8576000610ddb565b60015b905090565b6001600160a01b031660009081526002602052604090205490565b604080516370a0823160e01b81523060048201529051600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a0823191602480820192602092909190829003018186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d6020811015610e7a57600080fd5b5051919050565b6001546001600160a01b03163314610eca5760405162461bcd60e51b81526004018080602001828103825260458152602001806124ed6045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b60008060008311610f685760405162461bcd60e51b81526004018080602001828103825260368152602001806126926036913960400191505060405180910390fd5b6000610f99610f7561076f565b610f8d86670de0b6b3a764000063ffffffff611f0d16565b9063ffffffff611f6616565b9050610fa53385611fd0565b6000610faf611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d602081101561103057600080fd5b505190506000611046838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561109d57600080fd5b505afa1580156110b1573d6000803e3d6000fd5b505050506040513d60208110156110c757600080fd5b505190506000670de0b6b3a76400006110e6848863ffffffff611f0d16565b816110ed57fe5b049050670de0b6b3a7640000611109838863ffffffff611f0d16565b8161111057fe5b0496506b033b2e3c9fd0803ce8000000810497508615158061113157508715155b61116c5760405162461bcd60e51b81526004018080602001828103825260438152602001806126c86043913960600191505060405180910390fd5b838111156111ab5760405162461bcd60e51b81526004018080602001828103825260428152602001806123676042913960600191505060405180910390fd5b80156112ac576111b9610d4f565b15611234576040805163ef693bed60e01b8152336004820152602481018a90529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050506112ac565b6040805163bb35783b60e01b81523060048201523360248201526044810183905290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163bb35783b91606480830192600092919082900301818387803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b505050505b8615611373576040805163a9059cbb60e01b8152336004820152602481018990529051739f8f72aa9304c8b593d555f12ef6589cc3a579a29163a9059cbb9160448083019260209291908290030181600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b50516113735760405162461bcd60e51b81526004018080602001828103825260338152602001806123cb6033913960400191505060405180910390fd5b505050505050915091565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b604080518082019091526009815268044425376332d3130360bc1b602082015290565b60008080836113d8575060009150819050806115d0565b6113e061076f565b84111561141e5760405162461bcd60e51b815260040180806020018281038252603381526020018061270b6033913960400191505060405180910390fd5b600061144361142b61076f565b610f8d87670de0b6b3a764000063ffffffff611f0d16565b9050600061144f611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b5051905060006114e6838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561153d57600080fd5b505afa158015611551573d6000803e3d6000fd5b505050506040513d602081101561156757600080fd5b505190506000670de0b6b3a7640000611586848863ffffffff611f0d16565b8161158d57fe5b049050670de0b6b3a76400006115a9838863ffffffff611f0d16565b816115b057fe5b0497506b033b2e3c9fd0803ce80000008104985092909211159450505050505b9193909250565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611ce816565b6000610765338484611ba4565b61162861138d565b6116635760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6005805460ff19166002179055565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663cfdd33026040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b6060610ddb60066120ab565b6000806000806000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316634423c5f1876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d60a081101561176f57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6117d460068263ffffffff61213116565b61180f5760405162461bcd60e51b815260040180806020018281038252603f81526020018061257b603f913960400191505060405180910390fd5b60008061181b836116e5565b945050935050508065ffffffffffff1660001461184c576001600160a01b03821630141561184c5761184c83612146565b61185d60068463ffffffff6121bb16565b506040805184815290517f2d7633a748a750b559b97738629efd586b561319b152bb42ba14d590706d31da9181900360200190a1505050565b600260055460ff1660028111156118a957fe5b14156118e65760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b6118f760068263ffffffff61213116565b156119335760405162461bcd60e51b815260040180806020018281038252603a8152602001806125ba603a913960400191505060405180910390fd5b600061193e826116e5565b505050509050600060646b033b2e3c9fd0803ce8000000838161195d57fe5b048161196557fe5b049050611973838284612284565b600160055460ff16600281111561198657fe5b14611999576005805460ff191660011790555b6119aa60068463ffffffff61230216565b50604080518481526020810183905280820184905290517f35f50010a71a711fbfb0ada2814c5caf05bf153ccea88acca671ab6a5615d7c79181900360600190a1505050565b6119f861138d565b611a335760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6001600160a01b038116611a785760405162461bcd60e51b815260040180806020018281038252603881526020018061273e6038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006b033b2e3c9fd0803ce8000000611ab1611e98565b8161071b57fe5b6001600160a01b038316611afd5760405162461bcd60e51b815260040180806020018281038252602481526020018061263a6024913960400191505060405180910390fd5b6001600160a01b038216611b425760405162461bcd60e51b81526004018080602001828103825260228152602001806123a96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611be95760405162461bcd60e51b81526004018080602001828103825260258152602001806126156025913960400191505060405180910390fd5b6001600160a01b038216611c2e5760405162461bcd60e51b81526004018080602001828103825260238152602001806123446023913960400191505060405180910390fd5b6001600160a01b038316600090815260026020526040902054611c57908263ffffffff611ce816565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611c8c908263ffffffff611d4516565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115611d3f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611d9f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611e01576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600454611e14908263ffffffff611d4516565b6004556001600160a01b038216600090815260026020526040902054611e40908263ffffffff611d4516565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006060611ea660066120ab565b9050600080805b8351811015611f0657611ed2848281518110611ec557fe5b60200260200101516116e5565b50929550935050506001600160a01b038216301415611efe57611efb858463ffffffff611d4516565b94505b600101611ead565b5050505090565b600082611f1c57506000610769565b82820282848281611f2957fe5b0414611d9f5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b6000808211611fbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611fc757fe5b04949350505050565b6001600160a01b0382166120155760405162461bcd60e51b81526004018080602001828103825260218152602001806125f46021913960400191505060405180910390fd5b600454612028908263ffffffff611ce816565b6004556001600160a01b038216600090815260026020526040902054612054908263ffffffff611ce816565b6001600160a01b0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60608082600101805490506040519080825280602002602001820160405280156120df578160200160208202803883390190505b50905060005b600184015481101561212a5783600101818154811061210057fe5b906000526020600020015482828151811061211757fe5b60209081029190910101526001016120e5565b5092915050565b60009081526020919091526040902054151590565b734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663c959c42b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050565b60006121c78383612131565b1561227c576000828152602084905260409020546001840154600019918201910180821461223f57600085600101828154811061220057fe5b906000526020600020015490508086600101848154811061221d57fe5b6000918252602080832090910192909255918252869052604090206001830190555b6000848152602086905260408120556001850180548061225b57fe5b60019003818190600052602060002001600090559055600192505050610769565b506000610769565b60408051632ff9d1c160e11b81526004810185905260248101849052604481018390529051734d95a049d5b0b7d32058cd3f2163015747522e9991635ff3a38291606480830192600092919082900301818387803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b50505050505050565b600061230e8383612131565b61227c57506001808301805480830182556000828152602080822090920185905591548483529085905260409091205561076956fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a20496e73756666696369656e74204461692028696e2075736520696e2061756374696f6e732945524332303a20617070726f766520746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a204d4b5220726564656d7074696f6e206661696c65642e4461694261636b73746f7053796e6469636174652f6e6f745768656e44656163746976617465643a2053796e6469636174652069732064656163746976617465642c20706c656173652077697468647261772e4461694261636b73746f7053796e6469636174652f656e6c6973743a20436f756c64206e6f74207472616e736665722044616920616d6f756e742066726f6d2063616c6c65722e4461694261636b73746f7053796e6469636174652f656e6c6973743a2043616e6e6f74206465706f736974206f6e6365207468652066697273742061756374696f6e2062696420686173206265656e206d6164652e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774461694261636b73746f7053796e6469636174652f66696e616c697a6541756374696f6e3a2041756374696f6e20616c72656164792066696e616c697a65644461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c7265616479206163746976652e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f656e6c6973743a204e6f2044616920616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f20746f6b656e20616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f7468696e672072657475726e6564206166746572206275726e696e6720746f6b656e732e537570706c69656420746f6b656e20616d6f756e742069732067726561746572207468616e20746f74616c20737570706c792e54776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732ea265627a7a723158203b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f564736f6c63430005100032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638a5399721161011a578063bafebc6f116100ad578063dd62ed3e1161007c578063dd62ed3e146105f0578063e80838631461061e578063e918ad911461063b578063f2fde38b14610658578063feab50cb1461067e576101fb565b8063bafebc6f1461052d578063c49c2eb614610535578063cf44b5d51461053d578063da4e364f14610595576101fb565b80639d64087f116100e95780639d64087f14610490578063a457c2d7146104cd578063a9059cbb146104f9578063b2a8c6fe14610525576101fb565b80638a539972146104265780638da5cb5b1461045c5780638f32d59b1461048057806395d89b4114610488576101fb565b80633d8b7894116101925780636aa633b6116101615780636aa633b6146103e857806370a08231146103f0578063746fed731461041657806379ba50971461041e576101fb565b80633d8b7894146103695780633f1fc678146103865780634e69d560146103b45780635ddc916a146103e0576101fb565b806323452b9c116101ce57806323452b9c146102df57806323b872dd146102e9578063313ce5671461031f578063395093511461033d576101fb565b8063045f9f8a1461020057806306fdde031461021a578063095ea7b31461029757806318160ddd146102d7575b600080fd5b610208610686565b60408051918252519081900360200190f35b610222610721565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561025c578181015183820152602001610244565b50505050905090810190601f1680156102895780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102c3600480360360408110156102ad57600080fd5b506001600160a01b038135169060200135610758565b604080519115158252519081900360200190f35b61020861076f565b6102e7610775565b005b6102c3600480360360608110156102ff57600080fd5b506001600160a01b038135811691602081013590911690604001356107ca565b610327610821565b6040805160ff9092168252519081900360200190f35b6102c36004803603604081101561035357600080fd5b506001600160a01b038135169060200135610826565b6102086004803603602081101561037f57600080fd5b5035610862565b61038e610a8c565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6103bc610c8a565b604051808260028111156103cc57fe5b60ff16815260200191505060405180910390f35b610208610c93565b6102c3610d4f565b6102086004803603602081101561040657600080fd5b50356001600160a01b0316610de0565b610208610dfb565b6102e7610e81565b6104436004803603602081101561043c57600080fd5b5035610f26565b6040805192835260208301919091528051918290030190f35b61046461137e565b604080516001600160a01b039092168252519081900360200190f35b6102c361138d565b61022261139e565b6104ad600480360360208110156104a657600080fd5b50356113c1565b604080519384526020840192909252151582820152519081900360600190f35b6102c3600480360360408110156104e357600080fd5b506001600160a01b0381351690602001356115d7565b6102c36004803603604081101561050f57600080fd5b506001600160a01b038135169060200135611613565b6102e7611620565b610464611672565b61020861168a565b6105456116d9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610581578181015183820152602001610569565b505050509050019250505060405180910390f35b6105b2600480360360208110156105ab57600080fd5b50356116e5565b6040805195865260208601949094526001600160a01b039092168484015265ffffffffffff9081166060850152166080830152519081900360a00190f35b6102086004803603604081101561060657600080fd5b506001600160a01b0381358116916020013516611798565b6102e76004803603602081101561063457600080fd5b50356117c3565b6102e76004803603602081101561065157600080fd5b5035611896565b6102e76004803603602081101561066e57600080fd5b50356001600160a01b03166119f0565b610208611a9a565b60408051633612d9a360e11b815230600482015290516000916b033b2e3c9fd0803ce8000000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156106e857600080fd5b505afa1580156106fc573d6000803e3d6000fd5b505050506040513d602081101561071257600080fd5b50518161071b57fe5b04905090565b60408051808201909152601d81527f446169204261636b73746f702053796e6469636174652076332d313030000000602082015290565b6000610765338484611ab8565b5060015b92915050565b60045490565b61077d61138d565b6107b85760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b600180546001600160a01b0319169055565b60006107d7848484611ba4565b6001600160a01b038416600090815260036020908152604080832033808552925290912054610817918691610812908663ffffffff611ce816565b611ab8565b5060019392505050565b601290565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611d4516565b6000600260055460ff16600281111561087757fe5b14156108b45760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b600082116108f35760405162461bcd60e51b815260040180806020018281038252603481526020018061265e6034913960400191505060405180910390fd5b600060055460ff16600281111561090657fe5b146109425760405162461bcd60e51b81526004018080602001828103825260558152602001806124986055913960600191505060405180910390fd5b604080516323b872dd60e01b8152336004820152306024820152604481018490529051736b175474e89094c44da98b954eedeac495271d0f916323b872dd9160648083019260209291908290030181600087803b1580156109a257600080fd5b505af11580156109b6573d6000803e3d6000fd5b505050506040513d60208110156109cc57600080fd5b5051610a095760405162461bcd60e51b81526004018080602001828103825260478152602001806124516047913960600191505060405180910390fd5b60408051633b4da69f60e01b8152306004820152602481018490529051739759a6ac90977b93b58547b4a71c78317f391a2891633b4da69f91604480830192600092919082900301818387803b158015610a6257600080fd5b505af1158015610a76573d6000803e3d6000fd5b50505050819050610a873382611da6565b919050565b600080600080734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316637d780d826040518163ffffffff1660e01b815260040160206040518083038186803b158015610adf57600080fd5b505afa158015610af3573d6000803e3d6000fd5b505050506040513d6020811015610b0957600080fd5b5051604080516324d8499b60e21b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991639361266c916004808301926020929190829003018186803b158015610b5657600080fd5b505afa158015610b6a573d6000803e3d6000fd5b505050506040513d6020811015610b8057600080fd5b505160408051634e8b1dd560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e9991634e8b1dd5916004808301926020929190829003018186803b158015610bcd57600080fd5b505afa158015610be1573d6000803e3d6000fd5b505050506040513d6020811015610bf757600080fd5b50516040805163cfc4af5560e01b81529051734d95a049d5b0b7d32058cd3f2163015747522e999163cfc4af55916004808301926020929190829003018186803b158015610c4457600080fd5b505afa158015610c58573d6000803e3d6000fd5b505050506040513d6020811015610c6e57600080fd5b5051929791965065ffffffffffff908116955090911692509050565b60055460ff1690565b600080610c9e611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b158015610cf557600080fd5b505afa158015610d09573d6000803e3d6000fd5b505050506040513d6020811015610d1f57600080fd5b505190506b033b2e3c9fd0803ce8000000610d40838363ffffffff611d4516565b81610d4757fe5b049250505090565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663957aa58c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9e57600080fd5b505afa158015610db2573d6000803e3d6000fd5b505050506040513d6020811015610dc857600080fd5b5051600114610dd8576000610ddb565b60015b905090565b6001600160a01b031660009081526002602052604090205490565b604080516370a0823160e01b81523060048201529051600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a0823191602480820192602092909190829003018186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d6020811015610e7a57600080fd5b5051919050565b6001546001600160a01b03163314610eca5760405162461bcd60e51b81526004018080602001828103825260458152602001806124ed6045913960600191505060405180910390fd5b600180546001600160a01b03191690556000805460405133926001600160a01b03909216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03191633179055565b60008060008311610f685760405162461bcd60e51b81526004018080602001828103825260368152602001806126926036913960400191505060405180910390fd5b6000610f99610f7561076f565b610f8d86670de0b6b3a764000063ffffffff611f0d16565b9063ffffffff611f6616565b9050610fa53385611fd0565b6000610faf611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b15801561100657600080fd5b505afa15801561101a573d6000803e3d6000fd5b505050506040513d602081101561103057600080fd5b505190506000611046838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561109d57600080fd5b505afa1580156110b1573d6000803e3d6000fd5b505050506040513d60208110156110c757600080fd5b505190506000670de0b6b3a76400006110e6848863ffffffff611f0d16565b816110ed57fe5b049050670de0b6b3a7640000611109838863ffffffff611f0d16565b8161111057fe5b0496506b033b2e3c9fd0803ce8000000810497508615158061113157508715155b61116c5760405162461bcd60e51b81526004018080602001828103825260438152602001806126c86043913960600191505060405180910390fd5b838111156111ab5760405162461bcd60e51b81526004018080602001828103825260428152602001806123676042913960600191505060405180910390fd5b80156112ac576111b9610d4f565b15611234576040805163ef693bed60e01b8152336004820152602481018a90529051739759a6ac90977b93b58547b4a71c78317f391a289163ef693bed91604480830192600092919082900301818387803b15801561121757600080fd5b505af115801561122b573d6000803e3d6000fd5b505050506112ac565b6040805163bb35783b60e01b81523060048201523360248201526044810183905290517335d1b3f3d7966a1dfe207aa4514c12a259a0492b9163bb35783b91606480830192600092919082900301818387803b15801561129357600080fd5b505af11580156112a7573d6000803e3d6000fd5b505050505b8615611373576040805163a9059cbb60e01b8152336004820152602481018990529051739f8f72aa9304c8b593d555f12ef6589cc3a579a29163a9059cbb9160448083019260209291908290030181600087803b15801561130c57600080fd5b505af1158015611320573d6000803e3d6000fd5b505050506040513d602081101561133657600080fd5b50516113735760405162461bcd60e51b81526004018080602001828103825260338152602001806123cb6033913960400191505060405180910390fd5b505050505050915091565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b604080518082019091526009815268044425376332d3130360bc1b602082015290565b60008080836113d8575060009150819050806115d0565b6113e061076f565b84111561141e5760405162461bcd60e51b815260040180806020018281038252603381526020018061270b6033913960400191505060405180910390fd5b600061144361142b61076f565b610f8d87670de0b6b3a764000063ffffffff611f0d16565b9050600061144f611e98565b60408051633612d9a360e11b815230600482015290519192506000917335d1b3f3d7966a1dfe207aa4514c12a259a0492b91636c25b346916024808301926020929190829003018186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d60208110156114d057600080fd5b5051905060006114e6838363ffffffff611d4516565b604080516370a0823160e01b81523060048201529051919250600091739f8f72aa9304c8b593d555f12ef6589cc3a579a2916370a08231916024808301926020929190829003018186803b15801561153d57600080fd5b505afa158015611551573d6000803e3d6000fd5b505050506040513d602081101561156757600080fd5b505190506000670de0b6b3a7640000611586848863ffffffff611f0d16565b8161158d57fe5b049050670de0b6b3a76400006115a9838863ffffffff611f0d16565b816115b057fe5b0497506b033b2e3c9fd0803ce80000008104985092909211159450505050505b9193909250565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610765918590610812908663ffffffff611ce816565b6000610765338484611ba4565b61162861138d565b6116635760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6005805460ff19166002179055565b734d95a049d5b0b7d32058cd3f2163015747522e9990565b6000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663cfdd33026040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b6060610ddb60066120ab565b6000806000806000734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b0316634423c5f1876040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d60a081101561176f57600080fd5b508051602082015160408301516060840151608090940151929a91995097509195509350915050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b6117d460068263ffffffff61213116565b61180f5760405162461bcd60e51b815260040180806020018281038252603f81526020018061257b603f913960400191505060405180910390fd5b60008061181b836116e5565b945050935050508065ffffffffffff1660001461184c576001600160a01b03821630141561184c5761184c83612146565b61185d60068463ffffffff6121bb16565b506040805184815290517f2d7633a748a750b559b97738629efd586b561319b152bb42ba14d590706d31da9181900360200190a1505050565b600260055460ff1660028111156118a957fe5b14156118e65760405162461bcd60e51b81526004018080602001828103825260538152602001806123fe6053913960600191505060405180910390fd5b6118f760068263ffffffff61213116565b156119335760405162461bcd60e51b815260040180806020018281038252603a8152602001806125ba603a913960400191505060405180910390fd5b600061193e826116e5565b505050509050600060646b033b2e3c9fd0803ce8000000838161195d57fe5b048161196557fe5b049050611973838284612284565b600160055460ff16600281111561198657fe5b14611999576005805460ff191660011790555b6119aa60068463ffffffff61230216565b50604080518481526020810183905280820184905290517f35f50010a71a711fbfb0ada2814c5caf05bf153ccea88acca671ab6a5615d7c79181900360600190a1505050565b6119f861138d565b611a335760405162461bcd60e51b81526004018080602001828103825260288152602001806125326028913960400191505060405180910390fd5b6001600160a01b038116611a785760405162461bcd60e51b815260040180806020018281038252603881526020018061273e6038913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006b033b2e3c9fd0803ce8000000611ab1611e98565b8161071b57fe5b6001600160a01b038316611afd5760405162461bcd60e51b815260040180806020018281038252602481526020018061263a6024913960400191505060405180910390fd5b6001600160a01b038216611b425760405162461bcd60e51b81526004018080602001828103825260228152602001806123a96022913960400191505060405180910390fd5b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611be95760405162461bcd60e51b81526004018080602001828103825260258152602001806126156025913960400191505060405180910390fd5b6001600160a01b038216611c2e5760405162461bcd60e51b81526004018080602001828103825260238152602001806123446023913960400191505060405180910390fd5b6001600160a01b038316600090815260026020526040902054611c57908263ffffffff611ce816565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611c8c908263ffffffff611d4516565b6001600160a01b0380841660008181526002602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600082821115611d3f576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611d9f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216611e01576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600454611e14908263ffffffff611d4516565b6004556001600160a01b038216600090815260026020526040902054611e40908263ffffffff611d4516565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006060611ea660066120ab565b9050600080805b8351811015611f0657611ed2848281518110611ec557fe5b60200260200101516116e5565b50929550935050506001600160a01b038216301415611efe57611efb858463ffffffff611d4516565b94505b600101611ead565b5050505090565b600082611f1c57506000610769565b82820282848281611f2957fe5b0414611d9f5760405162461bcd60e51b815260040180806020018281038252602181526020018061255a6021913960400191505060405180910390fd5b6000808211611fbc576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481611fc757fe5b04949350505050565b6001600160a01b0382166120155760405162461bcd60e51b81526004018080602001828103825260218152602001806125f46021913960400191505060405180910390fd5b600454612028908263ffffffff611ce816565b6004556001600160a01b038216600090815260026020526040902054612054908263ffffffff611ce816565b6001600160a01b0383166000818152600260209081526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60608082600101805490506040519080825280602002602001820160405280156120df578160200160208202803883390190505b50905060005b600184015481101561212a5783600101818154811061210057fe5b906000526020600020015482828151811061211757fe5b60209081029190910101526001016120e5565b5092915050565b60009081526020919091526040902054151590565b734d95a049d5b0b7d32058cd3f2163015747522e996001600160a01b031663c959c42b826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156121a057600080fd5b505af11580156121b4573d6000803e3d6000fd5b5050505050565b60006121c78383612131565b1561227c576000828152602084905260409020546001840154600019918201910180821461223f57600085600101828154811061220057fe5b906000526020600020015490508086600101848154811061221d57fe5b6000918252602080832090910192909255918252869052604090206001830190555b6000848152602086905260408120556001850180548061225b57fe5b60019003818190600052602060002001600090559055600192505050610769565b506000610769565b60408051632ff9d1c160e11b81526004810185905260248101849052604481018390529051734d95a049d5b0b7d32058cd3f2163015747522e9991635ff3a38291606480830192600092919082900301818387803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b50505050505050565b600061230e8383612131565b61227c57506001808301805480830182556000828152602080822090920185905591548483529085905260409091205561076956fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a20496e73756666696369656e74204461692028696e2075736520696e2061756374696f6e732945524332303a20617070726f766520746f20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f6465666563743a204d4b5220726564656d7074696f6e206661696c65642e4461694261636b73746f7053796e6469636174652f6e6f745768656e44656163746976617465643a2053796e6469636174652069732064656163746976617465642c20706c656173652077697468647261772e4461694261636b73746f7053796e6469636174652f656e6c6973743a20436f756c64206e6f74207472616e736665722044616920616d6f756e742066726f6d2063616c6c65722e4461694261636b73746f7053796e6469636174652f656e6c6973743a2043616e6e6f74206465706f736974206f6e6365207468652066697273742061756374696f6e2062696420686173206265656e206d6164652e54776f537465704f776e61626c653a2063757272656e74206f776e6572206d757374207365742063616c6c6572206173206e657720706f74656e7469616c206f776e65722e54776f537465704f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65722e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774461694261636b73746f7053796e6469636174652f66696e616c697a6541756374696f6e3a2041756374696f6e20616c72656164792066696e616c697a65644461694261636b73746f7053796e6469636174652f656e74657241756374696f6e3a2041756374696f6e20616c7265616479206163746976652e45524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734461694261636b73746f7053796e6469636174652f656e6c6973743a204e6f2044616920616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f20746f6b656e20616d6f756e7420737570706c6965642e4461694261636b73746f7053796e6469636174652f6465666563743a204e6f7468696e672072657475726e6564206166746572206275726e696e6720746f6b656e732e537570706c69656420746f6b656e20616d6f756e742069732067726561746572207468616e20746f74616c20737570706c792e54776f537465704f776e61626c653a206e657720706f74656e7469616c206f776e657220697320746865207a65726f20616464726573732ea265627a7a723158203b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f564736f6c63430005100032

Deployed Bytecode Sourcemap

29067:12360:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29067:12360:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38273:203;;;:::i;:::-;;;;;;;;;;;;;;;;36390:105;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36390:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14437:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14437:148:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;13460:91;;;:::i;24872:90::-;;;:::i;:::-;;15056:256;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15056:256:0;;;;;;;;;;;;;;;;;:::i;37234:72::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15721:206;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15721:206:0;;;;;;;;:::i;30515:834::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30515:834:0;;:::i;21239:257::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36082:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37390:496;;;:::i;20298:112::-;;;:::i;13614:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13614:110:0;-1:-1:-1;;;;;13614:110:0;;:::i;38560:163::-;;;:::i;25120:298::-;;;:::i;31616:2293::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31616:2293:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23959:73;;;:::i;:::-;;;;-1:-1:-1;;;;;23959:73:0;;;;;;;;;;;;;;24301:86;;;:::i;36604:87::-;;;:::i;39055:1550::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39055:1550:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16430:216;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16430:216:0;;;;;;;;:::i;13937:156::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13937:156:0;;;;;;;;:::i;35995:81::-;;;:::i;20714:104::-;;;:::i;20500:112::-;;;:::i;36176:152::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36176:152:0;;;;;;;;;;;;;;;;;21833:235;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21833:235:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;21833:235:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14156:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14156:134:0;;;;;;;;;;:::i;35024:842::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35024:842:0;;:::i;34066:901::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34066:901:0;;:::i;24520:225::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24520:225:0;-1:-1:-1;;;;;24520:225:0;;:::i;37975:219::-;;;:::i;38273:203::-;38440:23;;;-1:-1:-1;;;38440:23:0;;38457:4;38440:23;;;;;;38330:16;;38466:4;;29792:42;;38440:8;;:23;;;;;;;;;;;;;;29792:42;38440:23;;;5:2:-1;;;;30:1;27;20:12;5:2;38440:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38440:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38440:23:0;:30;;;;;;38429:41;;38273:203;:::o;36390:105::-;36451:38;;;;;;;;;;;;;;;;;36390:105;:::o;14437:148::-;14502:4;14519:36;14528:10;14540:7;14549:5;14519:8;:36::i;:::-;-1:-1:-1;14573:4:0;14437:148;;;;;:::o;13460:91::-;13531:12;;13460:91;:::o;24872:90::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24938:18;24931:25;;-1:-1:-1;;;;;;24931:25:0;;;24872:90::o;15056:256::-;15145:4;15162:36;15172:6;15180:9;15191:6;15162:9;:36::i;:::-;-1:-1:-1;;;;;15238:19:0;;;;;;:11;:19;;;;;;;;15226:10;15238:31;;;;;;;;;15209:73;;15218:6;;15238:43;;15274:6;15238:43;:35;:43;:::i;:::-;15209:8;:73::i;:::-;-1:-1:-1;15300:4:0;15056:256;;;;;:::o;37234:72::-;37298:2;37234:72;:::o;15721:206::-;15827:10;15801:4;15848:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;15848:32:0;;;;;;;;;;15801:4;;15818:79;;15839:7;;15848:48;;15885:10;15848:48;:36;:48;:::i;30515:834::-;30597:28;41291:18;41280:7;;;;:29;;;;;;;;;;41264:146;;;;-1:-1:-1;;;41264:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30654:1;30642:9;:13;30634:78;;;;-1:-1:-1;;;30634:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30756:25;30745:7;;;;:36;;;;;;;;;30729:155;;;;-1:-1:-1;;;30729:155:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30909:55;;;-1:-1:-1;;;30909:55:0;;30927:10;30909:55;;;;30947:4;30909:55;;;;;;;;;;;;29496:42;;30909:17;;:55;;;;;;;;;;;;;;-1:-1:-1;29496:42:0;30909:55;;;5:2:-1;;;;30:1;27;20:12;5:2;30909:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30909:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30909:55:0;30893:160;;;;-1:-1:-1;;;30893:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31144:40;;;-1:-1:-1;;;31144:40:0;;31167:4;31144:40;;;;;;;;;;;;29697:42;;31144:14;;:40;;;;;-1:-1:-1;;31144:40:0;;;;;;;-1:-1:-1;29697:42:0;31144:40;;;5:2:-1;;;;30:1;27;20:12;5:2;31144:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31144:40:0;;;;31288:9;31265:32;;31304:39;31310:10;31322:20;31304:5;:39::i;:::-;30515:834;;;:::o;21239:257::-;21299:20;21326:24;21357:19;21383:23;20108:42;-1:-1:-1;;;;;21427:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21427:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21427:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21427:14:0;21443;;;-1:-1:-1;;;21443:14:0;;;;20108:42;;21443:12;;:14;;;;;21427;;21443;;;;;;;20108:42;21443:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21443:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21443:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21443:14:0;21459;;;-1:-1:-1;;;21459:14:0;;;;20108:42;;21459:12;;:14;;;;;21443;;21459;;;;;;;20108:42;21459:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21459:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21459:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21459:14:0;21475;;;-1:-1:-1;;;21475:14:0;;;;20108:42;;21475:12;;:14;;;;;21459;;21475;;;;;;;20108:42;21475:14;;;5:2:-1;;;;30:1;27;20:12;5:2;21475:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21475:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21475:14:0;21419:71;;;;-1:-1:-1;21419:71:0;;;;;-1:-1:-1;21419:71:0;;;;-1:-1:-1;21239:257:0;-1:-1:-1;21239:257:0:o;36082:88::-;36157:7;;;;;36082:88::o;37390:496::-;37438:24;37538:30;37571;:28;:30::i;:::-;37708:23;;;-1:-1:-1;;;37708:23:0;;37725:4;37708:23;;;;;;37538:63;;-1:-1:-1;37684:21:0;;29792:42;;37708:8;;:23;;;;;;;;;;;;;;29792:42;37708:23;;;5:2:-1;;;;30:1;27;20:12;5:2;37708:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37708:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37708:23:0;;-1:-1:-1;37876:4:0;37832:41;:22;37708:23;37832:41;:26;:41;:::i;:::-;:48;;;;;;37813:67;;37390:496;;;:::o;20298:112::-;20340:11;20108:42;-1:-1:-1;;;;;20368:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20368:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20368:15:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20368:15:0;20387:1;20368:20;20367:37;;20399:5;20367:37;;;20392:4;20367:37;20360:44;;20298:112;:::o;13614:110::-;-1:-1:-1;;;;;13698:18:0;13671:7;13698:18;;;:9;:18;;;;;;;13614:110::o;38560:163::-;38688:29;;;-1:-1:-1;;;38688:29:0;;38711:4;38688:29;;;;;;38608:11;;29595:42;;38688:14;;:29;;;;;;;;;;;;;;;29595:42;38688:29;;;5:2:-1;;;;30:1;27;20:12;5:2;38688:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38688:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38688:29:0;;38560:163;-1:-1:-1;38560:163:0:o;25120:298::-;25191:18;;-1:-1:-1;;;;;25191:18:0;25177:10;:32;25161:135;;;;-1:-1:-1;;;25161:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25312:18;25305:25;;-1:-1:-1;;;;;;25305:25:0;;;-1:-1:-1;25365:6:0;;25344:40;;25373:10;;-1:-1:-1;;;;;25365:6:0;;;;25344:40;;;25393:6;:19;;-1:-1:-1;;;;;;25393:19:0;25402:10;25393:19;;;25120:298::o;31616:2293::-;31689:19;31710;31776:1;31754:19;:23;31738:104;;;;-1:-1:-1;;;31738:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31912:18;31933:50;31969:13;:11;:13::i;:::-;31934:29;:19;31958:4;31934:29;:23;:29;:::i;:::-;31933:35;:50;:35;:50;:::i;:::-;31912:71;;32017:38;32023:10;32035:19;32017:5;:38::i;:::-;32131:30;32164;:28;:30::i;:::-;32301:23;;;-1:-1:-1;;;32301:23:0;;32318:4;32301:23;;;;;;32131:63;;-1:-1:-1;32277:21:0;;29792:42;;32301:8;;:23;;;;;;;;;;;;;;29792:42;32301:23;;;5:2:-1;;;;30:1;27;20:12;5:2;32301:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32301:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32301:23:0;;-1:-1:-1;32406:22:0;32431:41;:22;32301:23;32431:41;:26;:41;:::i;:::-;32564:29;;;-1:-1:-1;;;32564:29:0;;32587:4;32564:29;;;;;;32406:66;;-1:-1:-1;32541:20:0;;29595:42;;32564:14;;:29;;;;;;;;;;;;;;29595:42;32564:29;;;5:2:-1;;;;30:1;27;20:12;5:2;32564:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32564:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32564:29:0;;-1:-1:-1;32676:22:0;32734:4;32701:30;:14;32720:10;32701:30;:18;:30;:::i;:::-;:37;;;;;;;-1:-1:-1;32790:4:0;32759:28;:12;32776:10;32759:28;:16;:28;:::i;:::-;:35;;;;;;;-1:-1:-1;32969:4:0;32952:14;:21;;-1:-1:-1;33071:16:0;;;;:36;;-1:-1:-1;33091:16:0;;;33071:36;33055:137;;;;-1:-1:-1;;;33055:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33316:13;33298:14;:31;;33282:131;;;;-1:-1:-1;;;33282:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33517:18;;33513:210;;33550:25;:23;:25::i;:::-;33546:170;;;33588:39;;;-1:-1:-1;;;33588:39:0;;33603:10;33588:39;;;;;;;;;;;;29697:42;;33588:14;;:39;;;;;-1:-1:-1;;33588:39:0;;;;;;;-1:-1:-1;29697:42:0;33588:39;;;5:2:-1;;;;30:1;27;20:12;5:2;33588:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33588:39:0;;;;33546:170;;;33654:52;;;-1:-1:-1;;;33654:52:0;;33672:4;33654:52;;;;33679:10;33654:52;;;;;;;;;;;;29792:42;;33654:9;;:52;;;;;-1:-1:-1;;33654:52:0;;;;;;;-1:-1:-1;29792:42:0;33654:52;;;5:2:-1;;;;30:1;27;20:12;5:2;33654:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33654:52:0;;;;33546:170;33735:15;;33731:173;;33779:38;;;-1:-1:-1;;;33779:38:0;;33793:10;33779:38;;;;;;;;;;;;29595:42;;33779:13;;:38;;;;;;;;;;;;;;-1:-1:-1;29595:42:0;33779:38;;;5:2:-1;;;;30:1;27;20:12;5:2;33779:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;33779:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33779:38:0;33761:129;;;;-1:-1:-1;;;33761:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31616:2293;;;;;;;;;:::o;23959:73::-;23997:7;24020:6;-1:-1:-1;;;;;24020:6:0;23959:73;:::o;24301:86::-;24341:4;24375:6;-1:-1:-1;;;;;24375:6:0;24361:10;:20;;24301:86::o;36604:87::-;36667:18;;;;;;;;;;;;-1:-1:-1;;;36667:18:0;;;;36604:87;:::o;39055:1550::-;39148:19;;;39222:24;39218:67;;-1:-1:-1;39265:1:0;;-1:-1:-1;39265:1:0;;-1:-1:-1;39265:1:0;39257:20;;39218:67;39319:13;:11;:13::i;:::-;39297:19;:35;39293:119;;;39343:61;;-1:-1:-1;;;39343:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39293:119;39475:18;39496:50;39532:13;:11;:13::i;:::-;39497:29;:19;39521:4;39497:29;:23;:29;:::i;39496:50::-;39475:71;;39622:30;39655;:28;:30::i;:::-;39792:23;;;-1:-1:-1;;;39792:23:0;;39809:4;39792:23;;;;;;39622:63;;-1:-1:-1;39768:21:0;;29792:42;;39792:8;;:23;;;;;;;;;;;;;;29792:42;39792:23;;;5:2:-1;;;;30:1;27;20:12;5:2;39792:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39792:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39792:23:0;;-1:-1:-1;39897:22:0;39922:41;:22;39792:23;39922:41;:26;:41;:::i;:::-;40055:29;;;-1:-1:-1;;;40055:29:0;;40078:4;40055:29;;;;;;39897:66;;-1:-1:-1;40032:20:0;;29595:42;;40055:14;;:29;;;;;;;;;;;;;;29595:42;40055:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40055:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40055:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40055:29:0;;-1:-1:-1;40167:22:0;40225:4;40192:30;:14;40211:10;40192:30;:18;:30;:::i;:::-;:37;;;;;;;-1:-1:-1;40281:4:0;40250:28;:12;40267:10;40250:28;:16;:28;:::i;:::-;:35;;;;;;;-1:-1:-1;40460:4:0;40443:14;:21;;-1:-1:-1;40567:31:0;;;;;;-1:-1:-1;;;;;39055:1550:0;;;;;;:::o;16430:216::-;16541:10;16515:4;16562:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;16562:32:0;;;;;;;;;;16515:4;;16532:84;;16553:7;;16562:53;;16599:15;16562:53;:36;:53;:::i;13937:156::-;14006:4;14023:40;14033:10;14045:9;14056:6;14023:9;:40::i;35995:81::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36042:7;:28;;-1:-1:-1;;36042:28:0;36052:18;36042:28;;;35995:81::o;20714:104::-;20108:42;20714:104;:::o;20500:112::-;20557:17;20108:42;-1:-1:-1;;;;;20590:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;36176:152:0;36234:31;36295:27;:15;:25;:27::i;21833:235::-;21902:17;21926;21950:14;21971:18;21996:22;20108:42;-1:-1:-1;;;;;22038:13:0;;22052:9;22038:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22038:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22038:24:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;22038:24:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22038:24:0;-1:-1:-1;22038:24:0;;-1:-1:-1;22038:24:0;-1:-1:-1;21833:235:0;-1:-1:-1;;21833:235:0:o;14156:134::-;-1:-1:-1;;;;;14255:18:0;;;14228:7;14255:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14156:134::o;35024:842::-;35100:35;:15;35125:9;35100:35;:24;:35;:::i;:::-;35084:132;;;;-1:-1:-1;;;35084:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35282:14;35299:10;35313:38;35341:9;35313:27;:38::i;:::-;35278:73;;;;;;;35426:3;:8;;35433:1;35426:8;35422:232;;-1:-1:-1;;;;;35567:23:0;;35585:4;35567:23;35563:84;;;35603:34;35627:9;35603:23;:34::i;:::-;35722:33;:15;35745:9;35722:33;:22;:33;:::i;:::-;-1:-1:-1;35833:27:0;;;;;;;;;;;;;;;;;35024:842;;;:::o;34066:901::-;41291:18;41280:7;;;;:29;;;;;;;;;;41264:146;;;;-1:-1:-1;;;41264:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34159:35;:15;34184:9;34159:35;:24;:35;:::i;:::-;34158:36;34142:128;;;;-1:-1:-1;;;34142:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34314:17;34343:38;34371:9;34343:27;:38::i;:::-;34313:68;;;;;;34472:19;34515:3;34507:4;34495:9;:16;;;;;;34494:24;;;;;;34472:46;;34572:53;34591:9;34602:11;34615:9;34572:18;:53::i;:::-;34683:16;34672:7;;;;:27;;;;;;;;;34668:76;;34710:7;:26;;-1:-1:-1;;34710:26:0;34720:16;34710:26;;;34668:76;34806:30;:15;34826:9;34806:30;:19;:30;:::i;:::-;-1:-1:-1;34912:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41417:1;;34066:901;:::o;24520:225::-;24153:9;:7;:9::i;:::-;24145:62;;;;-1:-1:-1;;;24145:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24605:22:0;;24589:112;;;;-1:-1:-1;;;24589:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24710:18;:29;;-1:-1:-1;;;;;;24710:29:0;-1:-1:-1;;;;;24710:29:0;;;;;;;;;;24520:225::o;37975:219::-;38034:27;38184:4;38151:30;:28;:30::i;:::-;:37;;;;19232:335;-1:-1:-1;;;;;19325:19:0;;19317:68;;;;-1:-1:-1;;;19317:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19404:21:0;;19396:68;;;;-1:-1:-1;;;19396:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19477:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;19528:31;;;;;;;;;;;;;;;;;19232:335;;;:::o;17136:429::-;-1:-1:-1;;;;;17234:20:0;;17226:70;;;;-1:-1:-1;;;17226:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17315:23:0;;17307:71;;;;-1:-1:-1;;;17307:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17411:17:0;;;;;;:9;:17;;;;;;:29;;17433:6;17411:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;17391:17:0;;;;;;;:9;:17;;;;;;:49;;;;17474:20;;;;;;;:32;;17499:6;17474:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;17451:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;17522:35;;;;;;;17451:20;;17522:35;;;;;;;;;;;;;17136:429;;;:::o;6882:184::-;6940:7;6973:1;6968;:6;;6960:49;;;;;-1:-1:-1;;;6960:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7032:5:0;;;6882:184::o;6426:181::-;6484:7;6516:5;;;6540:6;;;;6532:46;;;;;-1:-1:-1;;;6532:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6598:1;6426:181;-1:-1:-1;;;6426:181:0:o;17846:308::-;-1:-1:-1;;;;;17922:21:0;;17914:65;;;;;-1:-1:-1;;;17914:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18007:12;;:24;;18024:6;18007:24;:16;:24;:::i;:::-;17992:12;:39;-1:-1:-1;;;;;18063:18:0;;;;;;:9;:18;;;;;;:30;;18086:6;18063:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;18042:18:0;;;;;;:9;:18;;;;;;;;:51;;;;18109:37;;;;;;;18042:18;;;;18109:37;;;;;;;;;;17846:308;;:::o;40611:610::-;40674:14;40714:31;40748:27;:15;:25;:27::i;:::-;40714:61;-1:-1:-1;40784:21:0;;;40833:383;40857:14;:21;40853:1;:25;40833:383;;;40994:46;41022:14;41037:1;41022:17;;;;;;;;;;;;;;40994:27;:46::i;:::-;-1:-1:-1;40965:75:0;;-1:-1:-1;40965:75:0;-1:-1:-1;;;;;;;;41053:23:0;;41071:4;41053:23;41049:160;;;41174:25;:6;41185:13;41174:25;:10;:25;:::i;:::-;41165:34;;41049:160;40880:3;;40833:383;;;;40611:610;;;;:::o;7317:471::-;7375:7;7620:6;7616:47;;-1:-1:-1;7650:1:0;7643:8;;7616:47;7687:5;;;7691:1;7687;:5;:1;7711:5;;;;;:10;7703:56;;;;-1:-1:-1;;;7703:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8256:333;8314:7;8413:1;8409;:5;8401:44;;;;;-1:-1:-1;;;8401:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8456:9;8472:1;8468;:5;;;;;;;8256:333;-1:-1:-1;;;;8256:333:0:o;18486:306::-;-1:-1:-1;;;;;18561:21:0;;18553:67;;;;-1:-1:-1;;;18553:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18648:12;;:23;;18665:5;18648:23;:16;:23;:::i;:::-;18633:12;:38;-1:-1:-1;;;;;18703:18:0;;;;;;:9;:18;;;;;;:29;;18726:5;18703:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;18682:18:0;;;;;;:9;:18;;;;;;;;:50;;;;18748:36;;;;;;;18682:18;;18748:36;;;;;;;;;;;18486:306;;:::o;28028:286::-;28111:16;28139:23;28179:3;:10;;:17;;;;28165:32;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;28165:32:0;;28139:58;;28209:9;28204:85;28224:10;;;:17;28220:21;;28204:85;;;28268:3;:10;;28279:1;28268:13;;;;;;;;;;;;;;;;28256:6;28263:1;28256:9;;;;;;;;;;;;;;;;;:25;28243:3;;28204:85;;;-1:-1:-1;28302:6:0;28028:286;-1:-1:-1;;28028:286:0:o;27536:147::-;27633:4;27656:16;;;;;;;;;;;;:21;;;27536:147::o;22857:84::-;20108:42;-1:-1:-1;;;;;22911:13:0;;22925:9;22911:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22911:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22911:24:0;;;;22857:84;:::o;26539:919::-;26624:4;26644:20;26653:3;26658:5;26644:8;:20::i;:::-;26640:813;;;26674:21;26698:16;;;;;;;;;;;26717:1;26747:10;;:17;-1:-1:-1;;26698:20:0;;;;26747:21;26883:26;;;26879:343;;26922:17;26942:3;:10;;26953:9;26942:21;;;;;;;;;;;;;;;;26922:41;;27076:9;27048:3;:10;;27059:13;27048:25;;;;;;;;;;;;;;;;;;;:37;;;;27145:20;;;;;;;;;27184:1;27168:17;;27145:40;;26879:343;27294:9;:16;;;;;;;;;;27287:23;27372:10;;;:16;;;;;;;;;;;;;;;;;;;;;;;;27406:4;27399:11;;;;;;26640:813;-1:-1:-1;27440:5:0;27433:12;;22541:139;22628:46;;;-1:-1:-1;;;22628:46:0;;;;;;;;;;;;;;;;;;;;;;20108:42;;22628:13;;:46;;;;;-1:-1:-1;;22628:46:0;;;;;;;-1:-1:-1;20108:42:0;22628:46;;;5:2:-1;;;;30:1;27;20:12;5:2;22628:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22628:46:0;;;;22541:139;;;:::o;26031:382::-;26113:4;26134:20;26143:3;26148:5;26134:8;:20::i;:::-;26129:279;;-1:-1:-1;26165:10:0;;;;27::-1;;23:18;;;45:23;;-1:-1;26165:22:0;;;;;;;;;;;;;26328:17;;26309:16;;;;;;;;;;;:36;26354:11;

Swarm Source

bzzr://3b3d1ab0970420054eea88565f5c47c41e3cecbfdd2677b72dc1de24decde3f5

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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