ETH Price: $3,629.78 (+1.26%)

Token

ERC-20: Dragos (DRAGOS)
 

Overview

Max Total Supply

2,298 DRAGOS

Holders

954

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 DRAGOS
0x2A8F200C4A79C668BDd4400504FAE756a34f14cf
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Dragos

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-10
*/

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);
}


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



/**
 * @dev String operations.
 */
library Strings {

    /**
     * @dev Custom toString function
     */
    function toString(uint256 _i) internal pure returns (string memory) {

        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

}


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


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


/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}



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


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


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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private 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/math/SafeMath.sol

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

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

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

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


/**
 * @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(to).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 {}
}



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


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


contract Dragos is ERC721Enumerable, ReentrancyGuard, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;

    bool public saleActive;
    bool public whitelistIsActive;
    bool public revealActive;
    string public prerevealURI;
    address payable mintData;

    address payoutWallet1;
    address payoutWallet2;

    uint256 mintPrice = 150000000000000000; // 0.15 ETH
    uint256 whitelistMintPrice = 100000000000000000; // 0.1 ETH
    uint256 creationTime;
    uint256 public MAX_TOKEN_SUPPLY = 6000;
    uint256 maxWhitelistMints = 3;
    uint256 maxMintsPerTxn = 5;
    uint256 maxSpecialDragons = 15;
    uint256 specialDragonsMinted;
    uint256 bytPayoutPercentage;

    bytes32[] _whitelistRootHash;

    mapping(address => uint256) public numberOfWhitelistMints;
    mapping(uint256 => uint256) public tokenIdToSpecialDragon;

    mapping(uint256 => string) private _dragosNameByTokenId;
    mapping(uint256 => uint256) private _dragosBirthdayByTokenId;

    function setSale() external onlyOwner
    {
        saleActive = !saleActive;
    }

    function setWhitelistSale() external onlyOwner
    {
        whitelistIsActive = !whitelistIsActive;
    }

    function setRevealActive() external onlyOwner
    {
        revealActive = !revealActive;
    }

    function setPrerevealURI(string memory prerevealURI_) external onlyOwner {
        prerevealURI = prerevealURI_;
    }

    function addToWhitelistRootHash(bytes32 _hash) public onlyOwner{
        _whitelistRootHash.push(_hash);
    }

    function hasMinted(uint256 tokenId) external view returns (bool)
    {
        return _exists(tokenId);
    }

    function getCreationTime() external view returns (uint256)
    {
        return creationTime;
    }

    function getLegendary(uint256 tokenId) external view returns (uint256)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return tokenIdToSpecialDragon[tokenId];
    }

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

        if (bytes(_dragosNameByTokenId[tokenId]).length > 0) {
            return _dragosNameByTokenId[tokenId];
        } else {
            return string(abi.encodePacked("Dragos #", toString(tokenId)));
        }

    }

    function getBackground(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getBackground(tokenId);

        return output;
    }
    
    function getFaction(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getFaction(tokenId);

        return output;
    }
    
    function getWings(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getWings(tokenId);

        return output;
    }

    function getWingTips(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getWingTips(tokenId);

        return output;
    }
    
    function getClothes(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getClothes(tokenId);

        return output;
    }

    function getNecklace(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getNecklace(tokenId);

        return output;
    }
    
    function getMouth(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getMouth(tokenId);

        return output;
    }
    
    function getEyes(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;
        
        Dragos dataContract = Dragos(mintData);
        output = dataContract.getEyes(tokenId);

        return output;
    }
    
    function getHat(uint256 tokenId) public view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory output;

        Dragos dataContract = Dragos(mintData);
        output = dataContract.getHat(tokenId);

        return output;
    }

    function getBirthday(uint256 tokenId) public view returns (uint256) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return _dragosBirthdayByTokenId[tokenId];
    }

    function setBirthday(uint256 tokenId) internal {
        uint256 epoch = 1643673600 + 14 days; // Feb. 1, 2022 00:00:00 UTC + 14 days = Feb. 15
        uint256 daysToBday = uint256(keccak256(abi.encodePacked(toString(block.timestamp), toString(tokenId)))) % 91;
        uint256 birthday = epoch + (daysToBday * 1 days);

        _dragosBirthdayByTokenId[tokenId] = birthday;
    }

    function getStats(uint256 statIndex, uint256 tokenId) public view returns (string memory statName, uint256 statValue) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        Dragos dataContract = Dragos(mintData);
        (statName, statValue) = dataContract.getStats(statIndex, tokenId);

        return (statName, statValue);
    }

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

            Dragos dataContract = Dragos(mintData);
            output = dataContract.tokenURI(tokenId);

            return output;
        }
        else
        {
            return prerevealURI;
        }
    }

    function validateName(string memory str) internal pure returns (bool){
		bytes memory b = bytes(str);
		if(b.length < 1) return false;
		if(b.length > 25) return false; // Cannot be longer than 25 characters
		if(b[0] == 0x20) return false; // Leading space
		if (b[b.length - 1] == 0x20) return false; // Trailing space

		bytes1 lastChar = b[0];

		for(uint i; i<b.length; i++){
			bytes1 char = b[i];

			if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces

			if(
				!(char >= 0x30 && char <= 0x39) && //9-0
				!(char >= 0x41 && char <= 0x5A) && //A-Z
				!(char >= 0x61 && char <= 0x7A) && //a-z
				!(char == 0x20) //space
			)
				return false;

			lastChar = char;
		}

		return true;
	}

    function whitelistValidated(address wallet, uint256 index, bytes32[] memory proof, bytes32[] memory _rootHash) internal pure returns (bool) {
        uint256 amount = 1;

        // Compute the merkle root
        bytes32 node = keccak256(abi.encodePacked(index, wallet, amount));
        uint256 path = index;
        for (uint16 i = 0; i < proof.length; i++) {
            if ((path & 0x01) == 1) {
                node = keccak256(abi.encodePacked(proof[i], node));
            } else {
                node = keccak256(abi.encodePacked(node, proof[i]));
            }
            path /= 2;
        }

        // Check the merkle proof against the root hash array
        for(uint i = 0; i < _rootHash.length; i++)
        {
            if (node == _rootHash[i])
            {
                return true;
            }
        }

        return false;
    }

    function mint(uint256 amount, string[] memory names) public nonReentrant payable{
        require(saleActive, "Public mint is currently closed");
        require(amount <= maxMintsPerTxn, "Purchase exceeds max mints per transaction");
        require(totalSupply().add(amount) <= MAX_TOKEN_SUPPLY, "Purchase would exceed max supply");
        require(msg.value == amount.mul(mintPrice), "Incorrect payment amount");
        uint256 tokenId = totalSupply();

        for(uint256 i = 0; i < amount; i++)
        {
            if (bytes(names[i]).length > 0) {
                require(validateName(names[i]), "Name is invalid");
                _dragosNameByTokenId[tokenId + i] = names[i];
            }
            
            setBirthday(tokenId + i);

            if(isDragonSpecial(tokenId + i))
            {
                specialDragonsMinted++;
                tokenIdToSpecialDragon[tokenId + i] = specialDragonsMinted;
            }
            
            _safeMint(_msgSender(), tokenId + i);
        }
    }

    function whitelistMint(uint256 amount, uint256 spotInWhitelist, bytes32[] memory proof, string[] memory names) public nonReentrant payable{
        require(whitelistIsActive, "Whitelist mint is currently closed");
        require(totalSupply().add(amount) <= MAX_TOKEN_SUPPLY, "Purchase would exceed max supply");
        require(whitelistValidated(_msgSender(), spotInWhitelist, proof, _whitelistRootHash), "You're not on the giveaway list");
        require(numberOfWhitelistMints[_msgSender()].add(amount) <= maxWhitelistMints, "You do not have that many whitelist mints");
        require(msg.value == amount.mul(whitelistMintPrice), "Incorrect payment amount");

        uint256 tokenId = totalSupply();

        for(uint256 i = 0; i < amount; i++)
        {
            if (bytes(names[i]).length > 0) {
                require(validateName(names[i]), "Name is invalid");
                _dragosNameByTokenId[tokenId + i] = names[i];
            }
            
            setBirthday(tokenId + i);

            if(isDragonSpecial(tokenId + i))
            {
                specialDragonsMinted++;
                tokenIdToSpecialDragon[tokenId + i] = specialDragonsMinted;
            }
            
            _safeMint(_msgSender(), tokenId + i);
        }

        numberOfWhitelistMints[_msgSender()] += amount;
    }

    function isDragonSpecial(uint256 tokenId) internal view returns(bool)
    {
        uint256 rand = uint256(keccak256(abi.encodePacked(toString(tokenId), toString(creationTime))));
        if(rand % 1000 > 996)
        {
            return true;
        }

        //In the case that there are enough special dragons left that all remaining tokens should be special return true
        if(totalSupply() + maxSpecialDragons - specialDragonsMinted == MAX_TOKEN_SUPPLY)
        {
            return true;
        }

        return false;
    }

    function setWalletOne(address _walletAddress) external onlyOwner {
        payoutWallet1 = _walletAddress;
    }

    function setWalletTwo(address _walletAddress) external onlyOwner {
        payoutWallet2 = _walletAddress;
    }

    function setMintContract(address payable contractAddress) public onlyOwner {
        mintData = contractAddress;
    }

    function withdraw() external onlyOwner {
        require(payoutWallet1 != address(0), "wallet 1 not set");
        require(payoutWallet2 != address(0), "wallet 2 not set");
        uint256 balance = address(this).balance;
        uint256 walletBalance = balance.mul(100 - bytPayoutPercentage).div(100);
        payable(payoutWallet1).transfer(walletBalance);
        payable(payoutWallet2).transfer(balance.sub(walletBalance));
    }
    
    constructor() ERC721("Dragos", "DRAGOS") Ownable() {
        creationTime = block.timestamp;
        payoutWallet1 = 0x8d3Aad1100c67ecCef8426151DC8C4b659012a6F; // dragos payout wallet
        payoutWallet2 = 0xFd182CAc22329a58375bf5f93B2C33E83c881540; // byt payout wallet
        bytPayoutPercentage = 9;
        prerevealURI = "https://dragos.mypinata.cloud/ipfs/QmZdZhygDZTsG6KC71zk9XMohScmFKZryFpeGZ939oLzX9";
        addToWhitelistRootHash(0xd963e460e626c03996dd9aa0626ad93a829b3eaaedb764402193e10981172518);
        mintData = payable(0x77591D3868D657B31b788C430E9C2A9194768790); 
    }

    fallback() external payable {}

    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
}

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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MAX_TOKEN_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"addToWhitelistRootHash","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getBackground","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBirthday","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getClothes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCreationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getEyes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFaction","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHat","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getLegendary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMouth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNecklace","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"statIndex","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStats","outputs":[{"internalType":"string","name":"statName","type":"string"},{"internalType":"uint256","name":"statValue","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWingTips","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getWings","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numberOfWhitelistMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"prerevealURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"contractAddress","type":"address"}],"name":"setMintContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prerevealURI_","type":"string"}],"name":"setPrerevealURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"setWalletOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"setWalletTwo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhitelistSale","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToSpecialDragon","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":[],"name":"whitelistIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"spotInWhitelist","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"string[]","name":"names","type":"string[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052670214e8348c4f000060105567016345785d8a000060115561177060135560036014556005601555600f6016553480156200003e57600080fd5b5060405180604001604052806006815260200165447261676f7360d01b81525060405180604001604052806006815260200165445241474f5360d01b8152508160009080519060200190620000959291906200027c565b508051620000ab9060019060208401906200027c565b50506001600a5550620000be3362000196565b42601255600e80546001600160a01b0319908116738d3aad1100c67eccef8426151dc8c4b659012a6f17909155600f805490911673fd182cac22329a58375bf5f93b2c33e83c88154017905560096018556040805160808101909152605180825262003fba602083013980516200013e91600c916020909101906200027c565b506200016a7fd963e460e626c03996dd9aa0626ad93a829b3eaaedb764402193e10981172518620001e8565b600d80546001600160a01b0319167377591d3868d657b31b788c430e9c2a91947687901790556200035f565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600b546001600160a01b03163314620002475760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950155565b8280546200028a9062000322565b90600052602060002090601f016020900481019282620002ae5760008555620002f9565b82601f10620002c957805160ff1916838001178555620002f9565b82800160010185558215620002f9579182015b82811115620002f9578251825591602001919060010190620002dc565b50620003079291506200030b565b5090565b5b808211156200030757600081556001016200030c565b600181811c908216806200033757607f821691505b602082108114156200035957634e487b7160e01b600052602260045260246000fd5b50919050565b613c4b806200036f6000396000f3fe6080604052600436106102de5760003560e01c8063715018a61161017e578063cef216e2116100d3578063e6519a351161008f578063edde4c781161006c578063edde4c7814610900578063f0d6dcff14610915578063f2fde38b14610928578063feb6b3d11461094857005b8063e6519a3514610882578063e8d887d314610897578063e985e9c5146108b757005b8063cef216e2146107e2578063d18ceec2146107f7578063d2571f8814610817578063d62280b214610837578063e489d5101461084c578063e5b955951461086257005b8063a4c1291c1161013a578063bb47c9b311610117578063bb47c9b314610754578063c4d30bfa14610782578063c87b56dd146107a2578063c8d2524c146107c257005b8063a4c1291c146106f4578063a8a150b814610714578063b88d4fde1461073457005b8063715018a61461065957806388bd50021461066e5780638a1bbf861461068e5780638da5cb5b146106a157806395d89b41146106bf578063a22cb465146106d457005b806339c5c1a711610234578063519679d1116101f057806368428a1b116101cd57806368428a1b146105cb5780636b8ff574146105ec5780636be4d84d1461060c57806370a082311461063957005b8063519679d11461055e5780635fb64a6a1461058b5780636352211e146105ab57005b806339c5c1a7146104a85780633a6713ec146104c95780633ccfd60b146104e9578063407f42b7146104fe57806342842e0e1461051e5780634f6ccce71461053e57005b806318160ddd1161029b57806323b872dd1161027857806323b872dd14610428578063281303d4146104485780632d02f8c1146104685780632f745c591461048857005b806318160ddd146103dd5780631d9cfd6d146103f25780631fe70d6f1461040757005b806301ffc9a7146102e057806306fdde0314610315578063078eef2814610337578063081812fc14610357578063095ea7b31461038f57806310406bec146103af575b005b3480156102ec57600080fd5b506103006102fb3660046135a4565b610968565b60405190151581526020015b60405180910390f35b34801561032157600080fd5b5061032a610993565b60405161030c9190613889565b34801561034357600080fd5b506102de6103523660046135de565b610a25565b34801561036357600080fd5b5061037761037236600461358b565b610a6f565b6040516001600160a01b03909116815260200161030c565b34801561039b57600080fd5b506102de6103aa36600461355f565b610af7565b3480156103bb57600080fd5b506103cf6103ca36600461358b565b610c0d565b60405190815260200161030c565b3480156103e957600080fd5b506008546103cf565b3480156103fe57600080fd5b506102de610c47565b34801561041357600080fd5b50600b5461030090600160a81b900460ff1681565b34801561043457600080fd5b506102de61044336600461346b565b610c92565b34801561045457600080fd5b506102de610463366004613415565b610cc3565b34801561047457600080fd5b5061032a61048336600461358b565b610d0f565b34801561049457600080fd5b506103cf6104a336600461355f565b610dc2565b3480156104b457600080fd5b50600b5461030090600160b01b900460ff1681565b3480156104d557600080fd5b5061032a6104e436600461358b565b610e58565b3480156104f557600080fd5b506102de610eb3565b34801561050a57600080fd5b5061032a61051936600461358b565b61101b565b34801561052a57600080fd5b506102de61053936600461346b565b611076565b34801561054a57600080fd5b506103cf61055936600461358b565b611091565b34801561056a57600080fd5b506103cf610579366004613415565b601a6020526000908152604090205481565b34801561059757600080fd5b506102de6105a6366004613415565b611124565b3480156105b757600080fd5b506103776105c636600461358b565b611170565b3480156105d757600080fd5b50600b5461030090600160a01b900460ff1681565b3480156105f857600080fd5b5061032a61060736600461358b565b6111e7565b34801561061857600080fd5b506103cf61062736600461358b565b601b6020526000908152604090205481565b34801561064557600080fd5b506103cf610654366004613415565b6112fc565b34801561066557600080fd5b506102de611383565b34801561067a57600080fd5b5061032a61068936600461358b565b6113b9565b6102de61069c36600461368f565b611414565b3480156106ad57600080fd5b50600b546001600160a01b0316610377565b3480156106cb57600080fd5b5061032a61175f565b3480156106e057600080fd5b506102de6106ef36600461352c565b61176e565b34801561070057600080fd5b506102de61070f36600461358b565b611833565b34801561072057600080fd5b5061032a61072f36600461358b565b611892565b34801561074057600080fd5b506102de61074f3660046134ac565b6118ed565b34801561076057600080fd5b5061077461076f3660046136d6565b611925565b60405161030c92919061389c565b34801561078e57600080fd5b5061032a61079d36600461358b565b6119e3565b3480156107ae57600080fd5b5061032a6107bd36600461358b565b611a3e565b3480156107ce57600080fd5b506103cf6107dd36600461358b565b611ab8565b3480156107ee57600080fd5b506102de611af2565b34801561080357600080fd5b506102de610812366004613415565b611b3d565b34801561082357600080fd5b5061032a61083236600461358b565b611b89565b34801561084357600080fd5b5061032a611be4565b34801561085857600080fd5b506103cf60135481565b34801561086e57600080fd5b5061030061087d36600461358b565b611c72565b34801561088e57600080fd5b506012546103cf565b3480156108a357600080fd5b5061032a6108b236600461358b565b611c7d565b3480156108c357600080fd5b506103006108d2366004613432565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561090c57600080fd5b506102de611cd8565b6102de6109233660046136f8565b611d23565b34801561093457600080fd5b506102de610943366004613415565b612137565b34801561095457600080fd5b5061032a61096336600461358b565b6121d2565b60006001600160e01b0319821663780e9d6360e01b148061098d575061098d8261222d565b92915050565b6060600080546109a290613af0565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce90613af0565b8015610a1b5780601f106109f057610100808354040283529160200191610a1b565b820191906000526020600020905b8154815290600101906020018083116109fe57829003601f168201915b5050505050905090565b600b546001600160a01b03163314610a585760405162461bcd60e51b8152600401610a4f90613910565b60405180910390fd5b8051610a6b90600c906020840190613247565b5050565b6000610a7a8261227d565b610adb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a4f565b506000908152600460205260409020546001600160a01b031690565b6000610b0282611170565b9050806001600160a01b0316836001600160a01b03161415610b705760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a4f565b336001600160a01b0382161480610b8c5750610b8c81336108d2565b610bfe5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4f565b610c08838361229a565b505050565b6000610c188261227d565b610c345760405162461bcd60e51b8152600401610a4f90613945565b506000908152601b602052604090205490565b600b546001600160a01b03163314610c715760405162461bcd60e51b8152600401610a4f90613910565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b610c9c3382612308565b610cb85760405162461bcd60e51b8152600401610a4f90613994565b610c088383836123ee565b600b546001600160a01b03163314610ced5760405162461bcd60e51b8152600401610a4f90613910565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610d1a8261227d565b610d365760405162461bcd60e51b8152600401610a4f90613945565b600d54604051632d02f8c160e01b8152600481018490526060916001600160a01b0316908190632d02f8c1906024015b60006040518083038186803b158015610d7e57600080fd5b505afa158015610d92573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dba9190810190613613565b949350505050565b6000610dcd836112fc565b8210610e2f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a4f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6060610e638261227d565b610e7f5760405162461bcd60e51b8152600401610a4f90613945565b600d54604051630e99c4fb60e21b8152600481018490526060916001600160a01b0316908190633a6713ec90602401610d66565b600b546001600160a01b03163314610edd5760405162461bcd60e51b8152600401610a4f90613910565b600e546001600160a01b0316610f285760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c481b9bdd081cd95d60821b6044820152606401610a4f565b600f546001600160a01b0316610f735760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c881b9bdd081cd95d60821b6044820152606401610a4f565b60004790506000610f9e6064610f986018546064610f919190613aad565b8590612599565b9061261f565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610fd9573d6000803e3d6000fd5b50600f546001600160a01b03166108fc610ff3848461267a565b6040518115909202916000818181858888f19350505050158015610c08573d6000803e3d6000fd5b60606110268261227d565b6110425760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163407f42b760e01b8152600481018490526060916001600160a01b031690819063407f42b790602401610d66565b610c08838383604051806020016040528060008152506118ed565b600061109c60085490565b82106110ff5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a4f565b6008828154811061111257611112613bbe565b90600052602060002001549050919050565b600b546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610a4f90613910565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b03168061098d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a4f565b60606111f28261227d565b61120e5760405162461bcd60e51b8152600401610a4f90613945565b6000828152601c60205260408120805461122790613af0565b905011156112cd576000828152601c60205260409020805461124890613af0565b80601f016020809104026020016040519081016040528092919081815260200182805461127490613af0565b80156112c15780601f10611296576101008083540402835291602001916112c1565b820191906000526020600020905b8154815290600101906020018083116112a457829003601f168201915b50505050509050919050565b6112d6826126d6565b6040516020016112e6919061381c565b6040516020818303038152906040529050919050565b60006001600160a01b0382166113675760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a4f565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146113ad5760405162461bcd60e51b8152600401610a4f90613910565b6113b760006127d4565b565b60606113c48261227d565b6113e05760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163445ea80160e11b8152600481018490526060916001600160a01b03169081906388bd500290602401610d66565b6002600a5414156114675760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4f565b6002600a55600b54600160a01b900460ff166114c55760405162461bcd60e51b815260206004820152601f60248201527f5075626c6963206d696e742069732063757272656e746c7920636c6f736564006044820152606401610a4f565b60155482111561152a5760405162461bcd60e51b815260206004820152602a60248201527f50757263686173652065786365656473206d6178206d696e74732070657220746044820152693930b739b0b1ba34b7b760b11b6064820152608401610a4f565b6013546115408361153a60085490565b90612826565b111561158e5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610a4f565b60105461159c908390612599565b34146115e55760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b6044820152606401610a4f565b60006115f060085490565b905060005b8381101561175457600083828151811061161157611611613bbe565b60200260200101515111156116cd5761164283828151811061163557611635613bbe565b6020026020010151612885565b6116805760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b6044820152606401610a4f565b82818151811061169257611692613bbe565b6020026020010151601c600083856116aa9190613a62565b815260200190815260200160002090805190602001906116cb929190613247565b505b6116df6116da8284613a62565b612a94565b6116f16116ec8284613a62565b612b16565b1561172e576017805490600061170683613b4d565b9091555050601754601b600061171c8486613a62565b81526020810191909152604001600020555b611742335b61173d8385613a62565b612bae565b8061174c81613b4d565b9150506115f5565b50506001600a555050565b6060600180546109a290613af0565b6001600160a01b0382163314156117c75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546001600160a01b0316331461185d5760405162461bcd60e51b8152600401610a4f90613910565b601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950155565b606061189d8261227d565b6118b95760405162461bcd60e51b8152600401610a4f90613945565b600d546040516315142a1760e31b8152600481018490526060916001600160a01b031690819063a8a150b890602401610d66565b6118f73383612308565b6119135760405162461bcd60e51b8152600401610a4f90613994565b61191f84848484612bc8565b50505050565b606060006119328361227d565b61194e5760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163bb47c9b360e01b815260048101869052602481018590526001600160a01b0390911690819063bb47c9b39060440160006040518083038186803b15801561199b57600080fd5b505afa1580156119af573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119d79190810190613648565b90969095509350505050565b60606119ee8261227d565b611a0a5760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163626985fd60e11b8152600481018490526060916001600160a01b031690819063c4d30bfa90602401610d66565b6060611a498261227d565b611a655760405162461bcd60e51b8152600401610a4f90613945565b600b54600160b01b900460ff1615611aab57600d5460405163c87b56dd60e01b8152600481018490526060916001600160a01b031690819063c87b56dd90602401610d66565b600c805461124890613af0565b6000611ac38261227d565b611adf5760405162461bcd60e51b8152600401610a4f90613945565b506000908152601d602052604090205490565b600b546001600160a01b03163314611b1c5760405162461bcd60e51b8152600401610a4f90613910565b600b805460ff60a81b198116600160a81b9182900460ff1615909102179055565b600b546001600160a01b03163314611b675760405162461bcd60e51b8152600401610a4f90613910565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6060611b948261227d565b611bb05760405162461bcd60e51b8152600401610a4f90613945565b600d54604051631a4ae3f160e31b8152600481018490526060916001600160a01b031690819063d2571f8890602401610d66565b600c8054611bf190613af0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1d90613af0565b8015611c6a5780601f10611c3f57610100808354040283529160200191611c6a565b820191906000526020600020905b815481529060010190602001808311611c4d57829003601f168201915b505050505081565b600061098d8261227d565b6060611c888261227d565b611ca45760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163e8d887d360e01b8152600481018490526060916001600160a01b031690819063e8d887d390602401610d66565b600b546001600160a01b03163314611d025760405162461bcd60e51b8152600401610a4f90613910565b600b805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6002600a541415611d765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4f565b6002600a55600b54600160a81b900460ff16611ddf5760405162461bcd60e51b815260206004820152602260248201527f57686974656c697374206d696e742069732063757272656e746c7920636c6f73604482015261195960f21b6064820152608401610a4f565b601354611def8561153a60085490565b1115611e3d5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610a4f565b611e993384846019805480602002602001604051908101604052809291908181526020018280548015611e8f57602002820191906000526020600020905b815481526020019060010190808311611e7b575b5050505050612bfb565b611ee55760405162461bcd60e51b815260206004820152601f60248201527f596f75277265206e6f74206f6e20746865206769766561776179206c697374006044820152606401610a4f565b601454336000908152601a6020526040902054611f029086612826565b1115611f625760405162461bcd60e51b815260206004820152602960248201527f596f7520646f206e6f7420686176652074686174206d616e792077686974656c604482015268697374206d696e747360b81b6064820152608401610a4f565b601154611f70908590612599565b3414611fb95760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b6044820152606401610a4f565b6000611fc460085490565b905060005b85811015612106576000838281518110611fe557611fe5613bbe565b60200260200101515111156120945761200983828151811061163557611635613bbe565b6120475760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b6044820152606401610a4f565b82818151811061205957612059613bbe565b6020026020010151601c600083856120719190613a62565b81526020019081526020016000209080519060200190612092929190613247565b505b6120a16116da8284613a62565b6120ae6116ec8284613a62565b156120eb57601780549060006120c383613b4d565b9091555050601754601b60006120d98486613a62565b81526020810191909152604001600020555b6120f433611733565b806120fe81613b4d565b915050611fc9565b50336000908152601a602052604081208054879290612126908490613a62565b90915550506001600a555050505050565b600b546001600160a01b031633146121615760405162461bcd60e51b8152600401610a4f90613910565b6001600160a01b0381166121c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a4f565b6121cf816127d4565b50565b60606121dd8261227d565b6121f95760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163feb6b3d160e01b8152600481018490526060916001600160a01b031690819063feb6b3d190602401610d66565b60006001600160e01b031982166380ac58cd60e01b148061225e57506001600160e01b03198216635b5e139f60e01b145b8061098d57506301ffc9a760e01b6001600160e01b031983161461098d565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122cf82611170565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123138261227d565b6123745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a4f565b600061237f83611170565b9050806001600160a01b0316846001600160a01b031614806123ba5750836001600160a01b03166123af84610a6f565b6001600160a01b0316145b80610dba57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610dba565b826001600160a01b031661240182611170565b6001600160a01b0316146124695760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a4f565b6001600160a01b0382166124cb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4f565b6124d6838383612d83565b6124e160008261229a565b6001600160a01b038316600090815260036020526040812080546001929061250a908490613aad565b90915550506001600160a01b0382166000908152600360205260408120805460019290612538908490613a62565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826125a85750600061098d565b60006125b48385613a8e565b9050826125c18583613a7a565b146126185760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a4f565b9392505050565b60008082116126705760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610a4f565b6126188284613a7a565b6000828211156126cc5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610a4f565b6126188284613aad565b6060816126fa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612724578061270e81613b4d565b915061271d9050600a83613a7a565b91506126fe565b60008167ffffffffffffffff81111561273f5761273f613bd4565b6040519080825280601f01601f191660200182016040528015612769576020820181803683370190505b5090505b8415610dba5761277e600183613aad565b915061278b600a86613b68565b612796906030613a62565b60f81b8183815181106127ab576127ab613bbe565b60200101906001600160f81b031916908160001a9053506127cd600a86613a7a565b945061276d565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806128338385613a62565b9050838110156126185760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a4f565b60008082905060018151101561289e5750600092915050565b6019815111156128b15750600092915050565b806000815181106128c4576128c4613bbe565b6020910101516001600160f81b031916600160fd1b14156128e85750600092915050565b80600182516128f79190613aad565b8151811061290757612907613bbe565b6020910101516001600160f81b031916600160fd1b141561292b5750600092915050565b60008160008151811061294057612940613bbe565b01602001516001600160f81b031916905060005b8251811015612a8957600083828151811061297157612971613bbe565b01602001516001600160f81b0319169050600160fd1b811480156129a25750600160fd1b6001600160f81b03198416145b156129b35750600095945050505050565b600360fc1b6001600160f81b03198216108015906129df5750603960f81b6001600160f81b0319821611155b158015612a155750604160f81b6001600160f81b0319821610801590612a135750602d60f91b6001600160f81b0319821611155b155b8015612a4a5750606160f81b6001600160f81b0319821610801590612a485750603d60f91b6001600160f81b0319821611155b155b8015612a645750600160fd1b6001600160f81b0319821614155b15612a755750600095945050505050565b915080612a8181613b4d565b915050612954565b506001949350505050565b63620aed006000605b612aa6426126d6565b612aaf856126d6565b604051602001612ac09291906137ed565b6040516020818303038152906040528051906020012060001c612ae39190613b68565b90506000612af48262015180613a8e565b612afe9084613a62565b6000948552601d602052604090942093909355505050565b600080612b22836126d6565b612b2d6012546126d6565b604051602001612b3e9291906137ed565b60408051601f19818403018152919052805160209091012090506103e4612b676103e883613b68565b1115612b765750600192915050565b601354601754601654600854612b8c9190613a62565b612b969190613aad565b1415612ba55750600192915050565b50600092915050565b610a6b828260405180602001604052806000815250612e3b565b612bd38484846123ee565b612bdf84848484612e6e565b61191f5760405162461bcd60e51b8152600401610a4f906138be565b604080516020808201869052606087901b6bffffffffffffffffffffffff1916828401526001605480840182905284518085039091018152607490930190935281519101206000919085835b86518161ffff161015612d27578160011660011415612cb657868161ffff1681518110612c7657612c76613bbe565b602002602001015183604051602001612c99929190918252602082015260400190565b604051602081830303815290604052805190602001209250612d08565b82878261ffff1681518110612ccd57612ccd613bbe565b6020026020010151604051602001612cef929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b612d13600283613a7a565b915080612d1f81613b2b565b915050612c47565b5060005b8551811015612d7457858181518110612d4657612d46613bbe565b6020026020010151831415612d62576001945050505050610dba565b80612d6c81613b4d565b915050612d2b565b50600098975050505050505050565b6001600160a01b038316612dde57612dd981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e01565b816001600160a01b0316836001600160a01b031614612e0157612e018382612f78565b6001600160a01b038216612e1857610c0881613015565b826001600160a01b0316826001600160a01b031614610c0857610c0882826130c4565b612e458383613108565b612e526000848484612e6e565b610c085760405162461bcd60e51b8152600401610a4f906138be565b60006001600160a01b0384163b15612f7057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612eb290339089908890889060040161384c565b602060405180830381600087803b158015612ecc57600080fd5b505af1925050508015612efc575060408051601f3d908101601f19168201909252612ef9918101906135c1565b60015b612f56573d808015612f2a576040519150601f19603f3d011682016040523d82523d6000602084013e612f2f565b606091505b508051612f4e5760405162461bcd60e51b8152600401610a4f906138be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dba565b506001610dba565b60006001612f85846112fc565b612f8f9190613aad565b600083815260076020526040902054909150808214612fe2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061302790600190613aad565b6000838152600960205260408120546008805493945090928490811061304f5761304f613bbe565b90600052602060002001549050806008838154811061307057613070613bbe565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806130a8576130a8613ba8565b6001900381819060005260206000200160009055905550505050565b60006130cf836112fc565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661315e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4f565b6131678161227d565b156131b45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4f565b6131c060008383612d83565b6001600160a01b03821660009081526003602052604081208054600192906131e9908490613a62565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461325390613af0565b90600052602060002090601f01602090048101928261327557600085556132bb565b82601f1061328e57805160ff19168380011785556132bb565b828001600101855582156132bb579182015b828111156132bb5782518255916020019190600101906132a0565b506132c79291506132cb565b5090565b5b808211156132c757600081556001016132cc565b60006132f36132ee84613a3a565b6139e5565b905082815283838301111561330757600080fd5b828260208301376000602084830101529392505050565b600082601f83011261332f57600080fd5b8135602061333f6132ee83613a16565b80838252828201915082860187848660051b890101111561335f57600080fd5b6000805b868110156133a257823567ffffffffffffffff811115613381578283fd5b61338f8b88838d01016133b0565b8652509385019391850191600101613363565b509198975050505050505050565b600082601f8301126133c157600080fd5b612618838335602085016132e0565b600082601f8301126133e157600080fd5b81516133ef6132ee82613a3a565b81815284602083860101111561340457600080fd5b610dba826020830160208701613ac4565b60006020828403121561342757600080fd5b813561261881613bea565b6000806040838503121561344557600080fd5b823561345081613bea565b9150602083013561346081613bea565b809150509250929050565b60008060006060848603121561348057600080fd5b833561348b81613bea565b9250602084013561349b81613bea565b929592945050506040919091013590565b600080600080608085870312156134c257600080fd5b84356134cd81613bea565b935060208501356134dd81613bea565b925060408501359150606085013567ffffffffffffffff81111561350057600080fd5b8501601f8101871361351157600080fd5b613520878235602084016132e0565b91505092959194509250565b6000806040838503121561353f57600080fd5b823561354a81613bea565b91506020830135801515811461346057600080fd5b6000806040838503121561357257600080fd5b823561357d81613bea565b946020939093013593505050565b60006020828403121561359d57600080fd5b5035919050565b6000602082840312156135b657600080fd5b813561261881613bff565b6000602082840312156135d357600080fd5b815161261881613bff565b6000602082840312156135f057600080fd5b813567ffffffffffffffff81111561360757600080fd5b610dba848285016133b0565b60006020828403121561362557600080fd5b815167ffffffffffffffff81111561363c57600080fd5b610dba848285016133d0565b6000806040838503121561365b57600080fd5b825167ffffffffffffffff81111561367257600080fd5b61367e858286016133d0565b925050602083015190509250929050565b600080604083850312156136a257600080fd5b82359150602083013567ffffffffffffffff8111156136c057600080fd5b6136cc8582860161331e565b9150509250929050565b600080604083850312156136e957600080fd5b50508035926020909101359150565b6000806000806080858703121561370e57600080fd5b843593506020808601359350604086013567ffffffffffffffff8082111561373557600080fd5b818801915088601f83011261374957600080fd5b81356137576132ee82613a16565b8082825285820191508585018c878560051b880101111561377757600080fd5b600095505b8386101561379a57803583526001959095019491860191860161377c565b509650505060608801359250808311156137b357600080fd5b50506135208782880161331e565b600081518084526137d9816020860160208601613ac4565b601f01601f19169290920160200192915050565b600083516137ff818460208801613ac4565b835190830190613813818360208801613ac4565b01949350505050565b67447261676f73202360c01b81526000825161383f816008850160208701613ac4565b9190910160080192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061387f908301846137c1565b9695505050505050565b60208152600061261860208301846137c1565b6040815260006138af60408301856137c1565b90508260208301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a0e57613a0e613bd4565b604052919050565b600067ffffffffffffffff821115613a3057613a30613bd4565b5060051b60200190565b600067ffffffffffffffff821115613a5457613a54613bd4565b50601f01601f191660200190565b60008219821115613a7557613a75613b7c565b500190565b600082613a8957613a89613b92565b500490565b6000816000190483118215151615613aa857613aa8613b7c565b500290565b600082821015613abf57613abf613b7c565b500390565b60005b83811015613adf578181015183820152602001613ac7565b8381111561191f5750506000910152565b600181811c90821680613b0457607f821691505b60208210811415613b2557634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415613b4357613b43613b7c565b6001019392505050565b6000600019821415613b6157613b61613b7c565b5060010190565b600082613b7757613b77613b92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146121cf57600080fd5b6001600160e01b0319811681146121cf57600080fdfea264697066735822122052a65744a875ccbf30bda5fd46d09071ce1fdca790f3d490e0808898e91d79ed64736f6c6343000806003368747470733a2f2f647261676f732e6d7970696e6174612e636c6f75642f697066732f516d5a645a687967445a547347364b4337317a6b39584d6f6853636d464b5a7279467065475a3933396f4c7a5839

Deployed Bytecode

0x6080604052600436106102de5760003560e01c8063715018a61161017e578063cef216e2116100d3578063e6519a351161008f578063edde4c781161006c578063edde4c7814610900578063f0d6dcff14610915578063f2fde38b14610928578063feb6b3d11461094857005b8063e6519a3514610882578063e8d887d314610897578063e985e9c5146108b757005b8063cef216e2146107e2578063d18ceec2146107f7578063d2571f8814610817578063d62280b214610837578063e489d5101461084c578063e5b955951461086257005b8063a4c1291c1161013a578063bb47c9b311610117578063bb47c9b314610754578063c4d30bfa14610782578063c87b56dd146107a2578063c8d2524c146107c257005b8063a4c1291c146106f4578063a8a150b814610714578063b88d4fde1461073457005b8063715018a61461065957806388bd50021461066e5780638a1bbf861461068e5780638da5cb5b146106a157806395d89b41146106bf578063a22cb465146106d457005b806339c5c1a711610234578063519679d1116101f057806368428a1b116101cd57806368428a1b146105cb5780636b8ff574146105ec5780636be4d84d1461060c57806370a082311461063957005b8063519679d11461055e5780635fb64a6a1461058b5780636352211e146105ab57005b806339c5c1a7146104a85780633a6713ec146104c95780633ccfd60b146104e9578063407f42b7146104fe57806342842e0e1461051e5780634f6ccce71461053e57005b806318160ddd1161029b57806323b872dd1161027857806323b872dd14610428578063281303d4146104485780632d02f8c1146104685780632f745c591461048857005b806318160ddd146103dd5780631d9cfd6d146103f25780631fe70d6f1461040757005b806301ffc9a7146102e057806306fdde0314610315578063078eef2814610337578063081812fc14610357578063095ea7b31461038f57806310406bec146103af575b005b3480156102ec57600080fd5b506103006102fb3660046135a4565b610968565b60405190151581526020015b60405180910390f35b34801561032157600080fd5b5061032a610993565b60405161030c9190613889565b34801561034357600080fd5b506102de6103523660046135de565b610a25565b34801561036357600080fd5b5061037761037236600461358b565b610a6f565b6040516001600160a01b03909116815260200161030c565b34801561039b57600080fd5b506102de6103aa36600461355f565b610af7565b3480156103bb57600080fd5b506103cf6103ca36600461358b565b610c0d565b60405190815260200161030c565b3480156103e957600080fd5b506008546103cf565b3480156103fe57600080fd5b506102de610c47565b34801561041357600080fd5b50600b5461030090600160a81b900460ff1681565b34801561043457600080fd5b506102de61044336600461346b565b610c92565b34801561045457600080fd5b506102de610463366004613415565b610cc3565b34801561047457600080fd5b5061032a61048336600461358b565b610d0f565b34801561049457600080fd5b506103cf6104a336600461355f565b610dc2565b3480156104b457600080fd5b50600b5461030090600160b01b900460ff1681565b3480156104d557600080fd5b5061032a6104e436600461358b565b610e58565b3480156104f557600080fd5b506102de610eb3565b34801561050a57600080fd5b5061032a61051936600461358b565b61101b565b34801561052a57600080fd5b506102de61053936600461346b565b611076565b34801561054a57600080fd5b506103cf61055936600461358b565b611091565b34801561056a57600080fd5b506103cf610579366004613415565b601a6020526000908152604090205481565b34801561059757600080fd5b506102de6105a6366004613415565b611124565b3480156105b757600080fd5b506103776105c636600461358b565b611170565b3480156105d757600080fd5b50600b5461030090600160a01b900460ff1681565b3480156105f857600080fd5b5061032a61060736600461358b565b6111e7565b34801561061857600080fd5b506103cf61062736600461358b565b601b6020526000908152604090205481565b34801561064557600080fd5b506103cf610654366004613415565b6112fc565b34801561066557600080fd5b506102de611383565b34801561067a57600080fd5b5061032a61068936600461358b565b6113b9565b6102de61069c36600461368f565b611414565b3480156106ad57600080fd5b50600b546001600160a01b0316610377565b3480156106cb57600080fd5b5061032a61175f565b3480156106e057600080fd5b506102de6106ef36600461352c565b61176e565b34801561070057600080fd5b506102de61070f36600461358b565b611833565b34801561072057600080fd5b5061032a61072f36600461358b565b611892565b34801561074057600080fd5b506102de61074f3660046134ac565b6118ed565b34801561076057600080fd5b5061077461076f3660046136d6565b611925565b60405161030c92919061389c565b34801561078e57600080fd5b5061032a61079d36600461358b565b6119e3565b3480156107ae57600080fd5b5061032a6107bd36600461358b565b611a3e565b3480156107ce57600080fd5b506103cf6107dd36600461358b565b611ab8565b3480156107ee57600080fd5b506102de611af2565b34801561080357600080fd5b506102de610812366004613415565b611b3d565b34801561082357600080fd5b5061032a61083236600461358b565b611b89565b34801561084357600080fd5b5061032a611be4565b34801561085857600080fd5b506103cf60135481565b34801561086e57600080fd5b5061030061087d36600461358b565b611c72565b34801561088e57600080fd5b506012546103cf565b3480156108a357600080fd5b5061032a6108b236600461358b565b611c7d565b3480156108c357600080fd5b506103006108d2366004613432565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561090c57600080fd5b506102de611cd8565b6102de6109233660046136f8565b611d23565b34801561093457600080fd5b506102de610943366004613415565b612137565b34801561095457600080fd5b5061032a61096336600461358b565b6121d2565b60006001600160e01b0319821663780e9d6360e01b148061098d575061098d8261222d565b92915050565b6060600080546109a290613af0565b80601f01602080910402602001604051908101604052809291908181526020018280546109ce90613af0565b8015610a1b5780601f106109f057610100808354040283529160200191610a1b565b820191906000526020600020905b8154815290600101906020018083116109fe57829003601f168201915b5050505050905090565b600b546001600160a01b03163314610a585760405162461bcd60e51b8152600401610a4f90613910565b60405180910390fd5b8051610a6b90600c906020840190613247565b5050565b6000610a7a8261227d565b610adb5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a4f565b506000908152600460205260409020546001600160a01b031690565b6000610b0282611170565b9050806001600160a01b0316836001600160a01b03161415610b705760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a4f565b336001600160a01b0382161480610b8c5750610b8c81336108d2565b610bfe5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a4f565b610c08838361229a565b505050565b6000610c188261227d565b610c345760405162461bcd60e51b8152600401610a4f90613945565b506000908152601b602052604090205490565b600b546001600160a01b03163314610c715760405162461bcd60e51b8152600401610a4f90613910565b600b805460ff60a01b198116600160a01b9182900460ff1615909102179055565b610c9c3382612308565b610cb85760405162461bcd60e51b8152600401610a4f90613994565b610c088383836123ee565b600b546001600160a01b03163314610ced5760405162461bcd60e51b8152600401610a4f90613910565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6060610d1a8261227d565b610d365760405162461bcd60e51b8152600401610a4f90613945565b600d54604051632d02f8c160e01b8152600481018490526060916001600160a01b0316908190632d02f8c1906024015b60006040518083038186803b158015610d7e57600080fd5b505afa158015610d92573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dba9190810190613613565b949350505050565b6000610dcd836112fc565b8210610e2f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a4f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6060610e638261227d565b610e7f5760405162461bcd60e51b8152600401610a4f90613945565b600d54604051630e99c4fb60e21b8152600481018490526060916001600160a01b0316908190633a6713ec90602401610d66565b600b546001600160a01b03163314610edd5760405162461bcd60e51b8152600401610a4f90613910565b600e546001600160a01b0316610f285760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c481b9bdd081cd95d60821b6044820152606401610a4f565b600f546001600160a01b0316610f735760405162461bcd60e51b815260206004820152601060248201526f1dd85b1b195d080c881b9bdd081cd95d60821b6044820152606401610a4f565b60004790506000610f9e6064610f986018546064610f919190613aad565b8590612599565b9061261f565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f19350505050158015610fd9573d6000803e3d6000fd5b50600f546001600160a01b03166108fc610ff3848461267a565b6040518115909202916000818181858888f19350505050158015610c08573d6000803e3d6000fd5b60606110268261227d565b6110425760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163407f42b760e01b8152600481018490526060916001600160a01b031690819063407f42b790602401610d66565b610c08838383604051806020016040528060008152506118ed565b600061109c60085490565b82106110ff5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a4f565b6008828154811061111257611112613bbe565b90600052602060002001549050919050565b600b546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610a4f90613910565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b03168061098d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610a4f565b60606111f28261227d565b61120e5760405162461bcd60e51b8152600401610a4f90613945565b6000828152601c60205260408120805461122790613af0565b905011156112cd576000828152601c60205260409020805461124890613af0565b80601f016020809104026020016040519081016040528092919081815260200182805461127490613af0565b80156112c15780601f10611296576101008083540402835291602001916112c1565b820191906000526020600020905b8154815290600101906020018083116112a457829003601f168201915b50505050509050919050565b6112d6826126d6565b6040516020016112e6919061381c565b6040516020818303038152906040529050919050565b60006001600160a01b0382166113675760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610a4f565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b031633146113ad5760405162461bcd60e51b8152600401610a4f90613910565b6113b760006127d4565b565b60606113c48261227d565b6113e05760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163445ea80160e11b8152600481018490526060916001600160a01b03169081906388bd500290602401610d66565b6002600a5414156114675760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4f565b6002600a55600b54600160a01b900460ff166114c55760405162461bcd60e51b815260206004820152601f60248201527f5075626c6963206d696e742069732063757272656e746c7920636c6f736564006044820152606401610a4f565b60155482111561152a5760405162461bcd60e51b815260206004820152602a60248201527f50757263686173652065786365656473206d6178206d696e74732070657220746044820152693930b739b0b1ba34b7b760b11b6064820152608401610a4f565b6013546115408361153a60085490565b90612826565b111561158e5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610a4f565b60105461159c908390612599565b34146115e55760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b6044820152606401610a4f565b60006115f060085490565b905060005b8381101561175457600083828151811061161157611611613bbe565b60200260200101515111156116cd5761164283828151811061163557611635613bbe565b6020026020010151612885565b6116805760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b6044820152606401610a4f565b82818151811061169257611692613bbe565b6020026020010151601c600083856116aa9190613a62565b815260200190815260200160002090805190602001906116cb929190613247565b505b6116df6116da8284613a62565b612a94565b6116f16116ec8284613a62565b612b16565b1561172e576017805490600061170683613b4d565b9091555050601754601b600061171c8486613a62565b81526020810191909152604001600020555b611742335b61173d8385613a62565b612bae565b8061174c81613b4d565b9150506115f5565b50506001600a555050565b6060600180546109a290613af0565b6001600160a01b0382163314156117c75760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a4f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600b546001600160a01b0316331461185d5760405162461bcd60e51b8152600401610a4f90613910565b601980546001810182556000919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950155565b606061189d8261227d565b6118b95760405162461bcd60e51b8152600401610a4f90613945565b600d546040516315142a1760e31b8152600481018490526060916001600160a01b031690819063a8a150b890602401610d66565b6118f73383612308565b6119135760405162461bcd60e51b8152600401610a4f90613994565b61191f84848484612bc8565b50505050565b606060006119328361227d565b61194e5760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163bb47c9b360e01b815260048101869052602481018590526001600160a01b0390911690819063bb47c9b39060440160006040518083038186803b15801561199b57600080fd5b505afa1580156119af573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119d79190810190613648565b90969095509350505050565b60606119ee8261227d565b611a0a5760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163626985fd60e11b8152600481018490526060916001600160a01b031690819063c4d30bfa90602401610d66565b6060611a498261227d565b611a655760405162461bcd60e51b8152600401610a4f90613945565b600b54600160b01b900460ff1615611aab57600d5460405163c87b56dd60e01b8152600481018490526060916001600160a01b031690819063c87b56dd90602401610d66565b600c805461124890613af0565b6000611ac38261227d565b611adf5760405162461bcd60e51b8152600401610a4f90613945565b506000908152601d602052604090205490565b600b546001600160a01b03163314611b1c5760405162461bcd60e51b8152600401610a4f90613910565b600b805460ff60a81b198116600160a81b9182900460ff1615909102179055565b600b546001600160a01b03163314611b675760405162461bcd60e51b8152600401610a4f90613910565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b6060611b948261227d565b611bb05760405162461bcd60e51b8152600401610a4f90613945565b600d54604051631a4ae3f160e31b8152600481018490526060916001600160a01b031690819063d2571f8890602401610d66565b600c8054611bf190613af0565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1d90613af0565b8015611c6a5780601f10611c3f57610100808354040283529160200191611c6a565b820191906000526020600020905b815481529060010190602001808311611c4d57829003601f168201915b505050505081565b600061098d8261227d565b6060611c888261227d565b611ca45760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163e8d887d360e01b8152600481018490526060916001600160a01b031690819063e8d887d390602401610d66565b600b546001600160a01b03163314611d025760405162461bcd60e51b8152600401610a4f90613910565b600b805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6002600a541415611d765760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a4f565b6002600a55600b54600160a81b900460ff16611ddf5760405162461bcd60e51b815260206004820152602260248201527f57686974656c697374206d696e742069732063757272656e746c7920636c6f73604482015261195960f21b6064820152608401610a4f565b601354611def8561153a60085490565b1115611e3d5760405162461bcd60e51b815260206004820181905260248201527f507572636861736520776f756c6420657863656564206d617820737570706c796044820152606401610a4f565b611e993384846019805480602002602001604051908101604052809291908181526020018280548015611e8f57602002820191906000526020600020905b815481526020019060010190808311611e7b575b5050505050612bfb565b611ee55760405162461bcd60e51b815260206004820152601f60248201527f596f75277265206e6f74206f6e20746865206769766561776179206c697374006044820152606401610a4f565b601454336000908152601a6020526040902054611f029086612826565b1115611f625760405162461bcd60e51b815260206004820152602960248201527f596f7520646f206e6f7420686176652074686174206d616e792077686974656c604482015268697374206d696e747360b81b6064820152608401610a4f565b601154611f70908590612599565b3414611fb95760405162461bcd60e51b8152602060048201526018602482015277125b98dbdc9c9958dd081c185e5b595b9d08185b5bdd5b9d60421b6044820152606401610a4f565b6000611fc460085490565b905060005b85811015612106576000838281518110611fe557611fe5613bbe565b60200260200101515111156120945761200983828151811061163557611635613bbe565b6120475760405162461bcd60e51b815260206004820152600f60248201526e13985b59481a5cc81a5b9d985b1a59608a1b6044820152606401610a4f565b82818151811061205957612059613bbe565b6020026020010151601c600083856120719190613a62565b81526020019081526020016000209080519060200190612092929190613247565b505b6120a16116da8284613a62565b6120ae6116ec8284613a62565b156120eb57601780549060006120c383613b4d565b9091555050601754601b60006120d98486613a62565b81526020810191909152604001600020555b6120f433611733565b806120fe81613b4d565b915050611fc9565b50336000908152601a602052604081208054879290612126908490613a62565b90915550506001600a555050505050565b600b546001600160a01b031633146121615760405162461bcd60e51b8152600401610a4f90613910565b6001600160a01b0381166121c65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a4f565b6121cf816127d4565b50565b60606121dd8261227d565b6121f95760405162461bcd60e51b8152600401610a4f90613945565b600d5460405163feb6b3d160e01b8152600481018490526060916001600160a01b031690819063feb6b3d190602401610d66565b60006001600160e01b031982166380ac58cd60e01b148061225e57506001600160e01b03198216635b5e139f60e01b145b8061098d57506301ffc9a760e01b6001600160e01b031983161461098d565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906122cf82611170565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123138261227d565b6123745760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a4f565b600061237f83611170565b9050806001600160a01b0316846001600160a01b031614806123ba5750836001600160a01b03166123af84610a6f565b6001600160a01b0316145b80610dba57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16610dba565b826001600160a01b031661240182611170565b6001600160a01b0316146124695760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a4f565b6001600160a01b0382166124cb5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a4f565b6124d6838383612d83565b6124e160008261229a565b6001600160a01b038316600090815260036020526040812080546001929061250a908490613aad565b90915550506001600160a01b0382166000908152600360205260408120805460019290612538908490613a62565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000826125a85750600061098d565b60006125b48385613a8e565b9050826125c18583613a7a565b146126185760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610a4f565b9392505050565b60008082116126705760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610a4f565b6126188284613a7a565b6000828211156126cc5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610a4f565b6126188284613aad565b6060816126fa5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612724578061270e81613b4d565b915061271d9050600a83613a7a565b91506126fe565b60008167ffffffffffffffff81111561273f5761273f613bd4565b6040519080825280601f01601f191660200182016040528015612769576020820181803683370190505b5090505b8415610dba5761277e600183613aad565b915061278b600a86613b68565b612796906030613a62565b60f81b8183815181106127ab576127ab613bbe565b60200101906001600160f81b031916908160001a9053506127cd600a86613a7a565b945061276d565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000806128338385613a62565b9050838110156126185760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610a4f565b60008082905060018151101561289e5750600092915050565b6019815111156128b15750600092915050565b806000815181106128c4576128c4613bbe565b6020910101516001600160f81b031916600160fd1b14156128e85750600092915050565b80600182516128f79190613aad565b8151811061290757612907613bbe565b6020910101516001600160f81b031916600160fd1b141561292b5750600092915050565b60008160008151811061294057612940613bbe565b01602001516001600160f81b031916905060005b8251811015612a8957600083828151811061297157612971613bbe565b01602001516001600160f81b0319169050600160fd1b811480156129a25750600160fd1b6001600160f81b03198416145b156129b35750600095945050505050565b600360fc1b6001600160f81b03198216108015906129df5750603960f81b6001600160f81b0319821611155b158015612a155750604160f81b6001600160f81b0319821610801590612a135750602d60f91b6001600160f81b0319821611155b155b8015612a4a5750606160f81b6001600160f81b0319821610801590612a485750603d60f91b6001600160f81b0319821611155b155b8015612a645750600160fd1b6001600160f81b0319821614155b15612a755750600095945050505050565b915080612a8181613b4d565b915050612954565b506001949350505050565b63620aed006000605b612aa6426126d6565b612aaf856126d6565b604051602001612ac09291906137ed565b6040516020818303038152906040528051906020012060001c612ae39190613b68565b90506000612af48262015180613a8e565b612afe9084613a62565b6000948552601d602052604090942093909355505050565b600080612b22836126d6565b612b2d6012546126d6565b604051602001612b3e9291906137ed565b60408051601f19818403018152919052805160209091012090506103e4612b676103e883613b68565b1115612b765750600192915050565b601354601754601654600854612b8c9190613a62565b612b969190613aad565b1415612ba55750600192915050565b50600092915050565b610a6b828260405180602001604052806000815250612e3b565b612bd38484846123ee565b612bdf84848484612e6e565b61191f5760405162461bcd60e51b8152600401610a4f906138be565b604080516020808201869052606087901b6bffffffffffffffffffffffff1916828401526001605480840182905284518085039091018152607490930190935281519101206000919085835b86518161ffff161015612d27578160011660011415612cb657868161ffff1681518110612c7657612c76613bbe565b602002602001015183604051602001612c99929190918252602082015260400190565b604051602081830303815290604052805190602001209250612d08565b82878261ffff1681518110612ccd57612ccd613bbe565b6020026020010151604051602001612cef929190918252602082015260400190565b6040516020818303038152906040528051906020012092505b612d13600283613a7a565b915080612d1f81613b2b565b915050612c47565b5060005b8551811015612d7457858181518110612d4657612d46613bbe565b6020026020010151831415612d62576001945050505050610dba565b80612d6c81613b4d565b915050612d2b565b50600098975050505050505050565b6001600160a01b038316612dde57612dd981600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612e01565b816001600160a01b0316836001600160a01b031614612e0157612e018382612f78565b6001600160a01b038216612e1857610c0881613015565b826001600160a01b0316826001600160a01b031614610c0857610c0882826130c4565b612e458383613108565b612e526000848484612e6e565b610c085760405162461bcd60e51b8152600401610a4f906138be565b60006001600160a01b0384163b15612f7057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612eb290339089908890889060040161384c565b602060405180830381600087803b158015612ecc57600080fd5b505af1925050508015612efc575060408051601f3d908101601f19168201909252612ef9918101906135c1565b60015b612f56573d808015612f2a576040519150601f19603f3d011682016040523d82523d6000602084013e612f2f565b606091505b508051612f4e5760405162461bcd60e51b8152600401610a4f906138be565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050610dba565b506001610dba565b60006001612f85846112fc565b612f8f9190613aad565b600083815260076020526040902054909150808214612fe2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009061302790600190613aad565b6000838152600960205260408120546008805493945090928490811061304f5761304f613bbe565b90600052602060002001549050806008838154811061307057613070613bbe565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806130a8576130a8613ba8565b6001900381819060005260206000200160009055905550505050565b60006130cf836112fc565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661315e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a4f565b6131678161227d565b156131b45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a4f565b6131c060008383612d83565b6001600160a01b03821660009081526003602052604081208054600192906131e9908490613a62565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461325390613af0565b90600052602060002090601f01602090048101928261327557600085556132bb565b82601f1061328e57805160ff19168380011785556132bb565b828001600101855582156132bb579182015b828111156132bb5782518255916020019190600101906132a0565b506132c79291506132cb565b5090565b5b808211156132c757600081556001016132cc565b60006132f36132ee84613a3a565b6139e5565b905082815283838301111561330757600080fd5b828260208301376000602084830101529392505050565b600082601f83011261332f57600080fd5b8135602061333f6132ee83613a16565b80838252828201915082860187848660051b890101111561335f57600080fd5b6000805b868110156133a257823567ffffffffffffffff811115613381578283fd5b61338f8b88838d01016133b0565b8652509385019391850191600101613363565b509198975050505050505050565b600082601f8301126133c157600080fd5b612618838335602085016132e0565b600082601f8301126133e157600080fd5b81516133ef6132ee82613a3a565b81815284602083860101111561340457600080fd5b610dba826020830160208701613ac4565b60006020828403121561342757600080fd5b813561261881613bea565b6000806040838503121561344557600080fd5b823561345081613bea565b9150602083013561346081613bea565b809150509250929050565b60008060006060848603121561348057600080fd5b833561348b81613bea565b9250602084013561349b81613bea565b929592945050506040919091013590565b600080600080608085870312156134c257600080fd5b84356134cd81613bea565b935060208501356134dd81613bea565b925060408501359150606085013567ffffffffffffffff81111561350057600080fd5b8501601f8101871361351157600080fd5b613520878235602084016132e0565b91505092959194509250565b6000806040838503121561353f57600080fd5b823561354a81613bea565b91506020830135801515811461346057600080fd5b6000806040838503121561357257600080fd5b823561357d81613bea565b946020939093013593505050565b60006020828403121561359d57600080fd5b5035919050565b6000602082840312156135b657600080fd5b813561261881613bff565b6000602082840312156135d357600080fd5b815161261881613bff565b6000602082840312156135f057600080fd5b813567ffffffffffffffff81111561360757600080fd5b610dba848285016133b0565b60006020828403121561362557600080fd5b815167ffffffffffffffff81111561363c57600080fd5b610dba848285016133d0565b6000806040838503121561365b57600080fd5b825167ffffffffffffffff81111561367257600080fd5b61367e858286016133d0565b925050602083015190509250929050565b600080604083850312156136a257600080fd5b82359150602083013567ffffffffffffffff8111156136c057600080fd5b6136cc8582860161331e565b9150509250929050565b600080604083850312156136e957600080fd5b50508035926020909101359150565b6000806000806080858703121561370e57600080fd5b843593506020808601359350604086013567ffffffffffffffff8082111561373557600080fd5b818801915088601f83011261374957600080fd5b81356137576132ee82613a16565b8082825285820191508585018c878560051b880101111561377757600080fd5b600095505b8386101561379a57803583526001959095019491860191860161377c565b509650505060608801359250808311156137b357600080fd5b50506135208782880161331e565b600081518084526137d9816020860160208601613ac4565b601f01601f19169290920160200192915050565b600083516137ff818460208801613ac4565b835190830190613813818360208801613ac4565b01949350505050565b67447261676f73202360c01b81526000825161383f816008850160208701613ac4565b9190910160080192915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061387f908301846137c1565b9695505050505050565b60208152600061261860208301846137c1565b6040815260006138af60408301856137c1565b90508260208301529392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613a0e57613a0e613bd4565b604052919050565b600067ffffffffffffffff821115613a3057613a30613bd4565b5060051b60200190565b600067ffffffffffffffff821115613a5457613a54613bd4565b50601f01601f191660200190565b60008219821115613a7557613a75613b7c565b500190565b600082613a8957613a89613b92565b500490565b6000816000190483118215151615613aa857613aa8613b7c565b500290565b600082821015613abf57613abf613b7c565b500390565b60005b83811015613adf578181015183820152602001613ac7565b8381111561191f5750506000910152565b600181811c90821680613b0457607f821691505b60208210811415613b2557634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff80831681811415613b4357613b43613b7c565b6001019392505050565b6000600019821415613b6157613b61613b7c565b5060010190565b600082613b7757613b77613b92565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146121cf57600080fd5b6001600160e01b0319811681146121cf57600080fdfea264697066735822122052a65744a875ccbf30bda5fd46d09071ce1fdca790f3d490e0808898e91d79ed64736f6c63430008060033

Deployed Bytecode Sourcemap

50501:13859:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44351:224;;;;;;;;;;-1:-1:-1;44351:224:0;;;;;:::i;:::-;;:::i;:::-;;;11360:14:1;;11353:22;11335:41;;11323:2;11308:18;44351:224:0;;;;;;;;31473:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51843:120::-;;;;;;;;;;-1:-1:-1;51843:120:0;;;;;:::i;:::-;;:::i;33032:221::-;;;;;;;;;;-1:-1:-1;33032:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10658:32:1;;;10640:51;;10628:2;10613:18;33032:221:0;10595:102:1;32555:411:0;;;;;;;;;;-1:-1:-1;32555:411:0;;;;;:::i;:::-;;:::i;52321:220::-;;;;;;;;;;-1:-1:-1;52321:220:0;;;;;:::i;:::-;;:::i;:::-;;;24783:25:1;;;24771:2;24756:18;52321:220:0;24738:76:1;44991:113:0;;;;;;;;;;-1:-1:-1;45079:10:0;:17;44991:113;;51526:86;;;;;;;;;;;;;:::i;50666:29::-;;;;;;;;;;-1:-1:-1;50666:29:0;;;;-1:-1:-1;;;50666:29:0;;;;;;33922:339;;;;;;;;;;-1:-1:-1;33922:339:0;;;;;:::i;:::-;;:::i;62293:114::-;;;;;;;;;;-1:-1:-1;62293:114:0;;;;;:::i;:::-;;:::i;54339:336::-;;;;;;;;;;-1:-1:-1;54339:336:0;;;;;:::i;:::-;;:::i;44659:256::-;;;;;;;;;;-1:-1:-1;44659:256:0;;;;;:::i;:::-;;:::i;50702:24::-;;;;;;;;;;-1:-1:-1;50702:24:0;;;;-1:-1:-1;;;50702:24:0;;;;;;53649:332;;;;;;;;;;-1:-1:-1;53649:332:0;;;;;:::i;:::-;;:::i;62543:440::-;;;;;;;;;;;;;:::i;54683:338::-;;;;;;;;;;-1:-1:-1;54683:338:0;;;;;:::i;:::-;;:::i;34332:185::-;;;;;;;;;;-1:-1:-1;34332:185:0;;;;;:::i;:::-;;:::i;45181:233::-;;;;;;;;;;-1:-1:-1;45181:233:0;;;;;:::i;:::-;;:::i;51265:57::-;;;;;;;;;;-1:-1:-1;51265:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;62415:120;;;;;;;;;;-1:-1:-1;62415:120:0;;;;;:::i;:::-;;:::i;31167:239::-;;;;;;;;;;-1:-1:-1;31167:239:0;;;;;:::i;:::-;;:::i;50637:22::-;;;;;;;;;;-1:-1:-1;50637:22:0;;;;-1:-1:-1;;;50637:22:0;;;;;;52549:390;;;;;;;;;;-1:-1:-1;52549:390:0;;;;;:::i;:::-;;:::i;51329:57::-;;;;;;;;;;-1:-1:-1;51329:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;30897:208;;;;;;;;;;-1:-1:-1;30897:208:0;;;;;:::i;:::-;;:::i;8500:94::-;;;;;;;;;;;;;:::i;53989:338::-;;;;;;;;;;-1:-1:-1;53989:338:0;;;;;:::i;:::-;;:::i;59190:1045::-;;;;;;:::i;:::-;;:::i;7849:87::-;;;;;;;;;;-1:-1:-1;7922:6:0;;-1:-1:-1;;;;;7922:6:0;7849:87;;31642:104;;;;;;;;;;;;;:::i;33325:295::-;;;;;;;;;;-1:-1:-1;33325:295:0;;;;;:::i;:::-;;:::i;51971:112::-;;;;;;;;;;-1:-1:-1;51971:112:0;;;;;:::i;:::-;;:::i;53301:336::-;;;;;;;;;;-1:-1:-1;53301:336:0;;;;;:::i;:::-;;:::i;34588:328::-;;;;;;;;;;-1:-1:-1;34588:328:0;;;;;:::i;:::-;;:::i;56665:381::-;;;;;;;;;;-1:-1:-1;56665:381:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;55377:330::-;;;;;;;;;;-1:-1:-1;55377:330:0;;;;;:::i;:::-;;:::i;57054:467::-;;;;;;;;;;-1:-1:-1;57054:467:0;;;;;:::i;:::-;;:::i;56047:216::-;;;;;;;;;;-1:-1:-1;56047:216:0;;;;;:::i;:::-;;:::i;51620:109::-;;;;;;;;;;;;;:::i;62171:114::-;;;;;;;;;;-1:-1:-1;62171:114:0;;;;;:::i;:::-;;:::i;55719:320::-;;;;;;;;;;-1:-1:-1;55719:320:0;;;;;:::i;:::-;;:::i;50733:26::-;;;;;;;;;;;;;:::i;51006:38::-;;;;;;;;;;;;;;;;52091:112;;;;;;;;;;-1:-1:-1;52091:112:0;;;;;:::i;:::-;;:::i;52211:102::-;;;;;;;;;;-1:-1:-1;52293:12:0;;52211:102;;52947:342;;;;;;;;;;-1:-1:-1;52947:342:0;;;;;:::i;:::-;;:::i;33691:164::-;;;;;;;;;;-1:-1:-1;33691:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;33812:25:0;;;33788:4;33812:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;33691:164;51737:98;;;;;;;;;;;;;:::i;60243:1358::-;;;;;;:::i;:::-;;:::i;8749:192::-;;;;;;;;;;-1:-1:-1;8749:192:0;;;;;:::i;:::-;;:::i;55033:332::-;;;;;;;;;;-1:-1:-1;55033:332:0;;;;;:::i;:::-;;:::i;44351:224::-;44453:4;-1:-1:-1;;;;;;44477:50:0;;-1:-1:-1;;;44477:50:0;;:90;;;44531:36;44555:11;44531:23;:36::i;:::-;44470:97;44351:224;-1:-1:-1;;44351:224:0:o;31473:100::-;31527:13;31560:5;31553:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31473:100;:::o;51843:120::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;;;;;;;;;51927:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51843:120:::0;:::o;33032:221::-;33108:7;33136:16;33144:7;33136;:16::i;:::-;33128:73;;;;-1:-1:-1;;;33128:73:0;;20187:2:1;33128:73:0;;;20169:21:1;20226:2;20206:18;;;20199:30;20265:34;20245:18;;;20238:62;-1:-1:-1;;;20316:18:1;;;20309:42;20368:19;;33128:73:0;20159:234:1;33128:73:0;-1:-1:-1;33221:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;33221:24:0;;33032:221::o;32555:411::-;32636:13;32652:23;32667:7;32652:14;:23::i;:::-;32636:39;;32700:5;-1:-1:-1;;;;;32694:11:0;:2;-1:-1:-1;;;;;32694:11:0;;;32686:57;;;;-1:-1:-1;;;32686:57:0;;22131:2:1;32686:57:0;;;22113:21:1;22170:2;22150:18;;;22143:30;22209:34;22189:18;;;22182:62;-1:-1:-1;;;22260:18:1;;;22253:31;22301:19;;32686:57:0;22103:223:1;32686:57:0;6803:10;-1:-1:-1;;;;;32778:21:0;;;;:62;;-1:-1:-1;32803:37:0;32820:5;6803:10;33691:164;:::i;32803:37::-;32756:168;;;;-1:-1:-1;;;32756:168:0;;17817:2:1;32756:168:0;;;17799:21:1;17856:2;17836:18;;;17829:30;17895:34;17875:18;;;17868:62;17966:26;17946:18;;;17939:54;18010:19;;32756:168:0;17789:246:1;32756:168:0;32937:21;32946:2;32950:7;32937:8;:21::i;:::-;32625:341;32555:411;;:::o;52321:220::-;52383:7;52416:16;52424:7;52416;:16::i;:::-;52408:76;;;;-1:-1:-1;;;52408:76:0;;;;;;;:::i;:::-;-1:-1:-1;52502:31:0;;;;:22;:31;;;;;;;52321:220::o;51526:86::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;51594:10:::1;::::0;;-1:-1:-1;;;;51580:24:0;::::1;-1:-1:-1::0;;;51594:10:0;;;::::1;;;51593:11;51580:24:::0;;::::1;;::::0;;51526:86::o;33922:339::-;34117:41;6803:10;34150:7;34117:18;:41::i;:::-;34109:103;;;;-1:-1:-1;;;34109:103:0;;;;;;;:::i;:::-;34225:28;34235:4;34241:2;34245:7;34225:9;:28::i;62293:114::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;62369:13:::1;:30:::0;;-1:-1:-1;;;;;;62369:30:0::1;-1:-1:-1::0;;;;;62369:30:0;;;::::1;::::0;;;::::1;::::0;;62293:114::o;54339:336::-;54397:13;54431:16;54439:7;54431;:16::i;:::-;54423:76;;;;-1:-1:-1;;;54423:76:0;;;;;;;:::i;:::-;54580:8;;54609:32;;-1:-1:-1;;;54609:32:0;;;;;24783:25:1;;;54510:20:0;;-1:-1:-1;;;;;54580:8:0;;;;54609:23;;24756:18:1;;54609:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54609:32:0;;;;;;;;;;;;:::i;:::-;54600:41;54339:336;-1:-1:-1;;;;54339:336:0:o;44659:256::-;44756:7;44792:23;44809:5;44792:16;:23::i;:::-;44784:5;:31;44776:87;;;;-1:-1:-1;;;44776:87:0;;12879:2:1;44776:87:0;;;12861:21:1;12918:2;12898:18;;;12891:30;12957:34;12937:18;;;12930:62;-1:-1:-1;;;13008:18:1;;;13001:41;13059:19;;44776:87:0;12851:233:1;44776:87:0;-1:-1:-1;;;;;;44881:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;44659:256::o;53649:332::-;53705:13;53739:16;53747:7;53739;:16::i;:::-;53731:76;;;;-1:-1:-1;;;53731:76:0;;;;;;;:::i;:::-;53888:8;;53917:30;;-1:-1:-1;;;53917:30:0;;;;;24783:25:1;;;53818:20:0;;-1:-1:-1;;;;;53888:8:0;;;;53917:21;;24756:18:1;;53917:30:0;24738:76:1;62543:440:0;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;62601:13:::1;::::0;-1:-1:-1;;;;;62601:13:0::1;62593:56;;;::::0;-1:-1:-1;;;62593:56:0;;23311:2:1;62593:56:0::1;::::0;::::1;23293:21:1::0;23350:2;23330:18;;;23323:30;-1:-1:-1;;;23369:18:1;;;23362:46;23425:18;;62593:56:0::1;23283:166:1::0;62593:56:0::1;62668:13;::::0;-1:-1:-1;;;;;62668:13:0::1;62660:56;;;::::0;-1:-1:-1;;;62660:56:0;;15589:2:1;62660:56:0::1;::::0;::::1;15571:21:1::0;15628:2;15608:18;;;15601:30;-1:-1:-1;;;15647:18:1;;;15640:46;15703:18;;62660:56:0::1;15561:166:1::0;62660:56:0::1;62727:15;62745:21;62727:39;;62777:21;62801:47;62844:3;62801:38;62819:19;;62813:3;:25;;;;:::i;:::-;62801:7:::0;;:11:::1;:38::i;:::-;:42:::0;::::1;:47::i;:::-;62867:13;::::0;62859:46:::1;::::0;62777:71;;-1:-1:-1;;;;;;62867:13:0::1;::::0;62859:46;::::1;;;::::0;62777:71;;62867:13:::1;62859:46:::0;62867:13;62859:46;62777:71;62867:13;62859:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;62924:13:0::1;::::0;-1:-1:-1;;;;;62924:13:0::1;62916:59;62948:26;:7:::0;62960:13;62948:11:::1;:26::i;:::-;62916:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;54683:338:::0;54742:13;54776:16;54784:7;54776;:16::i;:::-;54768:76;;;;-1:-1:-1;;;54768:76:0;;;;;;;:::i;:::-;54925:8;;54954:33;;-1:-1:-1;;;54954:33:0;;;;;24783:25:1;;;54855:20:0;;-1:-1:-1;;;;;54925:8:0;;;;54954:24;;24756:18:1;;54954:33:0;24738:76:1;34332:185:0;34470:39;34487:4;34493:2;34497:7;34470:39;;;;;;;;;;;;:16;:39::i;45181:233::-;45256:7;45292:30;45079:10;:17;;44991:113;45292:30;45284:5;:38;45276:95;;;;-1:-1:-1;;;45276:95:0;;23656:2:1;45276:95:0;;;23638:21:1;23695:2;23675:18;;;23668:30;23734:34;23714:18;;;23707:62;-1:-1:-1;;;23785:18:1;;;23778:42;23837:19;;45276:95:0;23628:234:1;45276:95:0;45389:10;45400:5;45389:17;;;;;;;;:::i;:::-;;;;;;;;;45382:24;;45181:233;;;:::o;62415:120::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;62501:8:::1;:26:::0;;-1:-1:-1;;;;;;62501:26:0::1;-1:-1:-1::0;;;;;62501:26:0;;;::::1;::::0;;;::::1;::::0;;62415:120::o;31167:239::-;31239:7;31275:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31275:16:0;31310:19;31302:73;;;;-1:-1:-1;;;31302:73:0;;18653:2:1;31302:73:0;;;18635:21:1;18692:2;18672:18;;;18665:30;18731:34;18711:18;;;18704:62;-1:-1:-1;;;18782:18:1;;;18775:39;18831:19;;31302:73:0;18625:231:1;52549:390:0;52604:13;52638:16;52646:7;52638;:16::i;:::-;52630:76;;;;-1:-1:-1;;;52630:76:0;;;;;;;:::i;:::-;52769:1;52729:29;;;:20;:29;;;;;52723:43;;;;;:::i;:::-;;;:47;52719:211;;;52794:29;;;;:20;:29;;;;;52787:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52549:390;;;:::o;52719:211::-;52899:17;52908:7;52899:8;:17::i;:::-;52870:47;;;;;;;;:::i;:::-;;;;;;;;;;;;;52856:62;;52549:390;;;:::o;30897:208::-;30969:7;-1:-1:-1;;;;;30997:19:0;;30989:74;;;;-1:-1:-1;;;30989:74:0;;18242:2:1;30989:74:0;;;18224:21:1;18281:2;18261:18;;;18254:30;18320:34;18300:18;;;18293:62;-1:-1:-1;;;18371:18:1;;;18364:40;18421:19;;30989:74:0;18214:232:1;30989:74:0;-1:-1:-1;;;;;;31081:16:0;;;;;:9;:16;;;;;;;30897:208::o;8500:94::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;8565:21:::1;8583:1;8565:9;:21::i;:::-;8500:94::o:0;53989:338::-;54048:13;54082:16;54090:7;54082;:16::i;:::-;54074:76;;;;-1:-1:-1;;;54074:76:0;;;;;;;:::i;:::-;54231:8;;54260:33;;-1:-1:-1;;;54260:33:0;;;;;24783:25:1;;;54161:20:0;;-1:-1:-1;;;;;54231:8:0;;;;54260:24;;24756:18:1;;54260:33:0;24738:76:1;59190:1045:0;10782:1;11378:7;;:19;;11370:63;;;;-1:-1:-1;;;11370:63:0;;24069:2:1;11370:63:0;;;24051:21:1;24108:2;24088:18;;;24081:30;24147:33;24127:18;;;24120:61;24198:18;;11370:63:0;24041:181:1;11370:63:0;10782:1;11511:7;:18;59289:10:::1;::::0;-1:-1:-1;;;59289:10:0;::::1;;;59281:54;;;::::0;-1:-1:-1;;;59281:54:0;;22951:2:1;59281:54:0::1;::::0;::::1;22933:21:1::0;22990:2;22970:18;;;22963:30;23029:33;23009:18;;;23002:61;23080:18;;59281:54:0::1;22923:181:1::0;59281:54:0::1;59364:14;;59354:6;:24;;59346:79;;;::::0;-1:-1:-1;;;59346:79:0;;12108:2:1;59346:79:0::1;::::0;::::1;12090:21:1::0;12147:2;12127:18;;;12120:30;12186:34;12166:18;;;12159:62;-1:-1:-1;;;12237:18:1;;;12230:40;12287:19;;59346:79:0::1;12080:232:1::0;59346:79:0::1;59473:16;;59444:25;59462:6;59444:13;45079:10:::0;:17;;44991:113;59444:13:::1;:17:::0;::::1;:25::i;:::-;:45;;59436:90;;;::::0;-1:-1:-1;;;59436:90:0;;19063:2:1;59436:90:0::1;::::0;::::1;19045:21:1::0;;;19082:18;;;19075:30;19141:34;19121:18;;;19114:62;19193:18;;59436:90:0::1;19035:182:1::0;59436:90:0::1;59569:9;::::0;59558:21:::1;::::0;:6;;:10:::1;:21::i;:::-;59545:9;:34;59537:71;;;::::0;-1:-1:-1;;;59537:71:0;;15934:2:1;59537:71:0::1;::::0;::::1;15916:21:1::0;15973:2;15953:18;;;15946:30;-1:-1:-1;;;15992:18:1;;;15985:54;16056:18;;59537:71:0::1;15906:174:1::0;59537:71:0::1;59619:15;59637:13;45079:10:::0;:17;;44991:113;59637:13:::1;59619:31;;59667:9;59663:565;59686:6;59682:1;:10;59663:565;;;59752:1;59733:5;59739:1;59733:8;;;;;;;;:::i;:::-;;;;;;;59727:22;:26;59723:180;;;59782:22;59795:5;59801:1;59795:8;;;;;;;;:::i;:::-;;;;;;;59782:12;:22::i;:::-;59774:50;;;::::0;-1:-1:-1;;;59774:50:0;;20600:2:1;59774:50:0::1;::::0;::::1;20582:21:1::0;20639:2;20619:18;;;20612:30;-1:-1:-1;;;20658:18:1;;;20651:45;20713:18;;59774:50:0::1;20572:165:1::0;59774:50:0::1;59879:5;59885:1;59879:8;;;;;;;;:::i;:::-;;;;;;;59843:20;:33;59874:1;59864:7;:11;;;;:::i;:::-;59843:33;;;;;;;;;;;:44;;;;;;;;;;;;:::i;:::-;;59723:180;59931:24;59943:11;59953:1:::0;59943:7;:11:::1;:::i;:::-;59931;:24::i;:::-;59975:28;59991:11;60001:1:::0;59991:7;:11:::1;:::i;:::-;59975:15;:28::i;:::-;59972:180;;;60037:20;:22:::0;;;:20:::1;:22;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;60116:20:0::1;::::0;60078:22:::1;:35;60101:11;60111:1:::0;60101:7;:11:::1;:::i;:::-;60078:35:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;60078:35:0;:58;59972:180:::1;60180:36;6803:10:::0;60190:12:::1;60204:11;60214:1:::0;60204:7;:11:::1;:::i;:::-;60180:9;:36::i;:::-;59694:3:::0;::::1;::::0;::::1;:::i;:::-;;;;59663:565;;;-1:-1:-1::0;;10738:1:0;11690:7;:22;-1:-1:-1;;59190:1045:0:o;31642:104::-;31698:13;31731:7;31724:14;;;;;:::i;33325:295::-;-1:-1:-1;;;;;33428:24:0;;6803:10;33428:24;;33420:62;;;;-1:-1:-1;;;33420:62:0;;15235:2:1;33420:62:0;;;15217:21:1;15274:2;15254:18;;;15247:30;15313:27;15293:18;;;15286:55;15358:18;;33420:62:0;15207:175:1;33420:62:0;6803:10;33495:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;33495:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;33495:53:0;;;;;;;;;;33564:48;;11335:41:1;;;33495:42:0;;6803:10;33564:48;;11308:18:1;33564:48:0;;;;;;;33325:295;;:::o;51971:112::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;52045:18:::1;:30:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;52045:30:0;;;;;::::1;::::0;51971:112::o;53301:336::-;53359:13;53393:16;53401:7;53393;:16::i;:::-;53385:76;;;;-1:-1:-1;;;53385:76:0;;;;;;;:::i;:::-;53542:8;;53571:32;;-1:-1:-1;;;53571:32:0;;;;;24783:25:1;;;53472:20:0;;-1:-1:-1;;;;;53542:8:0;;;;53571:23;;24756:18:1;;53571:32:0;24738:76:1;34588:328:0;34763:41;6803:10;34796:7;34763:18;:41::i;:::-;34755:103;;;;-1:-1:-1;;;34755:103:0;;;;;;;:::i;:::-;34869:39;34883:4;34889:2;34893:7;34902:5;34869:13;:39::i;:::-;34588:328;;;;:::o;56665:381::-;56740:22;56764:17;56802:16;56810:7;56802;:16::i;:::-;56794:76;;;;-1:-1:-1;;;56794:76:0;;;;;;;:::i;:::-;56912:8;;56956:41;;-1:-1:-1;;;56956:41:0;;;;;24993:25:1;;;25034:18;;;25027:34;;;-1:-1:-1;;;;;56912:8:0;;;;;;56956:21;;24966:18:1;;56956:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;56956:41:0;;;;;;;;;;;;:::i;:::-;56932:65;;;;-1:-1:-1;56665:381:0;-1:-1:-1;;;;56665:381:0:o;55377:330::-;55432:13;55466:16;55474:7;55466;:16::i;:::-;55458:76;;;;-1:-1:-1;;;55458:76:0;;;;;;;:::i;:::-;55615:8;;55644:29;;-1:-1:-1;;;55644:29:0;;;;;24783:25:1;;;55545:20:0;;-1:-1:-1;;;;;55615:8:0;;;;55644:20;;24756:18:1;;55644:29:0;24738:76:1;57054:467:0;57119:13;57153:16;57161:7;57153;:16::i;:::-;57145:76;;;;-1:-1:-1;;;57145:76:0;;;;;;;:::i;:::-;57235:12;;-1:-1:-1;;;57235:12:0;;;;57232:282;;;57339:8;;57372:30;;-1:-1:-1;;;57372:30:0;;;;;24783:25:1;;;57273:20:0;;-1:-1:-1;;;;;57339:8:0;;;;57372:21;;24756:18:1;;57372:30:0;24738:76:1;57232:282:0;57490:12;57483:19;;;;;:::i;56047:216::-;56106:7;56134:16;56142:7;56134;:16::i;:::-;56126:76;;;;-1:-1:-1;;;56126:76:0;;;;;;;:::i;:::-;-1:-1:-1;56222:33:0;;;;:24;:33;;;;;;;56047:216::o;51620:109::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;51704:17:::1;::::0;;-1:-1:-1;;;;51683:38:0;::::1;-1:-1:-1::0;;;51704:17:0;;;::::1;;;51703:18;51683:38:::0;;::::1;;::::0;;51620:109::o;62171:114::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;62247:13:::1;:30:::0;;-1:-1:-1;;;;;;62247:30:0::1;-1:-1:-1::0;;;;;62247:30:0;;;::::1;::::0;;;::::1;::::0;;62171:114::o;55719:320::-;55773:13;55807:16;55815:7;55807;:16::i;:::-;55799:76;;;;-1:-1:-1;;;55799:76:0;;;;;;;:::i;:::-;55948:8;;55977:28;;-1:-1:-1;;;55977:28:0;;;;;24783:25:1;;;55886:20:0;;-1:-1:-1;;;;;55948:8:0;;;;55977:19;;24756:18:1;;55977:28:0;24738:76:1;50733:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52091:112::-;52150:4;52179:16;52187:7;52179;:16::i;52947:342::-;53008:13;53042:16;53050:7;53042;:16::i;:::-;53034:76;;;;-1:-1:-1;;;53034:76:0;;;;;;;:::i;:::-;53191:8;;53220:35;;-1:-1:-1;;;53220:35:0;;;;;24783:25:1;;;53121:20:0;;-1:-1:-1;;;;;53191:8:0;;;;53220:26;;24756:18:1;;53220:35:0;24738:76:1;51737:98:0;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;51815:12:::1;::::0;;-1:-1:-1;;;;51799:28:0;::::1;-1:-1:-1::0;;;51815:12:0;;;::::1;;;51814:13;51799:28:::0;;::::1;;::::0;;51737:98::o;60243:1358::-;10782:1;11378:7;;:19;;11370:63;;;;-1:-1:-1;;;11370:63:0;;24069:2:1;11370:63:0;;;24051:21:1;24108:2;24088:18;;;24081:30;24147:33;24127:18;;;24120:61;24198:18;;11370:63:0;24041:181:1;11370:63:0;10782:1;11511:7;:18;60400:17:::1;::::0;-1:-1:-1;;;60400:17:0;::::1;;;60392:64;;;::::0;-1:-1:-1;;;60392:64:0;;16287:2:1;60392:64:0::1;::::0;::::1;16269:21:1::0;16326:2;16306:18;;;16299:30;16365:34;16345:18;;;16338:62;-1:-1:-1;;;16416:18:1;;;16409:32;16458:19;;60392:64:0::1;16259:224:1::0;60392:64:0::1;60504:16;;60475:25;60493:6;60475:13;45079:10:::0;:17;;44991:113;60475:25:::1;:45;;60467:90;;;::::0;-1:-1:-1;;;60467:90:0;;19063:2:1;60467:90:0::1;::::0;::::1;19045:21:1::0;;;19082:18;;;19075:30;19141:34;19121:18;;;19114:62;19193:18;;60467:90:0::1;19035:182:1::0;60467:90:0::1;60576:76;6803:10:::0;60609:15:::1;60626:5;60633:18;60576:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:18;:76::i;:::-;60568:120;;;::::0;-1:-1:-1;;;60568:120:0;;12519:2:1;60568:120:0::1;::::0;::::1;12501:21:1::0;12558:2;12538:18;;;12531:30;12597:33;12577:18;;;12570:61;12648:18;;60568:120:0::1;12491:181:1::0;60568:120:0::1;60759:17;::::0;6803:10;60707:36:::1;::::0;;;:22:::1;:36;::::0;;;;;:48:::1;::::0;60748:6;60707:40:::1;:48::i;:::-;:69;;60699:123;;;::::0;-1:-1:-1;;;60699:123:0;;24429:2:1;60699:123:0::1;::::0;::::1;24411:21:1::0;24468:2;24448:18;;;24441:30;24507:34;24487:18;;;24480:62;-1:-1:-1;;;24558:18:1;;;24551:39;24607:19;;60699:123:0::1;24401:231:1::0;60699:123:0::1;60865:18;::::0;60854:30:::1;::::0;:6;;:10:::1;:30::i;:::-;60841:9;:43;60833:80;;;::::0;-1:-1:-1;;;60833:80:0;;15934:2:1;60833:80:0::1;::::0;::::1;15916:21:1::0;15973:2;15953:18;;;15946:30;-1:-1:-1;;;15992:18:1;;;15985:54;16056:18;;60833:80:0::1;15906:174:1::0;60833:80:0::1;60926:15;60944:13;45079:10:::0;:17;;44991:113;60944:13:::1;60926:31;;60974:9;60970:565;60993:6;60989:1;:10;60970:565;;;61059:1;61040:5;61046:1;61040:8;;;;;;;;:::i;:::-;;;;;;;61034:22;:26;61030:180;;;61089:22;61102:5;61108:1;61102:8;;;;;;;;:::i;61089:22::-;61081:50;;;::::0;-1:-1:-1;;;61081:50:0;;20600:2:1;61081:50:0::1;::::0;::::1;20582:21:1::0;20639:2;20619:18;;;20612:30;-1:-1:-1;;;20658:18:1;;;20651:45;20713:18;;61081:50:0::1;20572:165:1::0;61081:50:0::1;61186:5;61192:1;61186:8;;;;;;;;:::i;:::-;;;;;;;61150:20;:33;61181:1;61171:7;:11;;;;:::i;:::-;61150:33;;;;;;;;;;;:44;;;;;;;;;;;;:::i;:::-;;61030:180;61238:24;61250:11;61260:1:::0;61250:7;:11:::1;:::i;61238:24::-;61282:28;61298:11;61308:1:::0;61298:7;:11:::1;:::i;61282:28::-;61279:180;;;61344:20;:22:::0;;;:20:::1;:22;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;61423:20:0::1;::::0;61385:22:::1;:35;61408:11;61418:1:::0;61408:7;:11:::1;:::i;:::-;61385:35:::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;61385:35:0;:58;61279:180:::1;61487:36;6803:10:::0;61497:12:::1;6723:98:::0;61487:36:::1;61001:3:::0;::::1;::::0;::::1;:::i;:::-;;;;60970:565;;;-1:-1:-1::0;6803:10:0;61547:36:::1;::::0;;;:22:::1;:36;::::0;;;;:46;;61587:6;;61547:36;:46:::1;::::0;61587:6;;61547:46:::1;:::i;:::-;::::0;;;-1:-1:-1;;10738:1:0;11690:7;:22;-1:-1:-1;;;;;60243:1358:0:o;8749:192::-;7922:6;;-1:-1:-1;;;;;7922:6:0;6803:10;8069:23;8061:68;;;;-1:-1:-1;;;8061:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8838:22:0;::::1;8830:73;;;::::0;-1:-1:-1;;;8830:73:0;;13710:2:1;8830:73:0::1;::::0;::::1;13692:21:1::0;13749:2;13729:18;;;13722:30;13788:34;13768:18;;;13761:62;-1:-1:-1;;;13839:18:1;;;13832:36;13885:19;;8830:73:0::1;13682:228:1::0;8830:73:0::1;8914:19;8924:8;8914:9;:19::i;:::-;8749:192:::0;:::o;55033:332::-;55089:13;55123:16;55131:7;55123;:16::i;:::-;55115:76;;;;-1:-1:-1;;;55115:76:0;;;;;;;:::i;:::-;55272:8;;55301:30;;-1:-1:-1;;;55301:30:0;;;;;24783:25:1;;;55202:20:0;;-1:-1:-1;;;;;55272:8:0;;;;55301:21;;24756:18:1;;55301:30:0;24738:76:1;30528:305:0;30630:4;-1:-1:-1;;;;;;30667:40:0;;-1:-1:-1;;;30667:40:0;;:105;;-1:-1:-1;;;;;;;30724:48:0;;-1:-1:-1;;;30724:48:0;30667:105;:158;;;-1:-1:-1;;;;;;;;;;29244:40:0;;;30789:36;29135:157;36426:127;36491:4;36515:16;;;:7;:16;;;;;;-1:-1:-1;;;;;36515:16:0;:30;;;36426:127::o;40408:174::-;40483:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;40483:29:0;-1:-1:-1;;;;;40483:29:0;;;;;;;;:24;;40537:23;40483:24;40537:14;:23::i;:::-;-1:-1:-1;;;;;40528:46:0;;;;;;;;;;;40408:174;;:::o;36720:348::-;36813:4;36838:16;36846:7;36838;:16::i;:::-;36830:73;;;;-1:-1:-1;;;36830:73:0;;17049:2:1;36830:73:0;;;17031:21:1;17088:2;17068:18;;;17061:30;17127:34;17107:18;;;17100:62;-1:-1:-1;;;17178:18:1;;;17171:42;17230:19;;36830:73:0;17021:234:1;36830:73:0;36914:13;36930:23;36945:7;36930:14;:23::i;:::-;36914:39;;36983:5;-1:-1:-1;;;;;36972:16:0;:7;-1:-1:-1;;;;;36972:16:0;;:51;;;;37016:7;-1:-1:-1;;;;;36992:31:0;:20;37004:7;36992:11;:20::i;:::-;-1:-1:-1;;;;;36992:31:0;;36972:51;:87;;;-1:-1:-1;;;;;;33812:25:0;;;33788:4;33812:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37027:32;33691:164;39712:578;39871:4;-1:-1:-1;;;;;39844:31:0;:23;39859:7;39844:14;:23::i;:::-;-1:-1:-1;;;;;39844:31:0;;39836:85;;;;-1:-1:-1;;;39836:85:0;;21305:2:1;39836:85:0;;;21287:21:1;21344:2;21324:18;;;21317:30;21383:34;21363:18;;;21356:62;-1:-1:-1;;;21434:18:1;;;21427:39;21483:19;;39836:85:0;21277:231:1;39836:85:0;-1:-1:-1;;;;;39940:16:0;;39932:65;;;;-1:-1:-1;;;39932:65:0;;14830:2:1;39932:65:0;;;14812:21:1;14869:2;14849:18;;;14842:30;14908:34;14888:18;;;14881:62;-1:-1:-1;;;14959:18:1;;;14952:34;15003:19;;39932:65:0;14802:226:1;39932:65:0;40010:39;40031:4;40037:2;40041:7;40010:20;:39::i;:::-;40114:29;40131:1;40135:7;40114:8;:29::i;:::-;-1:-1:-1;;;;;40156:15:0;;;;;;:9;:15;;;;;:20;;40175:1;;40156:15;:20;;40175:1;;40156:20;:::i;:::-;;;;-1:-1:-1;;;;;;;40187:13:0;;;;;;:9;:13;;;;;:18;;40204:1;;40187:13;:18;;40204:1;;40187:18;:::i;:::-;;;;-1:-1:-1;;40216:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;40216:21:0;-1:-1:-1;;;;;40216:21:0;;;;;;;;;40255:27;;40216:16;;40255:27;;;;;;;39712:578;;;:::o;24649:220::-;24707:7;24731:6;24727:20;;-1:-1:-1;24746:1:0;24739:8;;24727:20;24758:9;24770:5;24774:1;24770;:5;:::i;:::-;24758:17;-1:-1:-1;24803:1:0;24794:5;24798:1;24758:17;24794:5;:::i;:::-;:10;24786:56;;;;-1:-1:-1;;;24786:56:0;;19785:2:1;24786:56:0;;;19767:21:1;19824:2;19804:18;;;19797:30;19863:34;19843:18;;;19836:62;-1:-1:-1;;;19914:18:1;;;19907:31;19955:19;;24786:56:0;19757:223:1;24786:56:0;24860:1;24649:220;-1:-1:-1;;;24649:220:0:o;25347:153::-;25405:7;25437:1;25433;:5;25425:44;;;;-1:-1:-1;;;25425:44:0;;17462:2:1;25425:44:0;;;17444:21:1;17501:2;17481:18;;;17474:30;17540:28;17520:18;;;17513:56;17586:18;;25425:44:0;17434:176:1;25425:44:0;25487:5;25491:1;25487;:5;:::i;24232:158::-;24290:7;24323:1;24318;:6;;24310:49;;;;-1:-1:-1;;;24310:49:0;;16690:2:1;24310:49:0;;;16672:21:1;16729:2;16709:18;;;16702:30;16768:32;16748:18;;;16741:60;16818:18;;24310:49:0;16662:180:1;24310:49:0;24377:5;24381:1;24377;:5;:::i;63642:715::-;63698:13;63911:10;63907:53;;-1:-1:-1;;63938:10:0;;;;;;;;;;;;-1:-1:-1;;;63938:10:0;;;;;63642:715::o;63907:53::-;63985:5;63970:12;64026:78;64033:9;;64026:78;;64059:8;;;;:::i;:::-;;-1:-1:-1;64082:10:0;;-1:-1:-1;64090:2:0;64082:10;;:::i;:::-;;;64026:78;;;64114:19;64146:6;64136:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64136:17:0;;64114:39;;64164:154;64171:10;;64164:154;;64198:11;64208:1;64198:11;;:::i;:::-;;-1:-1:-1;64267:10:0;64275:2;64267:5;:10;:::i;:::-;64254:24;;:2;:24;:::i;:::-;64241:39;;64224:6;64231;64224:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;64224:56:0;;;;;;;;-1:-1:-1;64295:11:0;64304:2;64295:11;;:::i;:::-;;;64164:154;;8949:173;9024:6;;;-1:-1:-1;;;;;9041:17:0;;;-1:-1:-1;;;;;;9041:17:0;;;;;;;9074:40;;9024:6;;;9041:17;9024:6;;9074:40;;9005:16;;9074:40;8994:128;8949:173;:::o;23770:179::-;23828:7;;23860:5;23864:1;23860;:5;:::i;:::-;23848:17;;23889:1;23884;:6;;23876:46;;;;-1:-1:-1;;;23876:46:0;;14474:2:1;23876:46:0;;;14456:21:1;14513:2;14493:18;;;14486:30;14552:29;14532:18;;;14525:57;14599:18;;23876:46:0;14446:177:1;57529:758:0;57593:4;57603:14;57626:3;57603:27;;57649:1;57638;:8;:12;57635:29;;;-1:-1:-1;57659:5:0;;57529:758;-1:-1:-1;;57529:758:0:o;57635:29::-;57683:2;57672:1;:8;:13;57669:30;;;-1:-1:-1;57694:5:0;;57529:758;-1:-1:-1;;57529:758:0:o;57669:30::-;57746:1;57748;57746:4;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;57746:4:0;-1:-1:-1;;;57746:12:0;57743:29;;;-1:-1:-1;57767:5:0;;57529:758;-1:-1:-1;;57529:758:0:o;57743:29::-;57798:1;57811;57800;:8;:12;;;;:::i;:::-;57798:15;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;57798:15:0;-1:-1:-1;;;57798:23:0;57794:41;;;-1:-1:-1;57830:5:0;;57529:758;-1:-1:-1;;57529:758:0:o;57794:41::-;57860:15;57878:1;57880;57878:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;57878:4:0;;-1:-1:-1;57893:6:0;57889:376;57903:1;:8;57901:1;:10;57889:376;;;57923:11;57937:1;57939;57937:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;57937:4:0;;-1:-1:-1;;;;57953:12:0;;:32;;;;-1:-1:-1;;;;;;;;;;57969:16:0;;;57953:32;57949:50;;;-1:-1:-1;57994:5:0;;57529:758;-1:-1:-1;;;;;57529:758:0:o;57949:50::-;-1:-1:-1;;;;;;;;;58053:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58069:12:0;;;;58053:28;58051:31;:77;;;;-1:-1:-1;;;;;;;;;;58099:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58115:12:0;;;;58099:28;58097:31;58051:77;:123;;;;-1:-1:-1;;;;;;;;;;58145:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;58161:12:0;;;;58145:28;58143:31;58051:123;:153;;;;-1:-1:-1;;;;;;;;;;58191:12:0;;;58189:15;58051:153;58042:194;;;-1:-1:-1;58231:5:0;;57529:758;-1:-1:-1;;;;;57529:758:0:o;58042:194::-;58255:4;-1:-1:-1;57913:3:0;;;;:::i;:::-;;;;57889:376;;;-1:-1:-1;58278:4:0;;57529:758;-1:-1:-1;;;;57529:758:0:o;56271:386::-;56345:20;56329:13;56531:2;56481:25;56490:15;56481:8;:25::i;:::-;56508:17;56517:7;56508:8;:17::i;:::-;56464:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56454:73;;;;;;56446:82;;:87;;;;:::i;:::-;56425:108;-1:-1:-1;56544:16:0;56572:19;56425:108;56585:6;56572:19;:::i;:::-;56563:29;;:5;:29;:::i;:::-;56605:33;;;;:24;:33;;;;;;:44;;;;-1:-1:-1;;;56271:386:0:o;61609:554::-;61673:4;61695:12;61745:17;61754:7;61745:8;:17::i;:::-;61764:22;61773:12;;61764:8;:22::i;:::-;61728:59;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;61728:59:0;;;;;;;;;61718:70;;61728:59;61718:70;;;;;-1:-1:-1;61817:3:0;61803:11;61810:4;61718:70;61803:11;:::i;:::-;:17;61800:69;;;-1:-1:-1;61853:4:0;;61609:554;-1:-1:-1;;61609:554:0:o;61800:69::-;62066:16;;62042:20;;62022:17;;45079:10;:17;62006:33;;;;:::i;:::-;:56;;;;:::i;:::-;:76;62003:128;;;-1:-1:-1;62115:4:0;;61609:554;-1:-1:-1;;61609:554:0:o;62003:128::-;-1:-1:-1;62150:5:0;;61609:554;-1:-1:-1;;61609:554:0:o;37410:110::-;37486:26;37496:2;37500:7;37486:26;;;;;;;;;;;;:9;:26::i;35798:315::-;35955:28;35965:4;35971:2;35975:7;35955:9;:28::i;:::-;36002:48;36025:4;36031:2;36035:7;36044:5;36002:22;:48::i;:::-;35994:111;;;;-1:-1:-1;;;35994:111:0;;;;;;;:::i;58295:887::-;58538:39;;;;;;;10315:19:1;;;10372:2;10368:15;;;-1:-1:-1;;10364:53:1;10350:12;;;10343:75;58463:1:0;10434:12:1;;;;10427:28;;;58538:39:0;;;;;;;;;;10471:12:1;;;;58538:39:0;;;58528:50;;;;;-1:-1:-1;;58463:1:0;10315:19:1;-1:-1:-1;58620:292:0;58643:5;:12;58639:1;:16;;;58620:292;;;58682:4;58689;58682:11;58698:1;58681:18;58677:200;;;58754:5;58760:1;58754:8;;;;;;;;;;:::i;:::-;;;;;;;58764:4;58737:32;;;;;;;;9130:19:1;;;9174:2;9165:12;;9158:28;9211:2;9202:12;;9120:100;58737:32:0;;;;;;;;;;;;;58727:43;;;;;;58720:50;;58677:200;;;58845:4;58851:5;58857:1;58851:8;;;;;;;;;;:::i;:::-;;;;;;;58828:32;;;;;;;;9130:19:1;;;9174:2;9165:12;;9158:28;9211:2;9202:12;;9120:100;58828:32:0;;;;;;;;;;;;;58818:43;;;;;;58811:50;;58677:200;58891:9;58899:1;58891:9;;:::i;:::-;;-1:-1:-1;58657:3:0;;;;:::i;:::-;;;;58620:292;;;;58991:6;58987:163;59007:9;:16;59003:1;:20;58987:163;;;59066:9;59076:1;59066:12;;;;;;;;:::i;:::-;;;;;;;59058:4;:20;59054:85;;;59119:4;59112:11;;;;;;;;59054:85;59025:3;;;;:::i;:::-;;;;58987:163;;;-1:-1:-1;59169:5:0;;58295:887;-1:-1:-1;;;;;;;;58295:887:0:o;46027:589::-;-1:-1:-1;;;;;46233:18:0;;46229:187;;46268:40;46300:7;47443:10;:17;;47416:24;;;;:15;:24;;;;;:44;;;47471:24;;;;;;;;;;;;47339:164;46268:40;46229:187;;;46338:2;-1:-1:-1;;;;;46330:10:0;:4;-1:-1:-1;;;;;46330:10:0;;46326:90;;46357:47;46390:4;46396:7;46357:32;:47::i;:::-;-1:-1:-1;;;;;46430:16:0;;46426:183;;46463:45;46500:7;46463:36;:45::i;46426:183::-;46536:4;-1:-1:-1;;;;;46530:10:0;:2;-1:-1:-1;;;;;46530:10:0;;46526:83;;46557:40;46585:2;46589:7;46557:27;:40::i;37747:321::-;37877:18;37883:2;37887:7;37877:5;:18::i;:::-;37928:54;37959:1;37963:2;37967:7;37976:5;37928:22;:54::i;:::-;37906:154;;;;-1:-1:-1;;;37906:154:0;;;;;;;:::i;41147:803::-;41302:4;-1:-1:-1;;;;;41323:13:0;;14221:20;14269:8;41319:624;;41359:72;;-1:-1:-1;;;41359:72:0;;-1:-1:-1;;;;;41359:36:0;;;;;:72;;6803:10;;41410:4;;41416:7;;41425:5;;41359:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41359:72:0;;;;;;;;-1:-1:-1;;41359:72:0;;;;;;;;;;;;:::i;:::-;;;41355:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41605:13:0;;41601:272;;41648:60;;-1:-1:-1;;;41648:60:0;;;;;;;:::i;41601:272::-;41823:6;41817:13;41808:6;41804:2;41800:15;41793:38;41355:533;-1:-1:-1;;;;;;41482:55:0;-1:-1:-1;;;41482:55:0;;-1:-1:-1;41475:62:0;;41319:624;-1:-1:-1;41927:4:0;41920:11;;48130:988;48396:22;48446:1;48421:22;48438:4;48421:16;:22::i;:::-;:26;;;;:::i;:::-;48458:18;48479:26;;;:17;:26;;;;;;48396:51;;-1:-1:-1;48612:28:0;;;48608:328;;-1:-1:-1;;;;;48679:18:0;;48657:19;48679:18;;;:12;:18;;;;;;;;:34;;;;;;;;;48730:30;;;;;;:44;;;48847:30;;:17;:30;;;;;:43;;;48608:328;-1:-1:-1;49032:26:0;;;;:17;:26;;;;;;;;49025:33;;;-1:-1:-1;;;;;49076:18:0;;;;;:12;:18;;;;;:34;;;;;;;49069:41;48130:988::o;49413:1079::-;49691:10;:17;49666:22;;49691:21;;49711:1;;49691:21;:::i;:::-;49723:18;49744:24;;;:15;:24;;;;;;50117:10;:26;;49666:46;;-1:-1:-1;49744:24:0;;49666:46;;50117:26;;;;;;:::i;:::-;;;;;;;;;50095:48;;50181:11;50156:10;50167;50156:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;50261:28;;;:15;:28;;;;;;;:41;;;50433:24;;;;;50426:31;50468:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;49484:1008;;;49413:1079;:::o;46917:221::-;47002:14;47019:20;47036:2;47019:16;:20::i;:::-;-1:-1:-1;;;;;47050:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;47095:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;46917:221:0:o;38404:382::-;-1:-1:-1;;;;;38484:16:0;;38476:61;;;;-1:-1:-1;;;38476:61:0;;19424:2:1;38476:61:0;;;19406:21:1;;;19443:18;;;19436:30;19502:34;19482:18;;;19475:62;19554:18;;38476:61:0;19396:182:1;38476:61:0;38557:16;38565:7;38557;:16::i;:::-;38556:17;38548:58;;;;-1:-1:-1;;;38548:58:0;;14117:2:1;38548:58:0;;;14099:21:1;14156:2;14136:18;;;14129:30;14195;14175:18;;;14168:58;14243:18;;38548:58:0;14089:178:1;38548:58:0;38619:45;38648:1;38652:2;38656:7;38619:20;:45::i;:::-;-1:-1:-1;;;;;38677:13:0;;;;;;:9;:13;;;;;:18;;38694:1;;38677:13;:18;;38694:1;;38677:18;:::i;:::-;;;;-1:-1:-1;;38706:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38706:21:0;-1:-1:-1;;;;;38706:21:0;;;;;;;;38745:33;;38706:16;;;38745:33;;38706:16;;38745:33;38404:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:336:1;78:5;107:52;123:35;151:6;123:35;:::i;:::-;107:52;:::i;:::-;98:61;;182:6;175:5;168:21;222:3;213:6;208:3;204:16;201:25;198:2;;;239:1;236;229:12;198:2;288:6;283:3;276:4;269:5;265:16;252:43;342:1;335:4;326:6;319:5;315:18;311:29;304:40;88:262;;;;;:::o;355:856::-;408:5;461:3;454:4;446:6;442:17;438:27;428:2;;479:1;476;469:12;428:2;515:6;502:20;541:4;565:60;581:43;621:2;581:43;:::i;565:60::-;647:3;671:2;666:3;659:15;699:2;694:3;690:12;683:19;;734:2;726:6;722:15;786:3;781:2;775;772:1;768:10;760:6;756:23;752:32;749:41;746:2;;;803:1;800;793:12;746:2;825:1;846;856:326;872:2;867:3;864:11;856:326;;;953:3;940:17;989:18;976:11;973:35;970:2;;;1021:1;1018;1011:12;970:2;1050:57;1103:3;1098:2;1084:11;1076:6;1072:24;1068:33;1050:57;:::i;:::-;1038:70;;-1:-1:-1;1128:12:1;;;;1160;;;;894:1;885:11;856:326;;;-1:-1:-1;1200:5:1;;418:793;-1:-1:-1;;;;;;;;418:793:1:o;1216:221::-;1259:5;1312:3;1305:4;1297:6;1293:17;1289:27;1279:2;;1330:1;1327;1320:12;1279:2;1352:79;1427:3;1418:6;1405:20;1398:4;1390:6;1386:17;1352:79;:::i;1442:429::-;1496:5;1549:3;1542:4;1534:6;1530:17;1526:27;1516:2;;1567:1;1564;1557:12;1516:2;1596:6;1590:13;1627:48;1643:31;1671:2;1643:31;:::i;1627:48::-;1700:2;1691:7;1684:19;1746:3;1739:4;1734:2;1726:6;1722:15;1718:26;1715:35;1712:2;;;1763:1;1760;1753:12;1712:2;1776:64;1837:2;1830:4;1821:7;1817:18;1810:4;1802:6;1798:17;1776:64;:::i;1876:247::-;1935:6;1988:2;1976:9;1967:7;1963:23;1959:32;1956:2;;;2004:1;2001;1994:12;1956:2;2043:9;2030:23;2062:31;2087:5;2062:31;:::i;2388:388::-;2456:6;2464;2517:2;2505:9;2496:7;2492:23;2488:32;2485:2;;;2533:1;2530;2523:12;2485:2;2572:9;2559:23;2591:31;2616:5;2591:31;:::i;:::-;2641:5;-1:-1:-1;2698:2:1;2683:18;;2670:32;2711:33;2670:32;2711:33;:::i;:::-;2763:7;2753:17;;;2475:301;;;;;:::o;2781:456::-;2858:6;2866;2874;2927:2;2915:9;2906:7;2902:23;2898:32;2895:2;;;2943:1;2940;2933:12;2895:2;2982:9;2969:23;3001:31;3026:5;3001:31;:::i;:::-;3051:5;-1:-1:-1;3108:2:1;3093:18;;3080:32;3121:33;3080:32;3121:33;:::i;:::-;2885:352;;3173:7;;-1:-1:-1;;;3227:2:1;3212:18;;;;3199:32;;2885:352::o;3242:794::-;3337:6;3345;3353;3361;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3470:9;3457:23;3489:31;3514:5;3489:31;:::i;:::-;3539:5;-1:-1:-1;3596:2:1;3581:18;;3568:32;3609:33;3568:32;3609:33;:::i;:::-;3661:7;-1:-1:-1;3715:2:1;3700:18;;3687:32;;-1:-1:-1;3770:2:1;3755:18;;3742:32;3797:18;3786:30;;3783:2;;;3829:1;3826;3819:12;3783:2;3852:22;;3905:4;3897:13;;3893:27;-1:-1:-1;3883:2:1;;3934:1;3931;3924:12;3883:2;3957:73;4022:7;4017:2;4004:16;3999:2;3995;3991:11;3957:73;:::i;:::-;3947:83;;;3372:664;;;;;;;:::o;4041:416::-;4106:6;4114;4167:2;4155:9;4146:7;4142:23;4138:32;4135:2;;;4183:1;4180;4173:12;4135:2;4222:9;4209:23;4241:31;4266:5;4241:31;:::i;:::-;4291:5;-1:-1:-1;4348:2:1;4333:18;;4320:32;4390:15;;4383:23;4371:36;;4361:2;;4421:1;4418;4411:12;4462:315;4530:6;4538;4591:2;4579:9;4570:7;4566:23;4562:32;4559:2;;;4607:1;4604;4597:12;4559:2;4646:9;4633:23;4665:31;4690:5;4665:31;:::i;:::-;4715:5;4767:2;4752:18;;;;4739:32;;-1:-1:-1;;;4549:228:1:o;4782:180::-;4841:6;4894:2;4882:9;4873:7;4869:23;4865:32;4862:2;;;4910:1;4907;4900:12;4862:2;-1:-1:-1;4933:23:1;;4852:110;-1:-1:-1;4852:110:1:o;4967:245::-;5025:6;5078:2;5066:9;5057:7;5053:23;5049:32;5046:2;;;5094:1;5091;5084:12;5046:2;5133:9;5120:23;5152:30;5176:5;5152:30;:::i;5217:249::-;5286:6;5339:2;5327:9;5318:7;5314:23;5310:32;5307:2;;;5355:1;5352;5345:12;5307:2;5387:9;5381:16;5406:30;5430:5;5406:30;:::i;5471:322::-;5540:6;5593:2;5581:9;5572:7;5568:23;5564:32;5561:2;;;5609:1;5606;5599:12;5561:2;5649:9;5636:23;5682:18;5674:6;5671:30;5668:2;;;5714:1;5711;5704:12;5668:2;5737:50;5779:7;5770:6;5759:9;5755:22;5737:50;:::i;5798:337::-;5878:6;5931:2;5919:9;5910:7;5906:23;5902:32;5899:2;;;5947:1;5944;5937:12;5899:2;5980:9;5974:16;6013:18;6005:6;6002:30;5999:2;;;6045:1;6042;6035:12;5999:2;6068:61;6121:7;6112:6;6101:9;6097:22;6068:61;:::i;6140:398::-;6229:6;6237;6290:2;6278:9;6269:7;6265:23;6261:32;6258:2;;;6306:1;6303;6296:12;6258:2;6339:9;6333:16;6372:18;6364:6;6361:30;6358:2;;;6404:1;6401;6394:12;6358:2;6427:61;6480:7;6471:6;6460:9;6456:22;6427:61;:::i;:::-;6417:71;;;6528:2;6517:9;6513:18;6507:25;6497:35;;6248:290;;;;;:::o;6728:425::-;6831:6;6839;6892:2;6880:9;6871:7;6867:23;6863:32;6860:2;;;6908:1;6905;6898:12;6860:2;6944:9;6931:23;6921:33;;7005:2;6994:9;6990:18;6977:32;7032:18;7024:6;7021:30;7018:2;;;7064:1;7061;7054:12;7018:2;7087:60;7139:7;7130:6;7119:9;7115:22;7087:60;:::i;:::-;7077:70;;;6850:303;;;;;:::o;7158:248::-;7226:6;7234;7287:2;7275:9;7266:7;7262:23;7258:32;7255:2;;;7303:1;7300;7293:12;7255:2;-1:-1:-1;;7326:23:1;;;7396:2;7381:18;;;7368:32;;-1:-1:-1;7245:161:1:o;7411:1295::-;7557:6;7565;7573;7581;7634:3;7622:9;7613:7;7609:23;7605:33;7602:2;;;7651:1;7648;7641:12;7602:2;7687:9;7674:23;7664:33;;7716:2;7765;7754:9;7750:18;7737:32;7727:42;;7820:2;7809:9;7805:18;7792:32;7843:18;7884:2;7876:6;7873:14;7870:2;;;7900:1;7897;7890:12;7870:2;7938:6;7927:9;7923:22;7913:32;;7983:7;7976:4;7972:2;7968:13;7964:27;7954:2;;8005:1;8002;7995:12;7954:2;8041;8028:16;8064:60;8080:43;8120:2;8080:43;:::i;8064:60::-;8146:3;8170:2;8165:3;8158:15;8198:2;8193:3;8189:12;8182:19;;8229:2;8225;8221:11;8277:7;8272:2;8266;8263:1;8259:10;8255:2;8251:19;8247:28;8244:41;8241:2;;;8298:1;8295;8288:12;8241:2;8320:1;8311:10;;8330:163;8344:2;8341:1;8338:9;8330:163;;;8401:17;;8389:30;;8362:1;8355:9;;;;;8439:12;;;;8471;;8330:163;;;-1:-1:-1;8512:5:1;-1:-1:-1;;;8570:2:1;8555:18;;8542:32;;-1:-1:-1;8586:16:1;;;8583:2;;;8615:1;8612;8605:12;8583:2;;;8638:62;8692:7;8681:8;8670:9;8666:24;8638:62;:::i;8711:257::-;8752:3;8790:5;8784:12;8817:6;8812:3;8805:19;8833:63;8889:6;8882:4;8877:3;8873:14;8866:4;8859:5;8855:16;8833:63;:::i;:::-;8950:2;8929:15;-1:-1:-1;;8925:29:1;8916:39;;;;8957:4;8912:50;;8760:208;-1:-1:-1;;8760:208:1:o;9225:470::-;9404:3;9442:6;9436:13;9458:53;9504:6;9499:3;9492:4;9484:6;9480:17;9458:53;:::i;:::-;9574:13;;9533:16;;;;9596:57;9574:13;9533:16;9630:4;9618:17;;9596:57;:::i;:::-;9669:20;;9412:283;-1:-1:-1;;;;9412:283:1:o;9700:425::-;-1:-1:-1;;;9957:3:1;9950:23;9932:3;10002:6;9996:13;10018:61;10072:6;10068:1;10063:3;10059:11;10052:4;10044:6;10040:17;10018:61;:::i;:::-;10099:16;;;;10117:1;10095:24;;9940:185;-1:-1:-1;;9940:185:1:o;10702:488::-;-1:-1:-1;;;;;10971:15:1;;;10953:34;;11023:15;;11018:2;11003:18;;10996:43;11070:2;11055:18;;11048:34;;;11118:3;11113:2;11098:18;;11091:31;;;10896:4;;11139:45;;11164:19;;11156:6;11139:45;:::i;:::-;11131:53;10905:285;-1:-1:-1;;;;;;10905:285:1:o;11387:219::-;11536:2;11525:9;11518:21;11499:4;11556:44;11596:2;11585:9;11581:18;11573:6;11556:44;:::i;11611:290::-;11788:2;11777:9;11770:21;11751:4;11808:44;11848:2;11837:9;11833:18;11825:6;11808:44;:::i;:::-;11800:52;;11888:6;11883:2;11872:9;11868:18;11861:34;11760:141;;;;;:::o;13089:414::-;13291:2;13273:21;;;13330:2;13310:18;;;13303:30;13369:34;13364:2;13349:18;;13342:62;-1:-1:-1;;;13435:2:1;13420:18;;13413:48;13493:3;13478:19;;13263:240::o;20742:356::-;20944:2;20926:21;;;20963:18;;;20956:30;21022:34;21017:2;21002:18;;20995:62;21089:2;21074:18;;20916:182::o;21513:411::-;21715:2;21697:21;;;21754:2;21734:18;;;21727:30;21793:34;21788:2;21773:18;;21766:62;-1:-1:-1;;;21859:2:1;21844:18;;21837:45;21914:3;21899:19;;21687:237::o;22331:413::-;22533:2;22515:21;;;22572:2;22552:18;;;22545:30;22611:34;22606:2;22591:18;;22584:62;-1:-1:-1;;;22677:2:1;22662:18;;22655:47;22734:3;22719:19;;22505:239::o;25072:275::-;25143:2;25137:9;25208:2;25189:13;;-1:-1:-1;;25185:27:1;25173:40;;25243:18;25228:34;;25264:22;;;25225:62;25222:2;;;25290:18;;:::i;:::-;25326:2;25319:22;25117:230;;-1:-1:-1;25117:230:1:o;25352:183::-;25412:4;25445:18;25437:6;25434:30;25431:2;;;25467:18;;:::i;:::-;-1:-1:-1;25512:1:1;25508:14;25524:4;25504:25;;25421:114::o;25540:186::-;25588:4;25621:18;25613:6;25610:30;25607:2;;;25643:18;;:::i;:::-;-1:-1:-1;25709:2:1;25688:15;-1:-1:-1;;25684:29:1;25715:4;25680:40;;25597:129::o;25731:128::-;25771:3;25802:1;25798:6;25795:1;25792:13;25789:2;;;25808:18;;:::i;:::-;-1:-1:-1;25844:9:1;;25779:80::o;25864:120::-;25904:1;25930;25920:2;;25935:18;;:::i;:::-;-1:-1:-1;25969:9:1;;25910:74::o;25989:168::-;26029:7;26095:1;26091;26087:6;26083:14;26080:1;26077:21;26072:1;26065:9;26058:17;26054:45;26051:2;;;26102:18;;:::i;:::-;-1:-1:-1;26142:9:1;;26041:116::o;26162:125::-;26202:4;26230:1;26227;26224:8;26221:2;;;26235:18;;:::i;:::-;-1:-1:-1;26272:9:1;;26211:76::o;26292:258::-;26364:1;26374:113;26388:6;26385:1;26382:13;26374:113;;;26464:11;;;26458:18;26445:11;;;26438:39;26410:2;26403:10;26374:113;;;26505:6;26502:1;26499:13;26496:2;;;-1:-1:-1;;26540:1:1;26522:16;;26515:27;26345:205::o;26555:380::-;26634:1;26630:12;;;;26677;;;26698:2;;26752:4;26744:6;26740:17;26730:27;;26698:2;26805;26797:6;26794:14;26774:18;26771:38;26768:2;;;26851:10;26846:3;26842:20;26839:1;26832:31;26886:4;26883:1;26876:15;26914:4;26911:1;26904:15;26768:2;;26610:325;;;:::o;26940:197::-;26978:3;27006:6;27047:2;27040:5;27036:14;27074:2;27065:7;27062:15;27059:2;;;27080:18;;:::i;:::-;27129:1;27116:15;;26986:151;-1:-1:-1;;;26986:151:1:o;27142:135::-;27181:3;-1:-1:-1;;27202:17:1;;27199:2;;;27222:18;;:::i;:::-;-1:-1:-1;27269:1:1;27258:13;;27189:88::o;27282:112::-;27314:1;27340;27330:2;;27345:18;;:::i;:::-;-1:-1:-1;27379:9:1;;27320:74::o;27399:127::-;27460:10;27455:3;27451:20;27448:1;27441:31;27491:4;27488:1;27481:15;27515:4;27512:1;27505:15;27531:127;27592:10;27587:3;27583:20;27580:1;27573:31;27623:4;27620:1;27613:15;27647:4;27644:1;27637:15;27663:127;27724:10;27719:3;27715:20;27712:1;27705:31;27755:4;27752:1;27745:15;27779:4;27776:1;27769:15;27795:127;27856:10;27851:3;27847:20;27844:1;27837:31;27887:4;27884:1;27877:15;27911:4;27908:1;27901:15;27927:127;27988:10;27983:3;27979:20;27976:1;27969:31;28019:4;28016:1;28009:15;28043:4;28040:1;28033:15;28059:131;-1:-1:-1;;;;;28134:31:1;;28124:42;;28114:2;;28180:1;28177;28170:12;28195:131;-1:-1:-1;;;;;;28269:32:1;;28259:43;;28249:2;;28316:1;28313;28306:12

Swarm Source

ipfs://52a65744a875ccbf30bda5fd46d09071ce1fdca790f3d490e0808898e91d79ed
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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