ETH Price: $3,812.81 (+5.04%)

Contract

0xBCF07086c7c9791D22E665a3454704E6c4017831
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Purchase169290412023-03-28 23:18:11623 days ago1680045491IN
0xBCF07086...6c4017831
0.042 ETH0.0099455629.5695389
Purchase169290402023-03-28 23:17:59623 days ago1680045479IN
0xBCF07086...6c4017831
0.042 ETH0.009509430.07829616
Purchase169290382023-03-28 23:17:35623 days ago1680045455IN
0xBCF07086...6c4017831
0.042 ETH0.009509430.07829616
Purchase169290262023-03-28 23:15:11623 days ago1680045311IN
0xBCF07086...6c4017831
0.042 ETH0.0088384627.95612375
Purchase169289182023-03-28 22:53:23623 days ago1680044003IN
0xBCF07086...6c4017831
0.084 ETH0.0140126325.66454641
Purchase169289052023-03-28 22:50:35623 days ago1680043835IN
0xBCF07086...6c4017831
0.042 ETH0.0090371528.58457355
Purchase169288722023-03-28 22:43:47623 days ago1680043427IN
0xBCF07086...6c4017831
0.042 ETH0.008909528.18082397
Purchase169288052023-03-28 22:30:11623 days ago1680042611IN
0xBCF07086...6c4017831
0.084 ETH0.0170897732.14224592
Purchase169287912023-03-28 22:27:23623 days ago1680042443IN
0xBCF07086...6c4017831
0.042 ETH0.0088256127.91547889
Purchase169287222023-03-28 22:13:35623 days ago1680041615IN
0xBCF07086...6c4017831
0.042 ETH0.0105289533.30313576
Purchase169286452023-03-28 21:58:11623 days ago1680040691IN
0xBCF07086...6c4017831
0.042 ETH0.0130534641.2881738
Purchase169285032023-03-28 21:29:11623 days ago1680038951IN
0xBCF07086...6c4017831
0.042 ETH0.0084127826.60968952
Purchase169284412023-03-28 21:16:47623 days ago1680038207IN
0xBCF07086...6c4017831
0.42 ETH0.0582741825.83019682
Set Project Max ...169284042023-03-28 21:08:47623 days ago1680037727IN
0xBCF07086...6c4017831
0 ETH0.0015613226.48595434
Purchase169275202023-03-28 18:10:59624 days ago1680027059IN
0xBCF07086...6c4017831
0 ETH0.0081677324.70884931
Purchase169273522023-03-28 17:36:59624 days ago1680025019IN
0xBCF07086...6c4017831
0 ETH0.0095132328.77923444
Purchase169268652023-03-28 15:57:11624 days ago1680019031IN
0xBCF07086...6c4017831
0 ETH0.0081872624.76794999
Purchase169254682023-03-28 11:14:47624 days ago1680002087IN
0xBCF07086...6c4017831
0 ETH0.0085638325.90711857
Purchase169245762023-03-28 8:13:11624 days ago1679991191IN
0xBCF07086...6c4017831
0 ETH0.0083369825.22088119
Purchase169234432023-03-28 4:23:11624 days ago1679977391IN
0xBCF07086...6c4017831
0 ETH0.0066729720.18694529
Purchase169219412023-03-27 23:19:59624 days ago1679959199IN
0xBCF07086...6c4017831
0 ETH0.0066111820
Purchase169218012023-03-27 22:51:35624 days ago1679957495IN
0xBCF07086...6c4017831
0 ETH0.0083869425.37201833
Purchase169216032023-03-27 22:11:23624 days ago1679955083IN
0xBCF07086...6c4017831
0 ETH0.0093163828.1837238
Purchase169214902023-03-27 21:48:35624 days ago1679953715IN
0xBCF07086...6c4017831
0 ETH0.0076738723.21484186
Purchase169009462023-03-25 0:34:11627 days ago1679704451IN
0xBCF07086...6c4017831
0.042 ETH0.0059008317.85670052
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
169290412023-03-28 23:18:11623 days ago1680045491
0xBCF07086...6c4017831
0.0378 ETH
169290412023-03-28 23:18:11623 days ago1680045491
0xBCF07086...6c4017831
0.0042 ETH
169290402023-03-28 23:17:59623 days ago1680045479
0xBCF07086...6c4017831
0.0378 ETH
169290402023-03-28 23:17:59623 days ago1680045479
0xBCF07086...6c4017831
0.0042 ETH
169290382023-03-28 23:17:35623 days ago1680045455
0xBCF07086...6c4017831
0.0378 ETH
169290382023-03-28 23:17:35623 days ago1680045455
0xBCF07086...6c4017831
0.0042 ETH
169290262023-03-28 23:15:11623 days ago1680045311
0xBCF07086...6c4017831
0.0378 ETH
169290262023-03-28 23:15:11623 days ago1680045311
0xBCF07086...6c4017831
0.0042 ETH
169289182023-03-28 22:53:23623 days ago1680044003
0xBCF07086...6c4017831
0.0378 ETH
169289182023-03-28 22:53:23623 days ago1680044003
0xBCF07086...6c4017831
0.0042 ETH
169289182023-03-28 22:53:23623 days ago1680044003
0xBCF07086...6c4017831
0.0378 ETH
169289182023-03-28 22:53:23623 days ago1680044003
0xBCF07086...6c4017831
0.0042 ETH
169289052023-03-28 22:50:35623 days ago1680043835
0xBCF07086...6c4017831
0.0378 ETH
169289052023-03-28 22:50:35623 days ago1680043835
0xBCF07086...6c4017831
0.0042 ETH
169288722023-03-28 22:43:47623 days ago1680043427
0xBCF07086...6c4017831
0.0378 ETH
169288722023-03-28 22:43:47623 days ago1680043427
0xBCF07086...6c4017831
0.0042 ETH
169288052023-03-28 22:30:11623 days ago1680042611
0xBCF07086...6c4017831
0.0378 ETH
169288052023-03-28 22:30:11623 days ago1680042611
0xBCF07086...6c4017831
0.0042 ETH
169288052023-03-28 22:30:11623 days ago1680042611
0xBCF07086...6c4017831
0.0378 ETH
169288052023-03-28 22:30:11623 days ago1680042611
0xBCF07086...6c4017831
0.0042 ETH
169287912023-03-28 22:27:23623 days ago1680042443
0xBCF07086...6c4017831
0.0378 ETH
169287912023-03-28 22:27:23623 days ago1680042443
0xBCF07086...6c4017831
0.0042 ETH
169287222023-03-28 22:13:35623 days ago1680041615
0xBCF07086...6c4017831
0.0378 ETH
169287222023-03-28 22:13:35623 days ago1680041615
0xBCF07086...6c4017831
0.0042 ETH
169286452023-03-28 21:58:11623 days ago1680040691
0xBCF07086...6c4017831
0.0378 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GenArt721Minter_DoodleLabs_Custom_Sale

Compiler Version
v0.5.0+commit.1d4f565a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 21: GenArt721Minter_DoodleLabs_Custom_Sale.sol
pragma solidity ^0.5.0;

import './GenArt721Minter_DoodleLabs_MultiMinter.sol';
import './Strings.sol';
import './MerkleProof.sol';

interface IGenArt721Minter_DoodleLabs_Config {
    function getPurchaseManyLimit(uint256 projectId) external view returns (uint256 limit);

    function getState(uint256 projectId) external view returns (uint256 _state);

    function setStateFamilyCollectors(uint256 projectId) external;

    function setStateRedemption(uint256 projectId) external;

    function setStatePublic(uint256 projectId) external;
}

interface IGenArt721Minter_DoodleLabs_WhiteList {
    function getMerkleRoot(uint256 projectId) external view returns (bytes32 merkleRoot);

    function getWhitelisted(uint256 projectId, address user) external view returns (uint256 amount);

    function addWhitelist(
        uint256 projectId,
        address[] calldata users,
        uint256[] calldata amounts
    ) external;

    function increaseAmount(
        uint256 projectId,
        address to,
        uint256 quantity
    ) external;
}

contract GenArt721Minter_DoodleLabs_Custom_Sale is GenArt721Minter_DoodleLabs_MultiMinter {
    using SafeMath for uint256;

    event Redeem(uint256 projectId);

    // Must match what is on the GenArtMinterV2_State contract
    enum SaleState {
        FAMILY_COLLECTORS,
        REDEMPTION,
        PUBLIC
    }

    IGenArt721Minter_DoodleLabs_WhiteList public activeWhitelist;
    IGenArt721Minter_DoodleLabs_Config public minterState;

    modifier onlyWhitelisted() {
        require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin');
        _;
    }

    modifier notRedemptionState(uint256 projectId) {
        require(
            uint256(minterState.getState(projectId)) != uint256(SaleState.REDEMPTION),
            'can not purchase in redemption phase'
        );
        _;
    }

    modifier onlyRedemptionState(uint256 projectId) {
        require(
            uint256(minterState.getState(projectId)) == uint256(SaleState.REDEMPTION),
            'not in redemption phase'
        );
        _;
    }

    constructor(address _genArtCore, address _minterStateAddress)
        public
        GenArt721Minter_DoodleLabs_MultiMinter(_genArtCore)
    {
        minterState = IGenArt721Minter_DoodleLabs_Config(_minterStateAddress);
    }

    function getMerkleRoot(uint256 projectId) public view returns (bytes32 merkleRoot) {
        require(address(activeWhitelist) != address(0), 'Active whitelist not set');
        return activeWhitelist.getMerkleRoot(projectId);
    }

    function getWhitelisted(uint256 projectId, address user)
        external
        view
        returns (uint256 amount)
    {
        require(address(activeWhitelist) != address(0), 'Active whitelist not set');
        return activeWhitelist.getWhitelisted(projectId, user);
    }

    function setActiveWhitelist(address whitelist) public onlyWhitelisted {
        activeWhitelist = IGenArt721Minter_DoodleLabs_WhiteList(whitelist);
    }

    function purchase(uint256 projectId, uint256 quantity)
        public
        payable
        notRedemptionState(projectId)
        returns (uint256[] memory _tokenIds)
    {
        return purchaseTo(msg.sender, projectId, quantity);
    }

    function purchaseTo(
        address to,
        uint256 projectId,
        uint256 quantity
    ) public payable notRedemptionState(projectId) returns (uint256[] memory _tokenIds) {
        require(
            quantity <= minterState.getPurchaseManyLimit(projectId),
            'Max purchase many limit reached'
        );
        if (
            uint256(minterState.getState(projectId)) == uint256(SaleState.FAMILY_COLLECTORS) &&
            msg.value > 0
        ) {
            require(false, 'ETH not accepted at this time');
        }
        return _purchaseManyTo(to, projectId, quantity);
    }

    function redeem(
        uint256 projectId,
        uint256 quantity,
        uint256 allottedAmount,
        bytes32[] memory proof
    ) public payable onlyRedemptionState(projectId) returns (uint256[] memory _tokenIds) {
        return redeemTo(msg.sender, projectId, quantity, allottedAmount, proof);
    }

    function redeemTo(
        address to,
        uint256 projectId,
        uint256 quantity,
        uint256 allottedAmount,
        bytes32[] memory proof
    ) public payable onlyRedemptionState(projectId) returns (uint256[] memory _tokenIds) {
        require(address(activeWhitelist) != address(0), 'Active whitelist not set');
        require(
            activeWhitelist.getWhitelisted(projectId, to).add(quantity) <= allottedAmount,
            'Address has already claimed'
        );

        string memory key = _addressToString(to);
        key = _appendStrings(key, Strings.toString(allottedAmount), Strings.toString(projectId));

        bytes32 leaf = keccak256(abi.encodePacked(key));
        require(MerkleProof.verify(proof, getMerkleRoot(projectId), leaf), 'Invalid proof');

        uint256[] memory createdTokens = _purchaseManyTo(to, projectId, quantity);

        activeWhitelist.increaseAmount(projectId, to, quantity);

        emit Redeem(projectId);
        return createdTokens;
    }

    function _appendStrings(
        string memory a,
        string memory b,
        string memory c
    ) internal pure returns (string memory) {
        return string(abi.encodePacked(a, '::', b, '::', c));
    }

    function _addressToString(address addr) private pure returns (string memory) {
        // From: https://www.reddit.com/r/ethdev/comments/qga46a/i_created_a_function_to_convert_address_to_string/
        // Cast address to byte array
        bytes memory addressBytes = abi.encodePacked(addr);

        // Byte array for the new string
        bytes memory stringBytes = new bytes(42);

        // Assign first two bytes to '0x'
        stringBytes[0] = '0';
        stringBytes[1] = 'x';

        // Iterate over every byte in the array
        // Each byte contains two hex digits that gets individually converted
        // into their ASCII representation and added to the string
        for (uint256 i = 0; i < 20; i++) {
            // Convert hex to decimal values
            uint8 leftValue = uint8(addressBytes[i]) / 16;
            uint8 rightValue = uint8(addressBytes[i]) - 16 * leftValue;

            // Convert decimals to ASCII values
            bytes1 leftChar = leftValue < 10 ? bytes1(leftValue + 48) : bytes1(leftValue + 87);
            bytes1 rightChar = rightValue < 10 ? bytes1(rightValue + 48) : bytes1(rightValue + 87);

            // Add ASCII values to the string byte array
            stringBytes[2 * i + 3] = rightChar;
            stringBytes[2 * i + 2] = leftChar;

            // console.log(string(stringBytes));
        }

        // Cast byte array to string and return
        return string(stringBytes);
    }
}

File 2 of 21: Address.sol
// File: openzeppelin-solidity/contracts/utils/Address.sol

pragma solidity ^0.5.0;

/**
 * @dev Collection of functions related to the address type,
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * This test is non-exhaustive, and there may be false-negatives: during the
     * execution of a contract's constructor, its address will be reported as
     * not containing a contract.
     *
     * > It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies in extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
}

File 3 of 21: Context.sol
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/GSN/Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor() internal {}

    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

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

File 4 of 21: Counters.sol
// File: openzeppelin-solidity/contracts/drafts/Counters.sol

pragma solidity ^0.5.0;

import './SafeMath.sol';

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

File 5 of 21: CustomERC721Metadata.sol
// File: contracts/CustomERC721Metadata.sol

pragma solidity ^0.5.0;

import './ERC165.sol';
import './ERC721.sol';
import './ERC721Enumerable.sol';

/**
 * ERC721 base contract without the concept of tokenUri as this is managed by the parent
 */
