ETH Price: $3,606.65 (+1.14%)

Token

ERC-20: Punked Apes (PA)
 

Overview

Max Total Supply

0 PA

Holders

313

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 PA
0x39c05a2ec4303A7A169AC9F9a0CAD47Db63e2E95
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:
PunkedApes

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-22
*/

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


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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

// File: contracts/PunkedApes.sol


pragma solidity ^0.8.11;




contract PunkedApes is ERC721, Ownable {

  using Counters for Counters.Counter;
  Counters.Counter private _tokenSupply;
  Counters.Counter private _nextTokenId;
  
  uint256 public mintPrice = 0.06 ether;

  uint256 private reserveAtATime = 50;
  uint256 private reservedCount = 0;
  uint256 private maxReserveCount = 50;

  string _baseTokenURI;

  uint256 public MAX_SUPPLY = 10000;
  uint256 public maximumAllowedTokensPerPurchase = 10;
  uint256 public maximumAllowedTokensPerWallet = 100;

  address public constant syncAddress = 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D;

  struct SaleConfig {
    uint256 startTime;
    uint256 duration;
  }

  enum WorkflowStatus {
        Before,
        Presale,
        Sale,
        SoldOut
  }

  WorkflowStatus public workflow;
  SaleConfig public saleConfig;

  event WorkflowStatusChange(WorkflowStatus previousStatus, WorkflowStatus newStatus);
  event ChangeSaleConfig(uint256 _startTime, uint256 _maxCount);

  constructor(string memory baseURI) ERC721("Punked Apes", "PA") {
    setBaseURI(baseURI);
    workflow = WorkflowStatus.Before;
  }

  modifier saleIsOpen {
    require(_tokenSupply.current() <= MAX_SUPPLY, "Sale has ended.");
    _;
  }

  modifier onlyAuthorized() {
    require(owner() == msg.sender);
    _;
  }

  function setWorkflowID(WorkflowStatus _workflowID) public onlyOwner {
      workflow = _workflowID;
  }

  function tokensMinted() public view returns (uint256) {
    return _tokenSupply.current();
  }

  function setMaximumAllowedTokens(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerPurchase = _count;
  }

  function setMaximumAllowedTokensPerWallet(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerWallet = _count;
  }

  function setMaxMintSupply(uint256 maxMintSupply) external  onlyAuthorized {
    MAX_SUPPLY = maxMintSupply;
  }

  function setReserveAtATime(uint256 val) public onlyAuthorized {
    reserveAtATime = val;
  }

  function setMaxReserve(uint256 val) public onlyAuthorized {
    maxReserveCount = val;
  }

  function setPrice(uint256 _price) public onlyAuthorized {
    mintPrice = _price;
  }

  function setBaseURI(string memory baseURI) public onlyAuthorized {
    _baseTokenURI = baseURI;
  }

  function getReserveAtATime() external view returns (uint256) {
    return reserveAtATime;
  }

  function getLeftDuration() public view returns (uint256) {
        SaleConfig memory _saleConfig = saleConfig;
        return (_saleConfig.startTime + _saleConfig.duration) - block.timestamp;
  }

  function checkPresaleStatus() public returns (bool) {
        bool isPresaleEnded = false;
        SaleConfig memory _saleConfig = saleConfig;

         if (block.timestamp > _saleConfig.startTime + _saleConfig.duration) {
            isPresaleEnded = true;
            workflow = WorkflowStatus.Sale;
        } 
        
        return isPresaleEnded;
  }

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

 function reserveNft() public onlyAuthorized {
    require(reservedCount <= maxReserveCount, "Max Reserves taken already!");
    uint256 i;

    if(_exists(_tokenSupply.current())) {
        _tokenSupply.increment();
    }

    for (i = 0; i < reserveAtATime; i++) {
      _tokenSupply.increment();
      _safeMint(msg.sender, _tokenSupply.current());
      reservedCount++;
    }
  }

  function setUpPresale() external onlyOwner {
        workflow = WorkflowStatus.Presale;
        uint256 _startTime = block.timestamp;
        uint256 _duration = 1 hours;
        saleConfig = SaleConfig(_startTime, _duration);
        emit ChangeSaleConfig(_startTime, _duration);
  }

  function setUpSale() external onlyOwner {
        workflow = WorkflowStatus.Sale;
        emit WorkflowStatusChange(WorkflowStatus.Presale, WorkflowStatus.Sale);
    }

  function mint(uint256 _count) public payable saleIsOpen {
    if(_exists(_tokenSupply.current())) {
      _tokenSupply.increment();
    }

    uint256 mintIndex = _tokenSupply.current();
    bool presaleEnded = checkPresaleStatus();
    
    if (msg.sender != owner()) {
      require(presaleEnded && workflow == WorkflowStatus.Sale, "Sale is not active currently.");
      require(balanceOf(msg.sender) + _count <= maximumAllowedTokensPerWallet, "Max holding cap reached.");
    }

    if (mintIndex + _count <= MAX_SUPPLY) {
      workflow = WorkflowStatus.SoldOut;
    }

    require(mintIndex + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(
      _count <= maximumAllowedTokensPerPurchase,
      "Exceeds maximum allowed tokens"
    );

    require(msg.value >= mintPrice * _count, "Insufficient ETH amount sent.");

    for (uint256 i = 0; i < _count; i++) {
      _tokenSupply.increment();
      if(_exists(_tokenSupply.current())) {
        _tokenSupply.increment();
      }
      _safeMint(msg.sender, _tokenSupply.current());
    }
  }

  function preSaleMint(uint256[] calldata _ownedTokenIDs) public payable saleIsOpen {
      // Get Sync Addres
      IERC721 token =  IERC721(syncAddress);
      bool presaleStatus = checkPresaleStatus();
      require(!presaleStatus, "Presale Has Ended");
      require(msg.value >= mintPrice, "Insuffient ETH amount sent.");
      require(
      _ownedTokenIDs.length <= maximumAllowedTokensPerPurchase,
      "Exceeds maximum allowed tokens"
    );

      for (uint256 i = 0; i < _ownedTokenIDs.length; i++) {
          // As front end need some time to get newly done Transaction, the contract will check passing ids also to be 100% sure that someone won't mint the the same token twice.
          require(!_exists(_ownedTokenIDs[i]), "This token has already minted");

          address isOwner = token.ownerOf(_ownedTokenIDs[i]);
          require(isOwner == msg.sender, "You are not the holder of this NFT");
          _safeMint(msg.sender, _ownedTokenIDs[i]);
      }
  }

  function adminAirdrop(address _BAYCHolderAddress, uint256[] calldata _tokenIDs) external onlyOwner {
        for (uint256 i = 0; i < _tokenIDs.length; i++) {
          require(!_exists(_tokenIDs[i]), "This token has already minted");
          _safeMint(_BAYCHolderAddress, _tokenIDs[i]);
      }
  }

  function withdraw() external onlyAuthorized {
    uint balance = address(this).balance;
    payable(owner()).transfer(balance);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangeSaleConfig","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PunkedApes.WorkflowStatus","name":"previousStatus","type":"uint8"},{"indexed":false,"internalType":"enum PunkedApes.WorkflowStatus","name":"newStatus","type":"uint8"}],"name":"WorkflowStatusChange","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_BAYCHolderAddress","type":"address"},{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"}],"name":"adminAirdrop","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":[],"name":"checkPresaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeftDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveAtATime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ownedTokenIDs","type":"uint256[]"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintSupply","type":"uint256"}],"name":"setMaxMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setReserveAtATime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PunkedApes.WorkflowStatus","name":"_workflowID","type":"uint8"}],"name":"setWorkflowID","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":[],"name":"syncAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"tokensMinted","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"workflow","outputs":[{"internalType":"enum PunkedApes.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"}]

608060405266d529ae9e8600006009556032600a556000600b556032600c55612710600e55600a600f5560646010553480156200003b57600080fd5b5060405162004f9438038062004f94833981810160405281019062000061919062000510565b6040518060400160405280600b81526020017f50756e6b656420417065730000000000000000000000000000000000000000008152506040518060400160405280600281526020017f50410000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000e5929190620002c3565b508060019080519060200190620000fe929190620002c3565b50505062000121620001156200016760201b60201c565b6200016f60201b60201c565b62000132816200023560201b60201c565b6000601160006101000a81548160ff021916908360038111156200015b576200015a62000561565b5b021790555050620005f5565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff166200025c6200029960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200027d57600080fd5b80600d908051906020019062000295929190620002c3565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002d190620005bf565b90600052602060002090601f016020900481019282620002f5576000855562000341565b82601f106200031057805160ff191683800117855562000341565b8280016001018555821562000341579182015b828111156200034057825182559160200191906001019062000323565b5b50905062000350919062000354565b5090565b5b808211156200036f57600081600090555060010162000355565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620003dc8262000391565b810181811067ffffffffffffffff82111715620003fe57620003fd620003a2565b5b80604052505050565b60006200041362000373565b9050620004218282620003d1565b919050565b600067ffffffffffffffff821115620004445762000443620003a2565b5b6200044f8262000391565b9050602081019050919050565b60005b838110156200047c5780820151818401526020810190506200045f565b838111156200048c576000848401525b50505050565b6000620004a9620004a38462000426565b62000407565b905082815260208101848484011115620004c857620004c76200038c565b5b620004d58482856200045c565b509392505050565b600082601f830112620004f557620004f462000387565b5b81516200050784826020860162000492565b91505092915050565b6000602082840312156200052957620005286200037d565b5b600082015167ffffffffffffffff8111156200054a576200054962000382565b5b6200055884828501620004dd565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005d857607f821691505b60208210811415620005ef57620005ee62000590565b5b50919050565b61498f80620006056000396000f3fe6080604052600436106102515760003560e01c806371e3500c11610139578063a3344125116100b6578063e7b62d961161007a578063e7b62d9614610825578063e985e9c514610850578063ea6eb8361461088d578063f2fde38b146108b6578063f6c9d9e3146108df578063f92a37d81461090857610251565b8063a33441251461073e578063b88d4fde14610769578063c87b56dd14610792578063cadf8818146107cf578063ddb0f1c6146107fa57610251565b806391b7f5ed116100fd57806391b7f5ed1461067a57806395d89b41146106a35780639a3bf728146106ce578063a0712d68146106f9578063a22cb4651461071557610251565b806371e3500c146105c75780637389fbb7146105de5780638da5cb5b146106075780638e4e9b021461063257806390aa0b0f1461064e57610251565b80633ccfd60b116101d257806356a87caa1161019657806356a87caa146104b75780636352211e146104e05780636817c76c1461051d5780636de9f32b1461054857806370a0823114610573578063715018a6146105b057610251565b80633ccfd60b146103fc57806342842e0e146104135780634dfea6271461043c578063544e9f891461046557806355f804b31461048e57610251565b80631f2898c3116102195780631f2898c31461033b57806323b872dd14610352578063304fa81a1461037b57806332cb6b0c146103a657806338d1eeae146103d157610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806315c316fc14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612f81565b610931565b60405161028a9190612fc9565b60405180910390f35b34801561029f57600080fd5b506102a8610a13565b6040516102b5919061307d565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906130d5565b610aa5565b6040516102f29190613143565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061318a565b610b2a565b005b34801561033057600080fd5b50610339610c42565b005b34801561034757600080fd5b50610350610d60565b005b34801561035e57600080fd5b50610379600480360381019061037491906131ca565b610e44565b005b34801561038757600080fd5b50610390610ea4565b60405161039d9190612fc9565b60405180910390f35b3480156103b257600080fd5b506103bb610f23565b6040516103c8919061322c565b60405180910390f35b3480156103dd57600080fd5b506103e6610f29565b6040516103f39190613143565b60405180910390f35b34801561040857600080fd5b50610411610f41565b005b34801561041f57600080fd5b5061043a600480360381019061043591906131ca565b610fd6565b005b34801561044857600080fd5b50610463600480360381019061045e91906130d5565b610ff6565b005b34801561047157600080fd5b5061048c600480360381019061048791906132ac565b61103f565b005b34801561049a57600080fd5b506104b560048036038101906104b0919061343c565b611167565b005b3480156104c357600080fd5b506104de60048036038101906104d991906130d5565b6111c0565b005b3480156104ec57600080fd5b50610507600480360381019061050291906130d5565b611209565b6040516105149190613143565b60405180910390f35b34801561052957600080fd5b506105326112bb565b60405161053f919061322c565b60405180910390f35b34801561055457600080fd5b5061055d6112c1565b60405161056a919061322c565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613485565b6112d2565b6040516105a7919061322c565b60405180910390f35b3480156105bc57600080fd5b506105c561138a565b005b3480156105d357600080fd5b506105dc611412565b005b3480156105ea57600080fd5b50610605600480360381019061060091906130d5565b611516565b005b34801561061357600080fd5b5061061c61155f565b6040516106299190613143565b60405180910390f35b61064c600480360381019061064791906134b2565b611589565b005b34801561065a57600080fd5b5061066361187d565b6040516106719291906134ff565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c91906130d5565b61188f565b005b3480156106af57600080fd5b506106b86118d8565b6040516106c5919061307d565b60405180910390f35b3480156106da57600080fd5b506106e361196a565b6040516106f0919061322c565b60405180910390f35b610713600480360381019061070e91906130d5565b611970565b005b34801561072157600080fd5b5061073c60048036038101906107379190613554565b611c94565b005b34801561074a57600080fd5b50610753611caa565b604051610760919061360b565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906136c7565b611cbd565b005b34801561079e57600080fd5b506107b960048036038101906107b491906130d5565b611d1f565b6040516107c6919061307d565b60405180910390f35b3480156107db57600080fd5b506107e4611dc6565b6040516107f1919061322c565b60405180910390f35b34801561080657600080fd5b5061080f611dcc565b60405161081c919061322c565b60405180910390f35b34801561083157600080fd5b5061083a611e17565b604051610847919061322c565b60405180910390f35b34801561085c57600080fd5b506108776004803603810190610872919061374a565b611e21565b6040516108849190612fc9565b60405180910390f35b34801561089957600080fd5b506108b460048036038101906108af91906130d5565b611eb5565b005b3480156108c257600080fd5b506108dd60048036038101906108d89190613485565b611efe565b005b3480156108eb57600080fd5b50610906600480360381019061090191906130d5565b611ff6565b005b34801561091457600080fd5b5061092f600480360381019061092a91906137af565b61203f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0c5750610a0b826120e8565b5b9050919050565b606060008054610a229061380b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e9061380b565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab082612152565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906138af565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3582611209565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613941565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc56121be565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee6121be565b611e21565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a906139d3565b60405180910390fd5b610c3d83836121c6565b505050565b610c4a6121be565b73ffffffffffffffffffffffffffffffffffffffff16610c6861155f565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613a3f565b60405180910390fd5b6001601160006101000a81548160ff02191690836003811115610ce457610ce3613594565b5b021790555060004290506000610e109050604051806040016040528083815260200182815250601260008201518160000155602082015181600101559050507f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a5548282604051610d549291906134ff565b60405180910390a15050565b610d686121be565b73ffffffffffffffffffffffffffffffffffffffff16610d8661155f565b73ffffffffffffffffffffffffffffffffffffffff1614610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd390613a3f565b60405180910390fd5b6002601160006101000a81548160ff02191690836003811115610e0257610e01613594565b5b02179055507f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f60016002604051610e3a929190613a5f565b60405180910390a1565b610e55610e4f6121be565b8261227f565b610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b90613afa565b60405180910390fd5b610e9f83838361235d565b505050565b600080600090506000601260405180604001604052908160008201548152602001600182015481525050905080602001518160000151610ee49190613b49565b421115610f1b57600191506002601160006101000a81548160ff02191690836003811115610f1557610f14613594565b5b02179055505b819250505090565b600e5481565b73bc4ca0eda7647a8ab7c2061c2e118a18a936f13d81565b3373ffffffffffffffffffffffffffffffffffffffff16610f6061155f565b73ffffffffffffffffffffffffffffffffffffffff1614610f8057600080fd5b6000479050610f8d61155f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd2573d6000803e3d6000fd5b5050565b610ff183838360405180602001604052806000815250611cbd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661101561155f565b73ffffffffffffffffffffffffffffffffffffffff161461103557600080fd5b80600f8190555050565b6110476121be565b73ffffffffffffffffffffffffffffffffffffffff1661106561155f565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613a3f565b60405180910390fd5b60005b82829050811015611161576110eb8383838181106110df576110de613b9f565b5b90506020020135612152565b1561112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290613c1a565b60405180910390fd5b61114e8484848481811061114257611141613b9f565b5b905060200201356125c4565b808061115990613c3a565b9150506110be565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1661118661155f565b73ffffffffffffffffffffffffffffffffffffffff16146111a657600080fd5b80600d90805190602001906111bc929190612e72565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166111df61155f565b73ffffffffffffffffffffffffffffffffffffffff16146111ff57600080fd5b80600c8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613cf5565b60405180910390fd5b80915050919050565b60095481565b60006112cd60076125e2565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90613d87565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113926121be565b73ffffffffffffffffffffffffffffffffffffffff166113b061155f565b73ffffffffffffffffffffffffffffffffffffffff1614611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd90613a3f565b60405180910390fd5b61141060006125f0565b565b3373ffffffffffffffffffffffffffffffffffffffff1661143161155f565b73ffffffffffffffffffffffffffffffffffffffff161461145157600080fd5b600c54600b541115611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f90613df3565b60405180910390fd5b60006114ac6114a760076125e2565b612152565b156114bc576114bb60076126b6565b5b600090505b600a54811015611513576114d560076126b6565b6114e8336114e360076125e2565b6125c4565b600b60008154809291906114fb90613c3a565b9190505550808061150b90613c3a565b9150506114c1565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661153561155f565b73ffffffffffffffffffffffffffffffffffffffff161461155557600080fd5b80600e8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5461159660076125e2565b11156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613e5f565b60405180910390fd5b600073bc4ca0eda7647a8ab7c2061c2e118a18a936f13d905060006115fa610ea4565b9050801561163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613ecb565b60405180910390fd5b600954341015611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990613f37565b60405180910390fd5b600f548484905011156116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613fa3565b60405180910390fd5b60005b84849050811015611876576116fa8585838181106116ee576116ed613b9f565b5b90506020020135612152565b1561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613c1a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16636352211e87878581811061176b5761176a613b9f565b5b905060200201356040518263ffffffff1660e01b815260040161178e919061322c565b602060405180830381865afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf9190613fd8565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690614077565b60405180910390fd5b6118623387878581811061185657611855613b9f565b5b905060200201356125c4565b50808061186e90613c3a565b9150506116cd565b5050505050565b60128060000154908060010154905082565b3373ffffffffffffffffffffffffffffffffffffffff166118ae61155f565b73ffffffffffffffffffffffffffffffffffffffff16146118ce57600080fd5b8060098190555050565b6060600180546118e79061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546119139061380b565b80156119605780601f1061193557610100808354040283529160200191611960565b820191906000526020600020905b81548152906001019060200180831161194357829003601f168201915b5050505050905090565b600f5481565b600e5461197d60076125e2565b11156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613e5f565b60405180910390fd5b6119d06119cb60076125e2565b612152565b156119e0576119df60076126b6565b5b60006119ec60076125e2565b905060006119f8610ea4565b9050611a0261155f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0c57808015611a74575060026003811115611a5057611a4f613594565b5b601160009054906101000a900460ff166003811115611a7257611a71613594565b5b145b611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa906140e3565b60405180910390fd5b60105483611ac0336112d2565b611aca9190613b49565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b029061414f565b60405180910390fd5b5b600e548383611b1b9190613b49565b11611b4c576003601160006101000a81548160ff02191690836003811115611b4657611b45613594565b5b02179055505b600e548383611b5b9190613b49565b1115611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b93906141bb565b60405180910390fd5b600f54831115611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890613fa3565b60405180910390fd5b82600954611bef91906141db565b341015611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890614281565b60405180910390fd5b60005b83811015611c8e57611c4660076126b6565b611c58611c5360076125e2565b612152565b15611c6857611c6760076126b6565b5b611c7b33611c7660076125e2565b6125c4565b8080611c8690613c3a565b915050611c34565b50505050565b611ca6611c9f6121be565b83836126cc565b5050565b601160009054906101000a900460ff1681565b611cce611cc86121be565b8361227f565b611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613afa565b60405180910390fd5b611d1984848484612839565b50505050565b6060611d2a82612152565b611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614313565b60405180910390fd5b6000611d73612895565b90506000815111611d935760405180602001604052806000815250611dbe565b80611d9d84612927565b604051602001611dae92919061436f565b6040516020818303038152906040525b915050919050565b60105481565b60008060126040518060400160405290816000820154815260200160018201548152505090504281602001518260000151611e079190613b49565b611e119190614393565b91505090565b6000600a54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611ed461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611ef457600080fd5b8060108190555050565b611f066121be565b73ffffffffffffffffffffffffffffffffffffffff16611f2461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190613a3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614439565b60405180910390fd5b611ff3816125f0565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661201561155f565b73ffffffffffffffffffffffffffffffffffffffff161461203557600080fd5b80600a8190555050565b6120476121be565b73ffffffffffffffffffffffffffffffffffffffff1661206561155f565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290613a3f565b60405180910390fd5b80601160006101000a81548160ff021916908360038111156120e0576120df613594565b5b021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661223983611209565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061228a82612152565b6122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906144cb565b60405180910390fd5b60006122d483611209565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234357508373ffffffffffffffffffffffffffffffffffffffff1661232b84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235457506123538185611e21565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661237d82611209565b73ffffffffffffffffffffffffffffffffffffffff16146123d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ca9061455d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a906145ef565b60405180910390fd5b61244e838383612a88565b6124596000826121c6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a99190614393565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125009190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bf838383612a8d565b505050565b6125de828260405180602001604052806000815250612a92565b5050565b600081600001549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061465b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282c9190612fc9565b60405180910390a3505050565b61284484848461235d565b61285084848484612aed565b61288f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612886906146ed565b60405180910390fd5b50505050565b6060600d80546128a49061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546128d09061380b565b801561291d5780601f106128f25761010080835404028352916020019161291d565b820191906000526020600020905b81548152906001019060200180831161290057829003601f168201915b5050505050905090565b6060600082141561296f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a83565b600082905060005b600082146129a157808061298a90613c3a565b915050600a8261299a919061473c565b9150612977565b60008167ffffffffffffffff8111156129bd576129bc613311565b5b6040519080825280601f01601f1916602001820160405280156129ef5781602001600182028036833780820191505090505b5090505b60008514612a7c57600182612a089190614393565b9150600a85612a17919061476d565b6030612a239190613b49565b60f81b818381518110612a3957612a38613b9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a75919061473c565b94506129f3565b8093505050505b919050565b505050565b505050565b612a9c8383612c75565b612aa96000848484612aed565b612ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf906146ed565b60405180910390fd5b505050565b6000612b0e8473ffffffffffffffffffffffffffffffffffffffff16612e4f565b15612c68578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b376121be565b8786866040518563ffffffff1660e01b8152600401612b5994939291906147f3565b6020604051808303816000875af1925050508015612b9557506040513d601f19601f82011682018060405250810190612b929190614854565b60015b612c18573d8060008114612bc5576040519150601f19603f3d011682016040523d82523d6000602084013e612bca565b606091505b50600081511415612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906146ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c6d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc906148cd565b60405180910390fd5b612cee81612152565b15612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2590614939565b60405180910390fd5b612d3a60008383612a88565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d8a9190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e4b60008383612a8d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612e7e9061380b565b90600052602060002090601f016020900481019282612ea05760008555612ee7565b82601f10612eb957805160ff1916838001178555612ee7565b82800160010185558215612ee7579182015b82811115612ee6578251825591602001919060010190612ecb565b5b509050612ef49190612ef8565b5090565b5b80821115612f11576000816000905550600101612ef9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f5e81612f29565b8114612f6957600080fd5b50565b600081359050612f7b81612f55565b92915050565b600060208284031215612f9757612f96612f1f565b5b6000612fa584828501612f6c565b91505092915050565b60008115159050919050565b612fc381612fae565b82525050565b6000602082019050612fde6000830184612fba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561301e578082015181840152602081019050613003565b8381111561302d576000848401525b50505050565b6000601f19601f8301169050919050565b600061304f82612fe4565b6130598185612fef565b9350613069818560208601613000565b61307281613033565b840191505092915050565b600060208201905081810360008301526130978184613044565b905092915050565b6000819050919050565b6130b28161309f565b81146130bd57600080fd5b50565b6000813590506130cf816130a9565b92915050565b6000602082840312156130eb576130ea612f1f565b5b60006130f9848285016130c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061312d82613102565b9050919050565b61313d81613122565b82525050565b60006020820190506131586000830184613134565b92915050565b61316781613122565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080604083850312156131a1576131a0612f1f565b5b60006131af85828601613175565b92505060206131c0858286016130c0565b9150509250929050565b6000806000606084860312156131e3576131e2612f1f565b5b60006131f186828701613175565b935050602061320286828701613175565b9250506040613213868287016130c0565b9150509250925092565b6132268161309f565b82525050565b6000602082019050613241600083018461321d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261326c5761326b613247565b5b8235905067ffffffffffffffff8111156132895761328861324c565b5b6020830191508360208202830111156132a5576132a4613251565b5b9250929050565b6000806000604084860312156132c5576132c4612f1f565b5b60006132d386828701613175565b935050602084013567ffffffffffffffff8111156132f4576132f3612f24565b5b61330086828701613256565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61334982613033565b810181811067ffffffffffffffff8211171561336857613367613311565b5b80604052505050565b600061337b612f15565b90506133878282613340565b919050565b600067ffffffffffffffff8211156133a7576133a6613311565b5b6133b082613033565b9050602081019050919050565b82818337600083830152505050565b60006133df6133da8461338c565b613371565b9050828152602081018484840111156133fb576133fa61330c565b5b6134068482856133bd565b509392505050565b600082601f83011261342357613422613247565b5b81356134338482602086016133cc565b91505092915050565b60006020828403121561345257613451612f1f565b5b600082013567ffffffffffffffff8111156134705761346f612f24565b5b61347c8482850161340e565b91505092915050565b60006020828403121561349b5761349a612f1f565b5b60006134a984828501613175565b91505092915050565b600080602083850312156134c9576134c8612f1f565b5b600083013567ffffffffffffffff8111156134e7576134e6612f24565b5b6134f385828601613256565b92509250509250929050565b6000604082019050613514600083018561321d565b613521602083018461321d565b9392505050565b61353181612fae565b811461353c57600080fd5b50565b60008135905061354e81613528565b92915050565b6000806040838503121561356b5761356a612f1f565b5b600061357985828601613175565b925050602061358a8582860161353f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106135d4576135d3613594565b5b50565b60008190506135e5826135c3565b919050565b60006135f5826135d7565b9050919050565b613605816135ea565b82525050565b600060208201905061362060008301846135fc565b92915050565b600067ffffffffffffffff82111561364157613640613311565b5b61364a82613033565b9050602081019050919050565b600061366a61366584613626565b613371565b9050828152602081018484840111156136865761368561330c565b5b6136918482856133bd565b509392505050565b600082601f8301126136ae576136ad613247565b5b81356136be848260208601613657565b91505092915050565b600080600080608085870312156136e1576136e0612f1f565b5b60006136ef87828801613175565b945050602061370087828801613175565b9350506040613711878288016130c0565b925050606085013567ffffffffffffffff81111561373257613731612f24565b5b61373e87828801613699565b91505092959194509250565b6000806040838503121561376157613760612f1f565b5b600061376f85828601613175565b925050602061378085828601613175565b9150509250929050565b6004811061379757600080fd5b50565b6000813590506137a98161378a565b92915050565b6000602082840312156137c5576137c4612f1f565b5b60006137d38482850161379a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061382357607f821691505b60208210811415613837576138366137dc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613899602c83612fef565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061392b602183612fef565b9150613936826138cf565b604082019050919050565b6000602082019050818103600083015261395a8161391e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006139bd603883612fef565b91506139c882613961565b604082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a29602083612fef565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b6000604082019050613a7460008301856135fc565b613a8160208301846135fc565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ae4603183612fef565b9150613aef82613a88565b604082019050919050565b60006020820190508181036000830152613b1381613ad7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b548261309f565b9150613b5f8361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b9457613b93613b1a565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5468697320746f6b656e2068617320616c7265616479206d696e746564000000600082015250565b6000613c04601d83612fef565b9150613c0f82613bce565b602082019050919050565b60006020820190508181036000830152613c3381613bf7565b9050919050565b6000613c458261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c7857613c77613b1a565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613cdf602983612fef565b9150613cea82613c83565b604082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d71602a83612fef565b9150613d7c82613d15565b604082019050919050565b60006020820190508181036000830152613da081613d64565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613ddd601b83612fef565b9150613de882613da7565b602082019050919050565b60006020820190508181036000830152613e0c81613dd0565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613e49600f83612fef565b9150613e5482613e13565b602082019050919050565b60006020820190508181036000830152613e7881613e3c565b9050919050565b7f50726573616c652048617320456e646564000000000000000000000000000000600082015250565b6000613eb5601183612fef565b9150613ec082613e7f565b602082019050919050565b60006020820190508181036000830152613ee481613ea8565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b6000613f21601b83612fef565b9150613f2c82613eeb565b602082019050919050565b60006020820190508181036000830152613f5081613f14565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000613f8d601e83612fef565b9150613f9882613f57565b602082019050919050565b60006020820190508181036000830152613fbc81613f80565b9050919050565b600081519050613fd28161315e565b92915050565b600060208284031215613fee57613fed612f1f565b5b6000613ffc84828501613fc3565b91505092915050565b7f596f7520617265206e6f742074686520686f6c646572206f662074686973204e60008201527f4654000000000000000000000000000000000000000000000000000000000000602082015250565b6000614061602283612fef565b915061406c82614005565b604082019050919050565b6000602082019050818103600083015261409081614054565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006140cd601d83612fef565b91506140d882614097565b602082019050919050565b600060208201905081810360008301526140fc816140c0565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b6000614139601883612fef565b915061414482614103565b602082019050919050565b600060208201905081810360008301526141688161412c565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006141a5601683612fef565b91506141b08261416f565b602082019050919050565b600060208201905081810360008301526141d481614198565b9050919050565b60006141e68261309f565b91506141f18361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422a57614229613b1a565b5b828202905092915050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b600061426b601d83612fef565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142fd602f83612fef565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b600081905092915050565b600061434982612fe4565b6143538185614333565b9350614363818560208601613000565b80840191505092915050565b600061437b828561433e565b9150614387828461433e565b91508190509392505050565b600061439e8261309f565b91506143a98361309f565b9250828210156143bc576143bb613b1a565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614423602683612fef565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144b5602c83612fef565b91506144c082614459565b604082019050919050565b600060208201905081810360008301526144e4816144a8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614547602583612fef565b9150614552826144eb565b604082019050919050565b600060208201905081810360008301526145768161453a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145d9602483612fef565b91506145e48261457d565b604082019050919050565b60006020820190508181036000830152614608816145cc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614645601983612fef565b91506146508261460f565b602082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146d7603283612fef565b91506146e28261467b565b604082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147478261309f565b91506147528361309f565b9250826147625761476161470d565b5b828204905092915050565b60006147788261309f565b91506147838361309f565b9250826147935761479261470d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147c58261479e565b6147cf81856147a9565b93506147df818560208601613000565b6147e881613033565b840191505092915050565b60006080820190506148086000830187613134565b6148156020830186613134565b614822604083018561321d565b818103606083015261483481846147ba565b905095945050505050565b60008151905061484e81612f55565b92915050565b60006020828403121561486a57614869612f1f565b5b60006148788482850161483f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148b7602083612fef565b91506148c282614881565b602082019050919050565b600060208201905081810360008301526148e6816148aa565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614923601c83612fef565b915061492e826148ed565b602082019050919050565b6000602082019050818103600083015261495281614916565b905091905056fea2646970667358221220cfd8fd7d25f52cd0b1130cbbc355fdfd5b483208cdd0a434f4291ef9ae87432b64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c806371e3500c11610139578063a3344125116100b6578063e7b62d961161007a578063e7b62d9614610825578063e985e9c514610850578063ea6eb8361461088d578063f2fde38b146108b6578063f6c9d9e3146108df578063f92a37d81461090857610251565b8063a33441251461073e578063b88d4fde14610769578063c87b56dd14610792578063cadf8818146107cf578063ddb0f1c6146107fa57610251565b806391b7f5ed116100fd57806391b7f5ed1461067a57806395d89b41146106a35780639a3bf728146106ce578063a0712d68146106f9578063a22cb4651461071557610251565b806371e3500c146105c75780637389fbb7146105de5780638da5cb5b146106075780638e4e9b021461063257806390aa0b0f1461064e57610251565b80633ccfd60b116101d257806356a87caa1161019657806356a87caa146104b75780636352211e146104e05780636817c76c1461051d5780636de9f32b1461054857806370a0823114610573578063715018a6146105b057610251565b80633ccfd60b146103fc57806342842e0e146104135780634dfea6271461043c578063544e9f891461046557806355f804b31461048e57610251565b80631f2898c3116102195780631f2898c31461033b57806323b872dd14610352578063304fa81a1461037b57806332cb6b0c146103a657806338d1eeae146103d157610251565b806301ffc9a71461025657806306fdde0314610293578063081812fc146102be578063095ea7b3146102fb57806315c316fc14610324575b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190612f81565b610931565b60405161028a9190612fc9565b60405180910390f35b34801561029f57600080fd5b506102a8610a13565b6040516102b5919061307d565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e091906130d5565b610aa5565b6040516102f29190613143565b60405180910390f35b34801561030757600080fd5b50610322600480360381019061031d919061318a565b610b2a565b005b34801561033057600080fd5b50610339610c42565b005b34801561034757600080fd5b50610350610d60565b005b34801561035e57600080fd5b50610379600480360381019061037491906131ca565b610e44565b005b34801561038757600080fd5b50610390610ea4565b60405161039d9190612fc9565b60405180910390f35b3480156103b257600080fd5b506103bb610f23565b6040516103c8919061322c565b60405180910390f35b3480156103dd57600080fd5b506103e6610f29565b6040516103f39190613143565b60405180910390f35b34801561040857600080fd5b50610411610f41565b005b34801561041f57600080fd5b5061043a600480360381019061043591906131ca565b610fd6565b005b34801561044857600080fd5b50610463600480360381019061045e91906130d5565b610ff6565b005b34801561047157600080fd5b5061048c600480360381019061048791906132ac565b61103f565b005b34801561049a57600080fd5b506104b560048036038101906104b0919061343c565b611167565b005b3480156104c357600080fd5b506104de60048036038101906104d991906130d5565b6111c0565b005b3480156104ec57600080fd5b50610507600480360381019061050291906130d5565b611209565b6040516105149190613143565b60405180910390f35b34801561052957600080fd5b506105326112bb565b60405161053f919061322c565b60405180910390f35b34801561055457600080fd5b5061055d6112c1565b60405161056a919061322c565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613485565b6112d2565b6040516105a7919061322c565b60405180910390f35b3480156105bc57600080fd5b506105c561138a565b005b3480156105d357600080fd5b506105dc611412565b005b3480156105ea57600080fd5b50610605600480360381019061060091906130d5565b611516565b005b34801561061357600080fd5b5061061c61155f565b6040516106299190613143565b60405180910390f35b61064c600480360381019061064791906134b2565b611589565b005b34801561065a57600080fd5b5061066361187d565b6040516106719291906134ff565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c91906130d5565b61188f565b005b3480156106af57600080fd5b506106b86118d8565b6040516106c5919061307d565b60405180910390f35b3480156106da57600080fd5b506106e361196a565b6040516106f0919061322c565b60405180910390f35b610713600480360381019061070e91906130d5565b611970565b005b34801561072157600080fd5b5061073c60048036038101906107379190613554565b611c94565b005b34801561074a57600080fd5b50610753611caa565b604051610760919061360b565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b91906136c7565b611cbd565b005b34801561079e57600080fd5b506107b960048036038101906107b491906130d5565b611d1f565b6040516107c6919061307d565b60405180910390f35b3480156107db57600080fd5b506107e4611dc6565b6040516107f1919061322c565b60405180910390f35b34801561080657600080fd5b5061080f611dcc565b60405161081c919061322c565b60405180910390f35b34801561083157600080fd5b5061083a611e17565b604051610847919061322c565b60405180910390f35b34801561085c57600080fd5b506108776004803603810190610872919061374a565b611e21565b6040516108849190612fc9565b60405180910390f35b34801561089957600080fd5b506108b460048036038101906108af91906130d5565b611eb5565b005b3480156108c257600080fd5b506108dd60048036038101906108d89190613485565b611efe565b005b3480156108eb57600080fd5b50610906600480360381019061090191906130d5565b611ff6565b005b34801561091457600080fd5b5061092f600480360381019061092a91906137af565b61203f565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fc57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0c5750610a0b826120e8565b5b9050919050565b606060008054610a229061380b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e9061380b565b8015610a9b5780601f10610a7057610100808354040283529160200191610a9b565b820191906000526020600020905b815481529060010190602001808311610a7e57829003601f168201915b5050505050905090565b6000610ab082612152565b610aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae6906138af565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3582611209565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9d90613941565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc56121be565b73ffffffffffffffffffffffffffffffffffffffff161480610bf45750610bf381610bee6121be565b611e21565b5b610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a906139d3565b60405180910390fd5b610c3d83836121c6565b505050565b610c4a6121be565b73ffffffffffffffffffffffffffffffffffffffff16610c6861155f565b73ffffffffffffffffffffffffffffffffffffffff1614610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613a3f565b60405180910390fd5b6001601160006101000a81548160ff02191690836003811115610ce457610ce3613594565b5b021790555060004290506000610e109050604051806040016040528083815260200182815250601260008201518160000155602082015181600101559050507f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a5548282604051610d549291906134ff565b60405180910390a15050565b610d686121be565b73ffffffffffffffffffffffffffffffffffffffff16610d8661155f565b73ffffffffffffffffffffffffffffffffffffffff1614610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd390613a3f565b60405180910390fd5b6002601160006101000a81548160ff02191690836003811115610e0257610e01613594565b5b02179055507f0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3f60016002604051610e3a929190613a5f565b60405180910390a1565b610e55610e4f6121be565b8261227f565b610e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8b90613afa565b60405180910390fd5b610e9f83838361235d565b505050565b600080600090506000601260405180604001604052908160008201548152602001600182015481525050905080602001518160000151610ee49190613b49565b421115610f1b57600191506002601160006101000a81548160ff02191690836003811115610f1557610f14613594565b5b02179055505b819250505090565b600e5481565b73bc4ca0eda7647a8ab7c2061c2e118a18a936f13d81565b3373ffffffffffffffffffffffffffffffffffffffff16610f6061155f565b73ffffffffffffffffffffffffffffffffffffffff1614610f8057600080fd5b6000479050610f8d61155f565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610fd2573d6000803e3d6000fd5b5050565b610ff183838360405180602001604052806000815250611cbd565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661101561155f565b73ffffffffffffffffffffffffffffffffffffffff161461103557600080fd5b80600f8190555050565b6110476121be565b73ffffffffffffffffffffffffffffffffffffffff1661106561155f565b73ffffffffffffffffffffffffffffffffffffffff16146110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290613a3f565b60405180910390fd5b60005b82829050811015611161576110eb8383838181106110df576110de613b9f565b5b90506020020135612152565b1561112b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112290613c1a565b60405180910390fd5b61114e8484848481811061114257611141613b9f565b5b905060200201356125c4565b808061115990613c3a565b9150506110be565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff1661118661155f565b73ffffffffffffffffffffffffffffffffffffffff16146111a657600080fd5b80600d90805190602001906111bc929190612e72565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166111df61155f565b73ffffffffffffffffffffffffffffffffffffffff16146111ff57600080fd5b80600c8190555050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990613cf5565b60405180910390fd5b80915050919050565b60095481565b60006112cd60076125e2565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133a90613d87565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113926121be565b73ffffffffffffffffffffffffffffffffffffffff166113b061155f565b73ffffffffffffffffffffffffffffffffffffffff1614611406576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fd90613a3f565b60405180910390fd5b61141060006125f0565b565b3373ffffffffffffffffffffffffffffffffffffffff1661143161155f565b73ffffffffffffffffffffffffffffffffffffffff161461145157600080fd5b600c54600b541115611498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148f90613df3565b60405180910390fd5b60006114ac6114a760076125e2565b612152565b156114bc576114bb60076126b6565b5b600090505b600a54811015611513576114d560076126b6565b6114e8336114e360076125e2565b6125c4565b600b60008154809291906114fb90613c3a565b9190505550808061150b90613c3a565b9150506114c1565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661153561155f565b73ffffffffffffffffffffffffffffffffffffffff161461155557600080fd5b80600e8190555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5461159660076125e2565b11156115d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ce90613e5f565b60405180910390fd5b600073bc4ca0eda7647a8ab7c2061c2e118a18a936f13d905060006115fa610ea4565b9050801561163d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163490613ecb565b60405180910390fd5b600954341015611682576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167990613f37565b60405180910390fd5b600f548484905011156116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c190613fa3565b60405180910390fd5b60005b84849050811015611876576116fa8585838181106116ee576116ed613b9f565b5b90506020020135612152565b1561173a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173190613c1a565b60405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff16636352211e87878581811061176b5761176a613b9f565b5b905060200201356040518263ffffffff1660e01b815260040161178e919061322c565b602060405180830381865afa1580156117ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cf9190613fd8565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461183f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183690614077565b60405180910390fd5b6118623387878581811061185657611855613b9f565b5b905060200201356125c4565b50808061186e90613c3a565b9150506116cd565b5050505050565b60128060000154908060010154905082565b3373ffffffffffffffffffffffffffffffffffffffff166118ae61155f565b73ffffffffffffffffffffffffffffffffffffffff16146118ce57600080fd5b8060098190555050565b6060600180546118e79061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546119139061380b565b80156119605780601f1061193557610100808354040283529160200191611960565b820191906000526020600020905b81548152906001019060200180831161194357829003601f168201915b5050505050905090565b600f5481565b600e5461197d60076125e2565b11156119be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b590613e5f565b60405180910390fd5b6119d06119cb60076125e2565b612152565b156119e0576119df60076126b6565b5b60006119ec60076125e2565b905060006119f8610ea4565b9050611a0261155f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0c57808015611a74575060026003811115611a5057611a4f613594565b5b601160009054906101000a900460ff166003811115611a7257611a71613594565b5b145b611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa906140e3565b60405180910390fd5b60105483611ac0336112d2565b611aca9190613b49565b1115611b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b029061414f565b60405180910390fd5b5b600e548383611b1b9190613b49565b11611b4c576003601160006101000a81548160ff02191690836003811115611b4657611b45613594565b5b02179055505b600e548383611b5b9190613b49565b1115611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b93906141bb565b60405180910390fd5b600f54831115611be1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd890613fa3565b60405180910390fd5b82600954611bef91906141db565b341015611c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2890614281565b60405180910390fd5b60005b83811015611c8e57611c4660076126b6565b611c58611c5360076125e2565b612152565b15611c6857611c6760076126b6565b5b611c7b33611c7660076125e2565b6125c4565b8080611c8690613c3a565b915050611c34565b50505050565b611ca6611c9f6121be565b83836126cc565b5050565b601160009054906101000a900460ff1681565b611cce611cc86121be565b8361227f565b611d0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0490613afa565b60405180910390fd5b611d1984848484612839565b50505050565b6060611d2a82612152565b611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6090614313565b60405180910390fd5b6000611d73612895565b90506000815111611d935760405180602001604052806000815250611dbe565b80611d9d84612927565b604051602001611dae92919061436f565b6040516020818303038152906040525b915050919050565b60105481565b60008060126040518060400160405290816000820154815260200160018201548152505090504281602001518260000151611e079190613b49565b611e119190614393565b91505090565b6000600a54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16611ed461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611ef457600080fd5b8060108190555050565b611f066121be565b73ffffffffffffffffffffffffffffffffffffffff16611f2461155f565b73ffffffffffffffffffffffffffffffffffffffff1614611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190613a3f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614439565b60405180910390fd5b611ff3816125f0565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661201561155f565b73ffffffffffffffffffffffffffffffffffffffff161461203557600080fd5b80600a8190555050565b6120476121be565b73ffffffffffffffffffffffffffffffffffffffff1661206561155f565b73ffffffffffffffffffffffffffffffffffffffff16146120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b290613a3f565b60405180910390fd5b80601160006101000a81548160ff021916908360038111156120e0576120df613594565b5b021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661223983611209565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061228a82612152565b6122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c0906144cb565b60405180910390fd5b60006122d483611209565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061234357508373ffffffffffffffffffffffffffffffffffffffff1661232b84610aa5565b73ffffffffffffffffffffffffffffffffffffffff16145b8061235457506123538185611e21565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661237d82611209565b73ffffffffffffffffffffffffffffffffffffffff16146123d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ca9061455d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243a906145ef565b60405180910390fd5b61244e838383612a88565b6124596000826121c6565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a99190614393565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125009190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125bf838383612a8d565b505050565b6125de828260405180602001604052806000815250612a92565b5050565b600081600001549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561273b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127329061465b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161282c9190612fc9565b60405180910390a3505050565b61284484848461235d565b61285084848484612aed565b61288f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612886906146ed565b60405180910390fd5b50505050565b6060600d80546128a49061380b565b80601f01602080910402602001604051908101604052809291908181526020018280546128d09061380b565b801561291d5780601f106128f25761010080835404028352916020019161291d565b820191906000526020600020905b81548152906001019060200180831161290057829003601f168201915b5050505050905090565b6060600082141561296f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a83565b600082905060005b600082146129a157808061298a90613c3a565b915050600a8261299a919061473c565b9150612977565b60008167ffffffffffffffff8111156129bd576129bc613311565b5b6040519080825280601f01601f1916602001820160405280156129ef5781602001600182028036833780820191505090505b5090505b60008514612a7c57600182612a089190614393565b9150600a85612a17919061476d565b6030612a239190613b49565b60f81b818381518110612a3957612a38613b9f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a75919061473c565b94506129f3565b8093505050505b919050565b505050565b505050565b612a9c8383612c75565b612aa96000848484612aed565b612ae8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612adf906146ed565b60405180910390fd5b505050565b6000612b0e8473ffffffffffffffffffffffffffffffffffffffff16612e4f565b15612c68578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b376121be565b8786866040518563ffffffff1660e01b8152600401612b5994939291906147f3565b6020604051808303816000875af1925050508015612b9557506040513d601f19601f82011682018060405250810190612b929190614854565b60015b612c18573d8060008114612bc5576040519150601f19603f3d011682016040523d82523d6000602084013e612bca565b606091505b50600081511415612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906146ed565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c6d565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cdc906148cd565b60405180910390fd5b612cee81612152565b15612d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2590614939565b60405180910390fd5b612d3a60008383612a88565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d8a9190613b49565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e4b60008383612a8d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612e7e9061380b565b90600052602060002090601f016020900481019282612ea05760008555612ee7565b82601f10612eb957805160ff1916838001178555612ee7565b82800160010185558215612ee7579182015b82811115612ee6578251825591602001919060010190612ecb565b5b509050612ef49190612ef8565b5090565b5b80821115612f11576000816000905550600101612ef9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612f5e81612f29565b8114612f6957600080fd5b50565b600081359050612f7b81612f55565b92915050565b600060208284031215612f9757612f96612f1f565b5b6000612fa584828501612f6c565b91505092915050565b60008115159050919050565b612fc381612fae565b82525050565b6000602082019050612fde6000830184612fba565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561301e578082015181840152602081019050613003565b8381111561302d576000848401525b50505050565b6000601f19601f8301169050919050565b600061304f82612fe4565b6130598185612fef565b9350613069818560208601613000565b61307281613033565b840191505092915050565b600060208201905081810360008301526130978184613044565b905092915050565b6000819050919050565b6130b28161309f565b81146130bd57600080fd5b50565b6000813590506130cf816130a9565b92915050565b6000602082840312156130eb576130ea612f1f565b5b60006130f9848285016130c0565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061312d82613102565b9050919050565b61313d81613122565b82525050565b60006020820190506131586000830184613134565b92915050565b61316781613122565b811461317257600080fd5b50565b6000813590506131848161315e565b92915050565b600080604083850312156131a1576131a0612f1f565b5b60006131af85828601613175565b92505060206131c0858286016130c0565b9150509250929050565b6000806000606084860312156131e3576131e2612f1f565b5b60006131f186828701613175565b935050602061320286828701613175565b9250506040613213868287016130c0565b9150509250925092565b6132268161309f565b82525050565b6000602082019050613241600083018461321d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261326c5761326b613247565b5b8235905067ffffffffffffffff8111156132895761328861324c565b5b6020830191508360208202830111156132a5576132a4613251565b5b9250929050565b6000806000604084860312156132c5576132c4612f1f565b5b60006132d386828701613175565b935050602084013567ffffffffffffffff8111156132f4576132f3612f24565b5b61330086828701613256565b92509250509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61334982613033565b810181811067ffffffffffffffff8211171561336857613367613311565b5b80604052505050565b600061337b612f15565b90506133878282613340565b919050565b600067ffffffffffffffff8211156133a7576133a6613311565b5b6133b082613033565b9050602081019050919050565b82818337600083830152505050565b60006133df6133da8461338c565b613371565b9050828152602081018484840111156133fb576133fa61330c565b5b6134068482856133bd565b509392505050565b600082601f83011261342357613422613247565b5b81356134338482602086016133cc565b91505092915050565b60006020828403121561345257613451612f1f565b5b600082013567ffffffffffffffff8111156134705761346f612f24565b5b61347c8482850161340e565b91505092915050565b60006020828403121561349b5761349a612f1f565b5b60006134a984828501613175565b91505092915050565b600080602083850312156134c9576134c8612f1f565b5b600083013567ffffffffffffffff8111156134e7576134e6612f24565b5b6134f385828601613256565b92509250509250929050565b6000604082019050613514600083018561321d565b613521602083018461321d565b9392505050565b61353181612fae565b811461353c57600080fd5b50565b60008135905061354e81613528565b92915050565b6000806040838503121561356b5761356a612f1f565b5b600061357985828601613175565b925050602061358a8582860161353f565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106135d4576135d3613594565b5b50565b60008190506135e5826135c3565b919050565b60006135f5826135d7565b9050919050565b613605816135ea565b82525050565b600060208201905061362060008301846135fc565b92915050565b600067ffffffffffffffff82111561364157613640613311565b5b61364a82613033565b9050602081019050919050565b600061366a61366584613626565b613371565b9050828152602081018484840111156136865761368561330c565b5b6136918482856133bd565b509392505050565b600082601f8301126136ae576136ad613247565b5b81356136be848260208601613657565b91505092915050565b600080600080608085870312156136e1576136e0612f1f565b5b60006136ef87828801613175565b945050602061370087828801613175565b9350506040613711878288016130c0565b925050606085013567ffffffffffffffff81111561373257613731612f24565b5b61373e87828801613699565b91505092959194509250565b6000806040838503121561376157613760612f1f565b5b600061376f85828601613175565b925050602061378085828601613175565b9150509250929050565b6004811061379757600080fd5b50565b6000813590506137a98161378a565b92915050565b6000602082840312156137c5576137c4612f1f565b5b60006137d38482850161379a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061382357607f821691505b60208210811415613837576138366137dc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613899602c83612fef565b91506138a48261383d565b604082019050919050565b600060208201905081810360008301526138c88161388c565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061392b602183612fef565b9150613936826138cf565b604082019050919050565b6000602082019050818103600083015261395a8161391e565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006139bd603883612fef565b91506139c882613961565b604082019050919050565b600060208201905081810360008301526139ec816139b0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a29602083612fef565b9150613a34826139f3565b602082019050919050565b60006020820190508181036000830152613a5881613a1c565b9050919050565b6000604082019050613a7460008301856135fc565b613a8160208301846135fc565b9392505050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613ae4603183612fef565b9150613aef82613a88565b604082019050919050565b60006020820190508181036000830152613b1381613ad7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613b548261309f565b9150613b5f8361309f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b9457613b93613b1a565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f5468697320746f6b656e2068617320616c7265616479206d696e746564000000600082015250565b6000613c04601d83612fef565b9150613c0f82613bce565b602082019050919050565b60006020820190508181036000830152613c3381613bf7565b9050919050565b6000613c458261309f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c7857613c77613b1a565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613cdf602983612fef565b9150613cea82613c83565b604082019050919050565b60006020820190508181036000830152613d0e81613cd2565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d71602a83612fef565b9150613d7c82613d15565b604082019050919050565b60006020820190508181036000830152613da081613d64565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b6000613ddd601b83612fef565b9150613de882613da7565b602082019050919050565b60006020820190508181036000830152613e0c81613dd0565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000613e49600f83612fef565b9150613e5482613e13565b602082019050919050565b60006020820190508181036000830152613e7881613e3c565b9050919050565b7f50726573616c652048617320456e646564000000000000000000000000000000600082015250565b6000613eb5601183612fef565b9150613ec082613e7f565b602082019050919050565b60006020820190508181036000830152613ee481613ea8565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b6000613f21601b83612fef565b9150613f2c82613eeb565b602082019050919050565b60006020820190508181036000830152613f5081613f14565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000613f8d601e83612fef565b9150613f9882613f57565b602082019050919050565b60006020820190508181036000830152613fbc81613f80565b9050919050565b600081519050613fd28161315e565b92915050565b600060208284031215613fee57613fed612f1f565b5b6000613ffc84828501613fc3565b91505092915050565b7f596f7520617265206e6f742074686520686f6c646572206f662074686973204e60008201527f4654000000000000000000000000000000000000000000000000000000000000602082015250565b6000614061602283612fef565b915061406c82614005565b604082019050919050565b6000602082019050818103600083015261409081614054565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006140cd601d83612fef565b91506140d882614097565b602082019050919050565b600060208201905081810360008301526140fc816140c0565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b6000614139601883612fef565b915061414482614103565b602082019050919050565b600060208201905081810360008301526141688161412c565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006141a5601683612fef565b91506141b08261416f565b602082019050919050565b600060208201905081810360008301526141d481614198565b9050919050565b60006141e68261309f565b91506141f18361309f565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561422a57614229613b1a565b5b828202905092915050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b600061426b601d83612fef565b915061427682614235565b602082019050919050565b6000602082019050818103600083015261429a8161425e565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142fd602f83612fef565b9150614308826142a1565b604082019050919050565b6000602082019050818103600083015261432c816142f0565b9050919050565b600081905092915050565b600061434982612fe4565b6143538185614333565b9350614363818560208601613000565b80840191505092915050565b600061437b828561433e565b9150614387828461433e565b91508190509392505050565b600061439e8261309f565b91506143a98361309f565b9250828210156143bc576143bb613b1a565b5b828203905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614423602683612fef565b915061442e826143c7565b604082019050919050565b6000602082019050818103600083015261445281614416565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144b5602c83612fef565b91506144c082614459565b604082019050919050565b600060208201905081810360008301526144e4816144a8565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614547602583612fef565b9150614552826144eb565b604082019050919050565b600060208201905081810360008301526145768161453a565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145d9602483612fef565b91506145e48261457d565b604082019050919050565b60006020820190508181036000830152614608816145cc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614645601983612fef565b91506146508261460f565b602082019050919050565b6000602082019050818103600083015261467481614638565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146d7603283612fef565b91506146e28261467b565b604082019050919050565b60006020820190508181036000830152614706816146ca565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147478261309f565b91506147528361309f565b9250826147625761476161470d565b5b828204905092915050565b60006147788261309f565b91506147838361309f565b9250826147935761479261470d565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147c58261479e565b6147cf81856147a9565b93506147df818560208601613000565b6147e881613033565b840191505092915050565b60006080820190506148086000830187613134565b6148156020830186613134565b614822604083018561321d565b818103606083015261483481846147ba565b905095945050505050565b60008151905061484e81612f55565b92915050565b60006020828403121561486a57614869612f1f565b5b60006148788482850161483f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006148b7602083612fef565b91506148c282614881565b602082019050919050565b600060208201905081810360008301526148e6816148aa565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614923601c83612fef565b915061492e826148ed565b602082019050919050565b6000602082019050818103600083015261495281614916565b905091905056fea2646970667358221220cfd8fd7d25f52cd0b1130cbbc355fdfd5b483208cdd0a434f4291ef9ae87432b64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38761:6550:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25574:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26519:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28078:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27601:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42291:290;;;;;;;;;;;;;:::i;:::-;;42587:170;;;;;;;;;;;;;:::i;:::-;;28828:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41404:366;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39127:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39278:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45174:134;;;;;;;;;;;;;:::i;:::-;;29238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40314:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44863:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40992:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40801:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26213:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38935:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40212:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25943:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;41889:396;;;;;;;;;;;;;:::i;:::-;;40581:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43861:996;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39576:28;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;40899:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26688:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39165:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42763:1092;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28371:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39541:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29494:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26863:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39221:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41200:198;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41099:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28597:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40444:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40700:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40101:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25574:305;25676:4;25728:25;25713:40;;;:11;:40;;;;:105;;;;25785:33;25770:48;;;:11;:48;;;;25713:105;:158;;;;25835:36;25859:11;25835:23;:36::i;:::-;25713:158;25693:178;;25574:305;;;:::o;26519:100::-;26573:13;26606:5;26599:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26519:100;:::o;28078:221::-;28154:7;28182:16;28190:7;28182;:16::i;:::-;28174:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28267:15;:24;28283:7;28267:24;;;;;;;;;;;;;;;;;;;;;28260:31;;28078:221;;;:::o;27601:411::-;27682:13;27698:23;27713:7;27698:14;:23::i;:::-;27682:39;;27746:5;27740:11;;:2;:11;;;;27732:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27840:5;27824:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27849:37;27866:5;27873:12;:10;:12::i;:::-;27849:16;:37::i;:::-;27824:62;27802:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:21;27992:2;27996:7;27983:8;:21::i;:::-;27671:341;27601:411;;:::o;42291:290::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42356:22:::1;42345:8;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;42389:18;42410:15;42389:36;;42436:17;42456:7;42436:27;;42487:33;;;;;;;;42498:10;42487:33;;;;42510:9;42487:33;;::::0;42474:10:::1;:46;;;;;;;;;;;;;;;;;;;42536:39;42553:10;42565:9;42536:39;;;;;;;:::i;:::-;;;;;;;;42334:247;;42291:290::o:0;42587:170::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42649:19:::1;42638:8;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;42684:65;42705:22;42729:19;42684:65;;;;;;;:::i;:::-;;;;;;;;42587:170::o:0;28828:339::-;29023:41;29042:12;:10;:12::i;:::-;29056:7;29023:18;:41::i;:::-;29015:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29131:28;29141:4;29147:2;29151:7;29131:9;:28::i;:::-;28828:339;;;:::o;41404:366::-;41450:4;41467:19;41489:5;41467:27;;41505:29;41537:10;41505:42;;;;;;;;;;;;;;;;;;;;;;;;;;;41607:11;:20;;;41583:11;:21;;;:44;;;;:::i;:::-;41565:15;:62;41561:161;;;41661:4;41644:21;;41691:19;41680:8;;:30;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;41561:161;41750:14;41743:21;;;;41404:366;:::o;39127:33::-;;;;:::o;39278:80::-;39316:42;39278:80;:::o;45174:134::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;45225:12:::1;45240:21;45225:36;;45276:7;:5;:7::i;:::-;45268:25;;:34;45294:7;45268:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;45218:90;45174:134::o:0;29238:185::-;29376:39;29393:4;29399:2;29403:7;29376:39;;;;;;;;;;;;:16;:39::i;:::-;29238:185;;;:::o;40314:124::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40426:6:::1;40392:31;:40;;;;40314:124:::0;:::o;44863:305::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44978:9:::1;44973:190;44997:9;;:16;;44993:1;:20;44973:190;;;45042:21;45050:9;;45060:1;45050:12;;;;;;;:::i;:::-;;;;;;;;45042:7;:21::i;:::-;45041:22;45033:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;45110:43;45120:18;45140:9;;45150:1;45140:12;;;;;;;:::i;:::-;;;;;;;;45110:9;:43::i;:::-;45015:3;;;;;:::i;:::-;;;;44973:190;;;;44863:305:::0;;;:::o;40992:101::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;41080:7:::1;41064:13;:23;;;;;;;;;;;;:::i;:::-;;40992:101:::0;:::o;40801:92::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40884:3:::1;40866:15;:21;;;;40801:92:::0;:::o;26213:239::-;26285:7;26305:13;26321:7;:16;26329:7;26321:16;;;;;;;;;;;;;;;;;;;;;26305:32;;26373:1;26356:19;;:5;:19;;;;26348:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26439:5;26432:12;;;26213:239;;;:::o;38935:37::-;;;;:::o;40212:96::-;40257:7;40280:22;:12;:20;:22::i;:::-;40273:29;;40212:96;:::o;25943:208::-;26015:7;26060:1;26043:19;;:5;:19;;;;26035:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26127:9;:16;26137:5;26127:16;;;;;;;;;;;;;;;;26120:23;;25943:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;41889:396::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;41965:15:::1;;41948:13;;:32;;41940:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;42019:9;42040:31;42048:22;:12;:20;:22::i;:::-;42040:7;:31::i;:::-;42037:79;;;42084:24;:12;:22;:24::i;:::-;42037:79;42133:1;42129:5;;42124:156;42140:14;;42136:1;:18;42124:156;;;42170:24;:12;:22;:24::i;:::-;42203:45;42213:10;42225:22;:12;:20;:22::i;:::-;42203:9;:45::i;:::-;42257:13;;:15;;;;;;;;;:::i;:::-;;;;;;42156:3;;;;;:::i;:::-;;;;42124:156;;;41933:352;41889:396::o:0;40581:113::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40675:13:::1;40662:10;:26;;;;40581:113:::0;:::o;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;43861:996::-;39968:10;;39942:22;:12;:20;:22::i;:::-;:36;;39934:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43978:13:::1;39316:42;43978:37;;44024:18;44045:20;:18;:20::i;:::-;44024:41;;44083:13;44082:14;44074:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;44148:9;;44135;:22;;44127:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44239:31;;44214:14;;:21;;:56;;44198:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;44334:9;44329:523;44353:14;;:21;;44349:1;:25;44329:523;;;44583:26;44591:14;;44606:1;44591:17;;;;;;;:::i;:::-;;;;;;;;44583:7;:26::i;:::-;44582:27;44574:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44658:15;44676:5;:13;;;44690:14;;44705:1;44690:17;;;;;;;:::i;:::-;;;;;;;;44676:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44658:50;;44740:10;44729:21;;:7;:21;;;44721:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44802:40;44812:10;44824:14;;44839:1;44824:17;;;;;;;:::i;:::-;;;;;;;;44802:9;:40::i;:::-;44381:471;44376:3;;;;;:::i;:::-;;;;44329:523;;;;43943:914;;43861:996:::0;;:::o;39576:28::-;;;;;;;;;;;;;;:::o;40899:87::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40974:6:::1;40962:9;:18;;;;40899:87:::0;:::o;26688:104::-;26744:13;26777:7;26770:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26688:104;:::o;39165:51::-;;;;:::o;42763:1092::-;39968:10;;39942:22;:12;:20;:22::i;:::-;:36;;39934:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;42829:31:::1;42837:22;:12;:20;:22::i;:::-;42829:7;:31::i;:::-;42826:77;;;42871:24;:12;:22;:24::i;:::-;42826:77;42911:17;42931:22;:12;:20;:22::i;:::-;42911:42;;42960:17;42980:20;:18;:20::i;:::-;42960:40;;43031:7;:5;:7::i;:::-;43017:21;;:10;:21;;;43013:242;;43057:12;:47;;;;;43085:19;43073:31;;;;;;;;:::i;:::-;;:8;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;43057:47;43049:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;43189:29;;43179:6;43155:21;43165:10;43155:9;:21::i;:::-;:30;;;;:::i;:::-;:63;;43147:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;43013:242;43289:10;;43279:6;43267:9;:18;;;;:::i;:::-;:32;43263:88;;43321:22;43310:8;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;43263:88;43389:10;;43379:6;43367:9;:18;;;;:::i;:::-;:32;;43359:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43459:31;;43449:6;:41;;43433:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;43580:6;43568:9;;:18;;;;:::i;:::-;43555:9;:31;;43547:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43634:9;43629:221;43653:6;43649:1;:10;43629:221;;;43675:24;:12;:22;:24::i;:::-;43711:31;43719:22;:12;:20;:22::i;:::-;43711:7;:31::i;:::-;43708:81;;;43755:24;:12;:22;:24::i;:::-;43708:81;43797:45;43807:10;43819:22;:12;:20;:22::i;:::-;43797:9;:45::i;:::-;43661:3;;;;;:::i;:::-;;;;43629:221;;;;42819:1036;;42763:1092:::0;:::o;28371:155::-;28466:52;28485:12;:10;:12::i;:::-;28499:8;28509;28466:18;:52::i;:::-;28371:155;;:::o;39541:30::-;;;;;;;;;;;;;:::o;29494:328::-;29669:41;29688:12;:10;:12::i;:::-;29702:7;29669:18;:41::i;:::-;29661:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29775:39;29789:4;29795:2;29799:7;29808:5;29775:13;:39::i;:::-;29494:328;;;;:::o;26863:334::-;26936:13;26970:16;26978:7;26970;:16::i;:::-;26962:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27051:21;27075:10;:8;:10::i;:::-;27051:34;;27127:1;27109:7;27103:21;:25;:86;;;;;;;;;;;;;;;;;27155:7;27164:18;:7;:16;:18::i;:::-;27138:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27103:86;27096:93;;;26863:334;;;:::o;39221:50::-;;;;:::o;41200:198::-;41248:7;41268:29;41300:10;41268:42;;;;;;;;;;;;;;;;;;;;;;;;;;;41377:15;41353:11;:20;;;41329:11;:21;;;:44;;;;:::i;:::-;41328:64;;;;:::i;:::-;41321:71;;;41200:198;:::o;41099:95::-;41151:7;41174:14;;41167:21;;41099:95;:::o;28597:164::-;28694:4;28718:18;:25;28737:5;28718:25;;;;;;;;;;;;;;;:35;28744:8;28718:35;;;;;;;;;;;;;;;;;;;;;;;;;28711:42;;28597:164;;;;:::o;40444:131::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40563:6:::1;40531:29;:38;;;;40444:131:::0;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;40700:95::-;40070:10;40059:21;;:7;:5;:7::i;:::-;:21;;;40051:30;;;;;;40786:3:::1;40769:14;:20;;;;40700:95:::0;:::o;40101:105::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40189:11:::1;40178:8;;:22;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;40101:105:::0;:::o;18328:157::-;18413:4;18452:25;18437:40;;;:11;:40;;;;18430:47;;18328:157;;;:::o;31332:127::-;31397:4;31449:1;31421:30;;:7;:16;31429:7;31421:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31414:37;;31332:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;35478:174::-;35580:2;35553:15;:24;35569:7;35553:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35636:7;35632:2;35598:46;;35607:23;35622:7;35607:14;:23::i;:::-;35598:46;;;;;;;;;;;;35478:174;;:::o;31626:348::-;31719:4;31744:16;31752:7;31744;:16::i;:::-;31736:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31820:13;31836:23;31851:7;31836:14;:23::i;:::-;31820:39;;31889:5;31878:16;;:7;:16;;;:51;;;;31922:7;31898:31;;:20;31910:7;31898:11;:20::i;:::-;:31;;;31878:51;:87;;;;31933:32;31950:5;31957:7;31933:16;:32::i;:::-;31878:87;31870:96;;;31626:348;;;;:::o;34735:625::-;34894:4;34867:31;;:23;34882:7;34867:14;:23::i;:::-;:31;;;34859:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34973:1;34959:16;;:2;:16;;;;34951:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35029:39;35050:4;35056:2;35060:7;35029:20;:39::i;:::-;35133:29;35150:1;35154:7;35133:8;:29::i;:::-;35194:1;35175:9;:15;35185:4;35175:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35223:1;35206:9;:13;35216:2;35206:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35254:2;35235:7;:16;35243:7;35235:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35293:7;35289:2;35274:27;;35283:4;35274:27;;;;;;;;;;;;35314:38;35334:4;35340:2;35344:7;35314:19;:38::i;:::-;34735:625;;;:::o;32316:110::-;32392:26;32402:2;32406:7;32392:26;;;;;;;;;;;;:9;:26::i;:::-;32316:110;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;35794:315::-;35949:8;35940:17;;:5;:17;;;;35932:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36036:8;35998:18;:25;36017:5;35998:25;;;;;;;;;;;;;;;:35;36024:8;35998:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36082:8;36060:41;;36075:5;36060:41;;;36092:8;36060:41;;;;;;:::i;:::-;;;;;;;;35794:315;;;:::o;30704:::-;30861:28;30871:4;30877:2;30881:7;30861:9;:28::i;:::-;30908:48;30931:4;30937:2;30941:7;30950:5;30908:22;:48::i;:::-;30900:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30704:315;;;;:::o;41776:108::-;41836:13;41865;41858:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41776:108;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;38045:126::-;;;;:::o;38556:125::-;;;;:::o;32653:321::-;32783:18;32789:2;32793:7;32783:5;:18::i;:::-;32834:54;32865:1;32869:2;32873:7;32882:5;32834:22;:54::i;:::-;32812:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32653:321;;;:::o;36674:799::-;36829:4;36850:15;:2;:13;;;:15::i;:::-;36846:620;;;36902:2;36886:36;;;36923:12;:10;:12::i;:::-;36937:4;36943:7;36952:5;36886:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36882:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:1;37128:6;:13;:18;37124:272;;;37171:60;;;;;;;;;;:::i;:::-;;;;;;;;37124:272;37346:6;37340:13;37331:6;37327:2;37323:15;37316:38;36882:529;37019:41;;;37009:51;;;:6;:51;;;;37002:58;;;;;36846:620;37450:4;37443:11;;36674:799;;;;;;;:::o;33310:439::-;33404:1;33390:16;;:2;:16;;;;33382:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33463:16;33471:7;33463;:16::i;:::-;33462:17;33454:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33525:45;33554:1;33558:2;33562:7;33525:20;:45::i;:::-;33600:1;33583:9;:13;33593:2;33583:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33631:2;33612:7;:16;33620:7;33612:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33676:7;33672:2;33651:33;;33668:1;33651:33;;;;;;;;;;;;33697:44;33725:1;33729:2;33733:7;33697:19;:44::i;:::-;33310:439;;:::o;8245:326::-;8305:4;8562:1;8540:7;:19;;;:23;8533:30;;8245:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:118::-;5650:24;5668:5;5650:24;:::i;:::-;5645:3;5638:37;5563:118;;:::o;5687:222::-;5780:4;5818:2;5807:9;5803:18;5795:26;;5831:71;5899:1;5888:9;5884:17;5875:6;5831:71;:::i;:::-;5687:222;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6301:568;6374:8;6384:6;6434:3;6427:4;6419:6;6415:17;6411:27;6401:122;;6442:79;;:::i;:::-;6401:122;6555:6;6542:20;6532:30;;6585:18;6577:6;6574:30;6571:117;;;6607:79;;:::i;:::-;6571:117;6721:4;6713:6;6709:17;6697:29;;6775:3;6767:4;6759:6;6755:17;6745:8;6741:32;6738:41;6735:128;;;6782:79;;:::i;:::-;6735:128;6301:568;;;;;:::o;6875:704::-;6970:6;6978;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7161:1;7186:53;7231:7;7222:6;7211:9;7207:22;7186:53;:::i;:::-;7176:63;;7132:117;7316:2;7305:9;7301:18;7288:32;7347:18;7339:6;7336:30;7333:117;;;7369:79;;:::i;:::-;7333:117;7482:80;7554:7;7545:6;7534:9;7530:22;7482:80;:::i;:::-;7464:98;;;;7259:313;6875:704;;;;;:::o;7585:117::-;7694:1;7691;7684:12;7708:180;7756:77;7753:1;7746:88;7853:4;7850:1;7843:15;7877:4;7874:1;7867:15;7894:281;7977:27;7999:4;7977:27;:::i;:::-;7969:6;7965:40;8107:6;8095:10;8092:22;8071:18;8059:10;8056:34;8053:62;8050:88;;;8118:18;;:::i;:::-;8050:88;8158:10;8154:2;8147:22;7937:238;7894:281;;:::o;8181:129::-;8215:6;8242:20;;:::i;:::-;8232:30;;8271:33;8299:4;8291:6;8271:33;:::i;:::-;8181:129;;;:::o;8316:308::-;8378:4;8468:18;8460:6;8457:30;8454:56;;;8490:18;;:::i;:::-;8454:56;8528:29;8550:6;8528:29;:::i;:::-;8520:37;;8612:4;8606;8602:15;8594:23;;8316:308;;;:::o;8630:154::-;8714:6;8709:3;8704;8691:30;8776:1;8767:6;8762:3;8758:16;8751:27;8630:154;;;:::o;8790:412::-;8868:5;8893:66;8909:49;8951:6;8909:49;:::i;:::-;8893:66;:::i;:::-;8884:75;;8982:6;8975:5;8968:21;9020:4;9013:5;9009:16;9058:3;9049:6;9044:3;9040:16;9037:25;9034:112;;;9065:79;;:::i;:::-;9034:112;9155:41;9189:6;9184:3;9179;9155:41;:::i;:::-;8874:328;8790:412;;;;;:::o;9222:340::-;9278:5;9327:3;9320:4;9312:6;9308:17;9304:27;9294:122;;9335:79;;:::i;:::-;9294:122;9452:6;9439:20;9477:79;9552:3;9544:6;9537:4;9529:6;9525:17;9477:79;:::i;:::-;9468:88;;9284:278;9222:340;;;;:::o;9568:509::-;9637:6;9686:2;9674:9;9665:7;9661:23;9657:32;9654:119;;;9692:79;;:::i;:::-;9654:119;9840:1;9829:9;9825:17;9812:31;9870:18;9862:6;9859:30;9856:117;;;9892:79;;:::i;:::-;9856:117;9997:63;10052:7;10043:6;10032:9;10028:22;9997:63;:::i;:::-;9987:73;;9783:287;9568:509;;;;:::o;10083:329::-;10142:6;10191:2;10179:9;10170:7;10166:23;10162:32;10159:119;;;10197:79;;:::i;:::-;10159:119;10317:1;10342:53;10387:7;10378:6;10367:9;10363:22;10342:53;:::i;:::-;10332:63;;10288:117;10083:329;;;;:::o;10418:559::-;10504:6;10512;10561:2;10549:9;10540:7;10536:23;10532:32;10529:119;;;10567:79;;:::i;:::-;10529:119;10715:1;10704:9;10700:17;10687:31;10745:18;10737:6;10734:30;10731:117;;;10767:79;;:::i;:::-;10731:117;10880:80;10952:7;10943:6;10932:9;10928:22;10880:80;:::i;:::-;10862:98;;;;10658:312;10418:559;;;;;:::o;10983:332::-;11104:4;11142:2;11131:9;11127:18;11119:26;;11155:71;11223:1;11212:9;11208:17;11199:6;11155:71;:::i;:::-;11236:72;11304:2;11293:9;11289:18;11280:6;11236:72;:::i;:::-;10983:332;;;;;:::o;11321:116::-;11391:21;11406:5;11391:21;:::i;:::-;11384:5;11381:32;11371:60;;11427:1;11424;11417:12;11371:60;11321:116;:::o;11443:133::-;11486:5;11524:6;11511:20;11502:29;;11540:30;11564:5;11540:30;:::i;:::-;11443:133;;;;:::o;11582:468::-;11647:6;11655;11704:2;11692:9;11683:7;11679:23;11675:32;11672:119;;;11710:79;;:::i;:::-;11672:119;11830:1;11855:53;11900:7;11891:6;11880:9;11876:22;11855:53;:::i;:::-;11845:63;;11801:117;11957:2;11983:50;12025:7;12016:6;12005:9;12001:22;11983:50;:::i;:::-;11973:60;;11928:115;11582:468;;;;;:::o;12056:180::-;12104:77;12101:1;12094:88;12201:4;12198:1;12191:15;12225:4;12222:1;12215:15;12242:124;12334:1;12327:5;12324:12;12314:46;;12340:18;;:::i;:::-;12314:46;12242:124;:::o;12372:149::-;12428:7;12457:5;12446:16;;12463:52;12509:5;12463:52;:::i;:::-;12372:149;;;:::o;12527:::-;12594:9;12627:43;12664:5;12627:43;:::i;:::-;12614:56;;12527:149;;;:::o;12682:165::-;12786:54;12834:5;12786:54;:::i;:::-;12781:3;12774:67;12682:165;;:::o;12853:256::-;12963:4;13001:2;12990:9;12986:18;12978:26;;13014:88;13099:1;13088:9;13084:17;13075:6;13014:88;:::i;:::-;12853:256;;;;:::o;13115:307::-;13176:4;13266:18;13258:6;13255:30;13252:56;;;13288:18;;:::i;:::-;13252:56;13326:29;13348:6;13326:29;:::i;:::-;13318:37;;13410:4;13404;13400:15;13392:23;;13115:307;;;:::o;13428:410::-;13505:5;13530:65;13546:48;13587:6;13546:48;:::i;:::-;13530:65;:::i;:::-;13521:74;;13618:6;13611:5;13604:21;13656:4;13649:5;13645:16;13694:3;13685:6;13680:3;13676:16;13673:25;13670:112;;;13701:79;;:::i;:::-;13670:112;13791:41;13825:6;13820:3;13815;13791:41;:::i;:::-;13511:327;13428:410;;;;;:::o;13857:338::-;13912:5;13961:3;13954:4;13946:6;13942:17;13938:27;13928:122;;13969:79;;:::i;:::-;13928:122;14086:6;14073:20;14111:78;14185:3;14177:6;14170:4;14162:6;14158:17;14111:78;:::i;:::-;14102:87;;13918:277;13857:338;;;;:::o;14201:943::-;14296:6;14304;14312;14320;14369:3;14357:9;14348:7;14344:23;14340:33;14337:120;;;14376:79;;:::i;:::-;14337:120;14496:1;14521:53;14566:7;14557:6;14546:9;14542:22;14521:53;:::i;:::-;14511:63;;14467:117;14623:2;14649:53;14694:7;14685:6;14674:9;14670:22;14649:53;:::i;:::-;14639:63;;14594:118;14751:2;14777:53;14822:7;14813:6;14802:9;14798:22;14777:53;:::i;:::-;14767:63;;14722:118;14907:2;14896:9;14892:18;14879:32;14938:18;14930:6;14927:30;14924:117;;;14960:79;;:::i;:::-;14924:117;15065:62;15119:7;15110:6;15099:9;15095:22;15065:62;:::i;:::-;15055:72;;14850:287;14201:943;;;;;;;:::o;15150:474::-;15218:6;15226;15275:2;15263:9;15254:7;15250:23;15246:32;15243:119;;;15281:79;;:::i;:::-;15243:119;15401:1;15426:53;15471:7;15462:6;15451:9;15447:22;15426:53;:::i;:::-;15416:63;;15372:117;15528:2;15554:53;15599:7;15590:6;15579:9;15575:22;15554:53;:::i;:::-;15544:63;;15499:118;15150:474;;;;;:::o;15630:118::-;15722:1;15715:5;15712:12;15702:40;;15738:1;15735;15728:12;15702:40;15630:118;:::o;15754:177::-;15819:5;15857:6;15844:20;15835:29;;15873:52;15919:5;15873:52;:::i;:::-;15754:177;;;;:::o;15937:367::-;16015:6;16064:2;16052:9;16043:7;16039:23;16035:32;16032:119;;;16070:79;;:::i;:::-;16032:119;16190:1;16215:72;16279:7;16270:6;16259:9;16255:22;16215:72;:::i;:::-;16205:82;;16161:136;15937:367;;;;:::o;16310:180::-;16358:77;16355:1;16348:88;16455:4;16452:1;16445:15;16479:4;16476:1;16469:15;16496:320;16540:6;16577:1;16571:4;16567:12;16557:22;;16624:1;16618:4;16614:12;16645:18;16635:81;;16701:4;16693:6;16689:17;16679:27;;16635:81;16763:2;16755:6;16752:14;16732:18;16729:38;16726:84;;;16782:18;;:::i;:::-;16726:84;16547:269;16496:320;;;:::o;16822:231::-;16962:34;16958:1;16950:6;16946:14;16939:58;17031:14;17026:2;17018:6;17014:15;17007:39;16822:231;:::o;17059:366::-;17201:3;17222:67;17286:2;17281:3;17222:67;:::i;:::-;17215:74;;17298:93;17387:3;17298:93;:::i;:::-;17416:2;17411:3;17407:12;17400:19;;17059:366;;;:::o;17431:419::-;17597:4;17635:2;17624:9;17620:18;17612:26;;17684:9;17678:4;17674:20;17670:1;17659:9;17655:17;17648:47;17712:131;17838:4;17712:131;:::i;:::-;17704:139;;17431:419;;;:::o;17856:220::-;17996:34;17992:1;17984:6;17980:14;17973:58;18065:3;18060:2;18052:6;18048:15;18041:28;17856:220;:::o;18082:366::-;18224:3;18245:67;18309:2;18304:3;18245:67;:::i;:::-;18238:74;;18321:93;18410:3;18321:93;:::i;:::-;18439:2;18434:3;18430:12;18423:19;;18082:366;;;:::o;18454:419::-;18620:4;18658:2;18647:9;18643:18;18635:26;;18707:9;18701:4;18697:20;18693:1;18682:9;18678:17;18671:47;18735:131;18861:4;18735:131;:::i;:::-;18727:139;;18454:419;;;:::o;18879:243::-;19019:34;19015:1;19007:6;19003:14;18996:58;19088:26;19083:2;19075:6;19071:15;19064:51;18879:243;:::o;19128:366::-;19270:3;19291:67;19355:2;19350:3;19291:67;:::i;:::-;19284:74;;19367:93;19456:3;19367:93;:::i;:::-;19485:2;19480:3;19476:12;19469:19;;19128:366;;;:::o;19500:419::-;19666:4;19704:2;19693:9;19689:18;19681:26;;19753:9;19747:4;19743:20;19739:1;19728:9;19724:17;19717:47;19781:131;19907:4;19781:131;:::i;:::-;19773:139;;19500:419;;;:::o;19925:182::-;20065:34;20061:1;20053:6;20049:14;20042:58;19925:182;:::o;20113:366::-;20255:3;20276:67;20340:2;20335:3;20276:67;:::i;:::-;20269:74;;20352:93;20441:3;20352:93;:::i;:::-;20470:2;20465:3;20461:12;20454:19;;20113:366;;;:::o;20485:419::-;20651:4;20689:2;20678:9;20674:18;20666:26;;20738:9;20732:4;20728:20;20724:1;20713:9;20709:17;20702:47;20766:131;20892:4;20766:131;:::i;:::-;20758:139;;20485:419;;;:::o;20910:400::-;21065:4;21103:2;21092:9;21088:18;21080:26;;21116:88;21201:1;21190:9;21186:17;21177:6;21116:88;:::i;:::-;21214:89;21299:2;21288:9;21284:18;21275:6;21214:89;:::i;:::-;20910:400;;;;;:::o;21316:236::-;21456:34;21452:1;21444:6;21440:14;21433:58;21525:19;21520:2;21512:6;21508:15;21501:44;21316:236;:::o;21558:366::-;21700:3;21721:67;21785:2;21780:3;21721:67;:::i;:::-;21714:74;;21797:93;21886:3;21797:93;:::i;:::-;21915:2;21910:3;21906:12;21899:19;;21558:366;;;:::o;21930:419::-;22096:4;22134:2;22123:9;22119:18;22111:26;;22183:9;22177:4;22173:20;22169:1;22158:9;22154:17;22147:47;22211:131;22337:4;22211:131;:::i;:::-;22203:139;;21930:419;;;:::o;22355:180::-;22403:77;22400:1;22393:88;22500:4;22497:1;22490:15;22524:4;22521:1;22514:15;22541:305;22581:3;22600:20;22618:1;22600:20;:::i;:::-;22595:25;;22634:20;22652:1;22634:20;:::i;:::-;22629:25;;22788:1;22720:66;22716:74;22713:1;22710:81;22707:107;;;22794:18;;:::i;:::-;22707:107;22838:1;22835;22831:9;22824:16;;22541:305;;;;:::o;22852:180::-;22900:77;22897:1;22890:88;22997:4;22994:1;22987:15;23021:4;23018:1;23011:15;23038:179;23178:31;23174:1;23166:6;23162:14;23155:55;23038:179;:::o;23223:366::-;23365:3;23386:67;23450:2;23445:3;23386:67;:::i;:::-;23379:74;;23462:93;23551:3;23462:93;:::i;:::-;23580:2;23575:3;23571:12;23564:19;;23223:366;;;:::o;23595:419::-;23761:4;23799:2;23788:9;23784:18;23776:26;;23848:9;23842:4;23838:20;23834:1;23823:9;23819:17;23812:47;23876:131;24002:4;23876:131;:::i;:::-;23868:139;;23595:419;;;:::o;24020:233::-;24059:3;24082:24;24100:5;24082:24;:::i;:::-;24073:33;;24128:66;24121:5;24118:77;24115:103;;;24198:18;;:::i;:::-;24115:103;24245:1;24238:5;24234:13;24227:20;;24020:233;;;:::o;24259:228::-;24399:34;24395:1;24387:6;24383:14;24376:58;24468:11;24463:2;24455:6;24451:15;24444:36;24259:228;:::o;24493:366::-;24635:3;24656:67;24720:2;24715:3;24656:67;:::i;:::-;24649:74;;24732:93;24821:3;24732:93;:::i;:::-;24850:2;24845:3;24841:12;24834:19;;24493:366;;;:::o;24865:419::-;25031:4;25069:2;25058:9;25054:18;25046:26;;25118:9;25112:4;25108:20;25104:1;25093:9;25089:17;25082:47;25146:131;25272:4;25146:131;:::i;:::-;25138:139;;24865:419;;;:::o;25290:229::-;25430:34;25426:1;25418:6;25414:14;25407:58;25499:12;25494:2;25486:6;25482:15;25475:37;25290:229;:::o;25525:366::-;25667:3;25688:67;25752:2;25747:3;25688:67;:::i;:::-;25681:74;;25764:93;25853:3;25764:93;:::i;:::-;25882:2;25877:3;25873:12;25866:19;;25525:366;;;:::o;25897:419::-;26063:4;26101:2;26090:9;26086:18;26078:26;;26150:9;26144:4;26140:20;26136:1;26125:9;26121:17;26114:47;26178:131;26304:4;26178:131;:::i;:::-;26170:139;;25897:419;;;:::o;26322:177::-;26462:29;26458:1;26450:6;26446:14;26439:53;26322:177;:::o;26505:366::-;26647:3;26668:67;26732:2;26727:3;26668:67;:::i;:::-;26661:74;;26744:93;26833:3;26744:93;:::i;:::-;26862:2;26857:3;26853:12;26846:19;;26505:366;;;:::o;26877:419::-;27043:4;27081:2;27070:9;27066:18;27058:26;;27130:9;27124:4;27120:20;27116:1;27105:9;27101:17;27094:47;27158:131;27284:4;27158:131;:::i;:::-;27150:139;;26877:419;;;:::o;27302:165::-;27442:17;27438:1;27430:6;27426:14;27419:41;27302:165;:::o;27473:366::-;27615:3;27636:67;27700:2;27695:3;27636:67;:::i;:::-;27629:74;;27712:93;27801:3;27712:93;:::i;:::-;27830:2;27825:3;27821:12;27814:19;;27473:366;;;:::o;27845:419::-;28011:4;28049:2;28038:9;28034:18;28026:26;;28098:9;28092:4;28088:20;28084:1;28073:9;28069:17;28062:47;28126:131;28252:4;28126:131;:::i;:::-;28118:139;;27845:419;;;:::o;28270:167::-;28410:19;28406:1;28398:6;28394:14;28387:43;28270:167;:::o;28443:366::-;28585:3;28606:67;28670:2;28665:3;28606:67;:::i;:::-;28599:74;;28682:93;28771:3;28682:93;:::i;:::-;28800:2;28795:3;28791:12;28784:19;;28443:366;;;:::o;28815:419::-;28981:4;29019:2;29008:9;29004:18;28996:26;;29068:9;29062:4;29058:20;29054:1;29043:9;29039:17;29032:47;29096:131;29222:4;29096:131;:::i;:::-;29088:139;;28815:419;;;:::o;29240:177::-;29380:29;29376:1;29368:6;29364:14;29357:53;29240:177;:::o;29423:366::-;29565:3;29586:67;29650:2;29645:3;29586:67;:::i;:::-;29579:74;;29662:93;29751:3;29662:93;:::i;:::-;29780:2;29775:3;29771:12;29764:19;;29423:366;;;:::o;29795:419::-;29961:4;29999:2;29988:9;29984:18;29976:26;;30048:9;30042:4;30038:20;30034:1;30023:9;30019:17;30012:47;30076:131;30202:4;30076:131;:::i;:::-;30068:139;;29795:419;;;:::o;30220:180::-;30360:32;30356:1;30348:6;30344:14;30337:56;30220:180;:::o;30406:366::-;30548:3;30569:67;30633:2;30628:3;30569:67;:::i;:::-;30562:74;;30645:93;30734:3;30645:93;:::i;:::-;30763:2;30758:3;30754:12;30747:19;;30406:366;;;:::o;30778:419::-;30944:4;30982:2;30971:9;30967:18;30959:26;;31031:9;31025:4;31021:20;31017:1;31006:9;31002:17;30995:47;31059:131;31185:4;31059:131;:::i;:::-;31051:139;;30778:419;;;:::o;31203:143::-;31260:5;31291:6;31285:13;31276:22;;31307:33;31334:5;31307:33;:::i;:::-;31203:143;;;;:::o;31352:351::-;31422:6;31471:2;31459:9;31450:7;31446:23;31442:32;31439:119;;;31477:79;;:::i;:::-;31439:119;31597:1;31622:64;31678:7;31669:6;31658:9;31654:22;31622:64;:::i;:::-;31612:74;;31568:128;31352:351;;;;:::o;31709:221::-;31849:34;31845:1;31837:6;31833:14;31826:58;31918:4;31913:2;31905:6;31901:15;31894:29;31709:221;:::o;31936:366::-;32078:3;32099:67;32163:2;32158:3;32099:67;:::i;:::-;32092:74;;32175:93;32264:3;32175:93;:::i;:::-;32293:2;32288:3;32284:12;32277:19;;31936:366;;;:::o;32308:419::-;32474:4;32512:2;32501:9;32497:18;32489:26;;32561:9;32555:4;32551:20;32547:1;32536:9;32532:17;32525:47;32589:131;32715:4;32589:131;:::i;:::-;32581:139;;32308:419;;;:::o;32733:179::-;32873:31;32869:1;32861:6;32857:14;32850:55;32733:179;:::o;32918:366::-;33060:3;33081:67;33145:2;33140:3;33081:67;:::i;:::-;33074:74;;33157:93;33246:3;33157:93;:::i;:::-;33275:2;33270:3;33266:12;33259:19;;32918:366;;;:::o;33290:419::-;33456:4;33494:2;33483:9;33479:18;33471:26;;33543:9;33537:4;33533:20;33529:1;33518:9;33514:17;33507:47;33571:131;33697:4;33571:131;:::i;:::-;33563:139;;33290:419;;;:::o;33715:174::-;33855:26;33851:1;33843:6;33839:14;33832:50;33715:174;:::o;33895:366::-;34037:3;34058:67;34122:2;34117:3;34058:67;:::i;:::-;34051:74;;34134:93;34223:3;34134:93;:::i;:::-;34252:2;34247:3;34243:12;34236:19;;33895:366;;;:::o;34267:419::-;34433:4;34471:2;34460:9;34456:18;34448:26;;34520:9;34514:4;34510:20;34506:1;34495:9;34491:17;34484:47;34548:131;34674:4;34548:131;:::i;:::-;34540:139;;34267:419;;;:::o;34692:172::-;34832:24;34828:1;34820:6;34816:14;34809:48;34692:172;:::o;34870:366::-;35012:3;35033:67;35097:2;35092:3;35033:67;:::i;:::-;35026:74;;35109:93;35198:3;35109:93;:::i;:::-;35227:2;35222:3;35218:12;35211:19;;34870:366;;;:::o;35242:419::-;35408:4;35446:2;35435:9;35431:18;35423:26;;35495:9;35489:4;35485:20;35481:1;35470:9;35466:17;35459:47;35523:131;35649:4;35523:131;:::i;:::-;35515:139;;35242:419;;;:::o;35667:348::-;35707:7;35730:20;35748:1;35730:20;:::i;:::-;35725:25;;35764:20;35782:1;35764:20;:::i;:::-;35759:25;;35952:1;35884:66;35880:74;35877:1;35874:81;35869:1;35862:9;35855:17;35851:105;35848:131;;;35959:18;;:::i;:::-;35848:131;36007:1;36004;36000:9;35989:20;;35667:348;;;;:::o;36021:179::-;36161:31;36157:1;36149:6;36145:14;36138:55;36021:179;:::o;36206:366::-;36348:3;36369:67;36433:2;36428:3;36369:67;:::i;:::-;36362:74;;36445:93;36534:3;36445:93;:::i;:::-;36563:2;36558:3;36554:12;36547:19;;36206:366;;;:::o;36578:419::-;36744:4;36782:2;36771:9;36767:18;36759:26;;36831:9;36825:4;36821:20;36817:1;36806:9;36802:17;36795:47;36859:131;36985:4;36859:131;:::i;:::-;36851:139;;36578:419;;;:::o;37003:234::-;37143:34;37139:1;37131:6;37127:14;37120:58;37212:17;37207:2;37199:6;37195:15;37188:42;37003:234;:::o;37243:366::-;37385:3;37406:67;37470:2;37465:3;37406:67;:::i;:::-;37399:74;;37482:93;37571:3;37482:93;:::i;:::-;37600:2;37595:3;37591:12;37584:19;;37243:366;;;:::o;37615:419::-;37781:4;37819:2;37808:9;37804:18;37796:26;;37868:9;37862:4;37858:20;37854:1;37843:9;37839:17;37832:47;37896:131;38022:4;37896:131;:::i;:::-;37888:139;;37615:419;;;:::o;38040:148::-;38142:11;38179:3;38164:18;;38040:148;;;;:::o;38194:377::-;38300:3;38328:39;38361:5;38328:39;:::i;:::-;38383:89;38465:6;38460:3;38383:89;:::i;:::-;38376:96;;38481:52;38526:6;38521:3;38514:4;38507:5;38503:16;38481:52;:::i;:::-;38558:6;38553:3;38549:16;38542:23;;38304:267;38194:377;;;;:::o;38577:435::-;38757:3;38779:95;38870:3;38861:6;38779:95;:::i;:::-;38772:102;;38891:95;38982:3;38973:6;38891:95;:::i;:::-;38884:102;;39003:3;38996:10;;38577:435;;;;;:::o;39018:191::-;39058:4;39078:20;39096:1;39078:20;:::i;:::-;39073:25;;39112:20;39130:1;39112:20;:::i;:::-;39107:25;;39151:1;39148;39145:8;39142:34;;;39156:18;;:::i;:::-;39142:34;39201:1;39198;39194:9;39186:17;;39018:191;;;;:::o;39215:225::-;39355:34;39351:1;39343:6;39339:14;39332:58;39424:8;39419:2;39411:6;39407:15;39400:33;39215:225;:::o;39446:366::-;39588:3;39609:67;39673:2;39668:3;39609:67;:::i;:::-;39602:74;;39685:93;39774:3;39685:93;:::i;:::-;39803:2;39798:3;39794:12;39787:19;;39446:366;;;:::o;39818:419::-;39984:4;40022:2;40011:9;40007:18;39999:26;;40071:9;40065:4;40061:20;40057:1;40046:9;40042:17;40035:47;40099:131;40225:4;40099:131;:::i;:::-;40091:139;;39818:419;;;:::o;40243:231::-;40383:34;40379:1;40371:6;40367:14;40360:58;40452:14;40447:2;40439:6;40435:15;40428:39;40243:231;:::o;40480:366::-;40622:3;40643:67;40707:2;40702:3;40643:67;:::i;:::-;40636:74;;40719:93;40808:3;40719:93;:::i;:::-;40837:2;40832:3;40828:12;40821:19;;40480:366;;;:::o;40852:419::-;41018:4;41056:2;41045:9;41041:18;41033:26;;41105:9;41099:4;41095:20;41091:1;41080:9;41076:17;41069:47;41133:131;41259:4;41133:131;:::i;:::-;41125:139;;40852:419;;;:::o;41277:224::-;41417:34;41413:1;41405:6;41401:14;41394:58;41486:7;41481:2;41473:6;41469:15;41462:32;41277:224;:::o;41507:366::-;41649:3;41670:67;41734:2;41729:3;41670:67;:::i;:::-;41663:74;;41746:93;41835:3;41746:93;:::i;:::-;41864:2;41859:3;41855:12;41848:19;;41507:366;;;:::o;41879:419::-;42045:4;42083:2;42072:9;42068:18;42060:26;;42132:9;42126:4;42122:20;42118:1;42107:9;42103:17;42096:47;42160:131;42286:4;42160:131;:::i;:::-;42152:139;;41879:419;;;:::o;42304:223::-;42444:34;42440:1;42432:6;42428:14;42421:58;42513:6;42508:2;42500:6;42496:15;42489:31;42304:223;:::o;42533:366::-;42675:3;42696:67;42760:2;42755:3;42696:67;:::i;:::-;42689:74;;42772:93;42861:3;42772:93;:::i;:::-;42890:2;42885:3;42881:12;42874:19;;42533:366;;;:::o;42905:419::-;43071:4;43109:2;43098:9;43094:18;43086:26;;43158:9;43152:4;43148:20;43144:1;43133:9;43129:17;43122:47;43186:131;43312:4;43186:131;:::i;:::-;43178:139;;42905:419;;;:::o;43330:175::-;43470:27;43466:1;43458:6;43454:14;43447:51;43330:175;:::o;43511:366::-;43653:3;43674:67;43738:2;43733:3;43674:67;:::i;:::-;43667:74;;43750:93;43839:3;43750:93;:::i;:::-;43868:2;43863:3;43859:12;43852:19;;43511:366;;;:::o;43883:419::-;44049:4;44087:2;44076:9;44072:18;44064:26;;44136:9;44130:4;44126:20;44122:1;44111:9;44107:17;44100:47;44164:131;44290:4;44164:131;:::i;:::-;44156:139;;43883:419;;;:::o;44308:237::-;44448:34;44444:1;44436:6;44432:14;44425:58;44517:20;44512:2;44504:6;44500:15;44493:45;44308:237;:::o;44551:366::-;44693:3;44714:67;44778:2;44773:3;44714:67;:::i;:::-;44707:74;;44790:93;44879:3;44790:93;:::i;:::-;44908:2;44903:3;44899:12;44892:19;;44551:366;;;:::o;44923:419::-;45089:4;45127:2;45116:9;45112:18;45104:26;;45176:9;45170:4;45166:20;45162:1;45151:9;45147:17;45140:47;45204:131;45330:4;45204:131;:::i;:::-;45196:139;;44923:419;;;:::o;45348:180::-;45396:77;45393:1;45386:88;45493:4;45490:1;45483:15;45517:4;45514:1;45507:15;45534:185;45574:1;45591:20;45609:1;45591:20;:::i;:::-;45586:25;;45625:20;45643:1;45625:20;:::i;:::-;45620:25;;45664:1;45654:35;;45669:18;;:::i;:::-;45654:35;45711:1;45708;45704:9;45699:14;;45534:185;;;;:::o;45725:176::-;45757:1;45774:20;45792:1;45774:20;:::i;:::-;45769:25;;45808:20;45826:1;45808:20;:::i;:::-;45803:25;;45847:1;45837:35;;45852:18;;:::i;:::-;45837:35;45893:1;45890;45886:9;45881:14;;45725:176;;;;:::o;45907:98::-;45958:6;45992:5;45986:12;45976:22;;45907:98;;;:::o;46011:168::-;46094:11;46128:6;46123:3;46116:19;46168:4;46163:3;46159:14;46144:29;;46011:168;;;;:::o;46185:360::-;46271:3;46299:38;46331:5;46299:38;:::i;:::-;46353:70;46416:6;46411:3;46353:70;:::i;:::-;46346:77;;46432:52;46477:6;46472:3;46465:4;46458:5;46454:16;46432:52;:::i;:::-;46509:29;46531:6;46509:29;:::i;:::-;46504:3;46500:39;46493:46;;46275:270;46185:360;;;;:::o;46551:640::-;46746:4;46784:3;46773:9;46769:19;46761:27;;46798:71;46866:1;46855:9;46851:17;46842:6;46798:71;:::i;:::-;46879:72;46947:2;46936:9;46932:18;46923:6;46879:72;:::i;:::-;46961;47029:2;47018:9;47014:18;47005:6;46961:72;:::i;:::-;47080:9;47074:4;47070:20;47065:2;47054:9;47050:18;47043:48;47108:76;47179:4;47170:6;47108:76;:::i;:::-;47100:84;;46551:640;;;;;;;:::o;47197:141::-;47253:5;47284:6;47278:13;47269:22;;47300:32;47326:5;47300:32;:::i;:::-;47197:141;;;;:::o;47344:349::-;47413:6;47462:2;47450:9;47441:7;47437:23;47433:32;47430:119;;;47468:79;;:::i;:::-;47430:119;47588:1;47613:63;47668:7;47659:6;47648:9;47644:22;47613:63;:::i;:::-;47603:73;;47559:127;47344:349;;;;:::o;47699:182::-;47839:34;47835:1;47827:6;47823:14;47816:58;47699:182;:::o;47887:366::-;48029:3;48050:67;48114:2;48109:3;48050:67;:::i;:::-;48043:74;;48126:93;48215:3;48126:93;:::i;:::-;48244:2;48239:3;48235:12;48228:19;;47887:366;;;:::o;48259:419::-;48425:4;48463:2;48452:9;48448:18;48440:26;;48512:9;48506:4;48502:20;48498:1;48487:9;48483:17;48476:47;48540:131;48666:4;48540:131;:::i;:::-;48532:139;;48259:419;;;:::o;48684:178::-;48824:30;48820:1;48812:6;48808:14;48801:54;48684:178;:::o;48868:366::-;49010:3;49031:67;49095:2;49090:3;49031:67;:::i;:::-;49024:74;;49107:93;49196:3;49107:93;:::i;:::-;49225:2;49220:3;49216:12;49209:19;;48868:366;;;:::o;49240:419::-;49406:4;49444:2;49433:9;49429:18;49421:26;;49493:9;49487:4;49483:20;49479:1;49468:9;49464:17;49457:47;49521:131;49647:4;49521:131;:::i;:::-;49513:139;;49240:419;;;:::o

Swarm Source

ipfs://cfd8fd7d25f52cd0b1130cbbc355fdfd5b483208cdd0a434f4291ef9ae87432b
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.