ETH Price: $3,106.87 (+1.55%)
Gas: 3 Gwei

Contract

0x49b3f5230248E6dc637860c842221A2748DFA3a7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Approval For...186115312023-11-20 7:31:35233 days ago1700465495IN
SunBlocks: SBLOCKS Token
0 ETH0.0016890236.23047495
Set Approval For...169213522023-03-27 21:20:47471 days ago1679952047IN
SunBlocks: SBLOCKS Token
0 ETH0.0015282332.78129354
Set Approval For...163078682022-12-31 22:55:35557 days ago1672527335IN
SunBlocks: SBLOCKS Token
0 ETH0.0007330515.70014434
Set Approval For...163057982022-12-31 16:00:23557 days ago1672502423IN
SunBlocks: SBLOCKS Token
0 ETH0.0009054819.39322688
Set Approval For...161209892022-12-05 20:31:59583 days ago1670272319IN
SunBlocks: SBLOCKS Token
0 ETH0.0006245113.38932902
Set Approval For...159425632022-11-10 22:20:23608 days ago1668118823IN
SunBlocks: SBLOCKS Token
0 ETH0.0011045623.6813612
Set Approval For...158877992022-11-03 6:46:35615 days ago1667457995IN
SunBlocks: SBLOCKS Token
0 ETH0.0006490613.91558533
Set Approval For...158723922022-11-01 3:03:35617 days ago1667271815IN
SunBlocks: SBLOCKS Token
0 ETH0.0006361613.63906088
Set Approval For...158648012022-10-31 1:37:11619 days ago1667180231IN
SunBlocks: SBLOCKS Token
0 ETH0.000199228.03633511
Set Approval For...158560642022-10-29 20:21:47620 days ago1667074907IN
SunBlocks: SBLOCKS Token
0 ETH0.0004917310.54251435
Set Approval For...158167022022-10-24 8:14:35625 days ago1666599275IN
SunBlocks: SBLOCKS Token
0 ETH0.0006073613.02161094
Set Approval For...157887842022-10-20 10:42:23629 days ago1666262543IN
SunBlocks: SBLOCKS Token
0 ETH0.0008729518.71560947
Set Approval For...157886122022-10-20 10:07:47629 days ago1666260467IN
SunBlocks: SBLOCKS Token
0 ETH0.0010870723.30626229
Set Approval For...157883092022-10-20 9:06:59629 days ago1666256819IN
SunBlocks: SBLOCKS Token
0 ETH0.0008992619.27971655
Set Approval For...157871482022-10-20 5:13:59629 days ago1666242839IN
SunBlocks: SBLOCKS Token
0 ETH0.00085818.39510965
Set Approval For...157863622022-10-20 2:35:47629 days ago1666233347IN
SunBlocks: SBLOCKS Token
0 ETH0.0009214119.75467908
Set Approval For...157837802022-10-19 17:55:35630 days ago1666202135IN
SunBlocks: SBLOCKS Token
0 ETH0.0022026447.22357933
Set Approval For...157171282022-10-10 10:32:47639 days ago1665397967IN
SunBlocks: SBLOCKS Token
0 ETH0.0019344241.49425365
Set Approval For...157171272022-10-10 10:32:35639 days ago1665397955IN
SunBlocks: SBLOCKS Token
0 ETH0.0018447139.49895031
Set Approval For...157171262022-10-10 10:32:23639 days ago1665397943IN
SunBlocks: SBLOCKS Token
0 ETH0.0017823238.16296087
Set Approval For...156185032022-09-26 15:41:23653 days ago1664206883IN
SunBlocks: SBLOCKS Token
0 ETH0.0010552722.6012387
Transfer From156146072022-09-26 2:37:11653 days ago1664159831IN
SunBlocks: SBLOCKS Token
0 ETH0.000535816.30903247
Set Approval For...155530042022-09-17 11:28:11662 days ago1663414091IN
SunBlocks: SBLOCKS Token
0 ETH0.000271785.82987314
Set Approval For...154962692022-09-08 11:18:43671 days ago1662635923IN
SunBlocks: SBLOCKS Token
0 ETH0.0004796910.2895953
Set Approval For...154783092022-09-05 14:10:33674 days ago1662387033IN
SunBlocks: SBLOCKS Token
0 ETH0.0004746410.18128322
View all transactions

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To Value
133682142021-10-06 22:57:081008 days ago1633561028
SunBlocks: SBLOCKS Token
2.6592 ETH
133671272021-10-06 18:49:321008 days ago1633546172
SunBlocks: SBLOCKS Token
11.02475 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SunBlocks

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-06
*/