contract CustomERC721Metadata is ERC165, ERC721, ERC721Enumerable {
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /**
     * @dev Constructor function
     */
    constructor(string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }

    /**
     * @dev Gets the token name
     * @return string representing the token name
     */
    function name() external view returns (string memory) {
        return _name;
    }

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory) {
        return _symbol;
    }
}

File 6 of 21: ERC165.sol
// File: openzeppelin-solidity/contracts/introspection/ERC165.sol

pragma solidity ^0.5.0;

import './IERC165.sol';

/**
 * @dev Implementation of the `IERC165` interface.
 *
 * Contracts may inherit from this and call `_registerInterface` to declare
 * their support of an interface.
 */
contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See `IERC165.supportsInterface`.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See `IERC165.supportsInterface`.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, 'ERC165: invalid interface id');
        _supportedInterfaces[interfaceId] = true;
    }
}

File 7 of 21: ERC20.sol
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/ERC20.sol
pragma solidity ^0.5.0;

import './Context.sol';
import './IERC20.sol';
import './SafeMath.sol';

/**
 * @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}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    /**
     * @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(_msgSender(), 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 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

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

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

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

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        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, 'ERC20: transfer amount exceeds balance');
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

File 8 of 21: ERC721.sol
// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol

pragma solidity ^0.5.0;

import './ERC165.sol';
import './IERC721.sol';
import './SafeMath.sol';
import './Address.sol';
import './Counters.sol';
import './IERC721Receiver.sol';

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;
    using Counters for Counters.Counter;

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

    // Mapping from token ID to owner
    mapping(uint256 => address) private _tokenOwner;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to number of owned token
    mapping(address => Counters.Counter) private _ownedTokensCount;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor() public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), 'ERC721: balance query for the zero address');

        return _ownedTokensCount[owner].current();
    }

    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), 'ERC721: owner query for nonexistent token');

        return owner;
    }

    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, 'ERC721: approval to current owner');

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            'ERC721: approve caller is not owner nor approved for all'
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), 'ERC721: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address to, bool approved) public {
        require(to != msg.sender, 'ERC721: approve to caller');

        _operatorApprovals[msg.sender][to] = approved;
        emit ApprovalForAll(msg.sender, to, approved);
    }

    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(msg.sender, tokenId),
            'ERC721: transfer caller is not owner nor approved'
        );

        _transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public {
        safeTransferFrom(from, to, tokenId, '');
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public {
        transferFrom(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721: transfer to non ERC721Receiver implementer'
        );
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        address owner = _tokenOwner[tokenId];
        return owner != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), 'ERC721: operator query for nonexistent token');
        address owner = ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), 'ERC721: mint to the zero address');
        require(!_exists(tokenId), 'ERC721: token already minted');

        _tokenOwner[tokenId] = to;
        _ownedTokensCount[to].increment();

        emit Transfer(address(0), to, tokenId);
    }

    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, 'ERC721: burn of token that is not own');

        _clearApproval(tokenId);

        _ownedTokensCount[owner].decrement();
        _tokenOwner[tokenId] = address(0);

        emit Transfer(owner, address(0), tokenId);
    }

    function _burn(uint256 tokenId) internal {
        _burn(ownerOf(tokenId), tokenId);
    }

    function _transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        require(ownerOf(tokenId) == from, 'ERC721: transfer of token that is not own');
        require(to != address(0), 'ERC721: transfer to the zero address');

        _clearApproval(tokenId);

        _ownedTokensCount[from].decrement();
        _ownedTokensCount[to].increment();

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal returns (bool) {
        if (!to.isContract()) {
            return true;
        }

        bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}

File 9 of 21: ERC721Enumerable.sol
// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol

pragma solidity ^0.5.0;

import './ERC165.sol';
import './ERC721.sol';
import './IERC721Enumerable.sol';

/**
 * @title ERC-721 Non-Fungible Token with optional enumeration extension logic
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    /**
     * @dev Constructor function.
     */
    constructor() public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

    /**
     * @dev Gets the token ID at a given index of the tokens list of the requested owner.
     * @param owner address owning the tokens list to be accessed
     * @param index uint256 representing the index to be accessed of the requested tokens list
     * @return uint256 token ID at the given index of the tokens list owned by the requested address
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), 'ERC721Enumerable: owner index out of bounds');
        return _ownedTokens[owner][index];
    }

    /**
     * @dev Gets the total amount of tokens stored by the contract.
     * @return uint256 representing the total amount of tokens
     */
    function totalSupply() public view returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev Gets the token ID at a given index of all the tokens in this contract
     * Reverts if the index is greater or equal to the total number of tokens.
     * @param index uint256 representing the index to be accessed of the tokens list
     * @return uint256 token ID at the given index of the tokens list
     */
    function tokenByIndex(uint256 index) public view returns (uint256) {
        require(index < totalSupply(), 'ERC721Enumerable: global index out of bounds');
        return _allTokens[index];
    }

    /**
     * @dev Internal function to transfer ownership of a given token ID to another address.
     * As opposed to transferFrom, this imposes no restrictions on msg.sender.
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function _transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }

    /**
     * @dev Internal function to mint a new token.
     * Reverts if the given token ID already exists.
     * @param to address the beneficiary that will own the minted token
     * @param tokenId uint256 ID of the token to be minted
     */
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);

        _addTokenToAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Internal function to burn a specific token.
     * Reverts if the token does not exist.
     * Deprecated, use _burn(uint256) instead.
     * @param owner owner of the token to burn
     * @param tokenId uint256 ID of the token being burned
     */
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;

        _removeTokenFromAllTokensEnumeration(tokenId);
    }

    /**
     * @dev Gets the list of token IDs of the requested owner.
     * @param owner address owning the tokens
     * @return uint256[] List of token IDs owned by the requested address
     */
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the _ownedTokensIndex mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        _ownedTokens[from].length--;

        // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by
        // lastTokenId, or just over the end of the array if the token was the last one).
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length.sub(1);
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        _allTokens.length--;
        _allTokensIndex[tokenId] = 0;
    }
}

File 10 of 21: GenArt721Minter_DoodleLabs_MultiMinter.sol
pragma solidity ^0.5.0;

import './GenArtMinterV2_DoodleLabs.sol';
import './SafeMath.sol';

contract GenArt721Minter_DoodleLabs_MultiMinter is GenArt721Minter_DoodleLabs {
    using SafeMath for uint256;

    event PurchaseMany(uint256 projectId, uint256 amount);
    event Purchase(uint256 _projectId);

    constructor(address _genArtCore) internal GenArt721Minter_DoodleLabs(_genArtCore) {}

    function _purchaseManyTo(
        address to,
        uint256 projectId,
        uint256 amount
    ) internal returns (uint256[] memory _tokenIds) {
        uint256[] memory tokenIds = new uint256[](amount);
        bool isDeferredRefund = false;

        // Refund ETH if user accidentially overpays
        // This is not needed for ERC20 tokens
        if (msg.value > 0) {
            uint256 pricePerTokenInWei = genArtCoreContract.projectIdToPricePerTokenInWei(
                projectId
            );
            require(msg.value >= pricePerTokenInWei.mul(amount), 'not enough funds transferred');
            uint256 refund = msg.value.sub(pricePerTokenInWei.mul(amount));
            isDeferredRefund = true;

            if (refund > 0) {
                // address payable _to = payable(to);
                address payable _to = address(uint160(to));
                _to.transfer(refund);
            }
        }

        for (uint256 i = 0; i < amount; i++) {
            tokenIds[i] = purchaseTo(to, projectId, isDeferredRefund);
            emit Purchase(projectId);
        }

        return tokenIds;
    }

    function _purchase(uint256 _projectId) internal returns (uint256 _tokenId) {
        emit Purchase(_projectId);
        return purchaseTo(msg.sender, _projectId, false);
    }
}

File 11 of 21: GenArtMinterV2_DoodleLabs.sol
/**
 *Submitted for verification at Etherscan.io on 2021-10-21
 */

pragma solidity ^0.5.0;

import './SafeMath.sol';
import './Strings.sol';
import './ERC20.sol';
import './IGenArt721CoreV2.sol';

interface BonusContract {
    function triggerBonus(address _to) external returns (bool);

    function bonusIsActive() external view returns (bool);
}

contract GenArt721Minter_DoodleLabs {
    using SafeMath for uint256;

    IGenArt721CoreV2 public genArtCoreContract;

    uint256 constant ONE_MILLION = 1_000_000;

    address payable public ownerAddress;
    uint256 public ownerPercentage;

    mapping(uint256 => bool) public projectIdToBonus;
    mapping(uint256 => address) public projectIdToBonusContractAddress;
    mapping(uint256 => bool) public contractFilterProject;
    mapping(address => mapping(uint256 => uint256)) public projectMintCounter;
    mapping(uint256 => uint256) public projectMintLimit;
    mapping(uint256 => bool) public projectMaxHasBeenInvoked;
    mapping(uint256 => uint256) public projectMaxInvocations;

    constructor(address _genArt721Address) public {
        genArtCoreContract = IGenArt721CoreV2(_genArt721Address);
    }

    function getYourBalanceOfProjectERC20(uint256 _projectId) public view returns (uint256) {
        uint256 balance = ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
            .balanceOf(msg.sender);
        return balance;
    }

    function checkYourAllowanceOfProjectERC20(uint256 _projectId) public view returns (uint256) {
        uint256 remaining = ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId))
            .allowance(msg.sender, address(this));
        return remaining;
    }

    function setProjectMintLimit(uint256 _projectId, uint8 _limit) public {
        require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin');
        projectMintLimit[_projectId] = _limit;
    }

    function setProjectMaxInvocations(uint256 _projectId) public {
        require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin');
        uint256 maxInvocations;
        uint256 invocations;
        (, , invocations, maxInvocations, , , , , ) = genArtCoreContract.projectTokenInfo(
            _projectId
        );
        projectMaxInvocations[_projectId] = maxInvocations;
        if (invocations < maxInvocations) {
            projectMaxHasBeenInvoked[_projectId] = false;
        }
    }

    function setOwnerAddress(address payable _ownerAddress) public {
        require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin');
        ownerAddress = _ownerAddress;
    }

    function setOwnerPercentage(uint256 _ownerPercentage) public {
        require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin');
        ownerPercentage = _ownerPercentage;
    }

    function toggleContractFilter(uint256 _projectId) public {
        require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin');
        contractFilterProject[_projectId] = !contractFilterProject[_projectId];
    }

    function artistToggleBonus(uint256 _projectId) public {
        require(
            msg.sender == genArtCoreContract.projectIdToArtistAddress(_projectId),
            'can only be set by artist'
        );
        projectIdToBonus[_projectId] = !projectIdToBonus[_projectId];
    }

    function artistSetBonusContractAddress(uint256 _projectId, address _bonusContractAddress)
        public
    {
        require(
            msg.sender == genArtCoreContract.projectIdToArtistAddress(_projectId),
            'can only be set by artist'
        );
        projectIdToBonusContractAddress[_projectId] = _bonusContractAddress;
    }

    function purchase(uint256 _projectId) internal returns (uint256 _tokenId) {
        return purchaseTo(msg.sender, _projectId, false);
    }

    // Remove `public`` and `payable`` to prevent public use
    // of the `purchaseTo`` function.
    function purchaseTo(
        address _to,
        uint256 _projectId,
        bool _isDeferredRefund
    ) internal returns (uint256 _tokenId) {
        require(!projectMaxHasBeenInvoked[_projectId], 'Maximum number of invocations reached');
        if (
            keccak256(abi.encodePacked(genArtCoreContract.projectIdToCurrencySymbol(_projectId))) !=
            keccak256(abi.encodePacked('ETH'))
        ) {
            require(
                msg.value == 0,
                'this project accepts a different currency and cannot accept ETH'
            );
            require(
                ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).allowance(
                    msg.sender,
                    address(this)
                ) >= genArtCoreContract.projectIdToPricePerTokenInWei(_projectId),
                'Insufficient Funds Approved for TX'
            );
            require(
                ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).balanceOf(
                    msg.sender
                ) >= genArtCoreContract.projectIdToPricePerTokenInWei(_projectId),
                'Insufficient balance.'
            );
            _splitFundsERC20(_projectId);
        } else {
            require(
                msg.value >= genArtCoreContract.projectIdToPricePerTokenInWei(_projectId),
                'Must send minimum value to mint!'
            );
            _splitFundsETH(_projectId, _isDeferredRefund);
        }

        // if contract filter is active prevent calls from another contract
        if (contractFilterProject[_projectId]) require(msg.sender == tx.origin, 'No Contract Buys');

        // limit mints per address by project
        if (projectMintLimit[_projectId] > 0) {
            require(
                projectMintCounter[msg.sender][_projectId] < projectMintLimit[_projectId],
                'Reached minting limit'
            );
            projectMintCounter[msg.sender][_projectId]++;
        }

        uint256 tokenId = genArtCoreContract.mint(_to, _projectId, msg.sender);

        // What if this overflows, since default value of uint256 is 0?
        // That is intended, so that by default the minter allows infinite
        // transactions, allowing the `genArtCoreContract` to stop minting
        // `uint256 tokenInvocation = tokenId % ONE_MILLION;`
        if (tokenId % ONE_MILLION == projectMaxInvocations[_projectId] - 1) {
            projectMaxHasBeenInvoked[_projectId] = true;
        }

        if (projectIdToBonus[_projectId]) {
            require(
                BonusContract(projectIdToBonusContractAddress[_projectId]).bonusIsActive(),
                'bonus must be active'
            );
            BonusContract(projectIdToBonusContractAddress[_projectId]).triggerBonus(msg.sender);
        }

        return tokenId;
    }

    function _splitFundsETH(uint256 _projectId, bool _isDeferredRefund) internal {
        if (msg.value > 0) {
            uint256 pricePerTokenInWei = genArtCoreContract.projectIdToPricePerTokenInWei(
                _projectId
            );
            uint256 refund = msg.value.sub(
                genArtCoreContract.projectIdToPricePerTokenInWei(_projectId)
            );
            if (!_isDeferredRefund && refund > 0) {
                msg.sender.transfer(refund);
            }
            uint256 renderProviderAmount = pricePerTokenInWei.div(100).mul(
                genArtCoreContract.renderProviderPercentage()
            );
            if (renderProviderAmount > 0) {
                genArtCoreContract.renderProviderAddress().transfer(renderProviderAmount);
            }

            uint256 remainingFunds = pricePerTokenInWei.sub(renderProviderAmount);

            uint256 ownerFunds = remainingFunds.div(100).mul(ownerPercentage);
            if (ownerFunds > 0) {
                ownerAddress.transfer(ownerFunds);
            }

            uint256 projectFunds = pricePerTokenInWei.sub(renderProviderAmount).sub(ownerFunds);
            uint256 additionalPayeeAmount;
            if (genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId) > 0) {
                additionalPayeeAmount = projectFunds.div(100).mul(
                    genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId)
                );
                if (additionalPayeeAmount > 0) {
                    genArtCoreContract.projectIdToAdditionalPayee(_projectId).transfer(
                        additionalPayeeAmount
                    );
                }
            }
            uint256 creatorFunds = projectFunds.sub(additionalPayeeAmount);
            if (creatorFunds > 0) {
                genArtCoreContract.projectIdToArtistAddress(_projectId).transfer(creatorFunds);
            }
        }
    }

    function _splitFundsERC20(uint256 _projectId) internal {
        uint256 pricePerTokenInWei = genArtCoreContract.projectIdToPricePerTokenInWei(_projectId);
        uint256 renderProviderAmount = pricePerTokenInWei.div(100).mul(
            genArtCoreContract.renderProviderPercentage()
        );
        if (renderProviderAmount > 0) {
            ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom(
                msg.sender,
                genArtCoreContract.renderProviderAddress(),
                renderProviderAmount
            );
        }
        uint256 remainingFunds = pricePerTokenInWei.sub(renderProviderAmount);

        uint256 ownerFunds = remainingFunds.div(100).mul(ownerPercentage);
        if (ownerFunds > 0) {
            ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom(
                msg.sender,
                ownerAddress,
                ownerFunds
            );
        }

        uint256 projectFunds = pricePerTokenInWei.sub(renderProviderAmount).sub(ownerFunds);
        uint256 additionalPayeeAmount;
        if (genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId) > 0) {
            additionalPayeeAmount = projectFunds.div(100).mul(
                genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId)
            );
            if (additionalPayeeAmount > 0) {
                ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom(
                    msg.sender,
                    genArtCoreContract.projectIdToAdditionalPayee(_projectId),
                    additionalPayeeAmount
                );
            }
        }
        uint256 creatorFunds = projectFunds.sub(additionalPayeeAmount);
        if (creatorFunds > 0) {
            ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom(
                msg.sender,
                genArtCoreContract.projectIdToArtistAddress(_projectId),
                creatorFunds
            );
        }
    }
}

