ERC-721
Overview
Max Total Supply
10,000 MAGC
Holders
1,620
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
18 MAGCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MutantApeGangClub
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-22 */ /** *Submitted for verification at Etherscan.io on 2022-09-21 */ /** *Submitted for verification at Etherscan.io on 2022-09-21 */ /** *Submitted for verification at Etherscan.io on 2022-09-20 */ /** *Submitted for verification at Etherscan.io on 2022-09-19 */ /** *Submitted for verification at Etherscan.io on 2022-09-18 */ /** *Submitted for verification at Etherscan.io on 2022-08-31 */ /** *Submitted for verification at Etherscan.io on 2022-08-13 */ /** *Submitted for verification at Etherscan.io on 2022-08-13 */ /** *Submitted for verification at Etherscan.io on 2022-07-25 */ /** *Submitted for verification at Etherscan.io on 2022-06-27 */ /** *Submitted for verification at Etherscan.io on 2022-06-23 */ // SPDX-License-Identifier: MIT // File 1: Address.sol // OpenZeppelin Contracts v4.4.1 (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/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // FILE 2: 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) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File 3: 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/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 4: 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File 5: 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 6: 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 7: 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 returns (string memory); } // File 8: 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 9: 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 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 overridden 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" ); if (to.isContract()) { revert("Token transfer to contract address is not allowed."); } else { _approve(to, tokenId); } // _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 10: IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File 11: ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File 12: 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 13: ERC721A.sol pragma solidity ^0.8.0; contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 internal currentIndex = 1; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx; address currOwnershipAddr; // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar. unchecked { for (uint256 i; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721A: balance query for the zero address" ); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); unchecked { for (uint256 curr = tokenId; curr >= 0; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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(), ".json")) : ""; } /** * @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 override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721A: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); require(quantity != 0, "ERC721A: quantity must be greater than 0"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1 // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1 unchecked { _addressData[to].balance += uint128(quantity); _addressData[to].numberMinted += uint128(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; for (uint256 i; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); if (safe) { require( _checkOnERC721Received( address(0), to, updatedIndex, _data ), "ERC721A: transfer to non ERC721Receiver implementer" ); } updatedIndex++; } currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership .startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721A: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // FILE 14: MAGC.sol pragma solidity ^0.8.0; contract MutantApeGangClub is ERC721A, Ownable, ReentrancyGuard { using Strings for uint256; using Counters for Counters.Counter; string private uriPrefix = ""; string public uriSuffix = ".json"; string private hiddenMetadataUri; constructor() ERC721A("MutantApeGangClub", "MAGC") { setHiddenMetadataUri("ipfs://__CID__/hidden.json"); } uint256 public salePrice = 0.003 ether; uint256 public maxPerTx = 10; uint256 public maxPerFree = 2; uint256 public maxFreeSupply = 2000; uint256 public maxSupply = 10000; bool public paused = true; bool public revealed = true; function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success, "Transfer failed."); } /** * @notice Team Mint */ function teamMint(uint256 quantity) external onlyOwner { require(!paused, "The contract is paused!"); _safeMint(msg.sender, quantity); } /** * @notice Pre Mint */ function preMint(uint256 quantity) external payable { require(!paused, "The contract is paused!"); require(totalSupply() < maxFreeSupply, "Pre sale is not active."); mint(quantity); } /** * @notice Public Mint */ function publicMint(uint256 quantity) external payable { require(!paused, "The contract is paused!"); require(totalSupply() >= maxFreeSupply, "Public sale is not active."); mint(quantity); } /** * @notice mint */ function mint(uint256 _quantity) internal { uint256 price = salePrice; uint256 quantity = _quantity; require( _quantity > 0, "Minimum 1 NFT has to be minted per transaction" ); require( _quantity <= maxPerTx && _quantity > 0, "Invalid quantity or Max Per Tx." ); require(_quantity + totalSupply() <= maxSupply, "Sold out"); if (msg.sender != owner()) { bool isFree = ((totalSupply() + _quantity <= maxFreeSupply) && (_quantity <= maxPerFree)); if (isFree) { price = 0; } else { if (totalSupply() < maxFreeSupply) { quantity = _quantity - (maxFreeSupply - totalSupply()); } else { price = price / 2; } } if (quantity % 2 == 0) { require(msg.value >= price * quantity, "Not enough ETH to mint"); } else { require(msg.value >= price * (quantity - 1) + salePrice, "Not enough ETH to mint"); } } _safeMint(msg.sender, _quantity); } /** * @notice airdrop */ function airdrop(address _to, uint256 _quantity) external onlyOwner { require(!paused, "The contract is paused!"); require(_quantity + totalSupply() <= maxSupply, "Sold out"); _safeMint(_to, _quantity); } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while ( ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply ) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require( _exists(_tokenId), "ERC721Metadata: URI query for nonexistent token" ); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, _tokenId.toString(), uriSuffix ) ) : ""; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setmaxPerTx(uint256 _maxPerTx) public onlyOwner { maxPerTx = _maxPerTx; } function setmaxPerFree(uint256 _maxPerFree) public onlyOwner { maxPerFree = _maxPerFree; } function setmaxFreeSupply(uint256 _maxFreeSupply) public onlyOwner { maxFreeSupply = _maxFreeSupply; } function setmaxSupply(uint256 _maxSupply) public onlyOwner { maxSupply = _maxSupply; } function setSalePrice(uint256 _salePrice) external onlyOwner { salePrice = _salePrice; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerFree","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salePrice","outputs":[{"internalType":"uint256","name":"","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":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"setSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFreeSupply","type":"uint256"}],"name":"setmaxFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerFree","type":"uint256"}],"name":"setmaxPerFree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setmaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setmaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600160005560405180602001604052806000815250600990805190602001906200003092919062000366565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a90805190602001906200007e92919062000366565b50660aa87bee538000600c55600a600d556002600e556107d0600f556127106010556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff021916908315150217905550348015620000e357600080fd5b506040518060400160405280601181526020017f4d7574616e7441706547616e67436c75620000000000000000000000000000008152506040518060400160405280600481526020017f4d4147430000000000000000000000000000000000000000000000000000000081525081600190805190602001906200016892919062000366565b5080600290805190602001906200018192919062000366565b5050506000620001966200028960201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001600881905550620002836040518060400160405280601a81526020017f697066733a2f2f5f5f4349445f5f2f68696464656e2e6a736f6e0000000000008152506200029160201b60201c565b620004fe565b600033905090565b620002a16200028960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c76200033c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000320576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000317906200043d565b60405180910390fd5b80600b90805190602001906200033892919062000366565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003749062000470565b90600052602060002090601f016020900481019282620003985760008555620003e4565b82601f10620003b357805160ff1916838001178555620003e4565b82800160010185558215620003e4579182015b82811115620003e3578251825591602001919060010190620003c6565b5b509050620003f39190620003f7565b5090565b5b8082111562000412576000816000905550600101620003f8565b5090565b6000620004256020836200045f565b91506200043282620004d5565b602082019050919050565b60006020820190508181036000830152620004588162000416565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048957607f821691505b60208210811415620004a0576200049f620004a6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6151b5806200050e6000396000f3fe60806040526004361061025c5760003560e01c80635503a0e811610144578063a22cb465116100b6578063d5abeb011161007a578063d5abeb01146108c2578063e0a80853146108ed578063e985e9c514610916578063f2fde38b14610953578063f51f96dd1461097c578063f968adbe146109a75761025c565b8063a22cb465146107df578063b88d4fde14610808578063bde12d7314610831578063c7c39ffc1461085a578063c87b56dd146108855761025c565b80637ec4a659116101085780637ec4a659146106f2578063805dcae51461071b5780638ad433ac146107445780638ba4cc3c146107605780638da5cb5b1461078957806395d89b41146107b45761025c565b80635503a0e81461060b5780635c975abb146106365780636352211e1461066157806370a082311461069e578063715018a6146106db5761025c565b80632db11544116101dd57806342842e0e116101a157806342842e0e146104e9578063438b630014610512578063475133341461054f5780634f6ccce71461057a5780634fdd43cb146105b757806351830227146105e05761025c565b80632db11544146104275780632f745c59146104435780632fbba11514610480578063308d7798146104a95780633ccfd60b146104d25761025c565b806316c38b3c1161022457806316c38b3c1461035857806318160ddd146103815780631919fed7146103ac578063228025e8146103d557806323b872dd146103fe5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806316ba10e01461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a47565b6109d2565b604051610295919061418e565b60405180910390f35b3480156102aa57600080fd5b506102b3610b1c565b6040516102c091906141a9565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613aea565b610bae565b6040516102fd9190614105565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906139da565b610c33565b005b34801561033b57600080fd5b5061035660048036038101906103519190613aa1565b610d4c565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613a1a565b610de2565b005b34801561038d57600080fd5b50610396610e7b565b6040516103a3919061452b565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613aea565b610e84565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190613aea565b610f0a565b005b34801561040a57600080fd5b50610425600480360381019061042091906138c4565b610f90565b005b610441600480360381019061043c9190613aea565b610fa0565b005b34801561044f57600080fd5b5061046a600480360381019061046591906139da565b611048565b604051610477919061452b565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613aea565b61123a565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613aea565b611313565b005b3480156104de57600080fd5b506104e7611399565b005b3480156104f557600080fd5b50610510600480360381019061050b91906138c4565b6114c4565b005b34801561051e57600080fd5b5061053960048036038101906105349190613857565b6114e4565b604051610546919061416c565b60405180910390f35b34801561055b57600080fd5b506105646115ef565b604051610571919061452b565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613aea565b6115f5565b6040516105ae919061452b565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613aa1565b611648565b005b3480156105ec57600080fd5b506105f56116de565b604051610602919061418e565b60405180910390f35b34801561061757600080fd5b506106206116f1565b60405161062d91906141a9565b60405180910390f35b34801561064257600080fd5b5061064b61177f565b604051610658919061418e565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613aea565b611792565b6040516106959190614105565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613857565b6117a8565b6040516106d2919061452b565b60405180910390f35b3480156106e757600080fd5b506106f0611891565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613aa1565b6119ce565b005b34801561072757600080fd5b50610742600480360381019061073d9190613aea565b611a64565b005b61075e60048036038101906107599190613aea565b611aea565b005b34801561076c57600080fd5b50610787600480360381019061078291906139da565b611b91565b005b34801561079557600080fd5b5061079e611cc2565b6040516107ab9190614105565b60405180910390f35b3480156107c057600080fd5b506107c9611cec565b6040516107d691906141a9565b60405180910390f35b3480156107eb57600080fd5b506108066004803603810190610801919061399a565b611d7e565b005b34801561081457600080fd5b5061082f600480360381019061082a9190613917565b611eff565b005b34801561083d57600080fd5b5061085860048036038101906108539190613aea565b611f5b565b005b34801561086657600080fd5b5061086f611fe1565b60405161087c919061452b565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a79190613aea565b611fe7565b6040516108b991906141a9565b60405180910390f35b3480156108ce57600080fd5b506108d7612140565b6040516108e4919061452b565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190613a1a565b612146565b005b34801561092257600080fd5b5061093d60048036038101906109389190613884565b6121df565b60405161094a919061418e565b60405180910390f35b34801561095f57600080fd5b5061097a60048036038101906109759190613857565b612273565b005b34801561098857600080fd5b5061099161241f565b60405161099e919061452b565b60405180910390f35b3480156109b357600080fd5b506109bc612425565b6040516109c9919061452b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b155750610b148261242b565b5b9050919050565b606060018054610b2b90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5790614834565b8015610ba45780601f10610b7957610100808354040283529160200191610ba4565b820191906000526020600020905b815481529060010190602001808311610b8757829003601f168201915b5050505050905090565b6000610bb982612495565b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061450b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3e82611792565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca69061440b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cce6124a2565b73ffffffffffffffffffffffffffffffffffffffff161480610cfd5750610cfc81610cf76124a2565b6121df565b5b610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d339061430b565b60405180910390fd5b610d478383836124aa565b505050565b610d546124a2565b73ffffffffffffffffffffffffffffffffffffffff16610d72611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf9061436b565b60405180910390fd5b80600a9080519060200190610dde929190613631565b5050565b610dea6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610e08611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e559061436b565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60008054905090565b610e8c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610eaa611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef79061436b565b60405180910390fd5b80600c8190555050565b610f126124a2565b73ffffffffffffffffffffffffffffffffffffffff16610f30611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d9061436b565b60405180910390fd5b8060108190555050565b610f9b83838361255c565b505050565b601160009054906101000a900460ff1615610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061438b565b60405180910390fd5b600f54610ffb610e7b565b101561103c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110339061424b565b60405180910390fd5b61104581612a9c565b50565b6000611053836117a8565b8210611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b906141cb565b60405180910390fd5b600061109e610e7b565b905060008060005b838110156111f8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111ea57868414156111e1578195505050505050611234565b83806001019450505b5080806001019150506110a6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b906144cb565b60405180910390fd5b92915050565b6112426124a2565b73ffffffffffffffffffffffffffffffffffffffff16611260611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061436b565b60405180910390fd5b601160009054906101000a900460ff1615611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd9061438b565b60405180910390fd5b6113103382612d30565b50565b61131b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611339611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113869061436b565b60405180910390fd5b80600e8190555050565b6113a16124a2565b73ffffffffffffffffffffffffffffffffffffffff166113bf611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c9061436b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161143b906140f0565b60006040518083038185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b50509050806114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89061442b565b60405180910390fd5b50565b6114df83838360405180602001604052806000815250611eff565b505050565b606060006114f1836117a8565b905060008167ffffffffffffffff81111561150f5761150e6149cd565b5b60405190808252806020026020018201604052801561153d5781602001602082028036833780820191505090505b50905060006001905060005b838110801561155a57506010548211155b156115e357600061156a83611792565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf57828483815181106115b4576115b361499e565b5b60200260200101818152505081806115cb90614897565b9250505b82806115da90614897565b93505050611549565b82945050505050919050565b600f5481565b60006115ff610e7b565b8210611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061426b565b60405180910390fd5b819050919050565b6116506124a2565b73ffffffffffffffffffffffffffffffffffffffff1661166e611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb9061436b565b60405180910390fd5b80600b90805190602001906116da929190613631565b5050565b601160019054906101000a900460ff1681565b600a80546116fe90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461172a90614834565b80156117775780601f1061174c57610100808354040283529160200191611777565b820191906000526020600020905b81548152906001019060200180831161175a57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600061179d82612d4e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061432b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118996124a2565b73ffffffffffffffffffffffffffffffffffffffff166118b7611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119049061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6119d66124a2565b73ffffffffffffffffffffffffffffffffffffffff166119f4611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a419061436b565b60405180910390fd5b8060099080519060200190611a60929190613631565b5050565b611a6c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611a8a611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad79061436b565b60405180910390fd5b80600d8190555050565b601160009054906101000a900460ff1615611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b319061438b565b60405180910390fd5b600f54611b45610e7b565b10611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c906142eb565b60405180910390fd5b611b8e81612a9c565b50565b611b996124a2565b73ffffffffffffffffffffffffffffffffffffffff16611bb7611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c049061436b565b60405180910390fd5b601160009054906101000a900460ff1615611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c549061438b565b60405180910390fd5b601054611c68610e7b565b82611c739190614669565b1115611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab9061444b565b60405180910390fd5b611cbe8282612d30565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611cfb90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2790614834565b8015611d745780601f10611d4957610100808354040283529160200191611d74565b820191906000526020600020905b815481529060010190602001808311611d5757829003601f168201915b5050505050905090565b611d866124a2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906143cb565b60405180910390fd5b8060066000611e016124a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eae6124a2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ef3919061418e565b60405180910390a35050565b611f0a84848461255c565b611f1684848484612ee8565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c9061446b565b60405180910390fd5b50505050565b611f636124a2565b73ffffffffffffffffffffffffffffffffffffffff16611f81611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce9061436b565b60405180910390fd5b80600f8190555050565b600e5481565b6060611ff282612495565b612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906143ab565b60405180910390fd5b60001515601160019054906101000a900460ff16151514156120df57600b805461205a90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461208690614834565b80156120d35780601f106120a8576101008083540402835291602001916120d3565b820191906000526020600020905b8154815290600101906020018083116120b657829003601f168201915b5050505050905061213b565b60006120e961307f565b905060008151116121095760405180602001604052806000815250612137565b8061211384613111565b600a604051602001612127939291906140bf565b6040516020818303038152906040525b9150505b919050565b60105481565b61214e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1661216c611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99061436b565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61227b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16612299611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e69061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561235f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123569061420b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600d5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061256782612d4e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661258e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1614806125ea57506125b36124a2565b73ffffffffffffffffffffffffffffffffffffffff166125d284610bae565b73ffffffffffffffffffffffffffffffffffffffff16145b80612606575061260582600001516126006124a2565b6121df565b5b905080612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f906143eb565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b19061434b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127219061428b565b60405180910390fd5b6127378585856001613272565b61274760008484600001516124aa565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a2c5761298b81612495565b15612a2b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a958585856001613278565b5050505050565b6000600c549050600082905060008311612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae2906141eb565b60405180910390fd5b600d548311158015612afd5750600083115b612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906142cb565b60405180910390fd5b601054612b47610e7b565b84612b529190614669565b1115612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a9061444b565b60405180910390fd5b612b9b611cc2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d21576000600f5484612bdb610e7b565b612be59190614669565b11158015612bf55750600e548411155b90508015612c065760009250612c4f565b600f54612c11610e7b565b1015612c3e57612c1f610e7b565b600f54612c2c919061474a565b84612c37919061474a565b9150612c4e565b600283612c4b91906146bf565b92505b5b6000600283612c5e91906148e0565b1415612cb7578183612c7091906146f0565b341015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906142ab565b60405180910390fd5b612d1f565b600c54600183612cc7919061474a565b84612cd291906146f0565b612cdc9190614669565b341015612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d15906142ab565b60405180910390fd5b5b505b612d2b3384612d30565b505050565b612d4a82826040518060200160405280600081525061327e565b5050565b612d566136b7565b612d5f82612495565b612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d959061422b565b60405180910390fd5b60008290505b60008110612ea7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e98578092505050612ee3565b50808060019003915050612da4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda906144eb565b60405180910390fd5b919050565b6000612f098473ffffffffffffffffffffffffffffffffffffffff16613290565b15613072578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f326124a2565b8786866040518563ffffffff1660e01b8152600401612f549493929190614120565b602060405180830381600087803b158015612f6e57600080fd5b505af1925050508015612f9f57506040513d601f19601f82011682018060405250810190612f9c9190613a74565b60015b613022573d8060008114612fcf576040519150601f19603f3d011682016040523d82523d6000602084013e612fd4565b606091505b5060008151141561301a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130119061446b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613077565b600190505b949350505050565b60606009805461308e90614834565b80601f01602080910402602001604051908101604052809291908181526020018280546130ba90614834565b80156131075780601f106130dc57610100808354040283529160200191613107565b820191906000526020600020905b8154815290600101906020018083116130ea57829003601f168201915b5050505050905090565b60606000821415613159576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061326d565b600082905060005b6000821461318b57808061317490614897565b915050600a8261318491906146bf565b9150613161565b60008167ffffffffffffffff8111156131a7576131a66149cd565b5b6040519080825280601f01601f1916602001820160405280156131d95781602001600182028036833780820191505090505b5090505b60008514613266576001826131f2919061474a565b9150600a8561320191906148e0565b603061320d9190614669565b60f81b8183815181106132235761322261499e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561325f91906146bf565b94506131dd565b8093505050505b919050565b50505050565b50505050565b61328b83838360016132b3565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613329576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133209061448b565b60405180910390fd5b600084141561336d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613364906144ab565b60405180910390fd5b61337a6000868387613272565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561361457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156135ff576135bf6000888488612ee8565b6135fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f59061446b565b60405180910390fd5b5b81806001019250508080600101915050613548565b50806000819055505061362a6000868387613278565b5050505050565b82805461363d90614834565b90600052602060002090601f01602090048101928261365f57600085556136a6565b82601f1061367857805160ff19168380011785556136a6565b828001600101855582156136a6579182015b828111156136a557825182559160200191906001019061368a565b5b5090506136b391906136f1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561370a5760008160009055506001016136f2565b5090565b600061372161371c8461456b565b614546565b90508281526020810184848401111561373d5761373c614a01565b5b6137488482856147f2565b509392505050565b600061376361375e8461459c565b614546565b90508281526020810184848401111561377f5761377e614a01565b5b61378a8482856147f2565b509392505050565b6000813590506137a181615123565b92915050565b6000813590506137b68161513a565b92915050565b6000813590506137cb81615151565b92915050565b6000815190506137e081615151565b92915050565b600082601f8301126137fb576137fa6149fc565b5b813561380b84826020860161370e565b91505092915050565b600082601f830112613829576138286149fc565b5b8135613839848260208601613750565b91505092915050565b60008135905061385181615168565b92915050565b60006020828403121561386d5761386c614a0b565b5b600061387b84828501613792565b91505092915050565b6000806040838503121561389b5761389a614a0b565b5b60006138a985828601613792565b92505060206138ba85828601613792565b9150509250929050565b6000806000606084860312156138dd576138dc614a0b565b5b60006138eb86828701613792565b93505060206138fc86828701613792565b925050604061390d86828701613842565b9150509250925092565b6000806000806080858703121561393157613930614a0b565b5b600061393f87828801613792565b945050602061395087828801613792565b935050604061396187828801613842565b925050606085013567ffffffffffffffff81111561398257613981614a06565b5b61398e878288016137e6565b91505092959194509250565b600080604083850312156139b1576139b0614a0b565b5b60006139bf85828601613792565b92505060206139d0858286016137a7565b9150509250929050565b600080604083850312156139f1576139f0614a0b565b5b60006139ff85828601613792565b9250506020613a1085828601613842565b9150509250929050565b600060208284031215613a3057613a2f614a0b565b5b6000613a3e848285016137a7565b91505092915050565b600060208284031215613a5d57613a5c614a0b565b5b6000613a6b848285016137bc565b91505092915050565b600060208284031215613a8a57613a89614a0b565b5b6000613a98848285016137d1565b91505092915050565b600060208284031215613ab757613ab6614a0b565b5b600082013567ffffffffffffffff811115613ad557613ad4614a06565b5b613ae184828501613814565b91505092915050565b600060208284031215613b0057613aff614a0b565b5b6000613b0e84828501613842565b91505092915050565b6000613b2383836140a1565b60208301905092915050565b613b388161477e565b82525050565b6000613b49826145f2565b613b538185614620565b9350613b5e836145cd565b8060005b83811015613b8f578151613b768882613b17565b9750613b8183614613565b925050600181019050613b62565b5085935050505092915050565b613ba581614790565b82525050565b6000613bb6826145fd565b613bc08185614631565b9350613bd0818560208601614801565b613bd981614a10565b840191505092915050565b6000613bef82614608565b613bf9818561464d565b9350613c09818560208601614801565b613c1281614a10565b840191505092915050565b6000613c2882614608565b613c32818561465e565b9350613c42818560208601614801565b80840191505092915050565b60008154613c5b81614834565b613c65818661465e565b94506001821660008114613c805760018114613c9157613cc4565b60ff19831686528186019350613cc4565b613c9a856145dd565b60005b83811015613cbc57815481890152600182019150602081019050613c9d565b838801955050505b50505092915050565b6000613cda60228361464d565b9150613ce582614a21565b604082019050919050565b6000613cfd602e8361464d565b9150613d0882614a70565b604082019050919050565b6000613d2060268361464d565b9150613d2b82614abf565b604082019050919050565b6000613d43602a8361464d565b9150613d4e82614b0e565b604082019050919050565b6000613d66601a8361464d565b9150613d7182614b5d565b602082019050919050565b6000613d8960238361464d565b9150613d9482614b86565b604082019050919050565b6000613dac60258361464d565b9150613db782614bd5565b604082019050919050565b6000613dcf60168361464d565b9150613dda82614c24565b602082019050919050565b6000613df2601f8361464d565b9150613dfd82614c4d565b602082019050919050565b6000613e1560178361464d565b9150613e2082614c76565b602082019050919050565b6000613e3860398361464d565b9150613e4382614c9f565b604082019050919050565b6000613e5b602b8361464d565b9150613e6682614cee565b604082019050919050565b6000613e7e60268361464d565b9150613e8982614d3d565b604082019050919050565b6000613ea160208361464d565b9150613eac82614d8c565b602082019050919050565b6000613ec460178361464d565b9150613ecf82614db5565b602082019050919050565b6000613ee7602f8361464d565b9150613ef282614dde565b604082019050919050565b6000613f0a601a8361464d565b9150613f1582614e2d565b602082019050919050565b6000613f2d60328361464d565b9150613f3882614e56565b604082019050919050565b6000613f5060228361464d565b9150613f5b82614ea5565b604082019050919050565b6000613f73600083614642565b9150613f7e82614ef4565b600082019050919050565b6000613f9660108361464d565b9150613fa182614ef7565b602082019050919050565b6000613fb960088361464d565b9150613fc482614f20565b602082019050919050565b6000613fdc60338361464d565b9150613fe782614f49565b604082019050919050565b6000613fff60218361464d565b915061400a82614f98565b604082019050919050565b600061402260288361464d565b915061402d82614fe7565b604082019050919050565b6000614045602e8361464d565b915061405082615036565b604082019050919050565b6000614068602f8361464d565b915061407382615085565b604082019050919050565b600061408b602d8361464d565b9150614096826150d4565b604082019050919050565b6140aa816147e8565b82525050565b6140b9816147e8565b82525050565b60006140cb8286613c1d565b91506140d78285613c1d565b91506140e38284613c4e565b9150819050949350505050565b60006140fb82613f66565b9150819050919050565b600060208201905061411a6000830184613b2f565b92915050565b60006080820190506141356000830187613b2f565b6141426020830186613b2f565b61414f60408301856140b0565b81810360608301526141618184613bab565b905095945050505050565b600060208201905081810360008301526141868184613b3e565b905092915050565b60006020820190506141a36000830184613b9c565b92915050565b600060208201905081810360008301526141c38184613be4565b905092915050565b600060208201905081810360008301526141e481613ccd565b9050919050565b6000602082019050818103600083015261420481613cf0565b9050919050565b6000602082019050818103600083015261422481613d13565b9050919050565b6000602082019050818103600083015261424481613d36565b9050919050565b6000602082019050818103600083015261426481613d59565b9050919050565b6000602082019050818103600083015261428481613d7c565b9050919050565b600060208201905081810360008301526142a481613d9f565b9050919050565b600060208201905081810360008301526142c481613dc2565b9050919050565b600060208201905081810360008301526142e481613de5565b9050919050565b6000602082019050818103600083015261430481613e08565b9050919050565b6000602082019050818103600083015261432481613e2b565b9050919050565b6000602082019050818103600083015261434481613e4e565b9050919050565b6000602082019050818103600083015261436481613e71565b9050919050565b6000602082019050818103600083015261438481613e94565b9050919050565b600060208201905081810360008301526143a481613eb7565b9050919050565b600060208201905081810360008301526143c481613eda565b9050919050565b600060208201905081810360008301526143e481613efd565b9050919050565b6000602082019050818103600083015261440481613f20565b9050919050565b6000602082019050818103600083015261442481613f43565b9050919050565b6000602082019050818103600083015261444481613f89565b9050919050565b6000602082019050818103600083015261446481613fac565b9050919050565b6000602082019050818103600083015261448481613fcf565b9050919050565b600060208201905081810360008301526144a481613ff2565b9050919050565b600060208201905081810360008301526144c481614015565b9050919050565b600060208201905081810360008301526144e481614038565b9050919050565b600060208201905081810360008301526145048161405b565b9050919050565b600060208201905081810360008301526145248161407e565b9050919050565b600060208201905061454060008301846140b0565b92915050565b6000614550614561565b905061455c8282614866565b919050565b6000604051905090565b600067ffffffffffffffff821115614586576145856149cd565b5b61458f82614a10565b9050602081019050919050565b600067ffffffffffffffff8211156145b7576145b66149cd565b5b6145c082614a10565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614674826147e8565b915061467f836147e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b4576146b3614911565b5b828201905092915050565b60006146ca826147e8565b91506146d5836147e8565b9250826146e5576146e4614940565b5b828204905092915050565b60006146fb826147e8565b9150614706836147e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473f5761473e614911565b5b828202905092915050565b6000614755826147e8565b9150614760836147e8565b92508282101561477357614772614911565b5b828203905092915050565b6000614789826147c8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481f578082015181840152602081019050614804565b8381111561482e576000848401525b50505050565b6000600282049050600182168061484c57607f821691505b602082108114156148605761485f61496f565b5b50919050565b61486f82614a10565b810181811067ffffffffffffffff8211171561488e5761488d6149cd565b5b80604052505050565b60006148a2826147e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d5576148d4614911565b5b600182019050919050565b60006148eb826147e8565b91506148f6836147e8565b92508261490657614905614940565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e696d756d2031204e46542068617320746f206265206d696e746564207060008201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f496e76616c6964207175616e74697479206f72204d6178205065722054782e00600082015250565b7f5072652073616c65206973206e6f74206163746976652e000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61512c8161477e565b811461513757600080fd5b50565b61514381614790565b811461514e57600080fd5b50565b61515a8161479c565b811461516557600080fd5b50565b615171816147e8565b811461517c57600080fd5b5056fea2646970667358221220824dbd822647812d8f88889c84699825ad504a47c26cb5fda20275addb6a8c6264736f6c63430008070033
Deployed Bytecode
0x60806040526004361061025c5760003560e01c80635503a0e811610144578063a22cb465116100b6578063d5abeb011161007a578063d5abeb01146108c2578063e0a80853146108ed578063e985e9c514610916578063f2fde38b14610953578063f51f96dd1461097c578063f968adbe146109a75761025c565b8063a22cb465146107df578063b88d4fde14610808578063bde12d7314610831578063c7c39ffc1461085a578063c87b56dd146108855761025c565b80637ec4a659116101085780637ec4a659146106f2578063805dcae51461071b5780638ad433ac146107445780638ba4cc3c146107605780638da5cb5b1461078957806395d89b41146107b45761025c565b80635503a0e81461060b5780635c975abb146106365780636352211e1461066157806370a082311461069e578063715018a6146106db5761025c565b80632db11544116101dd57806342842e0e116101a157806342842e0e146104e9578063438b630014610512578063475133341461054f5780634f6ccce71461057a5780634fdd43cb146105b757806351830227146105e05761025c565b80632db11544146104275780632f745c59146104435780632fbba11514610480578063308d7798146104a95780633ccfd60b146104d25761025c565b806316c38b3c1161022457806316c38b3c1461035857806318160ddd146103815780631919fed7146103ac578063228025e8146103d557806323b872dd146103fe5761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b31461030657806316ba10e01461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613a47565b6109d2565b604051610295919061418e565b60405180910390f35b3480156102aa57600080fd5b506102b3610b1c565b6040516102c091906141a9565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb9190613aea565b610bae565b6040516102fd9190614105565b60405180910390f35b34801561031257600080fd5b5061032d600480360381019061032891906139da565b610c33565b005b34801561033b57600080fd5b5061035660048036038101906103519190613aa1565b610d4c565b005b34801561036457600080fd5b5061037f600480360381019061037a9190613a1a565b610de2565b005b34801561038d57600080fd5b50610396610e7b565b6040516103a3919061452b565b60405180910390f35b3480156103b857600080fd5b506103d360048036038101906103ce9190613aea565b610e84565b005b3480156103e157600080fd5b506103fc60048036038101906103f79190613aea565b610f0a565b005b34801561040a57600080fd5b50610425600480360381019061042091906138c4565b610f90565b005b610441600480360381019061043c9190613aea565b610fa0565b005b34801561044f57600080fd5b5061046a600480360381019061046591906139da565b611048565b604051610477919061452b565b60405180910390f35b34801561048c57600080fd5b506104a760048036038101906104a29190613aea565b61123a565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613aea565b611313565b005b3480156104de57600080fd5b506104e7611399565b005b3480156104f557600080fd5b50610510600480360381019061050b91906138c4565b6114c4565b005b34801561051e57600080fd5b5061053960048036038101906105349190613857565b6114e4565b604051610546919061416c565b60405180910390f35b34801561055b57600080fd5b506105646115ef565b604051610571919061452b565b60405180910390f35b34801561058657600080fd5b506105a1600480360381019061059c9190613aea565b6115f5565b6040516105ae919061452b565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d99190613aa1565b611648565b005b3480156105ec57600080fd5b506105f56116de565b604051610602919061418e565b60405180910390f35b34801561061757600080fd5b506106206116f1565b60405161062d91906141a9565b60405180910390f35b34801561064257600080fd5b5061064b61177f565b604051610658919061418e565b60405180910390f35b34801561066d57600080fd5b5061068860048036038101906106839190613aea565b611792565b6040516106959190614105565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613857565b6117a8565b6040516106d2919061452b565b60405180910390f35b3480156106e757600080fd5b506106f0611891565b005b3480156106fe57600080fd5b5061071960048036038101906107149190613aa1565b6119ce565b005b34801561072757600080fd5b50610742600480360381019061073d9190613aea565b611a64565b005b61075e60048036038101906107599190613aea565b611aea565b005b34801561076c57600080fd5b50610787600480360381019061078291906139da565b611b91565b005b34801561079557600080fd5b5061079e611cc2565b6040516107ab9190614105565b60405180910390f35b3480156107c057600080fd5b506107c9611cec565b6040516107d691906141a9565b60405180910390f35b3480156107eb57600080fd5b506108066004803603810190610801919061399a565b611d7e565b005b34801561081457600080fd5b5061082f600480360381019061082a9190613917565b611eff565b005b34801561083d57600080fd5b5061085860048036038101906108539190613aea565b611f5b565b005b34801561086657600080fd5b5061086f611fe1565b60405161087c919061452b565b60405180910390f35b34801561089157600080fd5b506108ac60048036038101906108a79190613aea565b611fe7565b6040516108b991906141a9565b60405180910390f35b3480156108ce57600080fd5b506108d7612140565b6040516108e4919061452b565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190613a1a565b612146565b005b34801561092257600080fd5b5061093d60048036038101906109389190613884565b6121df565b60405161094a919061418e565b60405180910390f35b34801561095f57600080fd5b5061097a60048036038101906109759190613857565b612273565b005b34801561098857600080fd5b5061099161241f565b60405161099e919061452b565b60405180910390f35b3480156109b357600080fd5b506109bc612425565b6040516109c9919061452b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b0557507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b155750610b148261242b565b5b9050919050565b606060018054610b2b90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5790614834565b8015610ba45780601f10610b7957610100808354040283529160200191610ba4565b820191906000526020600020905b815481529060010190602001808311610b8757829003601f168201915b5050505050905090565b6000610bb982612495565b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061450b565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c3e82611792565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca69061440b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cce6124a2565b73ffffffffffffffffffffffffffffffffffffffff161480610cfd5750610cfc81610cf76124a2565b6121df565b5b610d3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d339061430b565b60405180910390fd5b610d478383836124aa565b505050565b610d546124a2565b73ffffffffffffffffffffffffffffffffffffffff16610d72611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbf9061436b565b60405180910390fd5b80600a9080519060200190610dde929190613631565b5050565b610dea6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610e08611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610e5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e559061436b565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b60008054905090565b610e8c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16610eaa611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef79061436b565b60405180910390fd5b80600c8190555050565b610f126124a2565b73ffffffffffffffffffffffffffffffffffffffff16610f30611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d9061436b565b60405180910390fd5b8060108190555050565b610f9b83838361255c565b505050565b601160009054906101000a900460ff1615610ff0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe79061438b565b60405180910390fd5b600f54610ffb610e7b565b101561103c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110339061424b565b60405180910390fd5b61104581612a9c565b50565b6000611053836117a8565b8210611094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108b906141cb565b60405180910390fd5b600061109e610e7b565b905060008060005b838110156111f8576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461119857806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111ea57868414156111e1578195505050505050611234565b83806001019450505b5080806001019150506110a6565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122b906144cb565b60405180910390fd5b92915050565b6112426124a2565b73ffffffffffffffffffffffffffffffffffffffff16611260611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad9061436b565b60405180910390fd5b601160009054906101000a900460ff1615611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd9061438b565b60405180910390fd5b6113103382612d30565b50565b61131b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611339611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113869061436b565b60405180910390fd5b80600e8190555050565b6113a16124a2565b73ffffffffffffffffffffffffffffffffffffffff166113bf611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c9061436b565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff164760405161143b906140f0565b60006040518083038185875af1925050503d8060008114611478576040519150601f19603f3d011682016040523d82523d6000602084013e61147d565b606091505b50509050806114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b89061442b565b60405180910390fd5b50565b6114df83838360405180602001604052806000815250611eff565b505050565b606060006114f1836117a8565b905060008167ffffffffffffffff81111561150f5761150e6149cd565b5b60405190808252806020026020018201604052801561153d5781602001602082028036833780820191505090505b50905060006001905060005b838110801561155a57506010548211155b156115e357600061156a83611792565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115cf57828483815181106115b4576115b361499e565b5b60200260200101818152505081806115cb90614897565b9250505b82806115da90614897565b93505050611549565b82945050505050919050565b600f5481565b60006115ff610e7b565b8210611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061426b565b60405180910390fd5b819050919050565b6116506124a2565b73ffffffffffffffffffffffffffffffffffffffff1661166e611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb9061436b565b60405180910390fd5b80600b90805190602001906116da929190613631565b5050565b601160019054906101000a900460ff1681565b600a80546116fe90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461172a90614834565b80156117775780601f1061174c57610100808354040283529160200191611777565b820191906000526020600020905b81548152906001019060200180831161175a57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600061179d82612d4e565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611819576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118109061432b565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6118996124a2565b73ffffffffffffffffffffffffffffffffffffffff166118b7611cc2565b73ffffffffffffffffffffffffffffffffffffffff161461190d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119049061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6119d66124a2565b73ffffffffffffffffffffffffffffffffffffffff166119f4611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a419061436b565b60405180910390fd5b8060099080519060200190611a60929190613631565b5050565b611a6c6124a2565b73ffffffffffffffffffffffffffffffffffffffff16611a8a611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad79061436b565b60405180910390fd5b80600d8190555050565b601160009054906101000a900460ff1615611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b319061438b565b60405180910390fd5b600f54611b45610e7b565b10611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c906142eb565b60405180910390fd5b611b8e81612a9c565b50565b611b996124a2565b73ffffffffffffffffffffffffffffffffffffffff16611bb7611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611c0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c049061436b565b60405180910390fd5b601160009054906101000a900460ff1615611c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c549061438b565b60405180910390fd5b601054611c68610e7b565b82611c739190614669565b1115611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab9061444b565b60405180910390fd5b611cbe8282612d30565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054611cfb90614834565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2790614834565b8015611d745780601f10611d4957610100808354040283529160200191611d74565b820191906000526020600020905b815481529060010190602001808311611d5757829003601f168201915b5050505050905090565b611d866124a2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611df4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611deb906143cb565b60405180910390fd5b8060066000611e016124a2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eae6124a2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ef3919061418e565b60405180910390a35050565b611f0a84848461255c565b611f1684848484612ee8565b611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c9061446b565b60405180910390fd5b50505050565b611f636124a2565b73ffffffffffffffffffffffffffffffffffffffff16611f81611cc2565b73ffffffffffffffffffffffffffffffffffffffff1614611fd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fce9061436b565b60405180910390fd5b80600f8190555050565b600e5481565b6060611ff282612495565b612031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612028906143ab565b60405180910390fd5b60001515601160019054906101000a900460ff16151514156120df57600b805461205a90614834565b80601f016020809104026020016040519081016040528092919081815260200182805461208690614834565b80156120d35780601f106120a8576101008083540402835291602001916120d3565b820191906000526020600020905b8154815290600101906020018083116120b657829003601f168201915b5050505050905061213b565b60006120e961307f565b905060008151116121095760405180602001604052806000815250612137565b8061211384613111565b600a604051602001612127939291906140bf565b6040516020818303038152906040525b9150505b919050565b60105481565b61214e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1661216c611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99061436b565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61227b6124a2565b73ffffffffffffffffffffffffffffffffffffffff16612299611cc2565b73ffffffffffffffffffffffffffffffffffffffff16146122ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e69061436b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561235f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123569061420b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600d5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061256782612d4e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661258e6124a2565b73ffffffffffffffffffffffffffffffffffffffff1614806125ea57506125b36124a2565b73ffffffffffffffffffffffffffffffffffffffff166125d284610bae565b73ffffffffffffffffffffffffffffffffffffffff16145b80612606575061260582600001516126006124a2565b6121df565b5b905080612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263f906143eb565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b19061434b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561272a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127219061428b565b60405180910390fd5b6127378585856001613272565b61274760008484600001516124aa565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612a2c5761298b81612495565b15612a2b5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a958585856001613278565b5050505050565b6000600c549050600082905060008311612aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae2906141eb565b60405180910390fd5b600d548311158015612afd5750600083115b612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b33906142cb565b60405180910390fd5b601054612b47610e7b565b84612b529190614669565b1115612b93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8a9061444b565b60405180910390fd5b612b9b611cc2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d21576000600f5484612bdb610e7b565b612be59190614669565b11158015612bf55750600e548411155b90508015612c065760009250612c4f565b600f54612c11610e7b565b1015612c3e57612c1f610e7b565b600f54612c2c919061474a565b84612c37919061474a565b9150612c4e565b600283612c4b91906146bf565b92505b5b6000600283612c5e91906148e0565b1415612cb7578183612c7091906146f0565b341015612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906142ab565b60405180910390fd5b612d1f565b600c54600183612cc7919061474a565b84612cd291906146f0565b612cdc9190614669565b341015612d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d15906142ab565b60405180910390fd5b5b505b612d2b3384612d30565b505050565b612d4a82826040518060200160405280600081525061327e565b5050565b612d566136b7565b612d5f82612495565b612d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d959061422b565b60405180910390fd5b60008290505b60008110612ea7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612e98578092505050612ee3565b50808060019003915050612da4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eda906144eb565b60405180910390fd5b919050565b6000612f098473ffffffffffffffffffffffffffffffffffffffff16613290565b15613072578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f326124a2565b8786866040518563ffffffff1660e01b8152600401612f549493929190614120565b602060405180830381600087803b158015612f6e57600080fd5b505af1925050508015612f9f57506040513d601f19601f82011682018060405250810190612f9c9190613a74565b60015b613022573d8060008114612fcf576040519150601f19603f3d011682016040523d82523d6000602084013e612fd4565b606091505b5060008151141561301a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130119061446b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613077565b600190505b949350505050565b60606009805461308e90614834565b80601f01602080910402602001604051908101604052809291908181526020018280546130ba90614834565b80156131075780601f106130dc57610100808354040283529160200191613107565b820191906000526020600020905b8154815290600101906020018083116130ea57829003601f168201915b5050505050905090565b60606000821415613159576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061326d565b600082905060005b6000821461318b57808061317490614897565b915050600a8261318491906146bf565b9150613161565b60008167ffffffffffffffff8111156131a7576131a66149cd565b5b6040519080825280601f01601f1916602001820160405280156131d95781602001600182028036833780820191505090505b5090505b60008514613266576001826131f2919061474a565b9150600a8561320191906148e0565b603061320d9190614669565b60f81b8183815181106132235761322261499e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561325f91906146bf565b94506131dd565b8093505050505b919050565b50505050565b50505050565b61328b83838360016132b3565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613329576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133209061448b565b60405180910390fd5b600084141561336d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613364906144ab565b60405180910390fd5b61337a6000868387613272565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561361457818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156135ff576135bf6000888488612ee8565b6135fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135f59061446b565b60405180910390fd5b5b81806001019250508080600101915050613548565b50806000819055505061362a6000868387613278565b5050505050565b82805461363d90614834565b90600052602060002090601f01602090048101928261365f57600085556136a6565b82601f1061367857805160ff19168380011785556136a6565b828001600101855582156136a6579182015b828111156136a557825182559160200191906001019061368a565b5b5090506136b391906136f1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561370a5760008160009055506001016136f2565b5090565b600061372161371c8461456b565b614546565b90508281526020810184848401111561373d5761373c614a01565b5b6137488482856147f2565b509392505050565b600061376361375e8461459c565b614546565b90508281526020810184848401111561377f5761377e614a01565b5b61378a8482856147f2565b509392505050565b6000813590506137a181615123565b92915050565b6000813590506137b68161513a565b92915050565b6000813590506137cb81615151565b92915050565b6000815190506137e081615151565b92915050565b600082601f8301126137fb576137fa6149fc565b5b813561380b84826020860161370e565b91505092915050565b600082601f830112613829576138286149fc565b5b8135613839848260208601613750565b91505092915050565b60008135905061385181615168565b92915050565b60006020828403121561386d5761386c614a0b565b5b600061387b84828501613792565b91505092915050565b6000806040838503121561389b5761389a614a0b565b5b60006138a985828601613792565b92505060206138ba85828601613792565b9150509250929050565b6000806000606084860312156138dd576138dc614a0b565b5b60006138eb86828701613792565b93505060206138fc86828701613792565b925050604061390d86828701613842565b9150509250925092565b6000806000806080858703121561393157613930614a0b565b5b600061393f87828801613792565b945050602061395087828801613792565b935050604061396187828801613842565b925050606085013567ffffffffffffffff81111561398257613981614a06565b5b61398e878288016137e6565b91505092959194509250565b600080604083850312156139b1576139b0614a0b565b5b60006139bf85828601613792565b92505060206139d0858286016137a7565b9150509250929050565b600080604083850312156139f1576139f0614a0b565b5b60006139ff85828601613792565b9250506020613a1085828601613842565b9150509250929050565b600060208284031215613a3057613a2f614a0b565b5b6000613a3e848285016137a7565b91505092915050565b600060208284031215613a5d57613a5c614a0b565b5b6000613a6b848285016137bc565b91505092915050565b600060208284031215613a8a57613a89614a0b565b5b6000613a98848285016137d1565b91505092915050565b600060208284031215613ab757613ab6614a0b565b5b600082013567ffffffffffffffff811115613ad557613ad4614a06565b5b613ae184828501613814565b91505092915050565b600060208284031215613b0057613aff614a0b565b5b6000613b0e84828501613842565b91505092915050565b6000613b2383836140a1565b60208301905092915050565b613b388161477e565b82525050565b6000613b49826145f2565b613b538185614620565b9350613b5e836145cd565b8060005b83811015613b8f578151613b768882613b17565b9750613b8183614613565b925050600181019050613b62565b5085935050505092915050565b613ba581614790565b82525050565b6000613bb6826145fd565b613bc08185614631565b9350613bd0818560208601614801565b613bd981614a10565b840191505092915050565b6000613bef82614608565b613bf9818561464d565b9350613c09818560208601614801565b613c1281614a10565b840191505092915050565b6000613c2882614608565b613c32818561465e565b9350613c42818560208601614801565b80840191505092915050565b60008154613c5b81614834565b613c65818661465e565b94506001821660008114613c805760018114613c9157613cc4565b60ff19831686528186019350613cc4565b613c9a856145dd565b60005b83811015613cbc57815481890152600182019150602081019050613c9d565b838801955050505b50505092915050565b6000613cda60228361464d565b9150613ce582614a21565b604082019050919050565b6000613cfd602e8361464d565b9150613d0882614a70565b604082019050919050565b6000613d2060268361464d565b9150613d2b82614abf565b604082019050919050565b6000613d43602a8361464d565b9150613d4e82614b0e565b604082019050919050565b6000613d66601a8361464d565b9150613d7182614b5d565b602082019050919050565b6000613d8960238361464d565b9150613d9482614b86565b604082019050919050565b6000613dac60258361464d565b9150613db782614bd5565b604082019050919050565b6000613dcf60168361464d565b9150613dda82614c24565b602082019050919050565b6000613df2601f8361464d565b9150613dfd82614c4d565b602082019050919050565b6000613e1560178361464d565b9150613e2082614c76565b602082019050919050565b6000613e3860398361464d565b9150613e4382614c9f565b604082019050919050565b6000613e5b602b8361464d565b9150613e6682614cee565b604082019050919050565b6000613e7e60268361464d565b9150613e8982614d3d565b604082019050919050565b6000613ea160208361464d565b9150613eac82614d8c565b602082019050919050565b6000613ec460178361464d565b9150613ecf82614db5565b602082019050919050565b6000613ee7602f8361464d565b9150613ef282614dde565b604082019050919050565b6000613f0a601a8361464d565b9150613f1582614e2d565b602082019050919050565b6000613f2d60328361464d565b9150613f3882614e56565b604082019050919050565b6000613f5060228361464d565b9150613f5b82614ea5565b604082019050919050565b6000613f73600083614642565b9150613f7e82614ef4565b600082019050919050565b6000613f9660108361464d565b9150613fa182614ef7565b602082019050919050565b6000613fb960088361464d565b9150613fc482614f20565b602082019050919050565b6000613fdc60338361464d565b9150613fe782614f49565b604082019050919050565b6000613fff60218361464d565b915061400a82614f98565b604082019050919050565b600061402260288361464d565b915061402d82614fe7565b604082019050919050565b6000614045602e8361464d565b915061405082615036565b604082019050919050565b6000614068602f8361464d565b915061407382615085565b604082019050919050565b600061408b602d8361464d565b9150614096826150d4565b604082019050919050565b6140aa816147e8565b82525050565b6140b9816147e8565b82525050565b60006140cb8286613c1d565b91506140d78285613c1d565b91506140e38284613c4e565b9150819050949350505050565b60006140fb82613f66565b9150819050919050565b600060208201905061411a6000830184613b2f565b92915050565b60006080820190506141356000830187613b2f565b6141426020830186613b2f565b61414f60408301856140b0565b81810360608301526141618184613bab565b905095945050505050565b600060208201905081810360008301526141868184613b3e565b905092915050565b60006020820190506141a36000830184613b9c565b92915050565b600060208201905081810360008301526141c38184613be4565b905092915050565b600060208201905081810360008301526141e481613ccd565b9050919050565b6000602082019050818103600083015261420481613cf0565b9050919050565b6000602082019050818103600083015261422481613d13565b9050919050565b6000602082019050818103600083015261424481613d36565b9050919050565b6000602082019050818103600083015261426481613d59565b9050919050565b6000602082019050818103600083015261428481613d7c565b9050919050565b600060208201905081810360008301526142a481613d9f565b9050919050565b600060208201905081810360008301526142c481613dc2565b9050919050565b600060208201905081810360008301526142e481613de5565b9050919050565b6000602082019050818103600083015261430481613e08565b9050919050565b6000602082019050818103600083015261432481613e2b565b9050919050565b6000602082019050818103600083015261434481613e4e565b9050919050565b6000602082019050818103600083015261436481613e71565b9050919050565b6000602082019050818103600083015261438481613e94565b9050919050565b600060208201905081810360008301526143a481613eb7565b9050919050565b600060208201905081810360008301526143c481613eda565b9050919050565b600060208201905081810360008301526143e481613efd565b9050919050565b6000602082019050818103600083015261440481613f20565b9050919050565b6000602082019050818103600083015261442481613f43565b9050919050565b6000602082019050818103600083015261444481613f89565b9050919050565b6000602082019050818103600083015261446481613fac565b9050919050565b6000602082019050818103600083015261448481613fcf565b9050919050565b600060208201905081810360008301526144a481613ff2565b9050919050565b600060208201905081810360008301526144c481614015565b9050919050565b600060208201905081810360008301526144e481614038565b9050919050565b600060208201905081810360008301526145048161405b565b9050919050565b600060208201905081810360008301526145248161407e565b9050919050565b600060208201905061454060008301846140b0565b92915050565b6000614550614561565b905061455c8282614866565b919050565b6000604051905090565b600067ffffffffffffffff821115614586576145856149cd565b5b61458f82614a10565b9050602081019050919050565b600067ffffffffffffffff8211156145b7576145b66149cd565b5b6145c082614a10565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614674826147e8565b915061467f836147e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146b4576146b3614911565b5b828201905092915050565b60006146ca826147e8565b91506146d5836147e8565b9250826146e5576146e4614940565b5b828204905092915050565b60006146fb826147e8565b9150614706836147e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561473f5761473e614911565b5b828202905092915050565b6000614755826147e8565b9150614760836147e8565b92508282101561477357614772614911565b5b828203905092915050565b6000614789826147c8565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561481f578082015181840152602081019050614804565b8381111561482e576000848401525b50505050565b6000600282049050600182168061484c57607f821691505b602082108114156148605761485f61496f565b5b50919050565b61486f82614a10565b810181811067ffffffffffffffff8211171561488e5761488d6149cd565b5b80604052505050565b60006148a2826147e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d5576148d4614911565b5b600182019050919050565b60006148eb826147e8565b91506148f6836147e8565b92508261490657614905614940565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e696d756d2031204e46542068617320746f206265206d696e746564207060008201527f6572207472616e73616374696f6e000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f206d696e7400000000000000000000600082015250565b7f496e76616c6964207175616e74697479206f72204d6178205065722054782e00600082015250565b7f5072652073616c65206973206e6f74206163746976652e000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b61512c8161477e565b811461513757600080fd5b50565b61514381614790565b811461514e57600080fd5b50565b61515a8161479c565b811461516557600080fd5b50565b615171816147e8565b811461517c57600080fd5b5056fea2646970667358221220824dbd822647812d8f88889c84699825ad504a47c26cb5fda20275addb6a8c6264736f6c63430008070033
Deployed Bytecode Sourcemap
68927:5898:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54878:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56920:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58625:292;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58146:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74598:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73571:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53045:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74205:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74097:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59652:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70323:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53758:1048;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69844:159;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73861:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69586:206;;;;;;;;;;;;;:::i;:::-;;59885:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72097:735;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69435:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53230:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74315:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69550:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69110:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69518:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56729:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55364:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18767:148;;;;;;;;;;;;;:::i;:::-;;74484:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73757:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70054:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71853:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18116:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57089:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58989:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60133:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73973:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69399:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72840:723;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69477:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73662:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59371:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19070:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69319:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69364:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54878:422;55025:4;55082:25;55067:40;;;:11;:40;;;;:105;;;;55139:33;55124:48;;;:11;:48;;;;55067:105;:172;;;;55204:35;55189:50;;;:11;:50;;;;55067:172;:225;;;;55256:36;55280:11;55256:23;:36::i;:::-;55067:225;55047:245;;54878:422;;;:::o;56920:100::-;56974:13;57007:5;57000:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56920:100;:::o;58625:292::-;58729:7;58776:16;58784:7;58776;:16::i;:::-;58754:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;58885:15;:24;58901:7;58885:24;;;;;;;;;;;;;;;;;;;;;58878:31;;58625:292;;;:::o;58146:413::-;58219:13;58235:24;58251:7;58235:15;:24::i;:::-;58219:40;;58284:5;58278:11;;:2;:11;;;;58270:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58379:5;58363:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;58388:37;58405:5;58412:12;:10;:12::i;:::-;58388:16;:37::i;:::-;58363:62;58341:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;58523:28;58532:2;58536:7;58545:5;58523:8;:28::i;:::-;58208:351;58146:413;;:::o;74598:106::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74686:10:::1;74674:9;:22;;;;;;;;;;;;:::i;:::-;;74598:106:::0;:::o;73571:83::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73640:6:::1;73631;;:15;;;;;;;;;;;;;;;;;;73571:83:::0;:::o;53045:108::-;53106:7;53133:12;;53126:19;;53045:108;:::o;74205:102::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74289:10:::1;74277:9;:22;;;;74205:102:::0;:::o;74097:100::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74179:10:::1;74167:9;:22;;;;74097:100:::0;:::o;59652:162::-;59778:28;59788:4;59794:2;59798:7;59778:9;:28::i;:::-;59652:162;;;:::o;70323:222::-;70398:6;;;;;;;;;;;70397:7;70389:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;70468:13;;70451;:11;:13::i;:::-;:30;;70443:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;70523:14;70528:8;70523:4;:14::i;:::-;70323:222;:::o;53758:1048::-;53883:7;53924:16;53934:5;53924:9;:16::i;:::-;53916:5;:24;53908:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53990:22;54015:13;:11;:13::i;:::-;53990:38;;54039:19;54069:25;54258:9;54253:466;54273:14;54269:1;:18;54253:466;;;54313:31;54347:11;:14;54359:1;54347:14;;;;;;;;;;;54313:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54410:1;54384:28;;:9;:14;;;:28;;;54380:111;;54457:9;:14;;;54437:34;;54380:111;54534:5;54513:26;;:17;:26;;;54509:195;;;54583:5;54568:11;:20;54564:85;;;54624:1;54617:8;;;;;;;;;54564:85;54671:13;;;;;;;54509:195;54294:425;54289:3;;;;;;;54253:466;;;;54742:56;;;;;;;;;;:::i;:::-;;;;;;;;53758:1048;;;;;:::o;69844:159::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69919:6:::1;;;;;;;;;;;69918:7;69910:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;69964:31;69974:10;69986:8;69964:9;:31::i;:::-;69844:159:::0;:::o;73861:104::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73946:11:::1;73933:10;:24;;;;73861:104:::0;:::o;69586:206::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69637:12:::1;69663:10;69655:24;;69701:21;69655:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69636:101;;;69756:7;69748:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;69625:167;69586:206::o:0;59885:177::-;60015:39;60032:4;60038:2;60042:7;60015:39;;;;;;;;;;;;:16;:39::i;:::-;59885:177;;;:::o;72097:735::-;72184:16;72218:23;72244:17;72254:6;72244:9;:17::i;:::-;72218:43;;72272:30;72319:15;72305:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72272:63;;72346:22;72371:1;72346:26;;72383:23;72423:371;72462:15;72444;:33;:64;;;;;72499:9;;72481:14;:27;;72444:64;72423:371;;;72535:25;72563:23;72571:14;72563:7;:23::i;:::-;72535:51;;72626:6;72605:27;;:17;:27;;;72601:151;;;72686:14;72653:13;72667:15;72653:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;72719:17;;;;;:::i;:::-;;;;72601:151;72766:16;;;;;:::i;:::-;;;;72520:274;72423:371;;;72811:13;72804:20;;;;;;72097:735;;;:::o;69435:35::-;;;;:::o;53230:228::-;53333:7;53374:13;:11;:13::i;:::-;53366:5;:21;53358:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53445:5;53438:12;;53230:228;;;:::o;74315:161::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74450:18:::1;74430:17;:38;;;;;;;;;;;;:::i;:::-;;74315:161:::0;:::o;69550:27::-;;;;;;;;;;;;;:::o;69110:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69518:25::-;;;;;;;;;;;;;:::o;56729:124::-;56793:7;56820:20;56832:7;56820:11;:20::i;:::-;:25;;;56813:32;;56729:124;;;:::o;55364:258::-;55428:7;55487:1;55470:19;;:5;:19;;;;55448:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;55586:12;:19;55599:5;55586:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;55578:36;;55571:43;;55364:258;;;:::o;18767:148::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18874:1:::1;18837:40;;18858:6;;;;;;;;;;;18837:40;;;;;;;;;;;;18905:1;18888:6;;:19;;;;;;;;;;;;;;;;;;18767:148::o:0;74484:106::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74572:10:::1;74560:9;:22;;;;;;;;;;;;:::i;:::-;;74484:106:::0;:::o;73757:96::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73836:9:::1;73825:8;:20;;;;73757:96:::0;:::o;70054:215::-;70126:6;;;;;;;;;;;70125:7;70117:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;70195:13;;70179;:11;:13::i;:::-;:29;70171:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;70247:14;70252:8;70247:4;:14::i;:::-;70054:215;:::o;71853:236::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71941:6:::1;;;;;;;;;;;71940:7;71932:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;72023:9;;72006:13;:11;:13::i;:::-;71994:9;:25;;;;:::i;:::-;:38;;71986:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;72056:25;72066:3;72071:9;72056;:25::i;:::-;71853:236:::0;;:::o;18116:87::-;18162:7;18189:6;;;;;;;;;;;18182:13;;18116:87;:::o;57089:104::-;57145:13;57178:7;57171:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57089:104;:::o;58989:311::-;59119:12;:10;:12::i;:::-;59107:24;;:8;:24;;;;59099:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;59220:8;59175:18;:32;59194:12;:10;:12::i;:::-;59175:32;;;;;;;;;;;;;;;:42;59208:8;59175:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;59273:8;59244:48;;59259:12;:10;:12::i;:::-;59244:48;;;59283:8;59244:48;;;;;;:::i;:::-;;;;;;;;58989:311;;:::o;60133:355::-;60292:28;60302:4;60308:2;60312:7;60292:9;:28::i;:::-;60353:48;60376:4;60382:2;60386:7;60395:5;60353:22;:48::i;:::-;60331:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;60133:355;;;;:::o;73973:116::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;74067:14:::1;74051:13;:30;;;;73973:116:::0;:::o;69399:29::-;;;;:::o;72840:723::-;72959:13;73012:17;73020:8;73012:7;:17::i;:::-;72990:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;73131:5;73119:17;;:8;;;;;;;;;;;:17;;;73115:74;;;73160:17;73153:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73115:74;73199:28;73230:10;:8;:10::i;:::-;73199:41;;73302:1;73277:14;73271:28;:32;:284;;;;;;;;;;;;;;;;;73395:14;73436:19;:8;:17;:19::i;:::-;73482:9;73352:162;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;73271:284;73251:304;;;72840:723;;;;:::o;69477:32::-;;;;:::o;73662:87::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;73735:6:::1;73724:8;;:17;;;;;;;;;;;;;;;;;;73662:87:::0;:::o;59371:214::-;59513:4;59542:18;:25;59561:5;59542:25;;;;;;;;;;;;;;;:35;59568:8;59542:35;;;;;;;;;;;;;;;;;;;;;;;;;59535:42;;59371:214;;;;:::o;19070:281::-;18347:12;:10;:12::i;:::-;18336:23;;:7;:5;:7::i;:::-;:23;;;18328:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19193:1:::1;19173:22;;:8;:22;;;;19151:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19306:8;19277:38;;19298:6;;;;;;;;;;;19277:38;;;;;;;;;;;;19335:8;19326:6;;:17;;;;;;;;;;;;;;;;;;19070:281:::0;:::o;69319:38::-;;;;:::o;69364:28::-;;;;:::o;26654:207::-;26784:4;26828:25;26813:40;;;:11;:40;;;;26806:47;;26654:207;;;:::o;60743:111::-;60800:4;60834:12;;60824:7;:22;60817:29;;60743:111;;;:::o;13094:98::-;13147:7;13174:10;13167:17;;13094:98;:::o;65906:196::-;66048:2;66021:15;:24;66037:7;66021:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;66086:7;66082:2;66066:28;;66075:5;66066:28;;;;;;;;;;;;65906:196;;;:::o;63686:2102::-;63801:35;63839:20;63851:7;63839:11;:20::i;:::-;63801:58;;63872:22;63914:13;:18;;;63898:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;63973:12;:10;:12::i;:::-;63949:36;;:20;63961:7;63949:11;:20::i;:::-;:36;;;63898:87;:154;;;;64002:50;64019:13;:18;;;64039:12;:10;:12::i;:::-;64002:16;:50::i;:::-;63898:154;63872:181;;64088:17;64066:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;64240:4;64218:26;;:13;:18;;;:26;;;64196:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;64343:1;64329:16;;:2;:16;;;;64321:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;64400:43;64422:4;64428:2;64432:7;64441:1;64400:21;:43::i;:::-;64508:49;64525:1;64529:7;64538:13;:18;;;64508:8;:49::i;:::-;64883:1;64853:12;:18;64866:4;64853:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64927:1;64899:12;:16;64912:2;64899:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64973:2;64945:11;:20;64957:7;64945:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;65035:15;64990:11;:20;65002:7;64990:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;65303:19;65335:1;65325:7;:11;65303:33;;65396:1;65355:43;;:11;:24;65367:11;65355:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;65351:321;;;65423:20;65431:11;65423:7;:20::i;:::-;65419:238;;;65500:13;:18;;;65468:11;:24;65480:11;65468:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;65583:13;:54;;;65541:11;:24;65553:11;65541:24;;;;;;;;;;;:39;;;:96;;;;;;;;;;;;;;;;;;65419:238;65351:321;64828:855;65719:7;65715:2;65700:27;;65709:4;65700:27;;;;;;;;;;;;65738:42;65759:4;65765:2;65769:7;65778:1;65738:20;:42::i;:::-;63790:1998;;63686:2102;;;:::o;70592:1211::-;70645:13;70661:9;;70645:25;;70681:16;70700:9;70681:28;;70754:1;70742:9;:13;70720:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;70875:8;;70862:9;:21;;:38;;;;;70899:1;70887:9;:13;70862:38;70840:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;71007:9;;70990:13;:11;:13::i;:::-;70978:9;:25;;;;:::i;:::-;:38;;70970:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;71058:7;:5;:7::i;:::-;71044:21;;:10;:21;;;71040:713;;71082:11;71127:13;;71114:9;71098:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:42;;71097:73;;;;;71159:10;;71146:9;:23;;71097:73;71082:89;;71190:6;71186:295;;;71225:1;71217:9;;71186:295;;;71287:13;;71271;:11;:13::i;:::-;:29;71267:199;;;71365:13;:11;:13::i;:::-;71349;;:29;;;;:::i;:::-;71336:9;:43;;;;:::i;:::-;71325:54;;71267:199;;;71444:1;71436:5;:9;;;;:::i;:::-;71428:17;;71267:199;71186:295;71515:1;71510;71499:8;:12;;;;:::i;:::-;:17;71495:247;;;71566:8;71558:5;:16;;;;:::i;:::-;71545:9;:29;;71537:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;71495:247;;;71689:9;;71684:1;71673:8;:12;;;;:::i;:::-;71664:5;:22;;;;:::i;:::-;:34;;;;:::i;:::-;71651:9;:47;;71643:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;71495:247;71067:686;71040:713;71763:32;71773:10;71785:9;71763;:32::i;:::-;70634:1169;;70592:1211;:::o;60862:104::-;60931:27;60941:2;60945:8;60931:27;;;;;;;;;;;;:9;:27::i;:::-;60862:104;;:::o;56098:569::-;56186:21;;:::i;:::-;56233:16;56241:7;56233;:16::i;:::-;56225:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56339:12;56354:7;56339:22;;56334:245;56371:1;56363:4;:9;56334:245;;56401:31;56435:11;:17;56447:4;56435:17;;;;;;;;;;;56401:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56501:1;56475:28;;:9;:14;;;:28;;;56471:93;;56535:9;56528:16;;;;;;56471:93;56382:197;56374:6;;;;;;;;56334:245;;;;56602:57;;;;;;;;;;:::i;:::-;;;;;;;;56098:569;;;;:::o;66667:985::-;66822:4;66843:15;:2;:13;;;:15::i;:::-;66839:806;;;66912:2;66896:36;;;66955:12;:10;:12::i;:::-;66990:4;67017:7;67047:5;66896:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66875:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67275:1;67258:6;:13;:18;67254:321;;;67301:109;;;;;;;;;;:::i;:::-;;;;;;;;67254:321;67525:6;67519:13;67510:6;67506:2;67502:15;67495:38;66875:715;67145:45;;;67135:55;;;:6;:55;;;;67128:62;;;;;66839:806;67629:4;67622:11;;66667:985;;;;;;;:::o;74712:110::-;74772:13;74805:9;74798:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74712:110;:::o;13777:723::-;13833:13;14063:1;14054:5;:10;14050:53;;;14081:10;;;;;;;;;;;;;;;;;;;;;14050:53;14113:12;14128:5;14113:20;;14144:14;14169:78;14184:1;14176:4;:9;14169:78;;14202:8;;;;;:::i;:::-;;;;14233:2;14225:10;;;;;:::i;:::-;;;14169:78;;;14257:19;14289:6;14279:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14257:39;;14307:154;14323:1;14314:5;:10;14307:154;;14351:1;14341:11;;;;;:::i;:::-;;;14418:2;14410:5;:10;;;;:::i;:::-;14397:2;:24;;;;:::i;:::-;14384:39;;14367:6;14374;14367:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14447:2;14438:11;;;;;:::i;:::-;;;14307:154;;;14485:6;14471:21;;;;;13777:723;;;;:::o;68140:159::-;;;;;:::o;68711:158::-;;;;;:::o;61329:163::-;61452:32;61458:2;61462:8;61472:5;61479:4;61452:5;:32::i;:::-;61329:163;;;:::o;2010:326::-;2070:4;2327:1;2305:7;:19;;;:23;2298:30;;2010:326;;;:::o;61751:1681::-;61890:20;61913:12;;61890:35;;61958:1;61944:16;;:2;:16;;;;61936:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;62029:1;62017:8;:13;;62009:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62088:61;62118:1;62122:2;62126:12;62140:8;62088:21;:61::i;:::-;62463:8;62427:12;:16;62440:2;62427:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62528:8;62487:12;:16;62500:2;62487:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62587:2;62554:11;:25;62566:12;62554:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;62654:15;62604:11;:25;62616:12;62604:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;62687:20;62710:12;62687:35;;62744:9;62739:558;62759:8;62755:1;:12;62739:558;;;62823:12;62819:2;62798:38;;62815:1;62798:38;;;;;;;;;;;;62859:4;62855:392;;;62922:202;62983:1;63016:2;63049:12;63092:5;62922:22;:202::i;:::-;62888:339;;;;;;;;;;;;:::i;:::-;;;;;;;;;62855:392;63267:14;;;;;;;62769:3;;;;;;;62739:558;;;;63328:12;63313;:27;;;;62402:950;63364:60;63393:1;63397:2;63401:12;63415:8;63364:20;:60::i;:::-;61879:1553;61751:1681;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9822:845::-;9925:3;9962:5;9956:12;9991:36;10017:9;9991:36;:::i;:::-;10043:89;10125:6;10120:3;10043:89;:::i;:::-;10036:96;;10163:1;10152:9;10148:17;10179:1;10174:137;;;;10325:1;10320:341;;;;10141:520;;10174:137;10258:4;10254:9;10243;10239:25;10234:3;10227:38;10294:6;10289:3;10285:16;10278:23;;10174:137;;10320:341;10387:38;10419:5;10387:38;:::i;:::-;10447:1;10461:154;10475:6;10472:1;10469:13;10461:154;;;10549:7;10543:14;10539:1;10534:3;10530:11;10523:35;10599:1;10590:7;10586:15;10575:26;;10497:4;10494:1;10490:12;10485:17;;10461:154;;;10644:6;10639:3;10635:16;10628:23;;10327:334;;10141:520;;9929:738;;9822:845;;;;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10673:366;;;:::o;11045:::-;11187:3;11208:67;11272:2;11267:3;11208:67;:::i;:::-;11201:74;;11284:93;11373:3;11284:93;:::i;:::-;11402:2;11397:3;11393:12;11386:19;;11045:366;;;:::o;11417:::-;11559:3;11580:67;11644:2;11639:3;11580:67;:::i;:::-;11573:74;;11656:93;11745:3;11656:93;:::i;:::-;11774:2;11769:3;11765:12;11758:19;;11417:366;;;:::o;11789:::-;11931:3;11952:67;12016:2;12011:3;11952:67;:::i;:::-;11945:74;;12028:93;12117:3;12028:93;:::i;:::-;12146:2;12141:3;12137:12;12130:19;;11789:366;;;:::o;12161:::-;12303:3;12324:67;12388:2;12383:3;12324:67;:::i;:::-;12317:74;;12400:93;12489:3;12400:93;:::i;:::-;12518:2;12513:3;12509:12;12502:19;;12161:366;;;:::o;12533:::-;12675:3;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12772:93;12861:3;12772:93;:::i;:::-;12890:2;12885:3;12881:12;12874:19;;12533:366;;;:::o;12905:::-;13047:3;13068:67;13132:2;13127:3;13068:67;:::i;:::-;13061:74;;13144:93;13233:3;13144:93;:::i;:::-;13262:2;13257:3;13253:12;13246:19;;12905:366;;;:::o;13277:::-;13419:3;13440:67;13504:2;13499:3;13440:67;:::i;:::-;13433:74;;13516:93;13605:3;13516:93;:::i;:::-;13634:2;13629:3;13625:12;13618:19;;13277:366;;;:::o;13649:::-;13791:3;13812:67;13876:2;13871:3;13812:67;:::i;:::-;13805:74;;13888:93;13977:3;13888:93;:::i;:::-;14006:2;14001:3;13997:12;13990:19;;13649:366;;;:::o;14021:::-;14163:3;14184:67;14248:2;14243:3;14184:67;:::i;:::-;14177:74;;14260:93;14349:3;14260:93;:::i;:::-;14378:2;14373:3;14369:12;14362:19;;14021:366;;;:::o;14393:::-;14535:3;14556:67;14620:2;14615:3;14556:67;:::i;:::-;14549:74;;14632:93;14721:3;14632:93;:::i;:::-;14750:2;14745:3;14741:12;14734:19;;14393:366;;;:::o;14765:::-;14907:3;14928:67;14992:2;14987:3;14928:67;:::i;:::-;14921:74;;15004:93;15093:3;15004:93;:::i;:::-;15122:2;15117:3;15113:12;15106:19;;14765:366;;;:::o;15137:::-;15279:3;15300:67;15364:2;15359:3;15300:67;:::i;:::-;15293:74;;15376:93;15465:3;15376:93;:::i;:::-;15494:2;15489:3;15485:12;15478:19;;15137:366;;;:::o;15509:::-;15651:3;15672:67;15736:2;15731:3;15672:67;:::i;:::-;15665:74;;15748:93;15837:3;15748:93;:::i;:::-;15866:2;15861:3;15857:12;15850:19;;15509:366;;;:::o;15881:::-;16023:3;16044:67;16108:2;16103:3;16044:67;:::i;:::-;16037:74;;16120:93;16209:3;16120:93;:::i;:::-;16238:2;16233:3;16229:12;16222:19;;15881:366;;;:::o;16253:::-;16395:3;16416:67;16480:2;16475:3;16416:67;:::i;:::-;16409:74;;16492:93;16581:3;16492:93;:::i;:::-;16610:2;16605:3;16601:12;16594:19;;16253:366;;;:::o;16625:::-;16767:3;16788:67;16852:2;16847:3;16788:67;:::i;:::-;16781:74;;16864:93;16953:3;16864:93;:::i;:::-;16982:2;16977:3;16973:12;16966:19;;16625:366;;;:::o;16997:::-;17139:3;17160:67;17224:2;17219:3;17160:67;:::i;:::-;17153:74;;17236:93;17325:3;17236:93;:::i;:::-;17354:2;17349:3;17345:12;17338:19;;16997:366;;;:::o;17369:::-;17511:3;17532:67;17596:2;17591:3;17532:67;:::i;:::-;17525:74;;17608:93;17697:3;17608:93;:::i;:::-;17726:2;17721:3;17717:12;17710:19;;17369:366;;;:::o;17741:398::-;17900:3;17921:83;18002:1;17997:3;17921:83;:::i;:::-;17914:90;;18013:93;18102:3;18013:93;:::i;:::-;18131:1;18126:3;18122:11;18115:18;;17741:398;;;:::o;18145:366::-;18287:3;18308:67;18372:2;18367:3;18308:67;:::i;:::-;18301:74;;18384:93;18473:3;18384:93;:::i;:::-;18502:2;18497:3;18493:12;18486:19;;18145:366;;;:::o;18517:365::-;18659:3;18680:66;18744:1;18739:3;18680:66;:::i;:::-;18673:73;;18755:93;18844:3;18755:93;:::i;:::-;18873:2;18868:3;18864:12;18857:19;;18517:365;;;:::o;18888:366::-;19030:3;19051:67;19115:2;19110:3;19051:67;:::i;:::-;19044:74;;19127:93;19216:3;19127:93;:::i;:::-;19245:2;19240:3;19236:12;19229:19;;18888:366;;;:::o;19260:::-;19402:3;19423:67;19487:2;19482:3;19423:67;:::i;:::-;19416:74;;19499:93;19588:3;19499:93;:::i;:::-;19617:2;19612:3;19608:12;19601:19;;19260:366;;;:::o;19632:::-;19774:3;19795:67;19859:2;19854:3;19795:67;:::i;:::-;19788:74;;19871:93;19960:3;19871:93;:::i;:::-;19989:2;19984:3;19980:12;19973:19;;19632:366;;;:::o;20004:::-;20146:3;20167:67;20231:2;20226:3;20167:67;:::i;:::-;20160:74;;20243:93;20332:3;20243:93;:::i;:::-;20361:2;20356:3;20352:12;20345:19;;20004:366;;;:::o;20376:::-;20518:3;20539:67;20603:2;20598:3;20539:67;:::i;:::-;20532:74;;20615:93;20704:3;20615:93;:::i;:::-;20733:2;20728:3;20724:12;20717:19;;20376:366;;;:::o;20748:::-;20890:3;20911:67;20975:2;20970:3;20911:67;:::i;:::-;20904:74;;20987:93;21076:3;20987:93;:::i;:::-;21105:2;21100:3;21096:12;21089:19;;20748:366;;;:::o;21120:108::-;21197:24;21215:5;21197:24;:::i;:::-;21192:3;21185:37;21120:108;;:::o;21234:118::-;21321:24;21339:5;21321:24;:::i;:::-;21316:3;21309:37;21234:118;;:::o;21358:589::-;21583:3;21605:95;21696:3;21687:6;21605:95;:::i;:::-;21598:102;;21717:95;21808:3;21799:6;21717:95;:::i;:::-;21710:102;;21829:92;21917:3;21908:6;21829:92;:::i;:::-;21822:99;;21938:3;21931:10;;21358:589;;;;;;:::o;21953:379::-;22137:3;22159:147;22302:3;22159:147;:::i;:::-;22152:154;;22323:3;22316:10;;21953:379;;;:::o;22338:222::-;22431:4;22469:2;22458:9;22454:18;22446:26;;22482:71;22550:1;22539:9;22535:17;22526:6;22482:71;:::i;:::-;22338:222;;;;:::o;22566:640::-;22761:4;22799:3;22788:9;22784:19;22776:27;;22813:71;22881:1;22870:9;22866:17;22857:6;22813:71;:::i;:::-;22894:72;22962:2;22951:9;22947:18;22938:6;22894:72;:::i;:::-;22976;23044:2;23033:9;23029:18;23020:6;22976:72;:::i;:::-;23095:9;23089:4;23085:20;23080:2;23069:9;23065:18;23058:48;23123:76;23194:4;23185:6;23123:76;:::i;:::-;23115:84;;22566:640;;;;;;;:::o;23212:373::-;23355:4;23393:2;23382:9;23378:18;23370:26;;23442:9;23436:4;23432:20;23428:1;23417:9;23413:17;23406:47;23470:108;23573:4;23564:6;23470:108;:::i;:::-;23462:116;;23212:373;;;;:::o;23591:210::-;23678:4;23716:2;23705:9;23701:18;23693:26;;23729:65;23791:1;23780:9;23776:17;23767:6;23729:65;:::i;:::-;23591:210;;;;:::o;23807:313::-;23920:4;23958:2;23947:9;23943:18;23935:26;;24007:9;24001:4;23997:20;23993:1;23982:9;23978:17;23971:47;24035:78;24108:4;24099:6;24035:78;:::i;:::-;24027:86;;23807:313;;;;:::o;24126:419::-;24292:4;24330:2;24319:9;24315:18;24307:26;;24379:9;24373:4;24369:20;24365:1;24354:9;24350:17;24343:47;24407:131;24533:4;24407:131;:::i;:::-;24399:139;;24126:419;;;:::o;24551:::-;24717:4;24755:2;24744:9;24740:18;24732:26;;24804:9;24798:4;24794:20;24790:1;24779:9;24775:17;24768:47;24832:131;24958:4;24832:131;:::i;:::-;24824:139;;24551:419;;;:::o;24976:::-;25142:4;25180:2;25169:9;25165:18;25157:26;;25229:9;25223:4;25219:20;25215:1;25204:9;25200:17;25193:47;25257:131;25383:4;25257:131;:::i;:::-;25249:139;;24976:419;;;:::o;25401:::-;25567:4;25605:2;25594:9;25590:18;25582:26;;25654:9;25648:4;25644:20;25640:1;25629:9;25625:17;25618:47;25682:131;25808:4;25682:131;:::i;:::-;25674:139;;25401:419;;;:::o;25826:::-;25992:4;26030:2;26019:9;26015:18;26007:26;;26079:9;26073:4;26069:20;26065:1;26054:9;26050:17;26043:47;26107:131;26233:4;26107:131;:::i;:::-;26099:139;;25826:419;;;:::o;26251:::-;26417:4;26455:2;26444:9;26440:18;26432:26;;26504:9;26498:4;26494:20;26490:1;26479:9;26475:17;26468:47;26532:131;26658:4;26532:131;:::i;:::-;26524:139;;26251:419;;;:::o;26676:::-;26842:4;26880:2;26869:9;26865:18;26857:26;;26929:9;26923:4;26919:20;26915:1;26904:9;26900:17;26893:47;26957:131;27083:4;26957:131;:::i;:::-;26949:139;;26676:419;;;:::o;27101:::-;27267:4;27305:2;27294:9;27290:18;27282:26;;27354:9;27348:4;27344:20;27340:1;27329:9;27325:17;27318:47;27382:131;27508:4;27382:131;:::i;:::-;27374:139;;27101:419;;;:::o;27526:::-;27692:4;27730:2;27719:9;27715:18;27707:26;;27779:9;27773:4;27769:20;27765:1;27754:9;27750:17;27743:47;27807:131;27933:4;27807:131;:::i;:::-;27799:139;;27526:419;;;:::o;27951:::-;28117:4;28155:2;28144:9;28140:18;28132:26;;28204:9;28198:4;28194:20;28190:1;28179:9;28175:17;28168:47;28232:131;28358:4;28232:131;:::i;:::-;28224:139;;27951:419;;;:::o;28376:::-;28542:4;28580:2;28569:9;28565:18;28557:26;;28629:9;28623:4;28619:20;28615:1;28604:9;28600:17;28593:47;28657:131;28783:4;28657:131;:::i;:::-;28649:139;;28376:419;;;:::o;28801:::-;28967:4;29005:2;28994:9;28990:18;28982:26;;29054:9;29048:4;29044:20;29040:1;29029:9;29025:17;29018:47;29082:131;29208:4;29082:131;:::i;:::-;29074:139;;28801:419;;;:::o;29226:::-;29392:4;29430:2;29419:9;29415:18;29407:26;;29479:9;29473:4;29469:20;29465:1;29454:9;29450:17;29443:47;29507:131;29633:4;29507:131;:::i;:::-;29499:139;;29226:419;;;:::o;29651:::-;29817:4;29855:2;29844:9;29840:18;29832:26;;29904:9;29898:4;29894:20;29890:1;29879:9;29875:17;29868:47;29932:131;30058:4;29932:131;:::i;:::-;29924:139;;29651:419;;;:::o;30076:::-;30242:4;30280:2;30269:9;30265:18;30257:26;;30329:9;30323:4;30319:20;30315:1;30304:9;30300:17;30293:47;30357:131;30483:4;30357:131;:::i;:::-;30349:139;;30076:419;;;:::o;30501:::-;30667:4;30705:2;30694:9;30690:18;30682:26;;30754:9;30748:4;30744:20;30740:1;30729:9;30725:17;30718:47;30782:131;30908:4;30782:131;:::i;:::-;30774:139;;30501:419;;;:::o;30926:::-;31092:4;31130:2;31119:9;31115:18;31107:26;;31179:9;31173:4;31169:20;31165:1;31154:9;31150:17;31143:47;31207:131;31333:4;31207:131;:::i;:::-;31199:139;;30926:419;;;:::o;31351:::-;31517:4;31555:2;31544:9;31540:18;31532:26;;31604:9;31598:4;31594:20;31590:1;31579:9;31575:17;31568:47;31632:131;31758:4;31632:131;:::i;:::-;31624:139;;31351:419;;;:::o;31776:::-;31942:4;31980:2;31969:9;31965:18;31957:26;;32029:9;32023:4;32019:20;32015:1;32004:9;32000:17;31993:47;32057:131;32183:4;32057:131;:::i;:::-;32049:139;;31776:419;;;:::o;32201:::-;32367:4;32405:2;32394:9;32390:18;32382:26;;32454:9;32448:4;32444:20;32440:1;32429:9;32425:17;32418:47;32482:131;32608:4;32482:131;:::i;:::-;32474:139;;32201:419;;;:::o;32626:::-;32792:4;32830:2;32819:9;32815:18;32807:26;;32879:9;32873:4;32869:20;32865:1;32854:9;32850:17;32843:47;32907:131;33033:4;32907:131;:::i;:::-;32899:139;;32626:419;;;:::o;33051:::-;33217:4;33255:2;33244:9;33240:18;33232:26;;33304:9;33298:4;33294:20;33290:1;33279:9;33275:17;33268:47;33332:131;33458:4;33332:131;:::i;:::-;33324:139;;33051:419;;;:::o;33476:::-;33642:4;33680:2;33669:9;33665:18;33657:26;;33729:9;33723:4;33719:20;33715:1;33704:9;33700:17;33693:47;33757:131;33883:4;33757:131;:::i;:::-;33749:139;;33476:419;;;:::o;33901:::-;34067:4;34105:2;34094:9;34090:18;34082:26;;34154:9;34148:4;34144:20;34140:1;34129:9;34125:17;34118:47;34182:131;34308:4;34182:131;:::i;:::-;34174:139;;33901:419;;;:::o;34326:::-;34492:4;34530:2;34519:9;34515:18;34507:26;;34579:9;34573:4;34569:20;34565:1;34554:9;34550:17;34543:47;34607:131;34733:4;34607:131;:::i;:::-;34599:139;;34326:419;;;:::o;34751:::-;34917:4;34955:2;34944:9;34940:18;34932:26;;35004:9;34998:4;34994:20;34990:1;34979:9;34975:17;34968:47;35032:131;35158:4;35032:131;:::i;:::-;35024:139;;34751:419;;;:::o;35176:::-;35342:4;35380:2;35369:9;35365:18;35357:26;;35429:9;35423:4;35419:20;35415:1;35404:9;35400:17;35393:47;35457:131;35583:4;35457:131;:::i;:::-;35449:139;;35176:419;;;:::o;35601:222::-;35694:4;35732:2;35721:9;35717:18;35709:26;;35745:71;35813:1;35802:9;35798:17;35789:6;35745:71;:::i;:::-;35601:222;;;;:::o;35829:129::-;35863:6;35890:20;;:::i;:::-;35880:30;;35919:33;35947:4;35939:6;35919:33;:::i;:::-;35829:129;;;:::o;35964:75::-;35997:6;36030:2;36024:9;36014:19;;35964:75;:::o;36045:307::-;36106:4;36196:18;36188:6;36185:30;36182:56;;;36218:18;;:::i;:::-;36182:56;36256:29;36278:6;36256:29;:::i;:::-;36248:37;;36340:4;36334;36330:15;36322:23;;36045:307;;;:::o;36358:308::-;36420:4;36510:18;36502:6;36499:30;36496:56;;;36532:18;;:::i;:::-;36496:56;36570:29;36592:6;36570:29;:::i;:::-;36562:37;;36654:4;36648;36644:15;36636:23;;36358:308;;;:::o;36672:132::-;36739:4;36762:3;36754:11;;36792:4;36787:3;36783:14;36775:22;;36672:132;;;:::o;36810:141::-;36859:4;36882:3;36874:11;;36905:3;36902:1;36895:14;36939:4;36936:1;36926:18;36918:26;;36810:141;;;:::o;36957:114::-;37024:6;37058:5;37052:12;37042:22;;36957:114;;;:::o;37077:98::-;37128:6;37162:5;37156:12;37146:22;;37077:98;;;:::o;37181:99::-;37233:6;37267:5;37261:12;37251:22;;37181:99;;;:::o;37286:113::-;37356:4;37388;37383:3;37379:14;37371:22;;37286:113;;;:::o;37405:184::-;37504:11;37538:6;37533:3;37526:19;37578:4;37573:3;37569:14;37554:29;;37405:184;;;;:::o;37595:168::-;37678:11;37712:6;37707:3;37700:19;37752:4;37747:3;37743:14;37728:29;;37595:168;;;;:::o;37769:147::-;37870:11;37907:3;37892:18;;37769:147;;;;:::o;37922:169::-;38006:11;38040:6;38035:3;38028:19;38080:4;38075:3;38071:14;38056:29;;37922:169;;;;:::o;38097:148::-;38199:11;38236:3;38221:18;;38097:148;;;;:::o;38251:305::-;38291:3;38310:20;38328:1;38310:20;:::i;:::-;38305:25;;38344:20;38362:1;38344:20;:::i;:::-;38339:25;;38498:1;38430:66;38426:74;38423:1;38420:81;38417:107;;;38504:18;;:::i;:::-;38417:107;38548:1;38545;38541:9;38534:16;;38251:305;;;;:::o;38562:185::-;38602:1;38619:20;38637:1;38619:20;:::i;:::-;38614:25;;38653:20;38671:1;38653:20;:::i;:::-;38648:25;;38692:1;38682:35;;38697:18;;:::i;:::-;38682:35;38739:1;38736;38732:9;38727:14;;38562:185;;;;:::o;38753:348::-;38793:7;38816:20;38834:1;38816:20;:::i;:::-;38811:25;;38850:20;38868:1;38850:20;:::i;:::-;38845:25;;39038:1;38970:66;38966:74;38963:1;38960:81;38955:1;38948:9;38941:17;38937:105;38934:131;;;39045:18;;:::i;:::-;38934:131;39093:1;39090;39086:9;39075:20;;38753:348;;;;:::o;39107:191::-;39147:4;39167:20;39185:1;39167:20;:::i;:::-;39162:25;;39201:20;39219:1;39201:20;:::i;:::-;39196:25;;39240:1;39237;39234:8;39231:34;;;39245:18;;:::i;:::-;39231:34;39290:1;39287;39283:9;39275:17;;39107:191;;;;:::o;39304:96::-;39341:7;39370:24;39388:5;39370:24;:::i;:::-;39359:35;;39304:96;;;:::o;39406:90::-;39440:7;39483:5;39476:13;39469:21;39458:32;;39406:90;;;:::o;39502:149::-;39538:7;39578:66;39571:5;39567:78;39556:89;;39502:149;;;:::o;39657:126::-;39694:7;39734:42;39727:5;39723:54;39712:65;;39657:126;;;:::o;39789:77::-;39826:7;39855:5;39844:16;;39789:77;;;:::o;39872:154::-;39956:6;39951:3;39946;39933:30;40018:1;40009:6;40004:3;40000:16;39993:27;39872:154;;;:::o;40032:307::-;40100:1;40110:113;40124:6;40121:1;40118:13;40110:113;;;40209:1;40204:3;40200:11;40194:18;40190:1;40185:3;40181:11;40174:39;40146:2;40143:1;40139:10;40134:15;;40110:113;;;40241:6;40238:1;40235:13;40232:101;;;40321:1;40312:6;40307:3;40303:16;40296:27;40232:101;40081:258;40032:307;;;:::o;40345:320::-;40389:6;40426:1;40420:4;40416:12;40406:22;;40473:1;40467:4;40463:12;40494:18;40484:81;;40550:4;40542:6;40538:17;40528:27;;40484:81;40612:2;40604:6;40601:14;40581:18;40578:38;40575:84;;;40631:18;;:::i;:::-;40575:84;40396:269;40345:320;;;:::o;40671:281::-;40754:27;40776:4;40754:27;:::i;:::-;40746:6;40742:40;40884:6;40872:10;40869:22;40848:18;40836:10;40833:34;40830:62;40827:88;;;40895:18;;:::i;:::-;40827:88;40935:10;40931:2;40924:22;40714:238;40671:281;;:::o;40958:233::-;40997:3;41020:24;41038:5;41020:24;:::i;:::-;41011:33;;41066:66;41059:5;41056:77;41053:103;;;41136:18;;:::i;:::-;41053:103;41183:1;41176:5;41172:13;41165:20;;40958:233;;;:::o;41197:176::-;41229:1;41246:20;41264:1;41246:20;:::i;:::-;41241:25;;41280:20;41298:1;41280:20;:::i;:::-;41275:25;;41319:1;41309:35;;41324:18;;:::i;:::-;41309:35;41365:1;41362;41358:9;41353:14;;41197:176;;;;:::o;41379:180::-;41427:77;41424:1;41417:88;41524:4;41521:1;41514:15;41548:4;41545:1;41538:15;41565:180;41613:77;41610:1;41603:88;41710:4;41707:1;41700:15;41734:4;41731:1;41724:15;41751:180;41799:77;41796:1;41789:88;41896:4;41893:1;41886:15;41920:4;41917:1;41910:15;41937:180;41985:77;41982:1;41975:88;42082:4;42079:1;42072:15;42106:4;42103:1;42096:15;42123:180;42171:77;42168:1;42161:88;42268:4;42265:1;42258:15;42292:4;42289:1;42282:15;42309:117;42418:1;42415;42408:12;42432:117;42541:1;42538;42531:12;42555:117;42664:1;42661;42654:12;42678:117;42787:1;42784;42777:12;42801:102;42842:6;42893:2;42889:7;42884:2;42877:5;42873:14;42869:28;42859:38;;42801:102;;;:::o;42909:221::-;43049:34;43045:1;43037:6;43033:14;43026:58;43118:4;43113:2;43105:6;43101:15;43094:29;42909:221;:::o;43136:233::-;43276:34;43272:1;43264:6;43260:14;43253:58;43345:16;43340:2;43332:6;43328:15;43321:41;43136:233;:::o;43375:225::-;43515:34;43511:1;43503:6;43499:14;43492:58;43584:8;43579:2;43571:6;43567:15;43560:33;43375:225;:::o;43606:229::-;43746:34;43742:1;43734:6;43730:14;43723:58;43815:12;43810:2;43802:6;43798:15;43791:37;43606:229;:::o;43841:176::-;43981:28;43977:1;43969:6;43965:14;43958:52;43841:176;:::o;44023:222::-;44163:34;44159:1;44151:6;44147:14;44140:58;44232:5;44227:2;44219:6;44215:15;44208:30;44023:222;:::o;44251:224::-;44391:34;44387:1;44379:6;44375:14;44368:58;44460:7;44455:2;44447:6;44443:15;44436:32;44251:224;:::o;44481:172::-;44621:24;44617:1;44609:6;44605:14;44598:48;44481:172;:::o;44659:181::-;44799:33;44795:1;44787:6;44783:14;44776:57;44659:181;:::o;44846:173::-;44986:25;44982:1;44974:6;44970:14;44963:49;44846:173;:::o;45025:244::-;45165:34;45161:1;45153:6;45149:14;45142:58;45234:27;45229:2;45221:6;45217:15;45210:52;45025:244;:::o;45275:230::-;45415:34;45411:1;45403:6;45399:14;45392:58;45484:13;45479:2;45471:6;45467:15;45460:38;45275:230;:::o;45511:225::-;45651:34;45647:1;45639:6;45635:14;45628:58;45720:8;45715:2;45707:6;45703:15;45696:33;45511:225;:::o;45742:182::-;45882:34;45878:1;45870:6;45866:14;45859:58;45742:182;:::o;45930:173::-;46070:25;46066:1;46058:6;46054:14;46047:49;45930:173;:::o;46109:234::-;46249:34;46245:1;46237:6;46233:14;46226:58;46318:17;46313:2;46305:6;46301:15;46294:42;46109:234;:::o;46349:176::-;46489:28;46485:1;46477:6;46473:14;46466:52;46349:176;:::o;46531:237::-;46671:34;46667:1;46659:6;46655:14;46648:58;46740:20;46735:2;46727:6;46723:15;46716:45;46531:237;:::o;46774:221::-;46914:34;46910:1;46902:6;46898:14;46891:58;46983:4;46978:2;46970:6;46966:15;46959:29;46774:221;:::o;47001:114::-;;:::o;47121:166::-;47261:18;47257:1;47249:6;47245:14;47238:42;47121:166;:::o;47293:158::-;47433:10;47429:1;47421:6;47417:14;47410:34;47293:158;:::o;47457:238::-;47597:34;47593:1;47585:6;47581:14;47574:58;47666:21;47661:2;47653:6;47649:15;47642:46;47457:238;:::o;47701:220::-;47841:34;47837:1;47829:6;47825:14;47818:58;47910:3;47905:2;47897:6;47893:15;47886:28;47701:220;:::o;47927:227::-;48067:34;48063:1;48055:6;48051:14;48044:58;48136:10;48131:2;48123:6;48119:15;48112:35;47927:227;:::o;48160:233::-;48300:34;48296:1;48288:6;48284:14;48277:58;48369:16;48364:2;48356:6;48352:15;48345:41;48160:233;:::o;48399:234::-;48539:34;48535:1;48527:6;48523:14;48516:58;48608:17;48603:2;48595:6;48591:15;48584:42;48399:234;:::o;48639:232::-;48779:34;48775:1;48767:6;48763:14;48756:58;48848:15;48843:2;48835:6;48831:15;48824:40;48639:232;:::o;48877:122::-;48950:24;48968:5;48950:24;:::i;:::-;48943:5;48940:35;48930:63;;48989:1;48986;48979:12;48930:63;48877:122;:::o;49005:116::-;49075:21;49090:5;49075:21;:::i;:::-;49068:5;49065:32;49055:60;;49111:1;49108;49101:12;49055:60;49005:116;:::o;49127:120::-;49199:23;49216:5;49199:23;:::i;:::-;49192:5;49189:34;49179:62;;49237:1;49234;49227:12;49179:62;49127:120;:::o;49253:122::-;49326:24;49344:5;49326:24;:::i;:::-;49319:5;49316:35;49306:63;;49365:1;49362;49355:12;49306:63;49253:122;:::o
Swarm Source
ipfs://824dbd822647812d8f88889c84699825ad504a47c26cb5fda20275addb6a8c62
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.