// File: @openzeppelin/contracts/utils/Counters.sol
pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. 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;`
 */
library Counters {
    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 {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: contracts/WithLimitedSupply.sol


pragma solidity ^0.8.0;


/// @author 1001.digital 
/// @title A token tracker that limits the token supply and increments token IDs on each new mint.
abstract contract WithLimitedSupply {
    using Counters for Counters.Counter;

    // Keeps track of how many we have minted
    Counters.Counter private _tokenCount;

    /// @dev The maximum count of tokens this token tracker will hold.
    uint256 private _maxSupply;

    /// Instanciate the contract
    /// @param totalSupply_ how many tokens this collection should hold
    constructor (uint256 totalSupply_) {
        _maxSupply = totalSupply_;
    }

    /// @dev Get the max Supply
    /// @return the maximum token count
    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }

    /// @dev Get the current token count
    /// @return the created token count
    function tokenCount() public view returns (uint256) {
        return _tokenCount.current();
    }

    /// @dev Check whether tokens are still available
    /// @return the available token count
    function availableTokenCount() public view returns (uint256) {
        return maxSupply() - tokenCount();
    }

    /// @dev Increment the token count and fetch the latest count
    /// @return the next token id
    function nextToken() internal virtual ensureAvailability returns (uint256) {
        uint256 token = _tokenCount.current();

        _tokenCount.increment();

        return token;
    }

    /// @dev Check whether another token is still available
    modifier ensureAvailability() {
        require(availableTokenCount() > 0, "No more tokens available");
        _;
    }

    /// @param amount Check whether number of tokens are still available
    /// @dev Check whether tokens are still available
    modifier ensureAvailabilityFor(uint256 amount) {
        require(availableTokenCount() >= amount, "Requested number of tokens not available");
        _;
    }
}
// File: contracts/RandomlyAssigned.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// @title Randomly assign tokenIDs from a given set of tokens.
abstract contract RandomlyAssigned is WithLimitedSupply {
    // Used for random index assignment
    mapping(uint256 => uint256) private tokenMatrix;

    // The initial token ID
    uint256 private startFrom;

    /// Instanciate the contract
    /// @param _maxSupply how many tokens this collection should hold
    /// @param _startFrom the tokenID with which to start counting
    constructor (uint256 _maxSupply, uint256 _startFrom)
        WithLimitedSupply(_maxSupply)
    {
        startFrom = _startFrom;
    }

    /// Get the next token ID
    /// @dev Randomly gets a new token ID and keeps track of the ones that are still available.
    /// @return the next token ID
    function nextToken() internal override ensureAvailability returns (uint256) {
        uint256 maxIndex = maxSupply() - tokenCount();
        uint256 random = uint256(keccak256(
            abi.encodePacked(
                msg.sender,
                block.coinbase,
                block.difficulty,
                block.gaslimit,
                block.timestamp
            )
        )) % maxIndex;

        uint256 value = 0;
        if (tokenMatrix[random] == 0) {
            // If this matrix position is empty, set the value to the generated random number.
            value = random;
        } else {
            // Otherwise, use the previously stored number from the matrix.
            value = tokenMatrix[random];
        }

        // If the last available tokenID is still unused...
        if (tokenMatrix[maxIndex - 1] == 0) {
            // ...store that ID in the current matrix position.
            tokenMatrix[random] = maxIndex - 1;
        } else {
            // ...otherwise copy over the stored number to the current matrix position.
            tokenMatrix[random] = tokenMatrix[maxIndex - 1];
        }

        // Increment counts
        super.nextToken();

        return value + startFrom;
    }
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol



pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * 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
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * 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: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

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

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
pragma solidity ^0.8.0;
/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol



pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => 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;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @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 {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @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 = ERC721.balanceOf(from) - 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
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @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 - 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
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract SunBlocks is ERC721Enumerable, Ownable, RandomlyAssigned {
  using Strings for uint256;
  
  string public baseExtension = ".json";
  uint256 public cost = 0.0277 ether;
  uint256 public maxBlocksSupply = 555;
  uint256 public maxMintAmount = 10;
  bool public paused = false;

  uint public publicSupplyMinted = 0;
  uint public publicMaxSupply = 485;

  uint public presaleSupplyMinted = 0;
  uint public presaleMaxSupply = 70;

  mapping(address => uint256) public presaleList;
  
  string public baseURI;

  constructor(
  ) ERC721("SunBlocks", "SBLOCKS")
  RandomlyAssigned(555, 1) {
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  // public
  function mint(uint256 _mintAmount) public payable {
    require(!paused);
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(totalSupply() + _mintAmount <= maxBlocksSupply);
    require(publicSupplyMinted + _mintAmount <= publicMaxSupply);
    require(msg.value >= cost * _mintAmount);

    for (uint256 i = 1; i <= _mintAmount; i++) {
      uint256 mintIndex = nextToken();

      _safeMint(_msgSender(), mintIndex);
    }

    publicSupplyMinted = publicSupplyMinted + _mintAmount;
  }

  function presaleMint(uint256 _mintAmount) public payable {
      require(!paused);
      require(_mintAmount > 0);
      require(_mintAmount <= maxMintAmount);
      require(totalSupply() + _mintAmount <= maxBlocksSupply);
      require(presaleSupplyMinted + _mintAmount <= presaleMaxSupply);

      uint256 senderLimit = presaleList[msg.sender];

      require(senderLimit > 0, "You have no tokens left");
      require(_mintAmount <= senderLimit, "Your max token holding exceeded");


      for (uint256 i = 0; i < _mintAmount; i++) {
        uint256 mintIndex = nextToken();
        _safeMint(_msgSender(), mintIndex);
        senderLimit -= 1;
      }

      presaleSupplyMinted = presaleSupplyMinted + _mintAmount;
      presaleList[msg.sender] = senderLimit;
  }


  function addPresaleList(
      address[] calldata _addrs,
      uint256[] calldata _limit
  ) public onlyOwner {
      require(_addrs.length == _limit.length);
      for (uint256 i = 0; i < _addrs.length; i++) {
          presaleList[_addrs[i]] = _limit[i];
      }
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  //only owner

  function withdraw() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"addPresaleList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBlocksSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600f90805190602001906200005192919062000251565b5066626900d447400060105561022b601155600a6012556000601360006101000a81548160ff02191690831515021790555060006014556101e560155560006016556046601755348015620000a557600080fd5b5061022b6001816040518060400160405280600981526020017f53756e426c6f636b7300000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f53424c4f434b530000000000000000000000000000000000000000000000000081525081600090805190602001906200013092919062000251565b5080600190805190602001906200014992919062000251565b5050506200016c620001606200018360201b60201c565b6200018b60201b60201c565b80600c819055505080600e81905550505062000366565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025f9062000301565b90600052602060002090601f016020900481019282620002835760008555620002cf565b82601f106200029e57805160ff1916838001178555620002cf565b82800160010185558215620002cf579182015b82811115620002ce578251825591602001919060010190620002b1565b5b509050620002de9190620002e2565b5090565b5b80821115620002fd576000816000905550600101620002e3565b5090565b600060028204905060018216806200031a57607f821691505b6020821081141562000331576200033062000337565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6148ea80620003766000396000f3fe6080604052600436106102305760003560e01c80636c0360eb1161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461082c578063dccfbe4d14610857578063e14ca35314610882578063e985e9c5146108ad578063f2fde38b146108ea57610230565b8063a22cb46514610756578063b88d4fde1461077f578063c6682862146107a8578063c87b56dd146107d3578063c9b298f11461081057610230565b806388f627f7116100f257806388f627f71461068e5780638da5cb5b146106b957806395d89b41146106e45780639f181b5e1461070f578063a0712d681461073a57610230565b80636c0360eb146105bb57806370a08231146105e6578063715018a61461062357806378cbcf231461063a57806385fa83281461066557610230565b806323b872dd116101bc578063456918001161018057806345691800146104c25780634f6ccce7146104ed57806355f804b31461052a5780635c975abb146105535780636352211e1461057e57610230565b806323b872dd146103ec5780632f745c59146104155780633ccfd60b1461045257806342842e0e1461045c578063438b63001461048557610230565b8063095ea7b311610203578063095ea7b31461030557806312fb92e01461032e57806313faede61461036b57806318160ddd14610396578063239c70ae146103c157610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d57806308fc299b146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906133a6565b610913565b6040516102699190613a87565b60405180910390f35b34801561027e57600080fd5b5061028761098d565b6040516102949190613aa2565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613449565b610a1f565b6040516102d191906139fe565b60405180910390f35b3480156102e657600080fd5b506102ef610aa4565b6040516102fc9190613d64565b60405180910390f35b34801561031157600080fd5b5061032c600480360381019061032791906132e5565b610aaa565b005b34801561033a57600080fd5b5061035560048036038101906103509190613162565b610bc2565b6040516103629190613d64565b60405180910390f35b34801561037757600080fd5b50610380610bda565b60405161038d9190613d64565b60405180910390f35b3480156103a257600080fd5b506103ab610be0565b6040516103b89190613d64565b60405180910390f35b3480156103cd57600080fd5b506103d6610bed565b6040516103e39190613d64565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e91906131cf565b610bf3565b005b34801561042157600080fd5b5061043c600480360381019061043791906132e5565b610c53565b6040516104499190613d64565b60405180910390f35b61045a610cf8565b005b34801561046857600080fd5b50610483600480360381019061047e91906131cf565b610db4565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613162565b610dd4565b6040516104b99190613a65565b60405180910390f35b3480156104ce57600080fd5b506104d7610e82565b6040516104e49190613d64565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613449565b610e88565b6040516105219190613d64565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613400565b610ef9565b005b34801561055f57600080fd5b50610568610f8f565b6040516105759190613a87565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613449565b610fa2565b6040516105b291906139fe565b60405180910390f35b3480156105c757600080fd5b506105d0611054565b6040516105dd9190613aa2565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613162565b6110e2565b60405161061a9190613d64565b60405180910390f35b34801561062f57600080fd5b5061063861119a565b005b34801561064657600080fd5b5061064f611222565b60405161065c9190613d64565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613325565b611228565b005b34801561069a57600080fd5b506106a3611362565b6040516106b09190613d64565b60405180910390f35b3480156106c557600080fd5b506106ce611368565b6040516106db91906139fe565b60405180910390f35b3480156106f057600080fd5b506106f9611392565b6040516107069190613aa2565b60405180910390f35b34801561071b57600080fd5b50610724611424565b6040516107319190613d64565b60405180910390f35b610754600480360381019061074f9190613449565b611435565b005b34801561076257600080fd5b5061077d600480360381019061077891906132a5565b611519565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613222565b61169a565b005b3480156107b457600080fd5b506107bd6116fc565b6040516107ca9190613aa2565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190613449565b61178a565b6040516108079190613aa2565b60405180910390f35b61082a60048036038101906108259190613449565b611834565b005b34801561083857600080fd5b50610841611a19565b60405161084e9190613d64565b60405180910390f35b34801561086357600080fd5b5061086c611a23565b6040516108799190613d64565b60405180910390f35b34801561088e57600080fd5b50610897611a29565b6040516108a49190613d64565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf919061318f565b611a4a565b6040516108e19190613a87565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190613162565b611ade565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610986575061098582611bd6565b5b9050919050565b60606000805461099c90614074565b80601f01602080910402602001604051908101604052809291908181526020018280546109c890614074565b8015610a155780601f106109ea57610100808354040283529160200191610a15565b820191906000526020600020905b8154815290600101906020018083116109f857829003601f168201915b5050505050905090565b6000610a2a82611cb8565b610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090613c84565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60175481565b6000610ab582610fa2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1d90613d04565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b45611d24565b73ffffffffffffffffffffffffffffffffffffffff161480610b745750610b7381610b6e611d24565b611a4a565b5b610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa90613c04565b60405180910390fd5b610bbd8383611d2c565b505050565b60186020528060005260406000206000915090505481565b60105481565b6000600880549050905090565b60125481565b610c04610bfe611d24565b82611de5565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90613d24565b60405180910390fd5b610c4e838383611ec3565b505050565b6000610c5e836110e2565b8210610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613ae4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d00611d24565b73ffffffffffffffffffffffffffffffffffffffff16610d1e611368565b73ffffffffffffffffffffffffffffffffffffffff1614610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b90613ca4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610db257600080fd5b565b610dcf8383836040518060200160405280600081525061169a565b505050565b60606000610de1836110e2565b905060008167ffffffffffffffff811115610dff57610dfe61427c565b5b604051908082528060200260200182016040528015610e2d5781602001602082028036833780820191505090505b50905060005b82811015610e7757610e458582610c53565b828281518110610e5857610e5761424d565b5b6020026020010181815250508080610e6f906140d7565b915050610e33565b508092505050919050565b60165481565b6000610e92610be0565b8210610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90613d44565b60405180910390fd5b60088281548110610ee757610ee661424d565b5b90600052602060002001549050919050565b610f01611d24565b73ffffffffffffffffffffffffffffffffffffffff16610f1f611368565b73ffffffffffffffffffffffffffffffffffffffff1614610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90613ca4565b60405180910390fd5b8060199080519060200190610f8b929190612eca565b5050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613c44565b60405180910390fd5b80915050919050565b6019805461106190614074565b80601f016020809104026020016040519081016040528092919081815260200182805461108d90614074565b80156110da5780601f106110af576101008083540402835291602001916110da565b820191906000526020600020905b8154815290600101906020018083116110bd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a90613c24565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111a2611d24565b73ffffffffffffffffffffffffffffffffffffffff166111c0611368565b73ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90613ca4565b60405180910390fd5b611220600061211f565b565b60155481565b611230611d24565b73ffffffffffffffffffffffffffffffffffffffff1661124e611368565b73ffffffffffffffffffffffffffffffffffffffff16146112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90613ca4565b60405180910390fd5b8181905084849050146112b657600080fd5b60005b8484905081101561135b578282828181106112d7576112d661424d565b5b90506020020135601860008787858181106112f5576112f461424d565b5b905060200201602081019061130a9190613162565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611353906140d7565b9150506112b9565b5050505050565b60145481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113a190614074565b80601f01602080910402602001604051908101604052809291908181526020018280546113cd90614074565b801561141a5780601f106113ef5761010080835404028352916020019161141a565b820191906000526020600020905b8154815290600101906020018083116113fd57829003601f168201915b5050505050905090565b6000611430600b6121e5565b905090565b601360009054906101000a900460ff161561144f57600080fd5b6000811161145c57600080fd5b60125481111561146b57600080fd5b60115481611477610be0565b6114819190613e97565b111561148c57600080fd5b6015548160145461149d9190613e97565b11156114a857600080fd5b806010546114b69190613f1e565b3410156114c257600080fd5b6000600190505b8181116115015760006114da6121f3565b90506114ed6114e7611d24565b82612381565b5080806114f9906140d7565b9150506114c9565b50806014546115109190613e97565b60148190555050565b611521611d24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690613ba4565b60405180910390fd5b806005600061159c611d24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611649611d24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168e9190613a87565b60405180910390a35050565b6116ab6116a5611d24565b83611de5565b6116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613d24565b60405180910390fd5b6116f68484848461239f565b50505050565b600f805461170990614074565b80601f016020809104026020016040519081016040528092919081815260200182805461173590614074565b80156117825780601f1061175757610100808354040283529160200191611782565b820191906000526020600020905b81548152906001019060200180831161176557829003601f168201915b505050505081565b606061179582611cb8565b6117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb90613ce4565b60405180910390fd5b60006117de6123fb565b905060008151116117fe576040518060200160405280600081525061182c565b806118088461248d565b600f60405160200161181c939291906139cd565b6040516020818303038152906040525b915050919050565b601360009054906101000a900460ff161561184e57600080fd5b6000811161185b57600080fd5b60125481111561186a57600080fd5b60115481611876610be0565b6118809190613e97565b111561188b57600080fd5b6017548160165461189c9190613e97565b11156118a757600080fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590613ac4565b60405180910390fd5b80821115611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613b24565b60405180910390fd5b60005b828110156119bc5760006119866121f3565b9050611999611993611d24565b82612381565b6001836119a69190613f78565b92505080806119b4906140d7565b915050611974565b50816016546119cb9190613e97565b60168190555080601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000600c54905090565b60115481565b6000611a33611424565b611a3b611a19565b611a459190613f78565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ae6611d24565b73ffffffffffffffffffffffffffffffffffffffff16611b04611368565b73ffffffffffffffffffffffffffffffffffffffff1614611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613ca4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190613b44565b60405180910390fd5b611bd38161211f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb15750611cb0826125ee565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d9f83610fa2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df082611cb8565b611e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2690613be4565b60405180910390fd5b6000611e3a83610fa2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ea957508373ffffffffffffffffffffffffffffffffffffffff16611e9184610a1f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eba5750611eb98185611a4a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee382610fa2565b73ffffffffffffffffffffffffffffffffffffffff1614611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090613cc4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090613b84565b60405180910390fd5b611fb4838383612658565b611fbf600082611d2c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461200f9190613f78565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120669190613e97565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000806121fe611a29565b1161223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590613bc4565b60405180910390fd5b6000612248611424565b612250611a19565b61225a9190613f78565b9050600081334144454260405160200161227895949392919061396e565b6040516020818303038152906040528051906020012060001c61229b9190614160565b9050600080600d60008481526020019081526020016000205414156122c2578190506122d9565b600d60008381526020019081526020016000205490505b6000600d60006001866122ec9190613f78565b815260200190815260200160002054141561232a5760018361230e9190613f78565b600d600084815260200190815260200160002081905550612362565b600d600060018561233b9190613f78565b815260200190815260200160002054600d6000848152602001908152602001600020819055505b61236a61276c565b50600e54816123799190613e97565b935050505090565b61239b8282604051806020016040528060008152506127d6565b5050565b6123aa848484611ec3565b6123b684848484612831565b6123f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ec90613b04565b60405180910390fd5b50505050565b60606019805461240a90614074565b80601f016020809104026020016040519081016040528092919081815260200182805461243690614074565b80156124835780601f1061245857610100808354040283529160200191612483565b820191906000526020600020905b81548152906001019060200180831161246657829003601f168201915b5050505050905090565b606060008214156124d5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125e9565b600082905060005b600082146125075780806124f0906140d7565b915050600a826125009190613eed565b91506124dd565b60008167ffffffffffffffff8111156125235761252261427c565b5b6040519080825280601f01601f1916602001820160405280156125555781602001600182028036833780820191505090505b5090505b600085146125e25760018261256e9190613f78565b9150600a8561257d9190614160565b60306125899190613e97565b60f81b81838151811061259f5761259e61424d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125db9190613eed565b9450612559565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126638383836129c8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126a6576126a1816129cd565b6126e5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126e4576126e38382612a16565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127285761272381612b83565b612767565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612766576127658282612c54565b5b5b505050565b600080612777611a29565b116127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae90613bc4565b60405180910390fd5b60006127c3600b6121e5565b90506127cf600b612cd3565b8091505090565b6127e08383612ce9565b6127ed6000848484612831565b61282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282390613b04565b60405180910390fd5b505050565b60006128528473ffffffffffffffffffffffffffffffffffffffff16612eb7565b156129bb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261287b611d24565b8786866040518563ffffffff1660e01b815260040161289d9493929190613a19565b602060405180830381600087803b1580156128b757600080fd5b505af19250505080156128e857506040513d601f19601f820116820180604052508101906128e591906133d3565b60015b61296b573d8060008114612918576040519150601f19603f3d011682016040523d82523d6000602084013e61291d565b606091505b50600081511415612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90613b04565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129c0565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a23846110e2565b612a2d9190613f78565b9050600060076000848152602001908152602001600020549050818114612b12576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b979190613f78565b9050600060096000848152602001908152602001600020549050600060088381548110612bc757612bc661424d565b5b906000526020600020015490508060088381548110612be957612be861424d565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c3857612c3761421e565b5b6001900381819060005260206000200160009055905550505050565b6000612c5f836110e2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5090613c64565b60405180910390fd5b612d6281611cb8565b15612da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9990613b64565b60405180910390fd5b612dae60008383612658565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dfe9190613e97565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612ed690614074565b90600052602060002090601f016020900481019282612ef85760008555612f3f565b82601f10612f1157805160ff1916838001178555612f3f565b82800160010185558215612f3f579182015b82811115612f3e578251825591602001919060010190612f23565b5b509050612f4c9190612f50565b5090565b5b80821115612f69576000816000905550600101612f51565b5090565b6000612f80612f7b84613da4565b613d7f565b905082815260208101848484011115612f9c57612f9b6142ba565b5b612fa7848285614032565b509392505050565b6000612fc2612fbd84613dd5565b613d7f565b905082815260208101848484011115612fde57612fdd6142ba565b5b612fe9848285614032565b509392505050565b60008135905061300081614858565b92915050565b60008083601f84011261301c5761301b6142b0565b5b8235905067ffffffffffffffff811115613039576130386142ab565b5b602083019150836020820283011115613055576130546142b5565b5b9250929050565b60008083601f840112613072576130716142b0565b5b8235905067ffffffffffffffff81111561308f5761308e6142ab565b5b6020830191508360208202830111156130ab576130aa6142b5565b5b9250929050565b6000813590506130c18161486f565b92915050565b6000813590506130d681614886565b92915050565b6000815190506130eb81614886565b92915050565b600082601f830112613106576131056142b0565b5b8135613116848260208601612f6d565b91505092915050565b600082601f830112613134576131336142b0565b5b8135613144848260208601612faf565b91505092915050565b60008135905061315c8161489d565b92915050565b600060208284031215613178576131776142c4565b5b600061318684828501612ff1565b91505092915050565b600080604083850312156131a6576131a56142c4565b5b60006131b485828601612ff1565b92505060206131c585828601612ff1565b9150509250929050565b6000806000606084860312156131e8576131e76142c4565b5b60006131f686828701612ff1565b935050602061320786828701612ff1565b92505060406132188682870161314d565b9150509250925092565b6000806000806080858703121561323c5761323b6142c4565b5b600061324a87828801612ff1565b945050602061325b87828801612ff1565b935050604061326c8782880161314d565b925050606085013567ffffffffffffffff81111561328d5761328c6142bf565b5b613299878288016130f1565b91505092959194509250565b600080604083850312156132bc576132bb6142c4565b5b60006132ca85828601612ff1565b92505060206132db858286016130b2565b9150509250929050565b600080604083850312156132fc576132fb6142c4565b5b600061330a85828601612ff1565b925050602061331b8582860161314d565b9150509250929050565b6000806000806040858703121561333f5761333e6142c4565b5b600085013567ffffffffffffffff81111561335d5761335c6142bf565b5b61336987828801613006565b9450945050602085013567ffffffffffffffff81111561338c5761338b6142bf565b5b6133988782880161305c565b925092505092959194509250565b6000602082840312156133bc576133bb6142c4565b5b60006133ca848285016130c7565b91505092915050565b6000602082840312156133e9576133e86142c4565b5b60006133f7848285016130dc565b91505092915050565b600060208284031215613416576134156142c4565b5b600082013567ffffffffffffffff811115613434576134336142bf565b5b6134408482850161311f565b91505092915050565b60006020828403121561345f5761345e6142c4565b5b600061346d8482850161314d565b91505092915050565b60006134828383613939565b60208301905092915050565b61349f61349a82613fbe565b614132565b82525050565b6134ae81613fac565b82525050565b6134c56134c082613fac565b614120565b82525050565b60006134d682613e2b565b6134e08185613e59565b93506134eb83613e06565b8060005b8381101561351c5781516135038882613476565b975061350e83613e4c565b9250506001810190506134ef565b5085935050505092915050565b61353281613fd0565b82525050565b600061354382613e36565b61354d8185613e6a565b935061355d818560208601614041565b613566816142c9565b840191505092915050565b600061357c82613e41565b6135868185613e7b565b9350613596818560208601614041565b61359f816142c9565b840191505092915050565b60006135b582613e41565b6135bf8185613e8c565b93506135cf818560208601614041565b80840191505092915050565b600081546135e881614074565b6135f28186613e8c565b9450600182166000811461360d576001811461361e57613651565b60ff19831686528186019350613651565b61362785613e16565b60005b838110156136495781548189015260018201915060208101905061362a565b838801955050505b50505092915050565b6000613667601783613e7b565b9150613672826142e7565b602082019050919050565b600061368a602b83613e7b565b915061369582614310565b604082019050919050565b60006136ad603283613e7b565b91506136b88261435f565b604082019050919050565b60006136d0601f83613e7b565b91506136db826143ae565b602082019050919050565b60006136f3602683613e7b565b91506136fe826143d7565b604082019050919050565b6000613716601c83613e7b565b915061372182614426565b602082019050919050565b6000613739602483613e7b565b91506137448261444f565b604082019050919050565b600061375c601983613e7b565b91506137678261449e565b602082019050919050565b600061377f601883613e7b565b915061378a826144c7565b602082019050919050565b60006137a2602c83613e7b565b91506137ad826144f0565b604082019050919050565b60006137c5603883613e7b565b91506137d08261453f565b604082019050919050565b60006137e8602a83613e7b565b91506137f38261458e565b604082019050919050565b600061380b602983613e7b565b9150613816826145dd565b604082019050919050565b600061382e602083613e7b565b91506138398261462c565b602082019050919050565b6000613851602c83613e7b565b915061385c82614655565b604082019050919050565b6000613874602083613e7b565b915061387f826146a4565b602082019050919050565b6000613897602983613e7b565b91506138a2826146cd565b604082019050919050565b60006138ba602f83613e7b565b91506138c58261471c565b604082019050919050565b60006138dd602183613e7b565b91506138e88261476b565b604082019050919050565b6000613900603183613e7b565b915061390b826147ba565b604082019050919050565b6000613923602c83613e7b565b915061392e82614809565b604082019050919050565b61394281614028565b82525050565b61395181614028565b82525050565b61396861396382614028565b614156565b82525050565b600061397a82886134b4565b60148201915061398a828761348e565b60148201915061399a8286613957565b6020820191506139aa8285613957565b6020820191506139ba8284613957565b6020820191508190509695505050505050565b60006139d982866135aa565b91506139e582856135aa565b91506139f182846135db565b9150819050949350505050565b6000602082019050613a1360008301846134a5565b92915050565b6000608082019050613a2e60008301876134a5565b613a3b60208301866134a5565b613a486040830185613948565b8181036060830152613a5a8184613538565b905095945050505050565b60006020820190508181036000830152613a7f81846134cb565b905092915050565b6000602082019050613a9c6000830184613529565b92915050565b60006020820190508181036000830152613abc8184613571565b905092915050565b60006020820190508181036000830152613add8161365a565b9050919050565b60006020820190508181036000830152613afd8161367d565b9050919050565b60006020820190508181036000830152613b1d816136a0565b9050919050565b60006020820190508181036000830152613b3d816136c3565b9050919050565b60006020820190508181036000830152613b5d816136e6565b9050919050565b60006020820190508181036000830152613b7d81613709565b9050919050565b60006020820190508181036000830152613b9d8161372c565b9050919050565b60006020820190508181036000830152613bbd8161374f565b9050919050565b60006020820190508181036000830152613bdd81613772565b9050919050565b60006020820190508181036000830152613bfd81613795565b9050919050565b60006020820190508181036000830152613c1d816137b8565b9050919050565b60006020820190508181036000830152613c3d816137db565b9050919050565b60006020820190508181036000830152613c5d816137fe565b9050919050565b60006020820190508181036000830152613c7d81613821565b9050919050565b60006020820190508181036000830152613c9d81613844565b9050919050565b60006020820190508181036000830152613cbd81613867565b9050919050565b60006020820190508181036000830152613cdd8161388a565b9050919050565b60006020820190508181036000830152613cfd816138ad565b9050919050565b60006020820190508181036000830152613d1d816138d0565b9050919050565b60006020820190508181036000830152613d3d816138f3565b9050919050565b60006020820190508181036000830152613d5d81613916565b9050919050565b6000602082019050613d796000830184613948565b92915050565b6000613d89613d9a565b9050613d9582826140a6565b919050565b6000604051905090565b600067ffffffffffffffff821115613dbf57613dbe61427c565b5b613dc8826142c9565b9050602081019050919050565b600067ffffffffffffffff821115613df057613def61427c565b5b613df9826142c9565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ea282614028565b9150613ead83614028565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee257613ee1614191565b5b828201905092915050565b6000613ef882614028565b9150613f0383614028565b925082613f1357613f126141c0565b5b828204905092915050565b6000613f2982614028565b9150613f3483614028565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6d57613f6c614191565b5b828202905092915050565b6000613f8382614028565b9150613f8e83614028565b925082821015613fa157613fa0614191565b5b828203905092915050565b6000613fb782614008565b9050919050565b6000613fc982614008565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561405f578082015181840152602081019050614044565b8381111561406e576000848401525b50505050565b6000600282049050600182168061408c57607f821691505b602082108114156140a05761409f6141ef565b5b50919050565b6140af826142c9565b810181811067ffffffffffffffff821117156140ce576140cd61427c565b5b80604052505050565b60006140e282614028565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561411557614114614191565b5b600182019050919050565b600061412b82614144565b9050919050565b600061413d82614144565b9050919050565b600061414f826142da565b9050919050565b6000819050919050565b600061416b82614028565b915061417683614028565b925082614186576141856141c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f752068617665206e6f20746f6b656e73206c656674000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7572206d617820746f6b656e20686f6c64696e6720657863656564656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61486181613fac565b811461486c57600080fd5b50565b61487881613fd0565b811461488357600080fd5b50565b61488f81613fdc565b811461489a57600080fd5b50565b6148a681614028565b81146148b157600080fd5b5056fea2646970667358221220c357fc3983eba55c1fdc72adca6827beb8e5ddc2864752e8544f79425f7c4f9a64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102305760003560e01c80636c0360eb1161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461082c578063dccfbe4d14610857578063e14ca35314610882578063e985e9c5146108ad578063f2fde38b146108ea57610230565b8063a22cb46514610756578063b88d4fde1461077f578063c6682862146107a8578063c87b56dd146107d3578063c9b298f11461081057610230565b806388f627f7116100f257806388f627f71461068e5780638da5cb5b146106b957806395d89b41146106e45780639f181b5e1461070f578063a0712d681461073a57610230565b80636c0360eb146105bb57806370a08231146105e6578063715018a61461062357806378cbcf231461063a57806385fa83281461066557610230565b806323b872dd116101bc578063456918001161018057806345691800146104c25780634f6ccce7146104ed57806355f804b31461052a5780635c975abb146105535780636352211e1461057e57610230565b806323b872dd146103ec5780632f745c59146104155780633ccfd60b1461045257806342842e0e1461045c578063438b63001461048557610230565b8063095ea7b311610203578063095ea7b31461030557806312fb92e01461032e57806313faede61461036b57806318160ddd14610396578063239c70ae146103c157610230565b806301ffc9a71461023557806306fdde0314610272578063081812fc1461029d57806308fc299b146102da575b600080fd5b34801561024157600080fd5b5061025c600480360381019061025791906133a6565b610913565b6040516102699190613a87565b60405180910390f35b34801561027e57600080fd5b5061028761098d565b6040516102949190613aa2565b60405180910390f35b3480156102a957600080fd5b506102c460048036038101906102bf9190613449565b610a1f565b6040516102d191906139fe565b60405180910390f35b3480156102e657600080fd5b506102ef610aa4565b6040516102fc9190613d64565b60405180910390f35b34801561031157600080fd5b5061032c600480360381019061032791906132e5565b610aaa565b005b34801561033a57600080fd5b5061035560048036038101906103509190613162565b610bc2565b6040516103629190613d64565b60405180910390f35b34801561037757600080fd5b50610380610bda565b60405161038d9190613d64565b60405180910390f35b3480156103a257600080fd5b506103ab610be0565b6040516103b89190613d64565b60405180910390f35b3480156103cd57600080fd5b506103d6610bed565b6040516103e39190613d64565b60405180910390f35b3480156103f857600080fd5b50610413600480360381019061040e91906131cf565b610bf3565b005b34801561042157600080fd5b5061043c600480360381019061043791906132e5565b610c53565b6040516104499190613d64565b60405180910390f35b61045a610cf8565b005b34801561046857600080fd5b50610483600480360381019061047e91906131cf565b610db4565b005b34801561049157600080fd5b506104ac60048036038101906104a79190613162565b610dd4565b6040516104b99190613a65565b60405180910390f35b3480156104ce57600080fd5b506104d7610e82565b6040516104e49190613d64565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613449565b610e88565b6040516105219190613d64565b60405180910390f35b34801561053657600080fd5b50610551600480360381019061054c9190613400565b610ef9565b005b34801561055f57600080fd5b50610568610f8f565b6040516105759190613a87565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613449565b610fa2565b6040516105b291906139fe565b60405180910390f35b3480156105c757600080fd5b506105d0611054565b6040516105dd9190613aa2565b60405180910390f35b3480156105f257600080fd5b5061060d60048036038101906106089190613162565b6110e2565b60405161061a9190613d64565b60405180910390f35b34801561062f57600080fd5b5061063861119a565b005b34801561064657600080fd5b5061064f611222565b60405161065c9190613d64565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613325565b611228565b005b34801561069a57600080fd5b506106a3611362565b6040516106b09190613d64565b60405180910390f35b3480156106c557600080fd5b506106ce611368565b6040516106db91906139fe565b60405180910390f35b3480156106f057600080fd5b506106f9611392565b6040516107069190613aa2565b60405180910390f35b34801561071b57600080fd5b50610724611424565b6040516107319190613d64565b60405180910390f35b610754600480360381019061074f9190613449565b611435565b005b34801561076257600080fd5b5061077d600480360381019061077891906132a5565b611519565b005b34801561078b57600080fd5b506107a660048036038101906107a19190613222565b61169a565b005b3480156107b457600080fd5b506107bd6116fc565b6040516107ca9190613aa2565b60405180910390f35b3480156107df57600080fd5b506107fa60048036038101906107f59190613449565b61178a565b6040516108079190613aa2565b60405180910390f35b61082a60048036038101906108259190613449565b611834565b005b34801561083857600080fd5b50610841611a19565b60405161084e9190613d64565b60405180910390f35b34801561086357600080fd5b5061086c611a23565b6040516108799190613d64565b60405180910390f35b34801561088e57600080fd5b50610897611a29565b6040516108a49190613d64565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf919061318f565b611a4a565b6040516108e19190613a87565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190613162565b611ade565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610986575061098582611bd6565b5b9050919050565b60606000805461099c90614074565b80601f01602080910402602001604051908101604052809291908181526020018280546109c890614074565b8015610a155780601f106109ea57610100808354040283529160200191610a15565b820191906000526020600020905b8154815290600101906020018083116109f857829003601f168201915b5050505050905090565b6000610a2a82611cb8565b610a69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6090613c84565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60175481565b6000610ab582610fa2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1d90613d04565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b45611d24565b73ffffffffffffffffffffffffffffffffffffffff161480610b745750610b7381610b6e611d24565b611a4a565b5b610bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610baa90613c04565b60405180910390fd5b610bbd8383611d2c565b505050565b60186020528060005260406000206000915090505481565b60105481565b6000600880549050905090565b60125481565b610c04610bfe611d24565b82611de5565b610c43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3a90613d24565b60405180910390fd5b610c4e838383611ec3565b505050565b6000610c5e836110e2565b8210610c9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9690613ae4565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d00611d24565b73ffffffffffffffffffffffffffffffffffffffff16610d1e611368565b73ffffffffffffffffffffffffffffffffffffffff1614610d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6b90613ca4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610db257600080fd5b565b610dcf8383836040518060200160405280600081525061169a565b505050565b60606000610de1836110e2565b905060008167ffffffffffffffff811115610dff57610dfe61427c565b5b604051908082528060200260200182016040528015610e2d5781602001602082028036833780820191505090505b50905060005b82811015610e7757610e458582610c53565b828281518110610e5857610e5761424d565b5b6020026020010181815250508080610e6f906140d7565b915050610e33565b508092505050919050565b60165481565b6000610e92610be0565b8210610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca90613d44565b60405180910390fd5b60088281548110610ee757610ee661424d565b5b90600052602060002001549050919050565b610f01611d24565b73ffffffffffffffffffffffffffffffffffffffff16610f1f611368565b73ffffffffffffffffffffffffffffffffffffffff1614610f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6c90613ca4565b60405180910390fd5b8060199080519060200190610f8b929190612eca565b5050565b601360009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613c44565b60405180910390fd5b80915050919050565b6019805461106190614074565b80601f016020809104026020016040519081016040528092919081815260200182805461108d90614074565b80156110da5780601f106110af576101008083540402835291602001916110da565b820191906000526020600020905b8154815290600101906020018083116110bd57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114a90613c24565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6111a2611d24565b73ffffffffffffffffffffffffffffffffffffffff166111c0611368565b73ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90613ca4565b60405180910390fd5b611220600061211f565b565b60155481565b611230611d24565b73ffffffffffffffffffffffffffffffffffffffff1661124e611368565b73ffffffffffffffffffffffffffffffffffffffff16146112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b90613ca4565b60405180910390fd5b8181905084849050146112b657600080fd5b60005b8484905081101561135b578282828181106112d7576112d661424d565b5b90506020020135601860008787858181106112f5576112f461424d565b5b905060200201602081019061130a9190613162565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080611353906140d7565b9150506112b9565b5050505050565b60145481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113a190614074565b80601f01602080910402602001604051908101604052809291908181526020018280546113cd90614074565b801561141a5780601f106113ef5761010080835404028352916020019161141a565b820191906000526020600020905b8154815290600101906020018083116113fd57829003601f168201915b5050505050905090565b6000611430600b6121e5565b905090565b601360009054906101000a900460ff161561144f57600080fd5b6000811161145c57600080fd5b60125481111561146b57600080fd5b60115481611477610be0565b6114819190613e97565b111561148c57600080fd5b6015548160145461149d9190613e97565b11156114a857600080fd5b806010546114b69190613f1e565b3410156114c257600080fd5b6000600190505b8181116115015760006114da6121f3565b90506114ed6114e7611d24565b82612381565b5080806114f9906140d7565b9150506114c9565b50806014546115109190613e97565b60148190555050565b611521611d24565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561158f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158690613ba4565b60405180910390fd5b806005600061159c611d24565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611649611d24565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168e9190613a87565b60405180910390a35050565b6116ab6116a5611d24565b83611de5565b6116ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e190613d24565b60405180910390fd5b6116f68484848461239f565b50505050565b600f805461170990614074565b80601f016020809104026020016040519081016040528092919081815260200182805461173590614074565b80156117825780601f1061175757610100808354040283529160200191611782565b820191906000526020600020905b81548152906001019060200180831161176557829003601f168201915b505050505081565b606061179582611cb8565b6117d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cb90613ce4565b60405180910390fd5b60006117de6123fb565b905060008151116117fe576040518060200160405280600081525061182c565b806118088461248d565b600f60405160200161181c939291906139cd565b6040516020818303038152906040525b915050919050565b601360009054906101000a900460ff161561184e57600080fd5b6000811161185b57600080fd5b60125481111561186a57600080fd5b60115481611876610be0565b6118809190613e97565b111561188b57600080fd5b6017548160165461189c9190613e97565b11156118a757600080fd5b6000601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000811161192e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192590613ac4565b60405180910390fd5b80821115611971576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196890613b24565b60405180910390fd5b60005b828110156119bc5760006119866121f3565b9050611999611993611d24565b82612381565b6001836119a69190613f78565b92505080806119b4906140d7565b915050611974565b50816016546119cb9190613e97565b60168190555080601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b6000600c54905090565b60115481565b6000611a33611424565b611a3b611a19565b611a459190613f78565b905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ae6611d24565b73ffffffffffffffffffffffffffffffffffffffff16611b04611368565b73ffffffffffffffffffffffffffffffffffffffff1614611b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5190613ca4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc190613b44565b60405180910390fd5b611bd38161211f565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ca157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611cb15750611cb0826125ee565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d9f83610fa2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611df082611cb8565b611e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2690613be4565b60405180910390fd5b6000611e3a83610fa2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ea957508373ffffffffffffffffffffffffffffffffffffffff16611e9184610a1f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eba5750611eb98185611a4a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee382610fa2565b73ffffffffffffffffffffffffffffffffffffffff1614611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090613cc4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090613b84565b60405180910390fd5b611fb4838383612658565b611fbf600082611d2c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461200f9190613f78565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120669190613e97565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6000806121fe611a29565b1161223e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223590613bc4565b60405180910390fd5b6000612248611424565b612250611a19565b61225a9190613f78565b9050600081334144454260405160200161227895949392919061396e565b6040516020818303038152906040528051906020012060001c61229b9190614160565b9050600080600d60008481526020019081526020016000205414156122c2578190506122d9565b600d60008381526020019081526020016000205490505b6000600d60006001866122ec9190613f78565b815260200190815260200160002054141561232a5760018361230e9190613f78565b600d600084815260200190815260200160002081905550612362565b600d600060018561233b9190613f78565b815260200190815260200160002054600d6000848152602001908152602001600020819055505b61236a61276c565b50600e54816123799190613e97565b935050505090565b61239b8282604051806020016040528060008152506127d6565b5050565b6123aa848484611ec3565b6123b684848484612831565b6123f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ec90613b04565b60405180910390fd5b50505050565b60606019805461240a90614074565b80601f016020809104026020016040519081016040528092919081815260200182805461243690614074565b80156124835780601f1061245857610100808354040283529160200191612483565b820191906000526020600020905b81548152906001019060200180831161246657829003601f168201915b5050505050905090565b606060008214156124d5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125e9565b600082905060005b600082146125075780806124f0906140d7565b915050600a826125009190613eed565b91506124dd565b60008167ffffffffffffffff8111156125235761252261427c565b5b6040519080825280601f01601f1916602001820160405280156125555781602001600182028036833780820191505090505b5090505b600085146125e25760018261256e9190613f78565b9150600a8561257d9190614160565b60306125899190613e97565b60f81b81838151811061259f5761259e61424d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125db9190613eed565b9450612559565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6126638383836129c8565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126a6576126a1816129cd565b6126e5565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146126e4576126e38382612a16565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127285761272381612b83565b612767565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612766576127658282612c54565b5b5b505050565b600080612777611a29565b116127b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ae90613bc4565b60405180910390fd5b60006127c3600b6121e5565b90506127cf600b612cd3565b8091505090565b6127e08383612ce9565b6127ed6000848484612831565b61282c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282390613b04565b60405180910390fd5b505050565b60006128528473ffffffffffffffffffffffffffffffffffffffff16612eb7565b156129bb578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261287b611d24565b8786866040518563ffffffff1660e01b815260040161289d9493929190613a19565b602060405180830381600087803b1580156128b757600080fd5b505af19250505080156128e857506040513d601f19601f820116820180604052508101906128e591906133d3565b60015b61296b573d8060008114612918576040519150601f19603f3d011682016040523d82523d6000602084013e61291d565b606091505b50600081511415612963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295a90613b04565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129c0565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a23846110e2565b612a2d9190613f78565b9050600060076000848152602001908152602001600020549050818114612b12576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612b979190613f78565b9050600060096000848152602001908152602001600020549050600060088381548110612bc757612bc661424d565b5b906000526020600020015490508060088381548110612be957612be861424d565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c3857612c3761421e565b5b6001900381819060005260206000200160009055905550505050565b6000612c5f836110e2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d5090613c64565b60405180910390fd5b612d6281611cb8565b15612da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9990613b64565b60405180910390fd5b612dae60008383612658565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dfe9190613e97565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612ed690614074565b90600052602060002090601f016020900481019282612ef85760008555612f3f565b82601f10612f1157805160ff1916838001178555612f3f565b82800160010185558215612f3f579182015b82811115612f3e578251825591602001919060010190612f23565b5b509050612f4c9190612f50565b5090565b5b80821115612f69576000816000905550600101612f51565b5090565b6000612f80612f7b84613da4565b613d7f565b905082815260208101848484011115612f9c57612f9b6142ba565b5b612fa7848285614032565b509392505050565b6000612fc2612fbd84613dd5565b613d7f565b905082815260208101848484011115612fde57612fdd6142ba565b5b612fe9848285614032565b509392505050565b60008135905061300081614858565b92915050565b60008083601f84011261301c5761301b6142b0565b5b8235905067ffffffffffffffff811115613039576130386142ab565b5b602083019150836020820283011115613055576130546142b5565b5b9250929050565b60008083601f840112613072576130716142b0565b5b8235905067ffffffffffffffff81111561308f5761308e6142ab565b5b6020830191508360208202830111156130ab576130aa6142b5565b5b9250929050565b6000813590506130c18161486f565b92915050565b6000813590506130d681614886565b92915050565b6000815190506130eb81614886565b92915050565b600082601f830112613106576131056142b0565b5b8135613116848260208601612f6d565b91505092915050565b600082601f830112613134576131336142b0565b5b8135613144848260208601612faf565b91505092915050565b60008135905061315c8161489d565b92915050565b600060208284031215613178576131776142c4565b5b600061318684828501612ff1565b91505092915050565b600080604083850312156131a6576131a56142c4565b5b60006131b485828601612ff1565b92505060206131c585828601612ff1565b9150509250929050565b6000806000606084860312156131e8576131e76142c4565b5b60006131f686828701612ff1565b935050602061320786828701612ff1565b92505060406132188682870161314d565b9150509250925092565b6000806000806080858703121561323c5761323b6142c4565b5b600061324a87828801612ff1565b945050602061325b87828801612ff1565b935050604061326c8782880161314d565b925050606085013567ffffffffffffffff81111561328d5761328c6142bf565b5b613299878288016130f1565b91505092959194509250565b600080604083850312156132bc576132bb6142c4565b5b60006132ca85828601612ff1565b92505060206132db858286016130b2565b9150509250929050565b600080604083850312156132fc576132fb6142c4565b5b600061330a85828601612ff1565b925050602061331b8582860161314d565b9150509250929050565b6000806000806040858703121561333f5761333e6142c4565b5b600085013567ffffffffffffffff81111561335d5761335c6142bf565b5b61336987828801613006565b9450945050602085013567ffffffffffffffff81111561338c5761338b6142bf565b5b6133988782880161305c565b925092505092959194509250565b6000602082840312156133bc576133bb6142c4565b5b60006133ca848285016130c7565b91505092915050565b6000602082840312156133e9576133e86142c4565b5b60006133f7848285016130dc565b91505092915050565b600060208284031215613416576134156142c4565b5b600082013567ffffffffffffffff811115613434576134336142bf565b5b6134408482850161311f565b91505092915050565b60006020828403121561345f5761345e6142c4565b5b600061346d8482850161314d565b91505092915050565b60006134828383613939565b60208301905092915050565b61349f61349a82613fbe565b614132565b82525050565b6134ae81613fac565b82525050565b6134c56134c082613fac565b614120565b82525050565b60006134d682613e2b565b6134e08185613e59565b93506134eb83613e06565b8060005b8381101561351c5781516135038882613476565b975061350e83613e4c565b9250506001810190506134ef565b5085935050505092915050565b61353281613fd0565b82525050565b600061354382613e36565b61354d8185613e6a565b935061355d818560208601614041565b613566816142c9565b840191505092915050565b600061357c82613e41565b6135868185613e7b565b9350613596818560208601614041565b61359f816142c9565b840191505092915050565b60006135b582613e41565b6135bf8185613e8c565b93506135cf818560208601614041565b80840191505092915050565b600081546135e881614074565b6135f28186613e8c565b9450600182166000811461360d576001811461361e57613651565b60ff19831686528186019350613651565b61362785613e16565b60005b838110156136495781548189015260018201915060208101905061362a565b838801955050505b50505092915050565b6000613667601783613e7b565b9150613672826142e7565b602082019050919050565b600061368a602b83613e7b565b915061369582614310565b604082019050919050565b60006136ad603283613e7b565b91506136b88261435f565b604082019050919050565b60006136d0601f83613e7b565b91506136db826143ae565b602082019050919050565b60006136f3602683613e7b565b91506136fe826143d7565b604082019050919050565b6000613716601c83613e7b565b915061372182614426565b602082019050919050565b6000613739602483613e7b565b91506137448261444f565b604082019050919050565b600061375c601983613e7b565b91506137678261449e565b602082019050919050565b600061377f601883613e7b565b915061378a826144c7565b602082019050919050565b60006137a2602c83613e7b565b91506137ad826144f0565b604082019050919050565b60006137c5603883613e7b565b91506137d08261453f565b604082019050919050565b60006137e8602a83613e7b565b91506137f38261458e565b604082019050919050565b600061380b602983613e7b565b9150613816826145dd565b604082019050919050565b600061382e602083613e7b565b91506138398261462c565b602082019050919050565b6000613851602c83613e7b565b915061385c82614655565b604082019050919050565b6000613874602083613e7b565b915061387f826146a4565b602082019050919050565b6000613897602983613e7b565b91506138a2826146cd565b604082019050919050565b60006138ba602f83613e7b565b91506138c58261471c565b604082019050919050565b60006138dd602183613e7b565b91506138e88261476b565b604082019050919050565b6000613900603183613e7b565b915061390b826147ba565b604082019050919050565b6000613923602c83613e7b565b915061392e82614809565b604082019050919050565b61394281614028565b82525050565b61395181614028565b82525050565b61396861396382614028565b614156565b82525050565b600061397a82886134b4565b60148201915061398a828761348e565b60148201915061399a8286613957565b6020820191506139aa8285613957565b6020820191506139ba8284613957565b6020820191508190509695505050505050565b60006139d982866135aa565b91506139e582856135aa565b91506139f182846135db565b9150819050949350505050565b6000602082019050613a1360008301846134a5565b92915050565b6000608082019050613a2e60008301876134a5565b613a3b60208301866134a5565b613a486040830185613948565b8181036060830152613a5a8184613538565b905095945050505050565b60006020820190508181036000830152613a7f81846134cb565b905092915050565b6000602082019050613a9c6000830184613529565b92915050565b60006020820190508181036000830152613abc8184613571565b905092915050565b60006020820190508181036000830152613add8161365a565b9050919050565b60006020820190508181036000830152613afd8161367d565b9050919050565b60006020820190508181036000830152613b1d816136a0565b9050919050565b60006020820190508181036000830152613b3d816136c3565b9050919050565b60006020820190508181036000830152613b5d816136e6565b9050919050565b60006020820190508181036000830152613b7d81613709565b9050919050565b60006020820190508181036000830152613b9d8161372c565b9050919050565b60006020820190508181036000830152613bbd8161374f565b9050919050565b60006020820190508181036000830152613bdd81613772565b9050919050565b60006020820190508181036000830152613bfd81613795565b9050919050565b60006020820190508181036000830152613c1d816137b8565b9050919050565b60006020820190508181036000830152613c3d816137db565b9050919050565b60006020820190508181036000830152613c5d816137fe565b9050919050565b60006020820190508181036000830152613c7d81613821565b9050919050565b60006020820190508181036000830152613c9d81613844565b9050919050565b60006020820190508181036000830152613cbd81613867565b9050919050565b60006020820190508181036000830152613cdd8161388a565b9050919050565b60006020820190508181036000830152613cfd816138ad565b9050919050565b60006020820190508181036000830152613d1d816138d0565b9050919050565b60006020820190508181036000830152613d3d816138f3565b9050919050565b60006020820190508181036000830152613d5d81613916565b9050919050565b6000602082019050613d796000830184613948565b92915050565b6000613d89613d9a565b9050613d9582826140a6565b919050565b6000604051905090565b600067ffffffffffffffff821115613dbf57613dbe61427c565b5b613dc8826142c9565b9050602081019050919050565b600067ffffffffffffffff821115613df057613def61427c565b5b613df9826142c9565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ea282614028565b9150613ead83614028565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ee257613ee1614191565b5b828201905092915050565b6000613ef882614028565b9150613f0383614028565b925082613f1357613f126141c0565b5b828204905092915050565b6000613f2982614028565b9150613f3483614028565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f6d57613f6c614191565b5b828202905092915050565b6000613f8382614028565b9150613f8e83614028565b925082821015613fa157613fa0614191565b5b828203905092915050565b6000613fb782614008565b9050919050565b6000613fc982614008565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561405f578082015181840152602081019050614044565b8381111561406e576000848401525b50505050565b6000600282049050600182168061408c57607f821691505b602082108114156140a05761409f6141ef565b5b50919050565b6140af826142c9565b810181811067ffffffffffffffff821117156140ce576140cd61427c565b5b80604052505050565b60006140e282614028565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561411557614114614191565b5b600182019050919050565b600061412b82614144565b9050919050565b600061413d82614144565b9050919050565b600061414f826142da565b9050919050565b6000819050919050565b600061416b82614028565b915061417683614028565b925082614186576141856141c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f596f752068617665206e6f20746f6b656e73206c656674000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f596f7572206d617820746f6b656e20686f6c64696e6720657863656564656400600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6f206d6f726520746f6b656e7320617661696c61626c650000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61486181613fac565b811461486c57600080fd5b50565b61487881613fd0565b811461488357600080fd5b50565b61488f81613fdc565b811461489a57600080fd5b50565b6148a681614028565b81146148b157600080fd5b5056fea2646970667358221220c357fc3983eba55c1fdc72adca6827beb8e5ddc2864752e8544f79425f7c4f9a64736f6c63430008070033

Deployed Bytecode Sourcemap

48759:3409:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42552:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30444:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32003:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49176:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31526:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49216:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48906:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43192:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48986:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32893:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42860:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52051:114;;;:::i;:::-;;33303:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51250:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49136:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43382:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49511:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49024:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30138:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49271:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29868:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8081:94;;;;;;;;;;;;;:::i;:::-;;49096:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50967:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49057:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7430:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30613:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2338:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49628:536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32296:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33559:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48864:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51604:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50170:789;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2160:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48945:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2543:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32662:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8330:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42552:224;42654:4;42693:35;42678:50;;;:11;:50;;;;:90;;;;42732:36;42756:11;42732:23;:36::i;:::-;42678:90;42671:97;;42552:224;;;:::o;30444:100::-;30498:13;30531:5;30524:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30444:100;:::o;32003:221::-;32079:7;32107:16;32115:7;32107;:16::i;:::-;32099:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32192:15;:24;32208:7;32192:24;;;;;;;;;;;;;;;;;;;;;32185:31;;32003:221;;;:::o;49176:33::-;;;;:::o;31526:411::-;31607:13;31623:23;31638:7;31623:14;:23::i;:::-;31607:39;;31671:5;31665:11;;:2;:11;;;;31657:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;31765:5;31749:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;31774:37;31791:5;31798:12;:10;:12::i;:::-;31774:16;:37::i;:::-;31749:62;31727:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;31908:21;31917:2;31921:7;31908:8;:21::i;:::-;31596:341;31526:411;;:::o;49216:46::-;;;;;;;;;;;;;;;;;:::o;48906:34::-;;;;:::o;43192:113::-;43253:7;43280:10;:17;;;;43273:24;;43192:113;:::o;48986:33::-;;;;:::o;32893:339::-;33088:41;33107:12;:10;:12::i;:::-;33121:7;33088:18;:41::i;:::-;33080:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33196:28;33206:4;33212:2;33216:7;33196:9;:28::i;:::-;32893:339;;;:::o;42860:256::-;42957:7;42993:23;43010:5;42993:16;:23::i;:::-;42985:5;:31;42977:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43082:12;:19;43095:5;43082:19;;;;;;;;;;;;;;;:26;43102:5;43082:26;;;;;;;;;;;;43075:33;;42860:256;;;;:::o;52051:114::-;7661:12;:10;:12::i;:::-;7650:23;;:7;:5;:7::i;:::-;:23;;;7642:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52119:10:::1;52111:24;;:47;52136:21;52111:47;;;;;;;;;;;;;;;;;;;;;;;52103:56;;;::::0;::::1;;52051:114::o:0;33303:185::-;33441:39;33458:4;33464:2;33468:7;33441:39;;;;;;;;;;;;:16;:39::i;:::-;33303:185;;;:::o;51250:348::-;51325:16;51353:23;51379:17;51389:6;51379:9;:17::i;:::-;51353:43;;51403:25;51445:15;51431:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51403:58;;51473:9;51468:103;51488:15;51484:1;:19;51468:103;;;51533:30;51553:6;51561:1;51533:19;:30::i;:::-;51519:8;51528:1;51519:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;51505:3;;;;;:::i;:::-;;;;51468:103;;;;51584:8;51577:15;;;;51250:348;;;:::o;49136:35::-;;;;:::o;43382:233::-;43457:7;43493:30;:28;:30::i;:::-;43485:5;:38;43477:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43590:10;43601:5;43590:17;;;;;;;;:::i;:::-;;;;;;;;;;43583:24;;43382:233;;;:::o;49511:98::-;7661:12;:10;:12::i;:::-;7650:23;;:7;:5;:7::i;:::-;:23;;;7642:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49592:11:::1;49582:7;:21;;;;;;;;;;;;:::i;:::-;;49511:98:::0;:::o;49024:26::-;;;;;;;;;;;;;:::o;30138:239::-;30210:7;30230:13;30246:7;:16;30254:7;30246:16;;;;;;;;;;;;;;;;;;;;;30230:32;;30298:1;30281:19;;:5;:19;;;;30273:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30364:5;30357:12;;;30138:239;;;:::o;49271:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29868:208::-;29940:7;29985:1;29968:19;;:5;:19;;;;29960:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30052:9;:16;30062:5;30052:16;;;;;;;;;;;;;;;;30045:23;;29868:208;;;:::o;8081:94::-;7661:12;:10;:12::i;:::-;7650:23;;:7;:5;:7::i;:::-;:23;;;7642:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8146:21:::1;8164:1;8146:9;:21::i;:::-;8081:94::o:0;49096:33::-;;;;:::o;50967:277::-;7661:12;:10;:12::i;:::-;7650:23;;:7;:5;:7::i;:::-;:23;;;7642:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51115:6:::1;;:13;;51098:6;;:13;;:30;51090:39;;;::::0;::::1;;51143:9;51138:101;51162:6;;:13;;51158:1;:17;51138:101;;;51220:6;;51227:1;51220:9;;;;;;;:::i;:::-;;;;;;;;51195:11;:22;51207:6;;51214:1;51207:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51195:22;;;;;;;;;;;;;;;:34;;;;51177:3;;;;;:::i;:::-;;;;51138:101;;;;50967:277:::0;;;;:::o;49057:34::-;;;;:::o;7430:87::-;7476:7;7503:6;;;;;;;;;;;7496:13;;7430:87;:::o;30613:104::-;30669:13;30702:7;30695:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30613:104;:::o;2338:99::-;2381:7;2408:21;:11;:19;:21::i;:::-;2401:28;;2338:99;:::o;49628:536::-;49694:6;;;;;;;;;;;49693:7;49685:16;;;;;;49730:1;49716:11;:15;49708:24;;;;;;49762:13;;49747:11;:28;;49739:37;;;;;;49822:15;;49807:11;49791:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;49783:55;;;;;;49889:15;;49874:11;49853:18;;:32;;;;:::i;:::-;:51;;49845:60;;;;;;49940:11;49933:4;;:18;;;;:::i;:::-;49920:9;:31;;49912:40;;;;;;49966:9;49978:1;49966:13;;49961:136;49986:11;49981:1;:16;49961:136;;50013:17;50033:11;:9;:11::i;:::-;50013:31;;50055:34;50065:12;:10;:12::i;:::-;50079:9;50055;:34::i;:::-;50004:93;49999:3;;;;;:::i;:::-;;;;49961:136;;;;50147:11;50126:18;;:32;;;;:::i;:::-;50105:18;:53;;;;49628:536;:::o;32296:295::-;32411:12;:10;:12::i;:::-;32399:24;;:8;:24;;;;32391:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;32511:8;32466:18;:32;32485:12;:10;:12::i;:::-;32466:32;;;;;;;;;;;;;;;:42;32499:8;32466:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32564:8;32535:48;;32550:12;:10;:12::i;:::-;32535:48;;;32574:8;32535:48;;;;;;:::i;:::-;;;;;;;;32296:295;;:::o;33559:328::-;33734:41;33753:12;:10;:12::i;:::-;33767:7;33734:18;:41::i;:::-;33726:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33840:39;33854:4;33860:2;33864:7;33873:5;33840:13;:39::i;:::-;33559:328;;;;:::o;48864:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51604:423::-;51702:13;51743:16;51751:7;51743;:16::i;:::-;51727:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;51833:28;51864:10;:8;:10::i;:::-;51833:41;;51919:1;51894:14;51888:28;:32;:133;;;;;;;;;;;;;;;;;51956:14;51972:18;:7;:16;:18::i;:::-;51992:13;51939:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51888:133;51881:140;;;51604:423;;;:::o;50170:789::-;50245:6;;;;;;;;;;;50244:7;50236:16;;;;;;50283:1;50269:11;:15;50261:24;;;;;;50317:13;;50302:11;:28;;50294:37;;;;;;50379:15;;50364:11;50348:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:46;;50340:55;;;;;;50449:16;;50434:11;50412:19;;:33;;;;:::i;:::-;:53;;50404:62;;;;;;50477:19;50499:11;:23;50511:10;50499:23;;;;;;;;;;;;;;;;50477:45;;50555:1;50541:11;:15;50533:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;50616:11;50601;:26;;50593:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50681:9;50676:166;50700:11;50696:1;:15;50676:166;;;50729:17;50749:11;:9;:11::i;:::-;50729:31;;50771:34;50781:12;:10;:12::i;:::-;50795:9;50771;:34::i;:::-;50831:1;50816:16;;;;;:::i;:::-;;;50718:124;50713:3;;;;;:::i;:::-;;;;50676:166;;;;50896:11;50874:19;;:33;;;;:::i;:::-;50852:19;:55;;;;50942:11;50916;:23;50928:10;50916:23;;;;;;;;;;;;;;;:37;;;;50227:732;50170:789;:::o;2160:87::-;2202:7;2229:10;;2222:17;;2160:87;:::o;48945:36::-;;;;:::o;2543:113::-;2595:7;2636:12;:10;:12::i;:::-;2622:11;:9;:11::i;:::-;:26;;;;:::i;:::-;2615:33;;2543:113;:::o;32662:164::-;32759:4;32783:18;:25;32802:5;32783:25;;;;;;;;;;;;;;;:35;32809:8;32783:35;;;;;;;;;;;;;;;;;;;;;;;;;32776:42;;32662:164;;;;:::o;8330:192::-;7661:12;:10;:12::i;:::-;7650:23;;:7;:5;:7::i;:::-;:23;;;7642:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8439:1:::1;8419:22;;:8;:22;;;;8411:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;8495:19;8505:8;8495:9;:19::i;:::-;8330:192:::0;:::o;29499:305::-;29601:4;29653:25;29638:40;;;:11;:40;;;;:105;;;;29710:33;29695:48;;;:11;:48;;;;29638:105;:158;;;;29760:36;29784:11;29760:23;:36::i;:::-;29638:158;29618:178;;29499:305;;;:::o;35397:127::-;35462:4;35514:1;35486:30;;:7;:16;35494:7;35486:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35479:37;;35397:127;;;:::o;6218:98::-;6271:7;6298:10;6291:17;;6218:98;:::o;39379:174::-;39481:2;39454:15;:24;39470:7;39454:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39537:7;39533:2;39499:46;;39508:23;39523:7;39508:14;:23::i;:::-;39499:46;;;;;;;;;;;;39379:174;;:::o;35691:348::-;35784:4;35809:16;35817:7;35809;:16::i;:::-;35801:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35885:13;35901:23;35916:7;35901:14;:23::i;:::-;35885:39;;35954:5;35943:16;;:7;:16;;;:51;;;;35987:7;35963:31;;:20;35975:7;35963:11;:20::i;:::-;:31;;;35943:51;:87;;;;35998:32;36015:5;36022:7;35998:16;:32::i;:::-;35943:87;35935:96;;;35691:348;;;;:::o;38683:578::-;38842:4;38815:31;;:23;38830:7;38815:14;:23::i;:::-;:31;;;38807:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38925:1;38911:16;;:2;:16;;;;38903:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38981:39;39002:4;39008:2;39012:7;38981:20;:39::i;:::-;39085:29;39102:1;39106:7;39085:8;:29::i;:::-;39146:1;39127:9;:15;39137:4;39127:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39175:1;39158:9;:13;39168:2;39158:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39206:2;39187:7;:16;39195:7;39187:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39245:7;39241:2;39226:27;;39235:4;39226:27;;;;;;;;;;;;38683:578;;;:::o;8530:173::-;8586:16;8605:6;;;;;;;;;;;8586:25;;8631:8;8622:6;;:17;;;;;;;;;;;;;;;;;;8686:8;8655:40;;8676:8;8655:40;;;;;;;;;;;;8575:128;8530:173;:::o;811:114::-;876:7;903;:14;;;896:21;;811:114;;;:::o;4324:1262::-;4391:7;3100:1;3076:21;:19;:21::i;:::-;:25;3068:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4411:16:::1;4444:12;:10;:12::i;:::-;4430:11;:9;:11::i;:::-;:26;;;;:::i;:::-;4411:45;;4467:14;4726:8;4551:10;4580:14;4613:16;4648:14;4681:15;4516:195;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4492:230;;;;;;4484:239;;:250;;;;:::i;:::-;4467:267;;4747:13;4802:1:::0;4779:11:::1;:19;4791:6;4779:19;;;;;;;;;;;;:24;4775:304;;;4924:6;4916:14;;4775:304;;;5048:11;:19;5060:6;5048:19;;;;;;;;;;;;5040:27;;4775:304;5185:1;5156:11;:25;5179:1;5168:8;:12;;;;:::i;:::-;5156:25;;;;;;;;;;;;:30;5152:331;;;5301:1;5290:8;:12;;;;:::i;:::-;5268:11;:19;5280:6;5268:19;;;;;;;;;;;:34;;;;5152:331;;;5446:11;:25;5469:1;5458:8;:12;;;;:::i;:::-;5446:25;;;;;;;;;;;;5424:11;:19;5436:6;5424:19;;;;;;;;;;;:47;;;;5152:331;5524:17;:15;:17::i;:::-;;5569:9;;5561:5;:17;;;;:::i;:::-;5554:24;;;;;4324:1262:::0;:::o;36381:110::-;36457:26;36467:2;36471:7;36457:26;;;;;;;;;;;;:9;:26::i;:::-;36381:110;;:::o;34769:315::-;34926:28;34936:4;34942:2;34946:7;34926:9;:28::i;:::-;34973:48;34996:4;35002:2;35006:7;35015:5;34973:22;:48::i;:::-;34965:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34769:315;;;;:::o;49403:102::-;49463:13;49492:7;49485:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49403:102;:::o;16626:723::-;16682:13;16912:1;16903:5;:10;16899:53;;;16930:10;;;;;;;;;;;;;;;;;;;;;16899:53;16962:12;16977:5;16962:20;;16993:14;17018:78;17033:1;17025:4;:9;17018:78;;17051:8;;;;;:::i;:::-;;;;17082:2;17074:10;;;;;:::i;:::-;;;17018:78;;;17106:19;17138:6;17128:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17106:39;;17156:154;17172:1;17163:5;:10;17156:154;;17200:1;17190:11;;;;;:::i;:::-;;;17267:2;17259:5;:10;;;;:::i;:::-;17246:2;:24;;;;:::i;:::-;17233:39;;17216:6;17223;17216:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17296:2;17287:11;;;;;:::i;:::-;;;17156:154;;;17334:6;17320:21;;;;;16626:723;;;;:::o;16151:157::-;16236:4;16275:25;16260:40;;;:11;:40;;;;16253:47;;16151:157;;;:::o;44228:589::-;44372:45;44399:4;44405:2;44409:7;44372:26;:45::i;:::-;44450:1;44434:18;;:4;:18;;;44430:187;;;44469:40;44501:7;44469:31;:40::i;:::-;44430:187;;;44539:2;44531:10;;:4;:10;;;44527:90;;44558:47;44591:4;44597:7;44558:32;:47::i;:::-;44527:90;44430:187;44645:1;44631:16;;:2;:16;;;44627:183;;;44664:45;44701:7;44664:36;:45::i;:::-;44627:183;;;44737:4;44731:10;;:2;:10;;;44727:83;;44758:40;44786:2;44790:7;44758:27;:40::i;:::-;44727:83;44627:183;44228:589;;;:::o;2766:192::-;2832:7;3100:1;3076:21;:19;:21::i;:::-;:25;3068:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2852:13:::1;2868:21;:11;:19;:21::i;:::-;2852:37;;2902:23;:11;:21;:23::i;:::-;2945:5;2938:12;;;2766:192:::0;:::o;36718:321::-;36848:18;36854:2;36858:7;36848:5;:18::i;:::-;36899:54;36930:1;36934:2;36938:7;36947:5;36899:22;:54::i;:::-;36877:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;36718:321;;;:::o;40118:799::-;40273:4;40294:15;:2;:13;;;:15::i;:::-;40290:620;;;40346:2;40330:36;;;40367:12;:10;:12::i;:::-;40381:4;40387:7;40396:5;40330:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40326:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40589:1;40572:6;:13;:18;40568:272;;;40615:60;;;;;;;;;;:::i;:::-;;;;;;;;40568:272;40790:6;40784:13;40775:6;40771:2;40767:15;40760:38;40326:529;40463:41;;;40453:51;;;:6;:51;;;;40446:58;;;;;40290:620;40894:4;40887:11;;40118:799;;;;;;;:::o;41489:126::-;;;;:::o;45540:164::-;45644:10;:17;;;;45617:15;:24;45633:7;45617:24;;;;;;;;;;;:44;;;;45672:10;45688:7;45672:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45540:164;:::o;46331:988::-;46597:22;46647:1;46622:22;46639:4;46622:16;:22::i;:::-;:26;;;;:::i;:::-;46597:51;;46659:18;46680:17;:26;46698:7;46680:26;;;;;;;;;;;;46659:47;;46827:14;46813:10;:28;46809:328;;46858:19;46880:12;:18;46893:4;46880:18;;;;;;;;;;;;;;;:34;46899:14;46880:34;;;;;;;;;;;;46858:56;;46964:11;46931:12;:18;46944:4;46931:18;;;;;;;;;;;;;;;:30;46950:10;46931:30;;;;;;;;;;;:44;;;;47081:10;47048:17;:30;47066:11;47048:30;;;;;;;;;;;:43;;;;46843:294;46809:328;47233:17;:26;47251:7;47233:26;;;;;;;;;;;47226:33;;;47277:12;:18;47290:4;47277:18;;;;;;;;;;;;;;;:34;47296:14;47277:34;;;;;;;;;;;47270:41;;;46412:907;;46331:988;;:::o;47614:1079::-;47867:22;47912:1;47892:10;:17;;;;:21;;;;:::i;:::-;47867:46;;47924:18;47945:15;:24;47961:7;47945:24;;;;;;;;;;;;47924:45;;48296:19;48318:10;48329:14;48318:26;;;;;;;;:::i;:::-;;;;;;;;;;48296:48;;48382:11;48357:10;48368;48357:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48493:10;48462:15;:28;48478:11;48462:28;;;;;;;;;;;:41;;;;48634:15;:24;48650:7;48634:24;;;;;;;;;;;48627:31;;;48669:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47685:1008;;;47614:1079;:::o;45118:221::-;45203:14;45220:20;45237:2;45220:16;:20::i;:::-;45203:37;;45278:7;45251:12;:16;45264:2;45251:16;;;;;;;;;;;;;;;:24;45268:6;45251:24;;;;;;;;;;;:34;;;;45325:6;45296:17;:26;45314:7;45296:26;;;;;;;;;;;:35;;;;45192:147;45118:221;;:::o;933:127::-;1040:1;1022:7;:14;;;:19;;;;;;;;;;;933:127;:::o;37375:382::-;37469:1;37455:16;;:2;:16;;;;37447:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37528:16;37536:7;37528;:16::i;:::-;37527:17;37519:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37590:45;37619:1;37623:2;37627:7;37590:20;:45::i;:::-;37665:1;37648:9;:13;37658:2;37648:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37696:2;37677:7;:16;37685:7;37677:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37741:7;37737:2;37716:33;;37733:1;37716:33;;;;;;;;;;;;37375:382;;:::o;19151:387::-;19211:4;19419:12;19486:7;19474:20;19466:28;;19529:1;19522:4;:8;19515:15;;;19151:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1594:::-;1667:8;1677:6;1727:3;1720:4;1712:6;1708:17;1704:27;1694:122;;1735:79;;:::i;:::-;1694:122;1848:6;1835:20;1825:30;;1878:18;1870:6;1867:30;1864:117;;;1900:79;;:::i;:::-;1864:117;2014:4;2006:6;2002:17;1990:29;;2068:3;2060:4;2052:6;2048:17;2038:8;2034:32;2031:41;2028:128;;;2075:79;;:::i;:::-;2028:128;1594:568;;;;;:::o;2168:133::-;2211:5;2249:6;2236:20;2227:29;;2265:30;2289:5;2265:30;:::i;:::-;2168:133;;;;:::o;2307:137::-;2352:5;2390:6;2377:20;2368:29;;2406:32;2432:5;2406:32;:::i;:::-;2307:137;;;;:::o;2450:141::-;2506:5;2537:6;2531:13;2522:22;;2553:32;2579:5;2553:32;:::i;:::-;2450:141;;;;:::o;2610:338::-;2665:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:122;;2722:79;;:::i;:::-;2681:122;2839:6;2826:20;2864:78;2938:3;2930:6;2923:4;2915:6;2911:17;2864:78;:::i;:::-;2855:87;;2671:277;2610:338;;;;:::o;2968:340::-;3024:5;3073:3;3066:4;3058:6;3054:17;3050:27;3040:122;;3081:79;;:::i;:::-;3040:122;3198:6;3185:20;3223:79;3298:3;3290:6;3283:4;3275:6;3271:17;3223:79;:::i;:::-;3214:88;;3030:278;2968:340;;;;:::o;3314:139::-;3360:5;3398:6;3385:20;3376:29;;3414:33;3441:5;3414:33;:::i;:::-;3314:139;;;;:::o;3459:329::-;3518:6;3567:2;3555:9;3546:7;3542:23;3538:32;3535:119;;;3573:79;;:::i;:::-;3535:119;3693:1;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3664:117;3459:329;;;;:::o;3794:474::-;3862:6;3870;3919:2;3907:9;3898:7;3894:23;3890:32;3887:119;;;3925:79;;:::i;:::-;3887:119;4045:1;4070:53;4115:7;4106:6;4095:9;4091:22;4070:53;:::i;:::-;4060:63;;4016:117;4172:2;4198:53;4243:7;4234:6;4223:9;4219:22;4198:53;:::i;:::-;4188:63;;4143:118;3794:474;;;;;:::o;4274:619::-;4351:6;4359;4367;4416:2;4404:9;4395:7;4391:23;4387:32;4384:119;;;4422:79;;:::i;:::-;4384:119;4542:1;4567:53;4612:7;4603:6;4592:9;4588:22;4567:53;:::i;:::-;4557:63;;4513:117;4669:2;4695:53;4740:7;4731:6;4720:9;4716:22;4695:53;:::i;:::-;4685:63;;4640:118;4797:2;4823:53;4868:7;4859:6;4848:9;4844:22;4823:53;:::i;:::-;4813:63;;4768:118;4274:619;;;;;:::o;4899:943::-;4994:6;5002;5010;5018;5067:3;5055:9;5046:7;5042:23;5038:33;5035:120;;;5074:79;;:::i;:::-;5035:120;5194:1;5219:53;5264:7;5255:6;5244:9;5240:22;5219:53;:::i;:::-;5209:63;;5165:117;5321:2;5347:53;5392:7;5383:6;5372:9;5368:22;5347:53;:::i;:::-;5337:63;;5292:118;5449:2;5475:53;5520:7;5511:6;5500:9;5496:22;5475:53;:::i;:::-;5465:63;;5420:118;5605:2;5594:9;5590:18;5577:32;5636:18;5628:6;5625:30;5622:117;;;5658:79;;:::i;:::-;5622:117;5763:62;5817:7;5808:6;5797:9;5793:22;5763:62;:::i;:::-;5753:72;;5548:287;4899:943;;;;;;;:::o;5848:468::-;5913:6;5921;5970:2;5958:9;5949:7;5945:23;5941:32;5938:119;;;5976:79;;:::i;:::-;5938:119;6096:1;6121:53;6166:7;6157:6;6146:9;6142:22;6121:53;:::i;:::-;6111:63;;6067:117;6223:2;6249:50;6291:7;6282:6;6271:9;6267:22;6249:50;:::i;:::-;6239:60;;6194:115;5848:468;;;;;:::o;6322:474::-;6390:6;6398;6447:2;6435:9;6426:7;6422:23;6418:32;6415:119;;;6453:79;;:::i;:::-;6415:119;6573:1;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6544:117;6700:2;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6671:118;6322:474;;;;;:::o;6802:934::-;6924:6;6932;6940;6948;6997:2;6985:9;6976:7;6972:23;6968:32;6965:119;;;7003:79;;:::i;:::-;6965:119;7151:1;7140:9;7136:17;7123:31;7181:18;7173:6;7170:30;7167:117;;;7203:79;;:::i;:::-;7167:117;7316:80;7388:7;7379:6;7368:9;7364:22;7316:80;:::i;:::-;7298:98;;;;7094:312;7473:2;7462:9;7458:18;7445:32;7504:18;7496:6;7493:30;7490:117;;;7526:79;;:::i;:::-;7490:117;7639:80;7711:7;7702:6;7691:9;7687:22;7639:80;:::i;:::-;7621:98;;;;7416:313;6802:934;;;;;;;:::o;7742:327::-;7800:6;7849:2;7837:9;7828:7;7824:23;7820:32;7817:119;;;7855:79;;:::i;:::-;7817:119;7975:1;8000:52;8044:7;8035:6;8024:9;8020:22;8000:52;:::i;:::-;7990:62;;7946:116;7742:327;;;;:::o;8075:349::-;8144:6;8193:2;8181:9;8172:7;8168:23;8164:32;8161:119;;;8199:79;;:::i;:::-;8161:119;8319:1;8344:63;8399:7;8390:6;8379:9;8375:22;8344:63;:::i;:::-;8334:73;;8290:127;8075:349;;;;:::o;8430:509::-;8499:6;8548:2;8536:9;8527:7;8523:23;8519:32;8516:119;;;8554:79;;:::i;:::-;8516:119;8702:1;8691:9;8687:17;8674:31;8732:18;8724:6;8721:30;8718:117;;;8754:79;;:::i;:::-;8718:117;8859:63;8914:7;8905:6;8894:9;8890:22;8859:63;:::i;:::-;8849:73;;8645:287;8430:509;;;;:::o;8945:329::-;9004:6;9053:2;9041:9;9032:7;9028:23;9024:32;9021:119;;;9059:79;;:::i;:::-;9021:119;9179:1;9204:53;9249:7;9240:6;9229:9;9225:22;9204:53;:::i;:::-;9194:63;;9150:117;8945:329;;;;:::o;9280:179::-;9349:10;9370:46;9412:3;9404:6;9370:46;:::i;:::-;9448:4;9443:3;9439:14;9425:28;;9280:179;;;;:::o;9465:189::-;9586:61;9614:32;9640:5;9614:32;:::i;:::-;9586:61;:::i;:::-;9581:3;9574:74;9465:189;;:::o;9660:118::-;9747:24;9765:5;9747:24;:::i;:::-;9742:3;9735:37;9660:118;;:::o;9784:157::-;9889:45;9909:24;9927:5;9909:24;:::i;:::-;9889:45;:::i;:::-;9884:3;9877:58;9784:157;;:::o;9977:732::-;10096:3;10125:54;10173:5;10125:54;:::i;:::-;10195:86;10274:6;10269:3;10195:86;:::i;:::-;10188:93;;10305:56;10355:5;10305:56;:::i;:::-;10384:7;10415:1;10400:284;10425:6;10422:1;10419:13;10400:284;;;10501:6;10495:13;10528:63;10587:3;10572:13;10528:63;:::i;:::-;10521:70;;10614:60;10667:6;10614:60;:::i;:::-;10604:70;;10460:224;10447:1;10444;10440:9;10435:14;;10400:284;;;10404:14;10700:3;10693:10;;10101:608;;;9977:732;;;;:::o;10715:109::-;10796:21;10811:5;10796:21;:::i;:::-;10791:3;10784:34;10715:109;;:::o;10830:360::-;10916:3;10944:38;10976:5;10944:38;:::i;:::-;10998:70;11061:6;11056:3;10998:70;:::i;:::-;10991:77;;11077:52;11122:6;11117:3;11110:4;11103:5;11099:16;11077:52;:::i;:::-;11154:29;11176:6;11154:29;:::i;:::-;11149:3;11145:39;11138:46;;10920:270;10830:360;;;;:::o;11196:364::-;11284:3;11312:39;11345:5;11312:39;:::i;:::-;11367:71;11431:6;11426:3;11367:71;:::i;:::-;11360:78;;11447:52;11492:6;11487:3;11480:4;11473:5;11469:16;11447:52;:::i;:::-;11524:29;11546:6;11524:29;:::i;:::-;11519:3;11515:39;11508:46;;11288:272;11196:364;;;;:::o;11566:377::-;11672:3;11700:39;11733:5;11700:39;:::i;:::-;11755:89;11837:6;11832:3;11755:89;:::i;:::-;11748:96;;11853:52;11898:6;11893:3;11886:4;11879:5;11875:16;11853:52;:::i;:::-;11930:6;11925:3;11921:16;11914:23;;11676:267;11566:377;;;;:::o;11973:845::-;12076:3;12113:5;12107:12;12142:36;12168:9;12142:36;:::i;:::-;12194:89;12276:6;12271:3;12194:89;:::i;:::-;12187:96;;12314:1;12303:9;12299:17;12330:1;12325:137;;;;12476:1;12471:341;;;;12292:520;;12325:137;12409:4;12405:9;12394;12390:25;12385:3;12378:38;12445:6;12440:3;12436:16;12429:23;;12325:137;;12471:341;12538:38;12570:5;12538:38;:::i;:::-;12598:1;12612:154;12626:6;12623:1;12620:13;12612:154;;;12700:7;12694:14;12690:1;12685:3;12681:11;12674:35;12750:1;12741:7;12737:15;12726:26;;12648:4;12645:1;12641:12;12636:17;;12612:154;;;12795:6;12790:3;12786:16;12779:23;;12478:334;;12292:520;;12080:738;;11973:845;;;;:::o;12824:366::-;12966:3;12987:67;13051:2;13046:3;12987:67;:::i;:::-;12980:74;;13063:93;13152:3;13063:93;:::i;:::-;13181:2;13176:3;13172:12;13165:19;;12824:366;;;:::o;13196:::-;13338:3;13359:67;13423:2;13418:3;13359:67;:::i;:::-;13352:74;;13435:93;13524:3;13435:93;:::i;:::-;13553:2;13548:3;13544:12;13537:19;;13196:366;;;:::o;13568:::-;13710:3;13731:67;13795:2;13790:3;13731:67;:::i;:::-;13724:74;;13807:93;13896:3;13807:93;:::i;:::-;13925:2;13920:3;13916:12;13909:19;;13568:366;;;:::o;13940:::-;14082:3;14103:67;14167:2;14162:3;14103:67;:::i;:::-;14096:74;;14179:93;14268:3;14179:93;:::i;:::-;14297:2;14292:3;14288:12;14281:19;;13940:366;;;:::o;14312:::-;14454:3;14475:67;14539:2;14534:3;14475:67;:::i;:::-;14468:74;;14551:93;14640:3;14551:93;:::i;:::-;14669:2;14664:3;14660:12;14653:19;;14312:366;;;:::o;14684:::-;14826:3;14847:67;14911:2;14906:3;14847:67;:::i;:::-;14840:74;;14923:93;15012:3;14923:93;:::i;:::-;15041:2;15036:3;15032:12;15025:19;;14684:366;;;:::o;15056:::-;15198:3;15219:67;15283:2;15278:3;15219:67;:::i;:::-;15212:74;;15295:93;15384:3;15295:93;:::i;:::-;15413:2;15408:3;15404:12;15397:19;;15056:366;;;:::o;15428:::-;15570:3;15591:67;15655:2;15650:3;15591:67;:::i;:::-;15584:74;;15667:93;15756:3;15667:93;:::i;:::-;15785:2;15780:3;15776:12;15769:19;;15428:366;;;:::o;15800:::-;15942:3;15963:67;16027:2;16022:3;15963:67;:::i;:::-;15956:74;;16039:93;16128:3;16039:93;:::i;:::-;16157:2;16152:3;16148:12;16141:19;;15800:366;;;:::o;16172:::-;16314:3;16335:67;16399:2;16394:3;16335:67;:::i;:::-;16328:74;;16411:93;16500:3;16411:93;:::i;:::-;16529:2;16524:3;16520:12;16513:19;;16172:366;;;:::o;16544:::-;16686:3;16707:67;16771:2;16766:3;16707:67;:::i;:::-;16700:74;;16783:93;16872:3;16783:93;:::i;:::-;16901:2;16896:3;16892:12;16885:19;;16544:366;;;:::o;16916:::-;17058:3;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17155:93;17244:3;17155:93;:::i;:::-;17273:2;17268:3;17264:12;17257:19;;16916:366;;;:::o;17288:::-;17430:3;17451:67;17515:2;17510:3;17451:67;:::i;:::-;17444:74;;17527:93;17616:3;17527:93;:::i;:::-;17645:2;17640:3;17636:12;17629:19;;17288:366;;;:::o;17660:::-;17802:3;17823:67;17887:2;17882:3;17823:67;:::i;:::-;17816:74;;17899:93;17988:3;17899:93;:::i;:::-;18017:2;18012:3;18008:12;18001:19;;17660:366;;;:::o;18032:::-;18174:3;18195:67;18259:2;18254:3;18195:67;:::i;:::-;18188:74;;18271:93;18360:3;18271:93;:::i;:::-;18389:2;18384:3;18380:12;18373:19;;18032:366;;;:::o;18404:::-;18546:3;18567:67;18631:2;18626:3;18567:67;:::i;:::-;18560:74;;18643:93;18732:3;18643:93;:::i;:::-;18761:2;18756:3;18752:12;18745:19;;18404:366;;;:::o;18776:::-;18918:3;18939:67;19003:2;18998:3;18939:67;:::i;:::-;18932:74;;19015:93;19104:3;19015:93;:::i;:::-;19133:2;19128:3;19124:12;19117:19;;18776:366;;;:::o;19148:::-;19290:3;19311:67;19375:2;19370:3;19311:67;:::i;:::-;19304:74;;19387:93;19476:3;19387:93;:::i;:::-;19505:2;19500:3;19496:12;19489:19;;19148:366;;;:::o;19520:::-;19662:3;19683:67;19747:2;19742:3;19683:67;:::i;:::-;19676:74;;19759:93;19848:3;19759:93;:::i;:::-;19877:2;19872:3;19868:12;19861:19;;19520:366;;;:::o;19892:::-;20034:3;20055:67;20119:2;20114:3;20055:67;:::i;:::-;20048:74;;20131:93;20220:3;20131:93;:::i;:::-;20249:2;20244:3;20240:12;20233:19;;19892:366;;;:::o;20264:::-;20406:3;20427:67;20491:2;20486:3;20427:67;:::i;:::-;20420:74;;20503:93;20592:3;20503:93;:::i;:::-;20621:2;20616:3;20612:12;20605:19;;20264:366;;;:::o;20636:108::-;20713:24;20731:5;20713:24;:::i;:::-;20708:3;20701:37;20636:108;;:::o;20750:118::-;20837:24;20855:5;20837:24;:::i;:::-;20832:3;20825:37;20750:118;;:::o;20874:157::-;20979:45;20999:24;21017:5;20999:24;:::i;:::-;20979:45;:::i;:::-;20974:3;20967:58;20874:157;;:::o;21037:852::-;21277:3;21292:75;21363:3;21354:6;21292:75;:::i;:::-;21392:2;21387:3;21383:12;21376:19;;21405:91;21492:3;21483:6;21405:91;:::i;:::-;21521:2;21516:3;21512:12;21505:19;;21534:75;21605:3;21596:6;21534:75;:::i;:::-;21634:2;21629:3;21625:12;21618:19;;21647:75;21718:3;21709:6;21647:75;:::i;:::-;21747:2;21742:3;21738:12;21731:19;;21760:75;21831:3;21822:6;21760:75;:::i;:::-;21860:2;21855:3;21851:12;21844:19;;21880:3;21873:10;;21037:852;;;;;;;;:::o;21895:589::-;22120:3;22142:95;22233:3;22224:6;22142:95;:::i;:::-;22135:102;;22254:95;22345:3;22336:6;22254:95;:::i;:::-;22247:102;;22366:92;22454:3;22445:6;22366:92;:::i;:::-;22359:99;;22475:3;22468:10;;21895:589;;;;;;:::o;22490:222::-;22583:4;22621:2;22610:9;22606:18;22598:26;;22634:71;22702:1;22691:9;22687:17;22678:6;22634:71;:::i;:::-;22490:222;;;;:::o;22718:640::-;22913:4;22951:3;22940:9;22936:19;22928:27;;22965:71;23033:1;23022:9;23018:17;23009:6;22965:71;:::i;:::-;23046:72;23114:2;23103:9;23099:18;23090:6;23046:72;:::i;:::-;23128;23196:2;23185:9;23181:18;23172:6;23128:72;:::i;:::-;23247:9;23241:4;23237:20;23232:2;23221:9;23217:18;23210:48;23275:76;23346:4;23337:6;23275:76;:::i;:::-;23267:84;;22718:640;;;;;;;:::o;23364:373::-;23507:4;23545:2;23534:9;23530:18;23522:26;;23594:9;23588:4;23584:20;23580:1;23569:9;23565:17;23558:47;23622:108;23725:4;23716:6;23622:108;:::i;:::-;23614:116;;23364:373;;;;:::o;23743:210::-;23830:4;23868:2;23857:9;23853:18;23845:26;;23881:65;23943:1;23932:9;23928:17;23919:6;23881:65;:::i;:::-;23743:210;;;;:::o;23959:313::-;24072:4;24110:2;24099:9;24095:18;24087:26;;24159:9;24153:4;24149:20;24145:1;24134:9;24130:17;24123:47;24187:78;24260:4;24251:6;24187:78;:::i;:::-;24179:86;;23959:313;;;;:::o;24278:419::-;24444:4;24482:2;24471:9;24467:18;24459:26;;24531:9;24525:4;24521:20;24517:1;24506:9;24502:17;24495:47;24559:131;24685:4;24559:131;:::i;:::-;24551:139;;24278:419;;;:::o;24703:::-;24869:4;24907:2;24896:9;24892:18;24884:26;;24956:9;24950:4;24946:20;24942:1;24931:9;24927:17;24920:47;24984:131;25110:4;24984:131;:::i;:::-;24976:139;;24703:419;;;:::o;25128:::-;25294:4;25332:2;25321:9;25317:18;25309:26;;25381:9;25375:4;25371:20;25367:1;25356:9;25352:17;25345:47;25409:131;25535:4;25409:131;:::i;:::-;25401:139;;25128:419;;;:::o;25553:::-;25719:4;25757:2;25746:9;25742:18;25734:26;;25806:9;25800:4;25796:20;25792:1;25781:9;25777:17;25770:47;25834:131;25960:4;25834:131;:::i;:::-;25826:139;;25553:419;;;:::o;25978:::-;26144:4;26182:2;26171:9;26167:18;26159:26;;26231:9;26225:4;26221:20;26217:1;26206:9;26202:17;26195:47;26259:131;26385:4;26259:131;:::i;:::-;26251:139;;25978:419;;;:::o;26403:::-;26569:4;26607:2;26596:9;26592:18;26584:26;;26656:9;26650:4;26646:20;26642:1;26631:9;26627:17;26620:47;26684:131;26810:4;26684:131;:::i;:::-;26676:139;;26403:419;;;:::o;26828:::-;26994:4;27032:2;27021:9;27017:18;27009:26;;27081:9;27075:4;27071:20;27067:1;27056:9;27052:17;27045:47;27109:131;27235:4;27109:131;:::i;:::-;27101:139;;26828:419;;;:::o;27253:::-;27419:4;27457:2;27446:9;27442:18;27434:26;;27506:9;27500:4;27496:20;27492:1;27481:9;27477:17;27470:47;27534:131;27660:4;27534:131;:::i;:::-;27526:139;;27253:419;;;:::o;27678:::-;27844:4;27882:2;27871:9;27867:18;27859:26;;27931:9;27925:4;27921:20;27917:1;27906:9;27902:17;27895:47;27959:131;28085:4;27959:131;:::i;:::-;27951:139;;27678:419;;;:::o;28103:::-;28269:4;28307:2;28296:9;28292:18;28284:26;;28356:9;28350:4;28346:20;28342:1;28331:9;28327:17;28320:47;28384:131;28510:4;28384:131;:::i;:::-;28376:139;;28103:419;;;:::o;28528:::-;28694:4;28732:2;28721:9;28717:18;28709:26;;28781:9;28775:4;28771:20;28767:1;28756:9;28752:17;28745:47;28809:131;28935:4;28809:131;:::i;:::-;28801:139;;28528:419;;;:::o;28953:::-;29119:4;29157:2;29146:9;29142:18;29134:26;;29206:9;29200:4;29196:20;29192:1;29181:9;29177:17;29170:47;29234:131;29360:4;29234:131;:::i;:::-;29226:139;;28953:419;;;:::o;29378:::-;29544:4;29582:2;29571:9;29567:18;29559:26;;29631:9;29625:4;29621:20;29617:1;29606:9;29602:17;29595:47;29659:131;29785:4;29659:131;:::i;:::-;29651:139;;29378:419;;;:::o;29803:::-;29969:4;30007:2;29996:9;29992:18;29984:26;;30056:9;30050:4;30046:20;30042:1;30031:9;30027:17;30020:47;30084:131;30210:4;30084:131;:::i;:::-;30076:139;;29803:419;;;:::o;30228:::-;30394:4;30432:2;30421:9;30417:18;30409:26;;30481:9;30475:4;30471:20;30467:1;30456:9;30452:17;30445:47;30509:131;30635:4;30509:131;:::i;:::-;30501:139;;30228:419;;;:::o;30653:::-;30819:4;30857:2;30846:9;30842:18;30834:26;;30906:9;30900:4;30896:20;30892:1;30881:9;30877:17;30870:47;30934:131;31060:4;30934:131;:::i;:::-;30926:139;;30653:419;;;:::o;31078:::-;31244:4;31282:2;31271:9;31267:18;31259:26;;31331:9;31325:4;31321:20;31317:1;31306:9;31302:17;31295:47;31359:131;31485:4;31359:131;:::i;:::-;31351:139;;31078:419;;;:::o;31503:::-;31669:4;31707:2;31696:9;31692:18;31684:26;;31756:9;31750:4;31746:20;31742:1;31731:9;31727:17;31720:47;31784:131;31910:4;31784:131;:::i;:::-;31776:139;;31503:419;;;:::o;31928:::-;32094:4;32132:2;32121:9;32117:18;32109:26;;32181:9;32175:4;32171:20;32167:1;32156:9;32152:17;32145:47;32209:131;32335:4;32209:131;:::i;:::-;32201:139;;31928:419;;;:::o;32353:::-;32519:4;32557:2;32546:9;32542:18;32534:26;;32606:9;32600:4;32596:20;32592:1;32581:9;32577:17;32570:47;32634:131;32760:4;32634:131;:::i;:::-;32626:139;;32353:419;;;:::o;32778:::-;32944:4;32982:2;32971:9;32967:18;32959:26;;33031:9;33025:4;33021:20;33017:1;33006:9;33002:17;32995:47;33059:131;33185:4;33059:131;:::i;:::-;33051:139;;32778:419;;;:::o;33203:222::-;33296:4;33334:2;33323:9;33319:18;33311:26;;33347:71;33415:1;33404:9;33400:17;33391:6;33347:71;:::i;:::-;33203:222;;;;:::o;33431:129::-;33465:6;33492:20;;:::i;:::-;33482:30;;33521:33;33549:4;33541:6;33521:33;:::i;:::-;33431:129;;;:::o;33566:75::-;33599:6;33632:2;33626:9;33616:19;;33566:75;:::o;33647:307::-;33708:4;33798:18;33790:6;33787:30;33784:56;;;33820:18;;:::i;:::-;33784:56;33858:29;33880:6;33858:29;:::i;:::-;33850:37;;33942:4;33936;33932:15;33924:23;;33647:307;;;:::o;33960:308::-;34022:4;34112:18;34104:6;34101:30;34098:56;;;34134:18;;:::i;:::-;34098:56;34172:29;34194:6;34172:29;:::i;:::-;34164:37;;34256:4;34250;34246:15;34238:23;;33960:308;;;:::o;34274:132::-;34341:4;34364:3;34356:11;;34394:4;34389:3;34385:14;34377:22;;34274:132;;;:::o;34412:141::-;34461:4;34484:3;34476:11;;34507:3;34504:1;34497:14;34541:4;34538:1;34528:18;34520:26;;34412:141;;;:::o;34559:114::-;34626:6;34660:5;34654:12;34644:22;;34559:114;;;:::o;34679:98::-;34730:6;34764:5;34758:12;34748:22;;34679:98;;;:::o;34783:99::-;34835:6;34869:5;34863:12;34853:22;;34783:99;;;:::o;34888:113::-;34958:4;34990;34985:3;34981:14;34973:22;;34888:113;;;:::o;35007:184::-;35106:11;35140:6;35135:3;35128:19;35180:4;35175:3;35171:14;35156:29;;35007:184;;;;:::o;35197:168::-;35280:11;35314:6;35309:3;35302:19;35354:4;35349:3;35345:14;35330:29;;35197:168;;;;:::o;35371:169::-;35455:11;35489:6;35484:3;35477:19;35529:4;35524:3;35520:14;35505:29;;35371:169;;;;:::o;35546:148::-;35648:11;35685:3;35670:18;;35546:148;;;;:::o;35700:305::-;35740:3;35759:20;35777:1;35759:20;:::i;:::-;35754:25;;35793:20;35811:1;35793:20;:::i;:::-;35788:25;;35947:1;35879:66;35875:74;35872:1;35869:81;35866:107;;;35953:18;;:::i;:::-;35866:107;35997:1;35994;35990:9;35983:16;;35700:305;;;;:::o;36011:185::-;36051:1;36068:20;36086:1;36068:20;:::i;:::-;36063:25;;36102:20;36120:1;36102:20;:::i;:::-;36097:25;;36141:1;36131:35;;36146:18;;:::i;:::-;36131:35;36188:1;36185;36181:9;36176:14;;36011:185;;;;:::o;36202:348::-;36242:7;36265:20;36283:1;36265:20;:::i;:::-;36260:25;;36299:20;36317:1;36299:20;:::i;:::-;36294:25;;36487:1;36419:66;36415:74;36412:1;36409:81;36404:1;36397:9;36390:17;36386:105;36383:131;;;36494:18;;:::i;:::-;36383:131;36542:1;36539;36535:9;36524:20;;36202:348;;;;:::o;36556:191::-;36596:4;36616:20;36634:1;36616:20;:::i;:::-;36611:25;;36650:20;36668:1;36650:20;:::i;:::-;36645:25;;36689:1;36686;36683:8;36680:34;;;36694:18;;:::i;:::-;36680:34;36739:1;36736;36732:9;36724:17;;36556:191;;;;:::o;36753:96::-;36790:7;36819:24;36837:5;36819:24;:::i;:::-;36808:35;;36753:96;;;:::o;36855:104::-;36900:7;36929:24;36947:5;36929:24;:::i;:::-;36918:35;;36855:104;;;:::o;36965:90::-;36999:7;37042:5;37035:13;37028:21;37017:32;;36965:90;;;:::o;37061:149::-;37097:7;37137:66;37130:5;37126:78;37115:89;;37061:149;;;:::o;37216:126::-;37253:7;37293:42;37286:5;37282:54;37271:65;;37216:126;;;:::o;37348:77::-;37385:7;37414:5;37403:16;;37348:77;;;:::o;37431:154::-;37515:6;37510:3;37505;37492:30;37577:1;37568:6;37563:3;37559:16;37552:27;37431:154;;;:::o;37591:307::-;37659:1;37669:113;37683:6;37680:1;37677:13;37669:113;;;37768:1;37763:3;37759:11;37753:18;37749:1;37744:3;37740:11;37733:39;37705:2;37702:1;37698:10;37693:15;;37669:113;;;37800:6;37797:1;37794:13;37791:101;;;37880:1;37871:6;37866:3;37862:16;37855:27;37791:101;37640:258;37591:307;;;:::o;37904:320::-;37948:6;37985:1;37979:4;37975:12;37965:22;;38032:1;38026:4;38022:12;38053:18;38043:81;;38109:4;38101:6;38097:17;38087:27;;38043:81;38171:2;38163:6;38160:14;38140:18;38137:38;38134:84;;;38190:18;;:::i;:::-;38134:84;37955:269;37904:320;;;:::o;38230:281::-;38313:27;38335:4;38313:27;:::i;:::-;38305:6;38301:40;38443:6;38431:10;38428:22;38407:18;38395:10;38392:34;38389:62;38386:88;;;38454:18;;:::i;:::-;38386:88;38494:10;38490:2;38483:22;38273:238;38230:281;;:::o;38517:233::-;38556:3;38579:24;38597:5;38579:24;:::i;:::-;38570:33;;38625:66;38618:5;38615:77;38612:103;;;38695:18;;:::i;:::-;38612:103;38742:1;38735:5;38731:13;38724:20;;38517:233;;;:::o;38756:100::-;38795:7;38824:26;38844:5;38824:26;:::i;:::-;38813:37;;38756:100;;;:::o;38862:108::-;38909:7;38938:26;38958:5;38938:26;:::i;:::-;38927:37;;38862:108;;;:::o;38976:94::-;39015:7;39044:20;39058:5;39044:20;:::i;:::-;39033:31;;38976:94;;;:::o;39076:79::-;39115:7;39144:5;39133:16;;39076:79;;;:::o;39161:176::-;39193:1;39210:20;39228:1;39210:20;:::i;:::-;39205:25;;39244:20;39262:1;39244:20;:::i;:::-;39239:25;;39283:1;39273:35;;39288:18;;:::i;:::-;39273:35;39329:1;39326;39322:9;39317:14;;39161:176;;;;:::o;39343:180::-;39391:77;39388:1;39381:88;39488:4;39485:1;39478:15;39512:4;39509:1;39502:15;39529:180;39577:77;39574:1;39567:88;39674:4;39671:1;39664:15;39698:4;39695:1;39688:15;39715:180;39763:77;39760:1;39753:88;39860:4;39857:1;39850:15;39884:4;39881:1;39874:15;39901:180;39949:77;39946:1;39939:88;40046:4;40043:1;40036:15;40070:4;40067:1;40060:15;40087:180;40135:77;40132:1;40125:88;40232:4;40229:1;40222:15;40256:4;40253:1;40246:15;40273:180;40321:77;40318:1;40311:88;40418:4;40415:1;40408:15;40442:4;40439:1;40432:15;40459:117;40568:1;40565;40558:12;40582:117;40691:1;40688;40681:12;40705:117;40814:1;40811;40804:12;40828:117;40937:1;40934;40927:12;40951:117;41060:1;41057;41050:12;41074:117;41183:1;41180;41173:12;41197:102;41238:6;41289:2;41285:7;41280:2;41273:5;41269:14;41265:28;41255:38;;41197:102;;;:::o;41305:94::-;41338:8;41386:5;41382:2;41378:14;41357:35;;41305:94;;;:::o;41405:173::-;41545:25;41541:1;41533:6;41529:14;41522:49;41405:173;:::o;41584:230::-;41724:34;41720:1;41712:6;41708:14;41701:58;41793:13;41788:2;41780:6;41776:15;41769:38;41584:230;:::o;41820:237::-;41960:34;41956:1;41948:6;41944:14;41937:58;42029:20;42024:2;42016:6;42012:15;42005:45;41820:237;:::o;42063:181::-;42203:33;42199:1;42191:6;42187:14;42180:57;42063:181;:::o;42250:225::-;42390:34;42386:1;42378:6;42374:14;42367:58;42459:8;42454:2;42446:6;42442:15;42435:33;42250:225;:::o;42481:178::-;42621:30;42617:1;42609:6;42605:14;42598:54;42481:178;:::o;42665:223::-;42805:34;42801:1;42793:6;42789:14;42782:58;42874:6;42869:2;42861:6;42857:15;42850:31;42665:223;:::o;42894:175::-;43034:27;43030:1;43022:6;43018:14;43011:51;42894:175;:::o;43075:174::-;43215:26;43211:1;43203:6;43199:14;43192:50;43075:174;:::o;43255:231::-;43395:34;43391:1;43383:6;43379:14;43372:58;43464:14;43459:2;43451:6;43447:15;43440:39;43255:231;:::o;43492:243::-;43632:34;43628:1;43620:6;43616:14;43609:58;43701:26;43696:2;43688:6;43684:15;43677:51;43492:243;:::o;43741:229::-;43881:34;43877:1;43869:6;43865:14;43858:58;43950:12;43945:2;43937:6;43933:15;43926:37;43741:229;:::o;43976:228::-;44116:34;44112:1;44104:6;44100:14;44093:58;44185:11;44180:2;44172:6;44168:15;44161:36;43976:228;:::o;44210:182::-;44350:34;44346:1;44338:6;44334:14;44327:58;44210:182;:::o;44398:231::-;44538:34;44534:1;44526:6;44522:14;44515:58;44607:14;44602:2;44594:6;44590:15;44583:39;44398:231;:::o;44635:182::-;44775:34;44771:1;44763:6;44759:14;44752:58;44635:182;:::o;44823:228::-;44963:34;44959:1;44951:6;44947:14;44940:58;45032:11;45027:2;45019:6;45015:15;45008:36;44823:228;:::o;45057:234::-;45197:34;45193:1;45185:6;45181:14;45174:58;45266:17;45261:2;45253:6;45249:15;45242:42;45057:234;:::o;45297:220::-;45437:34;45433:1;45425:6;45421:14;45414:58;45506:3;45501:2;45493:6;45489:15;45482:28;45297:220;:::o;45523:236::-;45663:34;45659:1;45651:6;45647:14;45640:58;45732:19;45727:2;45719:6;45715:15;45708:44;45523:236;:::o;45765:231::-;45905:34;45901:1;45893:6;45889:14;45882:58;45974:14;45969:2;45961:6;45957:15;45950:39;45765:231;:::o;46002:122::-;46075:24;46093:5;46075:24;:::i;:::-;46068:5;46065:35;46055:63;;46114:1;46111;46104:12;46055:63;46002:122;:::o;46130:116::-;46200:21;46215:5;46200:21;:::i;:::-;46193:5;46190:32;46180:60;;46236:1;46233;46226:12;46180:60;46130:116;:::o;46252:120::-;46324:23;46341:5;46324:23;:::i;:::-;46317:5;46314:34;46304:62;;46362:1;46359;46352:12;46304:62;46252:120;:::o;46378:122::-;46451:24;46469:5;46451:24;:::i;:::-;46444:5;46441:35;46431:63;;46490:1;46487;46480:12;46431:63;46378:122;:::o

Swarm Source

ipfs://c357fc3983eba55c1fdc72adca6827beb8e5ddc2864752e8544f79425f7c4f9a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

555 Exclusive Pieces Only ! The hodlers of this collection get free mint on all future collections + token booster, starting with next collection, Training#1, dropping in November 7th.Sun Blocks are the fruit of Human / Machine collaboration. 
2800 photos, taken over the la...

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.