File 12 of 21: IERC165.sol
// File: openzeppelin-solidity/contracts/introspection/IERC165.sol
pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * [EIP](https://eips.ethereum.org/EIPS/eip-165).
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others (`ERC165Checker`).
 *
 * For an implementation, see `ERC165`.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 13 of 21: IERC20.sol
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.5.0;

/**
 * @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.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

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

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

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

File 14 of 21: IERC721.sol
// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol

pragma solidity ^0.5.0;

import './IERC165.sol';

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
contract IERC721 is IERC165 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of NFTs in `owner`'s account.
     */
    function balanceOf(address owner) public view returns (uint256 balance);

    /**
     * @dev Returns the owner of the NFT specified by `tokenId`.
     */
    function ownerOf(uint256 tokenId) public view returns (address owner);

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     *
     *
     * Requirements:
     * - `from`, `to` cannot be zero.
     * - `tokenId` must be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this
     * NFT by either `approve` or `setApproveForAll`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    /**
     * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to
     * another (`to`).
     *
     * Requirements:
     * - If the caller is not `from`, it must be approved to move this NFT by
     * either `approve` or `setApproveForAll`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public;

    function approve(address to, uint256 tokenId) public;

    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;

    function isApprovedForAll(address owner, address operator) public view returns (bool);

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public;
}

File 15 of 21: IERC721Enumerable.sol
// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Enumerable.sol

pragma solidity ^0.5.0;

import './IERC721.sol';

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
contract IERC721Enumerable is IERC721 {
    function totalSupply() public view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        returns (uint256 tokenId);

    function tokenByIndex(uint256 index) public view returns (uint256);
}

File 16 of 21: IERC721Receiver.sol
// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol

pragma solidity ^0.5.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
contract IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes memory data
    ) public returns (bytes4);
}

File 17 of 21: IGenArt721CoreV2.sol
pragma solidity ^0.5.0;

interface IGenArt721CoreV2 {
    function isWhitelisted(address sender) external view returns (bool);

    function admin() external view returns (address);

    function projectIdToCurrencySymbol(uint256 _projectId) external view returns (string memory);

    function projectIdToCurrencyAddress(uint256 _projectId) external view returns (address);

    function projectIdToArtistAddress(uint256 _projectId) external view returns (address payable);

    function projectIdToPricePerTokenInWei(uint256 _projectId) external view returns (uint256);

    function projectIdToAdditionalPayee(uint256 _projectId) external view returns (address payable);

    function projectIdToAdditionalPayeePercentage(uint256 _projectId)
        external
        view
        returns (uint256);

    function projectTokenInfo(uint256 _projectId)
        external
        view
        returns (
            address,
            uint256,
            uint256,
            uint256,
            bool,
            address,
            uint256,
            string memory,
            address
        );

    function renderProviderAddress() external view returns (address payable);

    function renderProviderPercentage() external view returns (uint256);

    function mint(
        address _to,
        uint256 _projectId,
        address _by
    ) external returns (uint256 tokenId);

    function ownerOf(uint256 tokenId) external view returns (address);

    function tokenIdToProjectId(uint256 tokenId) external view returns (uint256);
}

File 18 of 21: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.5.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 19 of 21: Randomizer.sol
pragma solidity ^0.5.0;

contract Randomizer {
    function returnValue() public view returns (bytes32) {
        uint256 time = block.timestamp;
        uint256 extra = (time % 200) + 1;

        return keccak256(abi.encodePacked(block.number, blockhash(block.number - 2), time, extra));
    }
}

File 20 of 21: SafeMath.sol
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/math/SafeMath.sol
pragma solidity ^0.5.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

File 21 of 21: Strings.sol
// File: contracts/Strings.sol

pragma solidity ^0.5.0;

//https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol
library Strings {

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function strConcat(string memory _a, string memory _b)
        internal
        pure
        returns (string memory _concatenatedString)
    {
        return strConcat(_a, _b, '', '', '');
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c
    ) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, '', '');
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c,
        string memory _d
    ) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, _d, '');
    }

    function strConcat(
        string memory _a,
        string memory _b,
        string memory _c,
        string memory _d,
        string memory _e
    ) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(
            _ba.length + _bb.length + _bc.length + _bd.length + _be.length
        );
        bytes memory babcde = bytes(abcde);
        uint256 k = 0;
        uint256 i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }

    function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return '0';
        }
        uint256 j = _i;
        uint256 len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint256 k = len - 1;
        while (_i != 0) {
            bstr[k--] = bytes1(uint8(48 + (_i % 10)));
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"projectId","type":"uint256"}],"name":"getMerkleRoot","outputs":[{"name":"merkleRoot","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"whitelist","type":"address"}],"name":"setActiveWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"},{"name":"allottedAmount","type":"uint256"},{"name":"proof","type":"bytes32[]"}],"name":"redeem","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"},{"name":"allottedAmount","type":"uint256"},{"name":"proof","type":"bytes32[]"}],"name":"redeemTo","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"},{"name":"_limit","type":"uint8"}],"name":"setProjectMintLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"projectId","type":"uint256"},{"name":"user","type":"address"}],"name":"getWhitelisted","outputs":[{"name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ownerAddress","type":"address"}],"name":"setOwnerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ownerPercentage","type":"uint256"}],"name":"setOwnerPercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"projectMintCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"},{"name":"_bonusContractAddress","type":"address"}],"name":"artistSetBonusContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ownerPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectMaxHasBeenInvoked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectMaxInvocations","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"toggleContractFilter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectMintLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"}],"name":"purchase","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectIdToBonus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectIdToBonusContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"genArtCoreContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ownerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activeWhitelist","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"artistToggleBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"}],"name":"purchaseTo","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"getYourBalanceOfProjectERC20","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minterState","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"checkYourAllowanceOfProjectERC20","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"setProjectMaxInvocations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"contractFilterProject","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_genArtCore","type":"address"},{"name":"_minterStateAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"projectId","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"projectId","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PurchaseMany","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_projectId","type":"uint256"}],"name":"Purchase","type":"event"}]

608060405234801561001057600080fd5b50604051604080620041298339810180604052604081101561003157600080fd5b50805160209091015160008054600160a060020a03938416600160a060020a031991821617909155600b80549390921692169190911790556140b080620000796000396000f3fe6080604052600436106101505763ffffffff60e060020a6000350416630aab8ba581146101555780631399c04f146101915780631606c0c6146101c65780631748f818146102cc578063231c22811461039057806328025280146103c3578063331a6bf5146103fc578063393b011c1461042f5780633a4657b4146104595780633c34b9f01461049257806341da7555146104cb578063462add46146104e057806356690aaf1461051e578063569f6f921461054857806362f7a7ed1461057257806370876c981461059c57806373709417146105bf5780637e6906de146105e95780637f38902b1461062f5780638f84aa091461064457806392a3b3f91461065957806395e3b0de1461066e578063a4d256bc14610698578063a9809600146106ca578063acaac517146106f4578063f463210314610709578063f7bd4b8814610733578063f9f96b9e1461075d575b600080fd5b34801561016157600080fd5b5061017f6004803603602081101561017857600080fd5b5035610787565b60408051918252519081900360200190f35b34801561019d57600080fd5b506101c4600480360360208110156101b457600080fd5b5035600160a060020a0316610885565b005b61027c600480360360808110156101dc57600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561020a57600080fd5b82018360208201111561021c57600080fd5b8035906020019184602083028401116401000000008311171561023e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610972945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102b85781810151838201526020016102a0565b505050509050019250505060405180910390f35b61027c600480360360a08110156102e257600080fd5b600160a060020a038235169160208101359160408201359160608101359181019060a08101608082013564010000000081111561031e57600080fd5b82018360208201111561033057600080fd5b8035906020019184602083028401116401000000008311171561035257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610a5e945050505050565b34801561039c57600080fd5b506101c4600480360360408110156103b357600080fd5b508035906020013560ff16610e79565b3480156103cf57600080fd5b5061017f600480360360408110156103e657600080fd5b5080359060200135600160a060020a0316610f4f565b34801561040857600080fd5b506101c46004803603602081101561041f57600080fd5b5035600160a060020a0316611056565b34801561043b57600080fd5b506101c46004803603602081101561045257600080fd5b5035611143565b34801561046557600080fd5b5061017f6004803603604081101561047c57600080fd5b50600160a060020a038135169060200135611206565b34801561049e57600080fd5b506101c4600480360360408110156104b557600080fd5b5080359060200135600160a060020a0316611223565b3480156104d757600080fd5b5061017f611338565b3480156104ec57600080fd5b5061050a6004803603602081101561050357600080fd5b503561133e565b604080519115158252519081900360200190f35b34801561052a57600080fd5b5061017f6004803603602081101561054157600080fd5b5035611353565b34801561055457600080fd5b506101c46004803603602081101561056b57600080fd5b5035611365565b34801561057e57600080fd5b5061017f6004803603602081101561059557600080fd5b5035611443565b61027c600480360360408110156105b257600080fd5b5080359060200135611455565b3480156105cb57600080fd5b5061050a600480360360208110156105e257600080fd5b5035611563565b3480156105f557600080fd5b506106136004803603602081101561060c57600080fd5b5035611578565b60408051600160a060020a039092168252519081900360200190f35b34801561063b57600080fd5b50610613611593565b34801561065057600080fd5b506106136115a2565b34801561066557600080fd5b506106136115b1565b34801561067a57600080fd5b506101c46004803603602081101561069157600080fd5b50356115c0565b61027c600480360360608110156106ae57600080fd5b50600160a060020a0381351690602081013590604001356116ba565b3480156106d657600080fd5b5061017f600480360360208110156106ed57600080fd5b503561198e565b34801561070057600080fd5b50610613611a9d565b34801561071557600080fd5b5061017f6004803603602081101561072c57600080fd5b5035611aac565b34801561073f57600080fd5b506101c46004803603602081101561075657600080fd5b5035611b8e565b34801561076957600080fd5b5061050a6004803603602081101561078057600080fd5b5035611dae565b600a54600090600160a060020a031615156107ec576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f0aab8ba5000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691630aab8ba591602480820192602092909190829003018186803b15801561085157600080fd5b505afa158015610865573d6000803e3d6000fd5b505050506040513d602081101561087b57600080fd5b505190505b919050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50511515610943576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156109c657600080fd5b505afa1580156109da573d6000803e3d6000fd5b505050506040513d60208110156109f057600080fd5b505114610a47576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b610a543387878787610a5e565b9695505050505050565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b158015610ab257600080fd5b505afa158015610ac6573d6000803e3d6000fd5b505050506040513d6020811015610adc57600080fd5b505114610b33576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b600a54600160a060020a03161515610b95576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038a8116602483015291518793610c41938a93911691632802528091604480820192602092909190829003018186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d6020811015610c3357600080fd5b50519063ffffffff611dc316565b1115610c97576040805160e560020a62461bcd02815260206004820152601b60248201527f416464726573732068617320616c726561647920636c61696d65640000000000604482015290519081900360640190fd5b6060610ca288611e27565b9050610cbf81610cb18761203d565b610cba8a61203d565b612114565b90506000816040516020018082805190602001908083835b60208310610cf65780518252601f199092019160209182019101610cd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050610d4685610d408a610787565b8361226c565b1515610d9c576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c69642070726f6f6600000000000000000000000000000000000000604482015290519081900360640190fd5b6060610da98a8a8a612282565b600a54604080517f6bf97eb1000000000000000000000000000000000000000000000000000000008152600481018d9052600160a060020a038e81166024830152604482018d90529151939450911691636bf97eb19160648082019260009290919082900301818387803b158015610e2057600080fd5b505af1158015610e34573d6000803e3d6000fd5b5050604080518c815290517f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a449350908190036020019150a19998505050505050505050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015610ec757600080fd5b505afa158015610edb573d6000803e3d6000fd5b505050506040513d6020811015610ef157600080fd5b50511515610f37576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60009182526007602052604090912060ff9091169055565b600a54600090600160a060020a03161515610fb4576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a038581166024830152915191909216916328025280916044808301926020929190829003018186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d602081101561104b57600080fd5b505190505b92915050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156110a457600080fd5b505afa1580156110b8573d6000803e3d6000fd5b505050506040513d60208110156110ce57600080fd5b50511515611114576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b15801561119157600080fd5b505afa1580156111a5573d6000803e3d6000fd5b505050506040513d60208110156111bb57600080fd5b50511515611201576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600255565b600660209081526000928352604080842090915290825290205481565b6000546040805160e060020a63a47d29cb028152600481018590529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b5051600160a060020a031633146112fd576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b600091825260046020526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60025481565b60086020526000908152604090205460ff1681565b60096020526000908152604090205481565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156113b357600080fd5b505afa1580156113c7573d6000803e3d6000fd5b505050506040513d60208110156113dd57600080fd5b50511515611423576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6000908152600560205260409020805460ff19811660ff90911615179055565b60076020526000908152604090205481565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156114a957600080fd5b505afa1580156114bd573d6000803e3d6000fd5b505050506040513d60208110156114d357600080fd5b50511415611550576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61155b3385856116ba565b949350505050565b60036020526000908152604090205460ff1681565b600460205260009081526040902054600160a060020a031681565b600054600160a060020a031681565b600154600160a060020a031681565b600a54600160a060020a031681565b6000546040805160e060020a63a47d29cb028152600481018490529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561160f57600080fd5b505afa158015611623573d6000803e3d6000fd5b505050506040513d602081101561163957600080fd5b5051600160a060020a0316331461169a576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b6000908152600360205260409020805460ff19811660ff90911615179055565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b15801561170e57600080fd5b505afa158015611722573d6000803e3d6000fd5b505050506040513d602081101561173857600080fd5b505114156117b5576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54604080517f7413d37b000000000000000000000000000000000000000000000000000000008152600481018790529051600160a060020a0390921691637413d37b91602480820192602092909190829003018186803b15801561181a57600080fd5b505afa15801561182e573d6000803e3d6000fd5b505050506040513d602081101561184457600080fd5b505183111561189d576040805160e560020a62461bcd02815260206004820152601f60248201527f4d6178207075726368617365206d616e79206c696d6974207265616368656400604482015290519081900360640190fd5b600b546040805160e360020a63089935e5028152600481018790529051600092600160a060020a0316916344c9af28916024808301926020929190829003018186803b1580156118ec57600080fd5b505afa158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b50511480156119255750600034115b1561197a576040805160e560020a62461bcd02815260206004820152601d60248201527f455448206e6f7420616363657074656420617420746869732074696d65000000604482015290519081900360640190fd5b611985858585612282565b95945050505050565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b1580156119dd57600080fd5b505afa1580156119f1573d6000803e3d6000fd5b505050506040513d6020811015611a0757600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d6020811015611a9457600080fd5b50519392505050565b600b54600160a060020a031681565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b158015611afb57600080fd5b505afa158015611b0f573d6000803e3d6000fd5b505050506040513d6020811015611b2557600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b158015611a6a57600080fd5b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015611bdc57600080fd5b505afa158015611bf0573d6000803e3d6000fd5b505050506040513d6020811015611c0657600080fd5b50511515611c4c576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60008054604080517f8c2c36220000000000000000000000000000000000000000000000000000000081526004810185905290518392600160a060020a031691638c2c36229160248083019286929190829003018186803b158015611cb057600080fd5b505afa158015611cc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610120811015611cee57600080fd5b8151602083015160408401516060850151608086015160a087015160c088015160e08901805197999698959794969395929491939283019291640100000000811115611d3957600080fd5b82016020810184811115611d4c57600080fd5b8151640100000000811182820187101715611d6657600080fd5b50505060008d815260096020526040902087905550949950949750505050858510159350611da992505050576000838152600860205260409020805460ff191690555b505050565b60056020526000908152604090205460ff1681565b600082820183811015611e20576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516c01000000000000000000000000600160a060020a03841602602082015281518082036014018152602a603483018181526094909301909352606092909183916020820181803883390190505090507f3000000000000000000000000000000000000000000000000000000000000000816000815181101515611eaa57fe5b906020010190600160f860020a031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181101515611ef257fe5b906020010190600160f860020a031916908160001a90535060005b601481101561203557600060108483815181101515611f2857fe5b90602001015160f860020a900460f860020a0260f860020a900460ff16811515611f4e57fe5b0490506000816010028584815181101515611f6557fe5b016020015160f860020a908190048102040390506000600a60ff841610611f95578260570160f860020a02611fa0565b8260300160f860020a025b90506000600a8360ff1610611fbe578260570160f860020a02611fc9565b8260300160f860020a025b9050808686600202600301815181101515611fe057fe5b906020010190600160f860020a031916908160001a90535081868660020260020181518110151561200d57fe5b906020010190600160f860020a031916908160001a9053505060019093019250611f0d915050565b509392505050565b6060811515612080575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610880565b8160005b811561209857600101600a82049150612084565b6060816040519080825280601f01601f1916602001820160405280156120c5576020820181803883390190505b5090505b841561155b5760001990910190600a850660300160f860020a0281838151811015156120f157fe5b906020010190600160f860020a031916908160001a905350600a850494506120c9565b60608383836040516020018084805190602001908083835b6020831061214b5780518252601f19909201916020918201910161212c565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528551600290910192860191508083835b602083106121bc5780518252601f19909201916020918201910161219d565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528451600290910192850191508083835b6020831061222d5780518252601f19909201916020918201910161220e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600082612279858461248c565b14949350505050565b606080826040519080825280602002602001820160405280156122af578160200160208202803883390190505b50905060003481101561241057600080546040805160e260020a633dc303c1028152600481018990529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d602081101561233657600080fd5b5051905061234a818663ffffffff6124e416565b3410156123a1576040805160e560020a62461bcd02815260206004820152601c60248201527f6e6f7420656e6f7567682066756e6473207472616e7366657272656400000000604482015290519081900360640190fd5b60006123c36123b6838863ffffffff6124e416565b349063ffffffff61258016565b905060019250600081111561240d576040518890600160a060020a0382169083156108fc029084906000818181858888f1935050505015801561240a573d6000803e3d6000fd5b50505b50505b60005b84811015612481576124268787846125c2565b838281518110151561243457fe5b90602001906020020181815250507fe2aeb2ae0272c38a449d3cebb58f6894790a45bfb16f73a8e1761acb1e312053866040518082815260200191505060405180910390a1600101612413565b509095945050505050565b600081815b845181101561203557600085828151811015156124aa57fe5b6020908102909101015190508083116124ce576124c783826130da565b92506124db565b6124d881846130da565b92505b50600101612491565b60008215156124f557506000611050565b82820282848281151561250457fe5b0414611e20576040805160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000611e2083836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130e9565b60008281526008602052604081205460ff161561264f576040805160e560020a62461bcd02815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e7320726560448201527f6163686564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604080517f4554480000000000000000000000000000000000000000000000000000000000602080830191909152825180830360030181526023830180855281519190920120600080547f20927ec9000000000000000000000000000000000000000000000000000000009093526027840188905293519093600160a060020a03909216926320927ec9926047808301939192829003018186803b1580156126f657600080fd5b505afa15801561270a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561273357600080fd5b81019080805164010000000081111561274b57600080fd5b8201602081018481111561275e57600080fd5b815164010000000081118282018710171561277857600080fd5b50509291905050506040516020018082805190602001908083835b602083106127b25780518252601f199092019160209182019101612793565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120141515612c5c573415612870576040805160e560020a62461bcd02815260206004820152603f60248201527f746869732070726f6a6563742061636365707473206120646966666572656e7460448201527f2063757272656e637920616e642063616e6e6f74206163636570742045544800606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156128bf57600080fd5b505afa1580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50511015612a75576040805160e560020a62461bcd02815260206004820152602260248201527f496e73756666696369656e742046756e647320417070726f76656420666f722060448201527f5458000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612ac457600080fd5b505afa158015612ad8573d6000803e3d6000fd5b505050506040513d6020811015612aee57600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b158015612b3f57600080fd5b505afa158015612b53573d6000803e3d6000fd5b505050506040513d6020811015612b6957600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015612bcc57600080fd5b505afa158015612be0573d6000803e3d6000fd5b505050506040513d6020811015612bf657600080fd5b50511015612c4e576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b612c5783613183565b612d38565b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612cab57600080fd5b505afa158015612cbf573d6000803e3d6000fd5b505050506040513d6020811015612cd557600080fd5b5051341015612d2e576040805160e560020a62461bcd02815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e7421604482015290519081900360640190fd5b612d3883836139ec565b60008381526005602052604090205460ff1615612da657333214612da6576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f20436f6e7472616374204275797300000000000000000000000000000000604482015290519081900360640190fd5b6000838152600760205260408120541115612e5857600083815260076020908152604080832054338452600683528184208785529092529091205410612e36576040805160e560020a62461bcd02815260206004820152601560248201527f52656163686564206d696e74696e67206c696d69740000000000000000000000604482015290519081900360640190fd5b3360009081526006602090815260408083208684529091529020805460010190555b60008054604080517f0d4d1513000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301526024820188905233604483015291519190921691630d4d151391606480830192602092919082900301818787803b158015612ecd57600080fd5b505af1158015612ee1573d6000803e3d6000fd5b505050506040513d6020811015612ef757600080fd5b505160008581526009602052604090205490915060001901620f424082061415612f35576000848152600860205260409020805460ff191660011790555b60008481526003602052604090205460ff161561155b576000848152600460208181526040928390205483517f17999ff40000000000000000000000000000000000000000000000000000000081529351600160a060020a03909116936317999ff493818101939291829003018186803b158015612fb257600080fd5b505afa158015612fc6573d6000803e3d6000fd5b505050506040513d6020811015612fdc57600080fd5b50511515613034576040805160e560020a62461bcd02815260206004820152601460248201527f626f6e7573206d75737420626520616374697665000000000000000000000000604482015290519081900360640190fd5b60008481526004602081815260408084205481517ff473237d00000000000000000000000000000000000000000000000000000000815233948101949094529051600160a060020a039091169363f473237d936024808201949392918390030190829087803b1580156130a657600080fd5b505af11580156130ba573d6000803e3d6000fd5b505050506040513d60208110156130d057600080fd5b5050949350505050565b60009182526020526040902090565b6000818484111561317b5760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613140578181015183820152602001613128565b50505050905090810190601f16801561316d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080546040805160e260020a633dc303c1028152600481018590529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156131d357600080fd5b505afa1580156131e7573d6000803e3d6000fd5b505050506040513d60208110156131fd57600080fd5b505160008054604080517f2e9eb74f000000000000000000000000000000000000000000000000000000008152905193945091926132af92600160a060020a0390921691632e9eb74f916004808301926020929190829003018186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d602081101561329057600080fd5b50516132a384606463ffffffff613fba16565b9063ffffffff6124e416565b9050600081111561344c576000546040805160e060020a63498dd0c1028152600481018690529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561330957600080fd5b505afa15801561331d573d6000803e3d6000fd5b505050506040513d602081101561333357600080fd5b5051600054604080517fcfbf4d970000000000000000000000000000000000000000000000000000000081529051600160a060020a03938416936323b872dd93339391169163cfbf4d9791600480820192602092909190829003018186803b15801561339e57600080fd5b505afa1580156133b2573d6000803e3d6000fd5b505050506040513d60208110156133c857600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561341f57600080fd5b505af1158015613433573d6000803e3d6000fd5b505050506040513d602081101561344957600080fd5b50505b600061345e838363ffffffff61258016565b9050600061347c6002546132a3606485613fba90919063ffffffff16565b905060008111156135a4576000546040805160e060020a63498dd0c1028152600481018890529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156134d657600080fd5b505afa1580156134ea573d6000803e3d6000fd5b505050506040513d602081101561350057600080fd5b5051600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03928316602482015260448101859052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561357757600080fd5b505af115801561358b573d6000803e3d6000fd5b505050506040513d60208110156135a157600080fd5b50505b60006135c6826135ba878763ffffffff61258016565b9063ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018b9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b15801561361c57600080fd5b505afa158015613630573d6000803e3d6000fd5b505050506040513d602081101561364657600080fd5b50511115613842576000546040805160e060020a63cc74234b028152600481018a9052905161369e92600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613842576000546040805160e060020a63498dd0c1028152600481018a90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156136f857600080fd5b505afa15801561370c573d6000803e3d6000fd5b505050506040513d602081101561372257600080fd5b5051600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018b90529051600160a060020a03938416936323b872dd93339391169163d7b044b691602480820192602092909190829003018186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b505050506040513d602081101561383f57600080fd5b50505b6000613854838363ffffffff61258016565b905060008111156139e2576000546040805160e060020a63498dd0c1028152600481018b90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156138ae57600080fd5b505afa1580156138c2573d6000803e3d6000fd5b505050506040513d60208110156138d857600080fd5b50516000546040805160e060020a63a47d29cb028152600481018c90529051600160a060020a03938416936323b872dd93339391169163a47d29cb91602480820192602092909190829003018186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d602081101561395e57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b1580156139b557600080fd5b505af11580156139c9573d6000803e3d6000fd5b505050506040513d60208110156139df57600080fd5b50505b5050505050505050565b6000341115613fb657600080546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015613a4557600080fd5b505afa158015613a59573d6000803e3d6000fd5b505050506040513d6020811015613a6f57600080fd5b5051600080546040805160e260020a633dc303c10281526004810188905290519394509192613b0292600160a060020a039092169163f70c0f04916024808301926020929190829003018186803b158015613ac957600080fd5b505afa158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b5051349063ffffffff61258016565b905082158015613b125750600081115b15613b4657604051339082156108fc029083906000818181858888f19350505050158015613b44573d6000803e3d6000fd5b505b60008054604080517f2e9eb74f0000000000000000000000000000000000000000000000000000000081529051613be392600160a060020a031691632e9eb74f916004808301926020929190829003018186803b158015613ba657600080fd5b505afa158015613bba573d6000803e3d6000fd5b505050506040513d6020811015613bd057600080fd5b50516132a385606463ffffffff613fba16565b90506000811115613ca3576000809054906101000a9004600160a060020a0316600160a060020a031663cfbf4d976040518163ffffffff1660e060020a02815260040160206040518083038186803b158015613c3e57600080fd5b505afa158015613c52573d6000803e3d6000fd5b505050506040513d6020811015613c6857600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613ca1573d6000803e3d6000fd5b505b6000613cb5848363ffffffff61258016565b90506000613cd36002546132a3606485613fba90919063ffffffff16565b90506000811115613d1a57600154604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613d18573d6000803e3d6000fd5b505b6000613d30826135ba888763ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018d9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b158015613d8657600080fd5b505afa158015613d9a573d6000803e3d6000fd5b505050506040513d6020811015613db057600080fd5b50511115613edd576000546040805160e060020a63cc74234b028152600481018c90529051613e0892600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613edd57600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018c90529051600160a060020a039092169163d7b044b691602480820192602092909190829003018186803b158015613e7857600080fd5b505afa158015613e8c573d6000803e3d6000fd5b505050506040513d6020811015613ea257600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613edb573d6000803e3d6000fd5b505b6000613eef838363ffffffff61258016565b905060008111156139df576000546040805160e060020a63a47d29cb028152600481018d90529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b158015613f4957600080fd5b505afa158015613f5d573d6000803e3d6000fd5b505050506040513d6020811015613f7357600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613fac573d6000803e3d6000fd5b5050505050505050505b5050565b6000611e2083836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008181841161404c5760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015613140578181015183820152602001613128565b506000838581151561405a57fe5b049594505050505056fe63616e206f6e6c79206265207365742062792061646d696e0000000000000000a165627a7a72305820120f13757f5b94fb335dcec02f41b30a06789404d87422fb2cc33eadb2e3da91002900000000000000000000000028f2d3805652fb5d359486dffb7d08320d4032400000000000000000000000005292970db5d37ca4d269ae1c12953b266aa97381

Deployed Bytecode

0x6080604052600436106101505763ffffffff60e060020a6000350416630aab8ba581146101555780631399c04f146101915780631606c0c6146101c65780631748f818146102cc578063231c22811461039057806328025280146103c3578063331a6bf5146103fc578063393b011c1461042f5780633a4657b4146104595780633c34b9f01461049257806341da7555146104cb578063462add46146104e057806356690aaf1461051e578063569f6f921461054857806362f7a7ed1461057257806370876c981461059c57806373709417146105bf5780637e6906de146105e95780637f38902b1461062f5780638f84aa091461064457806392a3b3f91461065957806395e3b0de1461066e578063a4d256bc14610698578063a9809600146106ca578063acaac517146106f4578063f463210314610709578063f7bd4b8814610733578063f9f96b9e1461075d575b600080fd5b34801561016157600080fd5b5061017f6004803603602081101561017857600080fd5b5035610787565b60408051918252519081900360200190f35b34801561019d57600080fd5b506101c4600480360360208110156101b457600080fd5b5035600160a060020a0316610885565b005b61027c600480360360808110156101dc57600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561020a57600080fd5b82018360208201111561021c57600080fd5b8035906020019184602083028401116401000000008311171561023e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610972945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102b85781810151838201526020016102a0565b505050509050019250505060405180910390f35b61027c600480360360a08110156102e257600080fd5b600160a060020a038235169160208101359160408201359160608101359181019060a08101608082013564010000000081111561031e57600080fd5b82018360208201111561033057600080fd5b8035906020019184602083028401116401000000008311171561035257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610a5e945050505050565b34801561039c57600080fd5b506101c4600480360360408110156103b357600080fd5b508035906020013560ff16610e79565b3480156103cf57600080fd5b5061017f600480360360408110156103e657600080fd5b5080359060200135600160a060020a0316610f4f565b34801561040857600080fd5b506101c46004803603602081101561041f57600080fd5b5035600160a060020a0316611056565b34801561043b57600080fd5b506101c46004803603602081101561045257600080fd5b5035611143565b34801561046557600080fd5b5061017f6004803603604081101561047c57600080fd5b50600160a060020a038135169060200135611206565b34801561049e57600080fd5b506101c4600480360360408110156104b557600080fd5b5080359060200135600160a060020a0316611223565b3480156104d757600080fd5b5061017f611338565b3480156104ec57600080fd5b5061050a6004803603602081101561050357600080fd5b503561133e565b604080519115158252519081900360200190f35b34801561052a57600080fd5b5061017f6004803603602081101561054157600080fd5b5035611353565b34801561055457600080fd5b506101c46004803603602081101561056b57600080fd5b5035611365565b34801561057e57600080fd5b5061017f6004803603602081101561059557600080fd5b5035611443565b61027c600480360360408110156105b257600080fd5b5080359060200135611455565b3480156105cb57600080fd5b5061050a600480360360208110156105e257600080fd5b5035611563565b3480156105f557600080fd5b506106136004803603602081101561060c57600080fd5b5035611578565b60408051600160a060020a039092168252519081900360200190f35b34801561063b57600080fd5b50610613611593565b34801561065057600080fd5b506106136115a2565b34801561066557600080fd5b506106136115b1565b34801561067a57600080fd5b506101c46004803603602081101561069157600080fd5b50356115c0565b61027c600480360360608110156106ae57600080fd5b50600160a060020a0381351690602081013590604001356116ba565b3480156106d657600080fd5b5061017f600480360360208110156106ed57600080fd5b503561198e565b34801561070057600080fd5b50610613611a9d565b34801561071557600080fd5b5061017f6004803603602081101561072c57600080fd5b5035611aac565b34801561073f57600080fd5b506101c46004803603602081101561075657600080fd5b5035611b8e565b34801561076957600080fd5b5061050a6004803603602081101561078057600080fd5b5035611dae565b600a54600090600160a060020a031615156107ec576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f0aab8ba5000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691630aab8ba591602480820192602092909190829003018186803b15801561085157600080fd5b505afa158015610865573d6000803e3d6000fd5b505050506040513d602081101561087b57600080fd5b505190505b919050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50511515610943576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156109c657600080fd5b505afa1580156109da573d6000803e3d6000fd5b505050506040513d60208110156109f057600080fd5b505114610a47576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b610a543387878787610a5e565b9695505050505050565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b158015610ab257600080fd5b505afa158015610ac6573d6000803e3d6000fd5b505050506040513d6020811015610adc57600080fd5b505114610b33576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b600a54600160a060020a03161515610b95576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038a8116602483015291518793610c41938a93911691632802528091604480820192602092909190829003018186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d6020811015610c3357600080fd5b50519063ffffffff611dc316565b1115610c97576040805160e560020a62461bcd02815260206004820152601b60248201527f416464726573732068617320616c726561647920636c61696d65640000000000604482015290519081900360640190fd5b6060610ca288611e27565b9050610cbf81610cb18761203d565b610cba8a61203d565b612114565b90506000816040516020018082805190602001908083835b60208310610cf65780518252601f199092019160209182019101610cd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050610d4685610d408a610787565b8361226c565b1515610d9c576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c69642070726f6f6600000000000000000000000000000000000000604482015290519081900360640190fd5b6060610da98a8a8a612282565b600a54604080517f6bf97eb1000000000000000000000000000000000000000000000000000000008152600481018d9052600160a060020a038e81166024830152604482018d90529151939450911691636bf97eb19160648082019260009290919082900301818387803b158015610e2057600080fd5b505af1158015610e34573d6000803e3d6000fd5b5050604080518c815290517f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a449350908190036020019150a19998505050505050505050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015610ec757600080fd5b505afa158015610edb573d6000803e3d6000fd5b505050506040513d6020811015610ef157600080fd5b50511515610f37576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60009182526007602052604090912060ff9091169055565b600a54600090600160a060020a03161515610fb4576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a038581166024830152915191909216916328025280916044808301926020929190829003018186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d602081101561104b57600080fd5b505190505b92915050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156110a457600080fd5b505afa1580156110b8573d6000803e3d6000fd5b505050506040513d60208110156110ce57600080fd5b50511515611114576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b15801561119157600080fd5b505afa1580156111a5573d6000803e3d6000fd5b505050506040513d60208110156111bb57600080fd5b50511515611201576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600255565b600660209081526000928352604080842090915290825290205481565b6000546040805160e060020a63a47d29cb028152600481018590529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b5051600160a060020a031633146112fd576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b600091825260046020526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60025481565b60086020526000908152604090205460ff1681565b60096020526000908152604090205481565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156113b357600080fd5b505afa1580156113c7573d6000803e3d6000fd5b505050506040513d60208110156113dd57600080fd5b50511515611423576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6000908152600560205260409020805460ff19811660ff90911615179055565b60076020526000908152604090205481565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156114a957600080fd5b505afa1580156114bd573d6000803e3d6000fd5b505050506040513d60208110156114d357600080fd5b50511415611550576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61155b3385856116ba565b949350505050565b60036020526000908152604090205460ff1681565b600460205260009081526040902054600160a060020a031681565b600054600160a060020a031681565b600154600160a060020a031681565b600a54600160a060020a031681565b6000546040805160e060020a63a47d29cb028152600481018490529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561160f57600080fd5b505afa158015611623573d6000803e3d6000fd5b505050506040513d602081101561163957600080fd5b5051600160a060020a0316331461169a576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b6000908152600360205260409020805460ff19811660ff90911615179055565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b15801561170e57600080fd5b505afa158015611722573d6000803e3d6000fd5b505050506040513d602081101561173857600080fd5b505114156117b5576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54604080517f7413d37b000000000000000000000000000000000000000000000000000000008152600481018790529051600160a060020a0390921691637413d37b91602480820192602092909190829003018186803b15801561181a57600080fd5b505afa15801561182e573d6000803e3d6000fd5b505050506040513d602081101561184457600080fd5b505183111561189d576040805160e560020a62461bcd02815260206004820152601f60248201527f4d6178207075726368617365206d616e79206c696d6974207265616368656400604482015290519081900360640190fd5b600b546040805160e360020a63089935e5028152600481018790529051600092600160a060020a0316916344c9af28916024808301926020929190829003018186803b1580156118ec57600080fd5b505afa158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b50511480156119255750600034115b1561197a576040805160e560020a62461bcd02815260206004820152601d60248201527f455448206e6f7420616363657074656420617420746869732074696d65000000604482015290519081900360640190fd5b611985858585612282565b95945050505050565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b1580156119dd57600080fd5b505afa1580156119f1573d6000803e3d6000fd5b505050506040513d6020811015611a0757600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d6020811015611a9457600080fd5b50519392505050565b600b54600160a060020a031681565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b158015611afb57600080fd5b505afa158015611b0f573d6000803e3d6000fd5b505050506040513d6020811015611b2557600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b158015611a6a57600080fd5b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015611bdc57600080fd5b505afa158015611bf0573d6000803e3d6000fd5b505050506040513d6020811015611c0657600080fd5b50511515611c4c576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60008054604080517f8c2c36220000000000000000000000000000000000000000000000000000000081526004810185905290518392600160a060020a031691638c2c36229160248083019286929190829003018186803b158015611cb057600080fd5b505afa158015611cc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610120811015611cee57600080fd5b8151602083015160408401516060850151608086015160a087015160c088015160e08901805197999698959794969395929491939283019291640100000000811115611d3957600080fd5b82016020810184811115611d4c57600080fd5b8151640100000000811182820187101715611d6657600080fd5b50505060008d815260096020526040902087905550949950949750505050858510159350611da992505050576000838152600860205260409020805460ff191690555b505050565b60056020526000908152604090205460ff1681565b600082820183811015611e20576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516c01000000000000000000000000600160a060020a03841602602082015281518082036014018152602a603483018181526094909301909352606092909183916020820181803883390190505090507f3000000000000000000000000000000000000000000000000000000000000000816000815181101515611eaa57fe5b906020010190600160f860020a031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181101515611ef257fe5b906020010190600160f860020a031916908160001a90535060005b601481101561203557600060108483815181101515611f2857fe5b90602001015160f860020a900460f860020a0260f860020a900460ff16811515611f4e57fe5b0490506000816010028584815181101515611f6557fe5b016020015160f860020a908190048102040390506000600a60ff841610611f95578260570160f860020a02611fa0565b8260300160f860020a025b90506000600a8360ff1610611fbe578260570160f860020a02611fc9565b8260300160f860020a025b9050808686600202600301815181101515611fe057fe5b906020010190600160f860020a031916908160001a90535081868660020260020181518110151561200d57fe5b906020010190600160f860020a031916908160001a9053505060019093019250611f0d915050565b509392505050565b6060811515612080575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610880565b8160005b811561209857600101600a82049150612084565b6060816040519080825280601f01601f1916602001820160405280156120c5576020820181803883390190505b5090505b841561155b5760001990910190600a850660300160f860020a0281838151811015156120f157fe5b906020010190600160f860020a031916908160001a905350600a850494506120c9565b60608383836040516020018084805190602001908083835b6020831061214b5780518252601f19909201916020918201910161212c565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528551600290910192860191508083835b602083106121bc5780518252601f19909201916020918201910161219d565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528451600290910192850191508083835b6020831061222d5780518252601f19909201916020918201910161220e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600082612279858461248c565b14949350505050565b606080826040519080825280602002602001820160405280156122af578160200160208202803883390190505b50905060003481101561241057600080546040805160e260020a633dc303c1028152600481018990529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d602081101561233657600080fd5b5051905061234a818663ffffffff6124e416565b3410156123a1576040805160e560020a62461bcd02815260206004820152601c60248201527f6e6f7420656e6f7567682066756e6473207472616e7366657272656400000000604482015290519081900360640190fd5b60006123c36123b6838863ffffffff6124e416565b349063ffffffff61258016565b905060019250600081111561240d576040518890600160a060020a0382169083156108fc029084906000818181858888f1935050505015801561240a573d6000803e3d6000fd5b50505b50505b60005b84811015612481576124268787846125c2565b838281518110151561243457fe5b90602001906020020181815250507fe2aeb2ae0272c38a449d3cebb58f6894790a45bfb16f73a8e1761acb1e312053866040518082815260200191505060405180910390a1600101612413565b509095945050505050565b600081815b845181101561203557600085828151811015156124aa57fe5b6020908102909101015190508083116124ce576124c783826130da565b92506124db565b6124d881846130da565b92505b50600101612491565b60008215156124f557506000611050565b82820282848281151561250457fe5b0414611e20576040805160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000611e2083836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130e9565b60008281526008602052604081205460ff161561264f576040805160e560020a62461bcd02815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e7320726560448201527f6163686564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604080517f4554480000000000000000000000000000000000000000000000000000000000602080830191909152825180830360030181526023830180855281519190920120600080547f20927ec9000000000000000000000000000000000000000000000000000000009093526027840188905293519093600160a060020a03909216926320927ec9926047808301939192829003018186803b1580156126f657600080fd5b505afa15801561270a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561273357600080fd5b81019080805164010000000081111561274b57600080fd5b8201602081018481111561275e57600080fd5b815164010000000081118282018710171561277857600080fd5b50509291905050506040516020018082805190602001908083835b602083106127b25780518252601f199092019160209182019101612793565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120141515612c5c573415612870576040805160e560020a62461bcd02815260206004820152603f60248201527f746869732070726f6a6563742061636365707473206120646966666572656e7460448201527f2063757272656e637920616e642063616e6e6f74206163636570742045544800606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156128bf57600080fd5b505afa1580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50511015612a75576040805160e560020a62461bcd02815260206004820152602260248201527f496e73756666696369656e742046756e647320417070726f76656420666f722060448201527f5458000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612ac457600080fd5b505afa158015612ad8573d6000803e3d6000fd5b505050506040513d6020811015612aee57600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b158015612b3f57600080fd5b505afa158015612b53573d6000803e3d6000fd5b505050506040513d6020811015612b6957600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015612bcc57600080fd5b505afa158015612be0573d6000803e3d6000fd5b505050506040513d6020811015612bf657600080fd5b50511015612c4e576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b612c5783613183565b612d38565b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612cab57600080fd5b505afa158015612cbf573d6000803e3d6000fd5b505050506040513d6020811015612cd557600080fd5b5051341015612d2e576040805160e560020a62461bcd02815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e7421604482015290519081900360640190fd5b612d3883836139ec565b60008381526005602052604090205460ff1615612da657333214612da6576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f20436f6e7472616374204275797300000000000000000000000000000000604482015290519081900360640190fd5b6000838152600760205260408120541115612e5857600083815260076020908152604080832054338452600683528184208785529092529091205410612e36576040805160e560020a62461bcd02815260206004820152601560248201527f52656163686564206d696e74696e67206c696d69740000000000000000000000604482015290519081900360640190fd5b3360009081526006602090815260408083208684529091529020805460010190555b60008054604080517f0d4d1513000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301526024820188905233604483015291519190921691630d4d151391606480830192602092919082900301818787803b158015612ecd57600080fd5b505af1158015612ee1573d6000803e3d6000fd5b505050506040513d6020811015612ef757600080fd5b505160008581526009602052604090205490915060001901620f424082061415612f35576000848152600860205260409020805460ff191660011790555b60008481526003602052604090205460ff161561155b576000848152600460208181526040928390205483517f17999ff40000000000000000000000000000000000000000000000000000000081529351600160a060020a03909116936317999ff493818101939291829003018186803b158015612fb257600080fd5b505afa158015612fc6573d6000803e3d6000fd5b505050506040513d6020811015612fdc57600080fd5b50511515613034576040805160e560020a62461bcd02815260206004820152601460248201527f626f6e7573206d75737420626520616374697665000000000000000000000000604482015290519081900360640190fd5b60008481526004602081815260408084205481517ff473237d00000000000000000000000000000000000000000000000000000000815233948101949094529051600160a060020a039091169363f473237d936024808201949392918390030190829087803b1580156130a657600080fd5b505af11580156130ba573d6000803e3d6000fd5b505050506040513d60208110156130d057600080fd5b5050949350505050565b60009182526020526040902090565b6000818484111561317b5760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613140578181015183820152602001613128565b50505050905090810190601f16801561316d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080546040805160e260020a633dc303c1028152600481018590529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156131d357600080fd5b505afa1580156131e7573d6000803e3d6000fd5b505050506040513d60208110156131fd57600080fd5b505160008054604080517f2e9eb74f000000000000000000000000000000000000000000000000000000008152905193945091926132af92600160a060020a0390921691632e9eb74f916004808301926020929190829003018186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d602081101561329057600080fd5b50516132a384606463ffffffff613fba16565b9063ffffffff6124e416565b9050600081111561344c576000546040805160e060020a63498dd0c1028152600481018690529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561330957600080fd5b505afa15801561331d573d6000803e3d6000fd5b505050506040513d602081101561333357600080fd5b5051600054604080517fcfbf4d970000000000000000000000000000000000000000000000000000000081529051600160a060020a03938416936323b872dd93339391169163cfbf4d9791600480820192602092909190829003018186803b15801561339e57600080fd5b505afa1580156133b2573d6000803e3d6000fd5b505050506040513d60208110156133c857600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561341f57600080fd5b505af1158015613433573d6000803e3d6000fd5b505050506040513d602081101561344957600080fd5b50505b600061345e838363ffffffff61258016565b9050600061347c6002546132a3606485613fba90919063ffffffff16565b905060008111156135a4576000546040805160e060020a63498dd0c1028152600481018890529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156134d657600080fd5b505afa1580156134ea573d6000803e3d6000fd5b505050506040513d602081101561350057600080fd5b5051600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03928316602482015260448101859052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561357757600080fd5b505af115801561358b573d6000803e3d6000fd5b505050506040513d60208110156135a157600080fd5b50505b60006135c6826135ba878763ffffffff61258016565b9063ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018b9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b15801561361c57600080fd5b505afa158015613630573d6000803e3d6000fd5b505050506040513d602081101561364657600080fd5b50511115613842576000546040805160e060020a63cc74234b028152600481018a9052905161369e92600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613842576000546040805160e060020a63498dd0c1028152600481018a90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156136f857600080fd5b505afa15801561370c573d6000803e3d6000fd5b505050506040513d602081101561372257600080fd5b5051600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018b90529051600160a060020a03938416936323b872dd93339391169163d7b044b691602480820192602092909190829003018186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b505050506040513d602081101561383f57600080fd5b50505b6000613854838363ffffffff61258016565b905060008111156139e2576000546040805160e060020a63498dd0c1028152600481018b90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156138ae57600080fd5b505afa1580156138c2573d6000803e3d6000fd5b505050506040513d60208110156138d857600080fd5b50516000546040805160e060020a63a47d29cb028152600481018c90529051600160a060020a03938416936323b872dd93339391169163a47d29cb91602480820192602092909190829003018186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d602081101561395e57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b1580156139b557600080fd5b505af11580156139c9573d6000803e3d6000fd5b505050506040513d60208110156139df57600080fd5b50505b5050505050505050565b6000341115613fb657600080546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015613a4557600080fd5b505afa158015613a59573d6000803e3d6000fd5b505050506040513d6020811015613a6f57600080fd5b5051600080546040805160e260020a633dc303c10281526004810188905290519394509192613b0292600160a060020a039092169163f70c0f04916024808301926020929190829003018186803b158015613ac957600080fd5b505afa158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b5051349063ffffffff61258016565b905082158015613b125750600081115b15613b4657604051339082156108fc029083906000818181858888f19350505050158015613b44573d6000803e3d6000fd5b505b60008054604080517f2e9eb74f0000000000000000000000000000000000000000000000000000000081529051613be392600160a060020a031691632e9eb74f916004808301926020929190829003018186803b158015613ba657600080fd5b505afa158015613bba573d6000803e3d6000fd5b505050506040513d6020811015613bd057600080fd5b50516132a385606463ffffffff613fba16565b90506000811115613ca3576000809054906101000a9004600160a060020a0316600160a060020a031663cfbf4d976040518163ffffffff1660e060020a02815260040160206040518083038186803b158015613c3e57600080fd5b505afa158015613c52573d6000803e3d6000fd5b505050506040513d6020811015613c6857600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613ca1573d6000803e3d6000fd5b505b6000613cb5848363ffffffff61258016565b90506000613cd36002546132a3606485613fba90919063ffffffff16565b90506000811115613d1a57600154604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613d18573d6000803e3d6000fd5b505b6000613d30826135ba888763ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018d9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b158015613d8657600080fd5b505afa158015613d9a573d6000803e3d6000fd5b505050506040513d6020811015613db057600080fd5b50511115613edd576000546040805160e060020a63cc74234b028152600481018c90529051613e0892600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613edd57600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018c90529051600160a060020a039092169163d7b044b691602480820192602092909190829003018186803b158015613e7857600080fd5b505afa158015613e8c573d6000803e3d6000fd5b505050506040513d6020811015613ea257600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613edb573d6000803e3d6000fd5b505b6000613eef838363ffffffff61258016565b905060008111156139df576000546040805160e060020a63a47d29cb028152600481018d90529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b158015613f4957600080fd5b505afa158015613f5d573d6000803e3d6000fd5b505050506040513d6020811015613f7357600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613fac573d6000803e3d6000fd5b5050505050505050505b5050565b6000611e2083836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008181841161404c5760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015613140578181015183820152602001613128565b506000838581151561405a57fe5b049594505050505056fe63616e206f6e6c79206265207365742062792061646d696e0000000000000000a165627a7a72305820120f13757f5b94fb335dcec02f41b30a06789404d87422fb2cc33eadb2e3da910029

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

00000000000000000000000028f2d3805652fb5d359486dffb7d08320d4032400000000000000000000000005292970db5d37ca4d269ae1c12953b266aa97381

-----Decoded View---------------
Arg [0] : _genArtCore (address): 0x28f2D3805652FB5d359486dFfb7D08320D403240
Arg [1] : _minterStateAddress (address): 0x5292970Db5D37CA4D269AE1C12953b266aa97381

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000028f2d3805652fb5d359486dffb7d08320d403240
Arg [1] : 0000000000000000000000005292970db5d37ca4d269ae1c12953b266aa97381


Deployed Bytecode Sourcemap

1048:5825:8:-;;;;;;;;;-1:-1:-1;;;1048:5825:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2331:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2331:232:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2331:232:8;;;;;;;;;;;;;;;;;;;2855:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2855:153:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2855:153:8;-1:-1:-1;;;;;2855:153:8;;;;;3872:310;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3872:310:8;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;3872:310:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3872:310:8;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3872:310:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3872:310:8;;-1:-1:-1;3872:310:8;;-1:-1:-1;;;;;3872:310:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;3872:310:8;;;;;;;;;;;;;;;;;4188:1010;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;4188:1010:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;4188:1010:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4188:1010:8;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4188:1010:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4188:1010:8;;-1:-1:-1;4188:1010:8;;-1:-1:-1;;;;;4188:1010:8;1698:215:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1698:215:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1698:215:10;;;;;;;;;;2569:280:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2569:280:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2569:280:8;;;;;;-1:-1:-1;;;;;2569:280:8;;;2442:199:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2442:199:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2442:199:10;-1:-1:-1;;;;;2442:199:10;;;2647:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2647:203:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2647:203:10;;;785:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;785:73:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;785:73:10;;;;;;;;;3385:344;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3385:344:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3385:344:10;;;;;;-1:-1:-1;;;;;3385:344:10;;;563:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;563:30:10;;;;921:56;;8:9:-1;5:2;;;30:1;27;20:12;5:2;921:56:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;921:56:10;;;;;;;;;;;;;;;;;;;;;983;;8:9:-1;5:2;;;30:1;27;20:12;5:2;983:56:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;983:56:10;;;2856:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2856:235:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2856:235:10;;;864:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;864:51:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;864:51:10;;;3014:240:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3014:240:8;;;;;;;;600:48:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;600:48:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;600:48:10;;;654:66;;8:9:-1;5:2;;;30:1;27;20:12;5:2;654:66:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;654:66:10;;;;;;;-1:-1:-1;;;;;654:66:10;;;;;;;;;;;;;;426:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;426:42:10;;;;522:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;522:35:10;;;;1368:60:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1368:60:8;;;;3097:282:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3097:282:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3097:282:10;;;3260:606:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3260:606:8;;;;;;;;;;;;;;1171:246:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1171:246:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1171:246:10;;;1434:53:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1434:53:8;;;;1423:269:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1423:269:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1423:269:10;;;1919:517;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1919:517:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1919:517:10;;;726:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;726:53:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;726:53:10;;;2331:232:8;2440:15;;2394:18;;-1:-1:-1;;;;;2440:15:8;2432:38;;2424:75;;;;;-1:-1:-1;;;;;2424:75:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2516:15;;:40;;;;;;;;;;;;;;-1:-1:-1;;;;;2516:15:8;;;;:29;;:40;;;;;;;;;;;;;;;:15;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;2516:40:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2516:40:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2516:40:8;;-1:-1:-1;2331:232:8;;;;:::o;2855:153::-;1539:18;;:44;;;-1:-1:-1;;;;;1539:44:8;;1572:10;1539:44;;;;;;-1:-1:-1;;;;;1539:18:8;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;1539:44:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1539:44:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1539:44:8;1531:81;;;;;;;-1:-1:-1;;;;;1531:81:8;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1531:81:8;;;;;;;;;;;;;;;2935:15;:66;;-1:-1:-1;;2935:66:8;-1:-1:-1;;;;;2935:66:8;;;;;;;;;;2855:153::o;3872:310::-;4066:26;4046:9;2004:20;1960:11;;:31;;;-1:-1:-1;;;;;1960:31:8;;;;;;;;;;-1:-1:-1;;;;;1960:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1960:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1960:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1960:31:8;1952:73;1931:143;;;;;-1:-1:-1;;;;;1931:143:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4111:64;4120:10;4132:9;4143:8;4153:14;4169:5;4111:8;:64::i;:::-;4104:71;3872:310;-1:-1:-1;;;;;;3872:310:8:o;4188:1010::-;4404:26;4384:9;2004:20;1960:11;;:31;;;-1:-1:-1;;;;;1960:31:8;;;;;;;;;;-1:-1:-1;;;;;1960:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1960:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1960:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1960:31:8;1952:73;1931:143;;;;;-1:-1:-1;;;;;1931:143:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4458:15;;-1:-1:-1;;;;;4458:15:8;4450:38;;4442:75;;;;;-1:-1:-1;;;;;4442:75:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4548:15;;:45;;;;;;;;;;;;-1:-1:-1;;;;;4548:45:8;;;;;;;;;4611:14;;4548:59;;4598:8;;4548:15;;;:30;;:45;;;;;;;;;;;;;;;:15;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;4548:45:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4548:45:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4548:45:8;;:59;:49;:59;:::i;:::-;:77;;4527:151;;;;;-1:-1:-1;;;;;4527:151:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4689:17;4709:20;4726:2;4709:16;:20::i;:::-;4689:40;;4745:82;4760:3;4765:32;4782:14;4765:16;:32::i;:::-;4799:27;4816:9;4799:16;:27::i;:::-;4745:14;:82::i;:::-;4739:88;;4838:12;4880:3;4863:21;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4863:21:8;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4863:21:8;;;4853:32;;;;;;4838:47;;4903:57;4922:5;4929:24;4943:9;4929:13;:24::i;:::-;4955:4;4903:18;:57::i;:::-;4895:83;;;;;;;-1:-1:-1;;;;;4895:83:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4989:30;5022:40;5038:2;5042:9;5053:8;5022:15;:40::i;:::-;5073:15;;:55;;;;;;;;;;;;-1:-1:-1;;;;;5073:55:8;;;;;;;;;;;;;;;4989:73;;-1:-1:-1;5073:15:8;;;:30;;:55;;;;;:15;;:55;;;;;;;;:15;;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;5073:55:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;5144:17:8;;;;;;;;;;-1:-1:-1;5144:17:8;;;;;;;-1:-1:-1;5144:17:8;5178:13;4188:1010;-1:-1:-1;;;;;;;;;4188:1010:8:o;1698:215:10:-;1786:18;;:44;;;-1:-1:-1;;;;;1786:44:10;;1819:10;1786:44;;;;;;-1:-1:-1;;;;;1786:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;1786:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1786:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1786:44:10;1778:81;;;;;;;-1:-1:-1;;;;;1778:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1778:81:10;;;;;;;;;;;;;;;1869:28;;;;:16;:28;;;;;;:37;;;;;;1698:215::o;2569:280:8:-;2719:15;;2673:14;;-1:-1:-1;;;;;2719:15:8;2711:38;;2703:75;;;;;-1:-1:-1;;;;;2703:75:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2795:15;;:47;;;;;;;;;;;;-1:-1:-1;;;;;2795:47:8;;;;;;;;;:15;;;;;:30;;:47;;;;;;;;;;;;;;:15;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;2795:47:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2795:47:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2795:47:8;;-1:-1:-1;2569:280:8;;;;;:::o;2442:199:10:-;2523:18;;:44;;;-1:-1:-1;;;;;2523:44:10;;2556:10;2523:44;;;;;;-1:-1:-1;;;;;2523:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;2523:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2523:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2523:44:10;2515:81;;;;;;;-1:-1:-1;;;;;2515:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2515:81:10;;;;;;;;;;;;;;;2606:12;:28;;-1:-1:-1;;2606:28:10;-1:-1:-1;;;;;2606:28:10;;;;;;;;;;2442:199::o;2647:203::-;2726:18;;:44;;;-1:-1:-1;;;;;2726:44:10;;2759:10;2726:44;;;;;;-1:-1:-1;;;;;2726:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;2726:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2726:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2726:44:10;2718:81;;;;;;;-1:-1:-1;;;;;2718:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2718:81:10;;;;;;;;;;;;;;;2809:15;:34;2647:203::o;785:73::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;3385:344::-;3539:18;;:55;;;-1:-1:-1;;;;;3539:55:10;;;;;;;;;;-1:-1:-1;;;;;3539:18:10;;;;:43;;:55;;;;;;;;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;3539:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3539:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3539:55:10;-1:-1:-1;;;;;3525:69:10;:10;:69;3504:141;;;;;-1:-1:-1;;;;;3504:141:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;3655:43;;;;:31;:43;;;;;;:67;;-1:-1:-1;;3655:67:10;-1:-1:-1;;;;;3655:67:10;;;;;;;;;3385:344::o;563:30::-;;;;:::o;921:56::-;;;;;;;;;;;;;;;:::o;983:::-;;;;;;;;;;;;;:::o;2856:235::-;2931:18;;:44;;;-1:-1:-1;;;;;2931:44:10;;2964:10;2931:44;;;;;;-1:-1:-1;;;;;2931:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;2931:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2931:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2931:44:10;2923:81;;;;;;;-1:-1:-1;;;;;2923:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2923:81:10;;;;;;;;;;;;;;;3051:33;;;;:21;:33;;;;;;;-1:-1:-1;;3014:70:10;;3051:33;;;;3050:34;3014:70;;;2856:235::o;864:51::-;;;;;;;;;;;;;:::o;3014:240:8:-;3155:26;3127:9;1766:20;1722:11;;:31;;;-1:-1:-1;;;;;1722:31:8;;;;;;;;;;-1:-1:-1;;;;;1722:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1722:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1722:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1722:31:8;1714:73;;1693:156;;;;;-1:-1:-1;;;;;1693:156:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3204:43;3215:10;3227:9;3238:8;3204:10;:43::i;:::-;3197:50;3014:240;-1:-1:-1;;;;3014:240:8:o;600:48:10:-;;;;;;;;;;;;;;;:::o;654:66::-;;;;;;;;;;;;-1:-1:-1;;;;;654:66:10;;:::o;426:42::-;;;-1:-1:-1;;;;;426:42:10;;:::o;522:35::-;;;-1:-1:-1;;;;;522:35:10;;:::o;1368:60:8:-;;;-1:-1:-1;;;;;1368:60:8;;:::o;3097:282:10:-;3196:18;;:55;;;-1:-1:-1;;;;;3196:55:10;;;;;;;;;;-1:-1:-1;;;;;3196:18:10;;;;:43;;:55;;;;;;;;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;3196:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3196:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3196:55:10;-1:-1:-1;;;;;3182:69:10;:10;:69;3161:141;;;;;-1:-1:-1;;;;;3161:141:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;3344:28;;;;:16;:28;;;;;;;-1:-1:-1;;3312:60:10;;3344:28;;;;3343:29;3312:60;;;3097:282::o;3260:606:8:-;3413:26;3393:9;1766:20;1722:11;;:31;;;-1:-1:-1;;;;;1722:31:8;;;;;;;;;;-1:-1:-1;;;;;1722:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1722:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1722:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1722:31:8;1714:73;;1693:156;;;;;-1:-1:-1;;;;;1693:156:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3484:11;;:43;;;;;;;;;;;;;;-1:-1:-1;;;;;3484:11:8;;;;:32;;:43;;;;;;;;;;;;;;;:11;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;3484:43:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3484:43:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3484:43:8;3472:55;;;3451:133;;;;;-1:-1:-1;;;;;3451:133:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3619:11;;:31;;;-1:-1:-1;;;;;3619:31:8;;;;;;;;;;3663:27;;-1:-1:-1;;;;;3619:11:8;;:20;;:31;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;3619:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3619:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3619:31:8;3611:80;:109;;;;;3719:1;3707:9;:13;3611:109;3594:209;;;3745:47;;;-1:-1:-1;;;;;3745:47:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3819:40;3835:2;3839:9;3850:8;3819:15;:40::i;:::-;3812:47;3260:606;-1:-1:-1;;;;;3260:606:8:o;1171:246:10:-;1250:7;1293:18;;:57;;;-1:-1:-1;;;;;1293:57:10;;;;;;;;;;1250:7;;-1:-1:-1;;;;;1293:18:10;;:45;;:57;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;1293:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1293:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1293:57:10;1287:99;;;;;;1375:10;1287:99;;;;;;-1:-1:-1;;;;;1287:87:10;;;;;;:99;;;;;1293:57;;1287:99;;;;;;;;:87;:99;;;5:2:-1;;;;30:1;27;20:12;5:2;1287:99:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1287:99:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1287:99:10;;1171:246;-1:-1:-1;;;1171:246:10:o;1434:53:8:-;;;-1:-1:-1;;;;;1434:53:8;;:::o;1423:269:10:-;1506:7;1551:18;;:57;;;-1:-1:-1;;;;;1551:57:10;;;;;;;;;;1506:7;;-1:-1:-1;;;;;1551:18:10;;:45;;:57;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;1551:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1551:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1551:57:10;1545:114;;;;;;1633:10;1545:114;;;;1653:4;1545:114;;;;;;-1:-1:-1;;;;;1545:87:10;;;;;;:114;;;;;1551:57;;1545:114;;;;;;;;:87;:114;;;5:2:-1;;;;30:1;27;20:12;1919:517:10;1998:18;;:44;;;-1:-1:-1;;;;;1998:44:10;;2031:10;1998:44;;;;;;-1:-1:-1;;;;;1998:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;1998:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1998:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1998:44:10;1990:81;;;;;;;-1:-1:-1;;;;;1990:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1990:81:10;;;;;;;;;;;;;;;2081:22;2188:18;;:69;;;;;;;;;;;;;;2081:22;;-1:-1:-1;;;;;2188:18:10;;:35;;:69;;;;;2081:22;;2188:69;;;;;;;:18;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;2188:69:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2188:69:10;;;;;;39:16:-1;36:1;17:17;2:54;101:4;2188:69:10;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:3;5:12;;2:2;;;30:1;27;20:12;2:2;2188:69:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19:11:-1;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;;;2267:33:10;;;;:21;2188:69;2267:33;2188:69;2267:33;;:50;;;-1:-1:-1;2142:115:10;;-1:-1:-1;2142:115:10;;-1:-1:-1;;;;2331:28:10;;;2327:103;;-1:-1:-1;2327:103:10;;-1:-1:-1;;;2327:103:10;2414:5;2375:36;;;:24;:36;;;;;:44;;-1:-1:-1;;2375:44:10;;;2327:103;1919:517;;;:::o;726:53::-;;;;;;;;;;;;;;;:::o;932:176:19:-;990:7;1021:5;;;1044:6;;;;1036:46;;;;;-1:-1:-1;;;;;1036:46:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;1100:1;932:176;-1:-1:-1;;;932:176:19:o;5422:1449:8:-;5691:22;;;;-1:-1:-1;;;;;5691:22:8;;;;;;;;;26:21:-1;;;5691:22:8;22:32:-1;6:49;;5802:2:8;5691:22;;;5792:13;;;;;;;;;;5484;;5691:22;;5484:13;;5792;;;21:6:-1;;104:10;5792:13:8;87:34:-1;135:17;;-1:-1;5792:13:8;5765:40;;5858:20;:11;5870:1;5858:14;;;;;;;;;;;;;;:20;-1:-1:-1;;;;;5858:20:8;;;;;;;;;5888;:11;5900:1;5888:14;;;;;;;;;;;;;;:20;-1:-1:-1;;;;;5888:20:8;;;;;;;;-1:-1:-1;6117:9:8;6112:668;6136:2;6132:1;:6;6112:668;;;6204:15;6247:2;6228:12;6241:1;6228:15;;;;;;;;;;;;;;;-1:-1:-1;;;6228:15:8;;-1:-1:-1;;;6228:15:8;-1:-1:-1;;;6222:22:8;;:27;;;;;;;;;;6204:45;;6263:16;6312:9;6307:2;:14;6288:12;6301:1;6288:15;;;;;;;;;;;;;;-1:-1:-1;;;6288:15:8;;;;;;6282:22;:39;;-1:-1:-1;6384:15:8;6414:2;6402:14;;;;:64;;6451:9;6463:2;6451:14;-1:-1:-1;;;6444:22:8;6402:64;;;6426:9;6438:2;6426:14;-1:-1:-1;;;6419:22:8;6402:64;6384:82;;6480:16;6512:2;6499:10;:15;;;:67;;6550:10;6563:2;6550:15;-1:-1:-1;;;6543:23:8;6499:67;;;6524:10;6537:2;6524:15;-1:-1:-1;;;6517:23:8;6499:67;6480:86;;6663:9;6638:11;6654:1;6650;:5;6658:1;6650:9;6638:22;;;;;;;;;;;;;;:34;-1:-1:-1;;;;;6638:34:8;;;;;;;;;6711:8;6686:11;6702:1;6698;:5;6706:1;6698:9;6686:22;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;6686:33:8;;;;;;;;-1:-1:-1;;6140:3:8;;;;;-1:-1:-1;6112:668:8;;-1:-1:-1;;6112:668:8;;-1:-1:-1;6852:11:8;5422:1449;-1:-1:-1;;;5422:1449:8:o;250:703:20:-;306:13;523:10;;519:51;;;-1:-1:-1;549:10:20;;;;;;;;;;;;;;;;;;;519:51;594:5;579:12;633:75;640:9;;633:75;;665:8;;695:2;687:10;;;;633:75;;;717:19;749:6;739:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;739:17:20;87:34:-1;135:17;;-1:-1;739:17:20;;717:39;;766:150;773:10;;766:150;;-1:-1:-1;;799:11:20;;;;875:2;867:5;:10;854:2;:24;-1:-1:-1;;;841:39:20;824:6;831;824:14;;;;;;;;;;;;;;:56;-1:-1:-1;;;;;824:56:20;;;;;;;;-1:-1:-1;903:2:20;894:11;;;;766:150;;5204:212:8;5332:13;5388:1;5397;5406;5371:37;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5371:37:8;;;;;;;;;;;;;;;;;;-1:-1:-1;5371:37:8;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5371:37:8;;;;;;;;;;;;;;;;;;-1:-1:-1;5371:37:8;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5371:37:8;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5371:37:8;;;5357:52;;5204:212;;;;;:::o;1154:184:17:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;;1154:184;-1:-1:-1;;;;1154:184:17:o;400:1126:9:-;520:26;558:25;600:6;586:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;586:21:9;-1:-1:-1;558:49:9;-1:-1:-1;617:21:9;761:9;:13;-1:-1:-1;757:570:9;;;790:26;819:18;;:89;;;-1:-1:-1;;;;;819:89:9;;;;;;;;;;-1:-1:-1;;;;;819:18:9;;;;:48;;:89;;;;;;;;;;;;;;;:18;:89;;;5:2:-1;;;;30:1;27;20:12;5:2;819:89:9;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;819:89:9;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;819:89:9;;-1:-1:-1;943:30:9;819:89;966:6;943:30;:22;:30;:::i;:::-;930:9;:43;;922:84;;;;;-1:-1:-1;;;;;922:84:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1020:14;1037:45;1051:30;:18;1074:6;1051:30;:22;:30;:::i;:::-;1037:9;;:45;:13;:45;:::i;:::-;1020:62;;1115:4;1096:23;;1147:1;1138:6;:10;1134:183;;;1282:20;;1260:2;;-1:-1:-1;;;;;1282:12:9;;;:20;;;;;1295:6;;1222:19;1282:20;1222:19;1282:20;1295:6;1282:12;:20;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1282:20:9;1134:183;;757:570;;;1342:9;1337:157;1361:6;1357:1;:10;1337:157;;;1402:43;1413:2;1417:9;1428:16;1402:10;:43::i;:::-;1388:8;1397:1;1388:11;;;;;;;;;;;;;;;;;:57;;;;;1464:19;1473:9;1464:19;;;;;;;;;;;;;;;;;;1369:3;;1337:157;;;-1:-1:-1;1511:8:9;;400:1126;-1:-1:-1;;;;;400:1126:9:o;1689:662:17:-;1772:7;1814:4;1772:7;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1934:28:17;;;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;-1:-1:-1;1866:3:17;;1828:488;;2287:459:19;2345:7;2586:6;;2582:45;;;-1:-1:-1;2615:1:19;2608:8;;2582:45;2649:5;;;2653:1;2649;:5;2672;;;;;;;;:10;2664:56;;;;;-1:-1:-1;;;;;2664:56:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:134;1430:7;1456:43;1460:1;1463;1456:43;;;;;;;;;;;;;;;;;;:3;:43::i;3979:2851:10:-;4104:16;4141:36;;;:24;:36;;;;;;;;4140:37;4132:87;;;;;-1:-1:-1;;;;;4132:87:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4357:23;;;;;;;;;;;;;;26:21:-1;;;4357:23:10;22:32:-1;6:49;;4357:23:10;;;;;;4347:34;;;;;;;4273:18;;;:56;;;;;;;;;;;;4347:34;;-1:-1:-1;;;;;4273:18:10;;;;:44;;:56;;;;;:18;;:56;;;;;:18;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;4273:56:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4273:56:10;;;;;;39:16:-1;36:1;17:17;2:54;101:4;4273:56:10;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;4273:56:10;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;4273:56:10;;;;;;4256:74;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4256:74:10;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4256:74:10;;;4246:85;;;;;;:135;;4229:1232;;;4431:9;:14;4406:136;;;;;-1:-1:-1;;;;;4406:136:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4744:18;;:60;;;-1:-1:-1;;;;;4744:60:10;;;;;;;;;;-1:-1:-1;;;;;4744:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;4744:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4744:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4744:60:10;4587:18;;:57;;;-1:-1:-1;;;;;4587:57:10;;;;;;;;;;-1:-1:-1;;;;;4587:18:10;;;;:45;;:57;;;;;4744:60;;4587:57;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;4587:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4587:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4587:57:10;4581:159;;;;;;4677:10;4581:159;;;;4717:4;4581:159;;;;;;-1:-1:-1;;;;;4581:74:10;;;;;;:159;;;;;4587:57;;4581:159;;;;;;;;:74;:159;;;5:2:-1;;;;30:1;27;20:12;5:2;4581:159:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4581:159:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4581:159:10;:223;;4556:316;;;;;-1:-1:-1;;;;;4556:316:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5039:18;;:60;;;-1:-1:-1;;;;;5039:60:10;;;;;;;;;;-1:-1:-1;;;;;5039:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;5039:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5039:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5039:60:10;4917:18;;:57;;;-1:-1:-1;;;;;4917:57:10;;;;;;;;;;-1:-1:-1;;;;;4917:18:10;;;;:45;;:57;;;;;5039:60;;4917:57;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;4917:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4917:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4917:57:10;4911:124;;;;;;5007:10;4911:124;;;;;;-1:-1:-1;;;;;4911:74:10;;;;;;:124;;;;;4917:57;;4911:124;;;;;;;;:74;:124;;;5:2:-1;;;;30:1;27;20:12;5:2;4911:124:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4911:124:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4911:124:10;:188;;4886:268;;;;;-1:-1:-1;;;;;4886:268:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;5168:28;5185:10;5168:16;:28::i;:::-;4229:1232;;;5265:18;;:60;;;-1:-1:-1;;;;;5265:60:10;;;;;;;;;;-1:-1:-1;;;;;5265:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;5265:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5265:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5265:60:10;5252:9;:73;;5227:164;;;;;-1:-1:-1;;;;;5227:164:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5405:45;5420:10;5432:17;5405:14;:45::i;:::-;5551:33;;;;:21;:33;;;;;;;;5547:91;;;5594:10;5608:9;5594:23;5586:52;;;;;-1:-1:-1;;;;;5586:52:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;5730:1;5699:28;;;:16;:28;;;;;;:32;5695:274;;;5817:28;;;;:16;:28;;;;;;;;;5791:10;5772:30;;:18;:30;;;;;:42;;;;;;;;;;:73;5747:153;;;;;-1:-1:-1;;;;;5747:153:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;5933:10;5914:30;;;;:18;:30;;;;;;;;:42;;;;;;;;:44;;;;;;5695:274;5979:15;5997:18;;:52;;;;;;-1:-1:-1;;;;;5997:52:10;;;;;;;;;;;;;6038:10;5997:52;;;;;;:18;;;;;:23;;:52;;;;;;;;;;;;;;5979:15;5997:18;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;5997:52:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5997:52:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5997:52:10;6373:33;;;;:21;5997:52;6373:33;;;;;5997:52;;-1:-1:-1;;;6373:37:10;506:9;5997:52;6348:21;:62;6344:136;;;6426:36;;;;:24;:36;;;;;:43;;-1:-1:-1;;6426:43:10;6465:4;6426:43;;;6344:136;6494:28;;;;:16;:28;;;;;;;;6490:309;;;6577:43;;;;:31;:43;;;;;;;;;;6563:74;;;;;;;-1:-1:-1;;;;;6577:43:10;;;;6563:72;;:74;;;;6577:43;6563:74;;;;;;6577:43;6563:74;;;5:2:-1;;;;30:1;27;20:12;5:2;6563:74:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6563:74:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6563:74:10;6538:153;;;;;;;-1:-1:-1;;;;;6538:153:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;6719:43;;;;:31;:43;;;;;;;;;6705:83;;;;;6777:10;6705:83;;;;;;;;;-1:-1:-1;;;;;6719:43:10;;;;6705:71;;:83;;;;;6719:43;6705:83;;;;;;;;;6719:43;6705:83;;;5:2:-1;;;;30:1;27;20:12;5:2;6705:83:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6705:83:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;6816:7:10;3979:2851;-1:-1:-1;;;;3979:2851:10:o;2357:218:17:-;2425:13;2473:15;;;2508:4;2501:15;2554:4;2538:21;;;2459:110::o;1830:217:19:-;1946:7;1981:12;1973:6;;;;1965:29;;;;-1:-1:-1;;;;;1965:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1965:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2016:5:19;;;1830:217::o;8776:2037:10:-;8841:26;8870:18;;:60;;;-1:-1:-1;;;;;8870:60:10;;;;;;;;;;-1:-1:-1;;;;;8870:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;8870:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8870:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8870:60:10;8940:28;9016:18;;:45;;;;;;;;8870:60;;-1:-1:-1;8940:28:10;;8971:100;;-1:-1:-1;;;;;9016:18:10;;;;:43;;:45;;;;;8870:60;;9016:45;;;;;;;:18;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;9016:45:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9016:45:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9016:45:10;8971:27;:18;8994:3;8971:27;:22;:27;:::i;:::-;:31;:100;:31;:100;:::i;:::-;8940:131;;9108:1;9085:20;:24;9081:272;;;9131:18;;:57;;;-1:-1:-1;;;;;9131:57:10;;;;;;;;;;-1:-1:-1;;;;;9131:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;9131:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9131:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9131:57:10;9248:18;;:42;;;;;;;;-1:-1:-1;;;;;9125:77:10;;;;;;9220:10;;9248:18;;;:40;;:42;;;;;9131:57;;9248:42;;;;;;;;:18;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;9248:42:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9248:42:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9248:42:10;9125:217;;;-1:-1:-1;;;9125:217:10;;;;;;-1:-1:-1;;;;;9125:217:10;;;;;;;;;;;;;;;;;;;;;;;;;;;9248:42;;9125:217;;;;;;;-1:-1:-1;9125:217:10;;;;5:2:-1;;;;30:1;27;20:12;5:2;9125:217:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9125:217:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;9081:272:10;9362:22;9387:44;:18;9410:20;9387:44;:22;:44;:::i;:::-;9362:69;;9442:18;9463:44;9491:15;;9463:23;9482:3;9463:14;:18;;:23;;;;:::i;:44::-;9442:65;;9534:1;9521:10;:14;9517:222;;;9557:18;;:57;;;-1:-1:-1;;;;;9557:57:10;;;;;;;;;;-1:-1:-1;;;;;9557:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;9557:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9557:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9557:57:10;9674:12;;9551:177;;;;;;9646:10;9551:177;;;;-1:-1:-1;;;;;9674:12:10;;;9551:177;;;;;;;;;;;;:77;;;;;;;:177;;;;;9557:57;;9551:177;;;;;;;9674:12;9551:77;:177;;;5:2:-1;;;;30:1;27;20:12;5:2;9551:177:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9551:177:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;9517:222:10;9749:20;9772:60;9821:10;9772:44;:18;9795:20;9772:44;:22;:44;:::i;:::-;:48;:60;:48;:60;:::i;:::-;9842:29;9885:18;;:67;;;-1:-1:-1;;;;;9885:67:10;;;;;;;;;;9749:83;;-1:-1:-1;9842:29:10;;;;-1:-1:-1;;;;;9885:18:10;;;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;9885:67:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9885:67:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9885:67:10;:71;9881:576;;;10039:18;;:67;;;-1:-1:-1;;;;;10039:67:10;;;;;;;;;;9996:124;;-1:-1:-1;;;;;10039:18:10;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;9996:124:10;9972:148;;10162:1;10138:21;:25;10134:313;;;10189:18;;:57;;;-1:-1:-1;;;;;10189:57:10;;;;;;;;;;-1:-1:-1;;;;;10189:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;10189:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10189:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10189:57:10;10314:18;;:57;;;;;;;;;;;;;;-1:-1:-1;;;;;10183:77:10;;;;;;10282:10;;10314:18;;;:45;;:57;;;;;10189;;10314;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;10314:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10314:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10314:57:10;10183:249;;;-1:-1:-1;;;10183:249:10;;;;;;-1:-1:-1;;;;;10183:249:10;;;;;;;;;;;;;;;;;;;;;;;;;;;10314:57;;10183:249;;;;;;;-1:-1:-1;10183:249:10;;;;5:2:-1;;;;30:1;27;20:12;5:2;10183:249:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10183:249:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10134:313:10;10466:20;10489:39;:12;10506:21;10489:39;:16;:39;:::i;:::-;10466:62;;10557:1;10542:12;:16;10538:269;;;10580:18;;:57;;;-1:-1:-1;;;;;10580:57:10;;;;;;;;;;-1:-1:-1;;;;;10580:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;10580:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10580:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10580:57:10;10697:18;;:55;;;-1:-1:-1;;;;;10697:55:10;;;;;;;;;;-1:-1:-1;;;;;10574:77:10;;;;;;10669:10;;10697:18;;;:43;;:55;;;;;10580:57;;10697:55;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;10697:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10697:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10697:55:10;10574:222;;;-1:-1:-1;;;10574:222:10;;;;;;-1:-1:-1;;;;;10574:222:10;;;;;;;;;;;;;;;;;;;;;;;;;;;10697:55;;10574:222;;;;;;;-1:-1:-1;10574:222:10;;;;5:2:-1;;;;30:1;27;20:12;5:2;10574:222:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10574:222:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10538:269:10;8776:2037;;;;;;;;:::o;6836:1934::-;6939:1;6927:9;:13;6923:1841;;;6956:26;6985:18;;:90;;;-1:-1:-1;;;;;6985:90:10;;;;;;;;;;-1:-1:-1;;;;;6985:18:10;;;;:48;;:90;;;;;;;;;;;;;;;:18;:90;;;5:2:-1;;;;30:1;27;20:12;5:2;6985:90:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6985:90:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6985:90:10;7089:14;7137:18;;:60;;;-1:-1:-1;;;;;7137:60:10;;;;;;;;;;6985:90;;-1:-1:-1;7089:14:10;;7106:105;;-1:-1:-1;;;;;7137:18:10;;;;:48;;:60;;;;;6985:90;;7137:60;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;7137:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7137:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7137:60:10;7106:9;;:105;:13;:105;:::i;:::-;7089:122;;7230:17;7229:18;:32;;;;;7260:1;7251:6;:10;7229:32;7225:98;;;7281:27;;:10;;:27;;;;;7301:6;;7281:27;;;;7301:6;7281:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7281:27:10;7225:98;7336:28;7416:18;;:45;;;;;;;;7367:108;;-1:-1:-1;;;;;7416:18:10;;:43;;:45;;;;;;;;;;;;;;:18;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;7416:45:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7416:45:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7416:45:10;7367:27;:18;7390:3;7367:27;:22;:27;:::i;:108::-;7336:139;;7516:1;7493:20;:24;7489:136;;;7537:18;;;;;;;;;-1:-1:-1;;;;;7537:18:10;-1:-1:-1;;;;;7537:40:10;;:42;;;;;-1:-1:-1;;;7537:42:10;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7537:42:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7537:42:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7537:42:10;:73;;-1:-1:-1;;;;;7537:51:10;;;;:73;;;;;7589:20;;7537:73;;;;7589:20;7537:51;:73;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7537:73:10;7489:136;7639:22;7664:44;:18;7687:20;7664:44;:22;:44;:::i;:::-;7639:69;;7723:18;7744:44;7772:15;;7744:23;7763:3;7744:14;:18;;:23;;;;:::i;:44::-;7723:65;;7819:1;7806:10;:14;7802:86;;;7840:12;;:33;;-1:-1:-1;;;;;7840:12:10;;;;:33;;;;;7862:10;;7840:12;:33;:12;:33;7862:10;7840:12;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7840:33:10;7802:86;7902:20;7925:60;7974:10;7925:44;:18;7948:20;7925:44;:22;:44;:::i;:60::-;7999:29;8046:18;;:67;;;-1:-1:-1;;;;;8046:67:10;;;;;;;;;;7902:83;;-1:-1:-1;7999:29:10;;;;-1:-1:-1;;;;;8046:18:10;;;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;8046:67:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8046:67:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8046:67:10;:71;8042:490;;;8208:18;;:67;;;-1:-1:-1;;;;;8208:67:10;;;;;;;;;;8161:132;;-1:-1:-1;;;;;8208:18:10;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;8161:132:10;8137:156;;8339:1;8315:21;:25;8311:207;;;8364:18;;:57;;;;;;;;;;;;;;-1:-1:-1;;;;;8364:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;8364:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8364:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8364:57:10;:135;;-1:-1:-1;;;;;8364:66:10;;;;:135;;;;;8456:21;;8364:135;;;;8456:21;8364:66;:135;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8364:135:10;8311:207;8545:20;8568:39;:12;8585:21;8568:39;:16;:39;:::i;:::-;8545:62;;8640:1;8625:12;:16;8621:133;;;8661:18;;:55;;;-1:-1:-1;;;;;8661:55:10;;;;;;;;;;-1:-1:-1;;;;;8661:18:10;;;;:43;;:55;;;;;;;;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;8661:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8661:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8661:55:10;:78;;-1:-1:-1;;;;;8661:64:10;;;;:78;;;;;8726:12;;8661:78;;;;8726:12;8661:64;:78;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8661:78:10;6923:1841;;;;;;;;;6836:1934;;:::o;3201:130:19:-;3259:7;3285:39;3289:1;3292;3285:39;;;;;;;;;;;;;;;;;;3962:7;4062:12;4055:5;;;4047:28;;;;-1:-1:-1;;;;;4047:28:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4047:28:19;;4085:9;4101:1;4097;:5;;;;;;;;;3846:368;-1:-1:-1;;;;;3846:368:19:o

Swarm Source

bzzr://120f13757f5b94fb335dcec02f41b30a06789404d87422fb2cc33eadb2e3da91

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.