More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 14,364 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 70626251 | 12 hrs ago | IN | 0 POL | 0.00074637 | ||||
Set Approval For... | 70231869 | 10 days ago | IN | 0 POL | 0.00140373 | ||||
Set Approval For... | 68893538 | 43 days ago | IN | 0 POL | 0.00523452 | ||||
Set Approval For... | 68123586 | 62 days ago | IN | 0 POL | 0.00140373 | ||||
Set Approval For... | 67449233 | 79 days ago | IN | 0 POL | 0.00166834 | ||||
Set Approval For... | 66803615 | 95 days ago | IN | 0 POL | 0.00221108 | ||||
Set Approval For... | 66257009 | 109 days ago | IN | 0 POL | 0.00244977 | ||||
Set Approval For... | 66215913 | 110 days ago | IN | 0 POL | 0.00256253 | ||||
Set Approval For... | 66210081 | 111 days ago | IN | 0 POL | 0.0007007 | ||||
Set Approval For... | 66197264 | 111 days ago | IN | 0 POL | 0.00082088 | ||||
Set Approval For... | 66197178 | 111 days ago | IN | 0 POL | 0.00082088 | ||||
Set Approval For... | 64602576 | 151 days ago | IN | 0 POL | 0.00315337 | ||||
Set Approval For... | 64256940 | 160 days ago | IN | 0 POL | 0.00179795 | ||||
Set Approval For... | 63956113 | 167 days ago | IN | 0 POL | 0.00373225 | ||||
Set Approval For... | 63674023 | 174 days ago | IN | 0 POL | 0.01238052 | ||||
Set Approval For... | 63674018 | 174 days ago | IN | 0 POL | 0.01250457 | ||||
Set Approval For... | 63674013 | 174 days ago | IN | 0 POL | 0.01236399 | ||||
Set Approval For... | 63165999 | 187 days ago | IN | 0 POL | 0.00082093 | ||||
Set Approval For... | 62274256 | 209 days ago | IN | 0 POL | 0.00119419 | ||||
Set Approval For... | 61572771 | 226 days ago | IN | 0 POL | 0.0015441 | ||||
Set Approval For... | 59623287 | 275 days ago | IN | 0 POL | 0.00092052 | ||||
Set Approval For... | 59623247 | 275 days ago | IN | 0 POL | 0.00092052 | ||||
Set Approval For... | 59623243 | 275 days ago | IN | 0 POL | 0.00092052 | ||||
Set Approval For... | 59582390 | 277 days ago | IN | 0 POL | 0.000821 | ||||
Set Approval For... | 59581640 | 277 days ago | IN | 0 POL | 0.00079612 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
18473549 | 1334 days ago | 39,700 POL | ||||
18441498 | 1335 days ago | 65,500 POL | ||||
18388438 | 1336 days ago | 20,200 POL | ||||
18379700 | 1336 days ago | 4,300 POL | ||||
18371507 | 1337 days ago | 21,600 POL | ||||
18348647 | 1337 days ago | 3,300 POL | ||||
18344818 | 1337 days ago | 10,000 POL | ||||
18332677 | 1338 days ago | 20,800 POL | ||||
18314357 | 1338 days ago | 15,700 POL | ||||
18308733 | 1338 days ago | 0.01 POL | ||||
18295248 | 1339 days ago | 200 POL | ||||
18293816 | 1339 days ago | 6,700 POL | ||||
18279579 | 1339 days ago | 11,800 POL | ||||
18262913 | 1339 days ago | 8,700 POL | ||||
18237186 | 1340 days ago | 6,200 POL | ||||
18220769 | 1341 days ago | 10,700 POL | ||||
18202950 | 1341 days ago | 11,700 POL | ||||
18182128 | 1342 days ago | 25,100 POL | ||||
18157916 | 1342 days ago | 17,200 POL | ||||
18131173 | 1343 days ago | 18,200 POL | ||||
18111918 | 1344 days ago | 15,800 POL | ||||
18093273 | 1344 days ago | 8,700 POL | ||||
18087176 | 1344 days ago | 16,400 POL | ||||
18079006 | 1344 days ago | 2,600 POL | ||||
18077483 | 1344 days ago | 63,000 POL |
Loading...
Loading
Contract Name:
MaticPunks
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-08-11 */ // SPDX-License-Identifier: MIT 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; } } 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); } 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; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } 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); } 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); } 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; } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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; } } 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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ 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; } } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant alphabet = "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] = alphabet[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping (uint256 => address) private _owners; // Mapping owner address to token count mapping (address => uint256) private _balances; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden * in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { // solhint-disable-next-line no-inline-assembly 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` 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 { } } // <3 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(); } } // MaticPunks // maticpunks.net pragma solidity ^0.8.0; contract MaticPunks is Ownable, ERC721Enumerable, ReentrancyGuard { using Counters for Counters.Counter; using Strings for uint256; bool public saleIsActive = false; mapping(uint => string) public punkNames; uint256 public constant MAX_MINTABLE_AT_ONCE = 20; uint256 private _price = 100 ether; event punkNameChange(address _by, uint _tokenId, string _name); constructor() ERC721("MaticPunks", "MPNK") {} uint256[10000] private _availableTokens; uint256 private _numAvailableTokens = 10000; uint256 private punkReserve = 200; uint256 private _lastTokenIdMintedInInitialSet = 10000; function numTotalPunks() public view virtual returns (uint256) { return 10000; } function reservePunks(address _to, uint256 _reserveAmount) public onlyOwner { uint256 totalSupply = totalSupply(); require(totalSupply + _reserveAmount <= numTotalPunks(), "There aren't this many punks left."); require(_reserveAmount > 0 && _reserveAmount <= punkReserve, "Not enough reserve left for team"); _mintReserve(_to, _reserveAmount); punkReserve = punkReserve - _reserveAmount; } function mint(uint256 _numToMint) public payable nonReentrant() { require(saleIsActive, "Sale hasn't started."); uint256 totalSupply = totalSupply(); require( totalSupply + _numToMint <= numTotalPunks(), "There aren't this many punks left." ); uint256 costForMintingPunks = _price * _numToMint; require( msg.value >= costForMintingPunks, "Too little sent, please send more MATIC." ); if (msg.value > costForMintingPunks) { payable(msg.sender).transfer(msg.value - costForMintingPunks); } _mint(_numToMint); } // internal minting function function _mint(uint256 _numToMint) internal { require(_numToMint <= MAX_MINTABLE_AT_ONCE, "Minting too many at once."); uint256 updatedNumAvailableTokens = _numAvailableTokens; for (uint256 i = 0; i < _numToMint; i++) { uint256 newTokenId = useRandomAvailableToken(_numToMint, i); _safeMint(msg.sender, newTokenId); updatedNumAvailableTokens--; } _numAvailableTokens = updatedNumAvailableTokens; } function _mintReserve(address _to,uint256 _numToMint) internal onlyOwner { require(_numToMint <= MAX_MINTABLE_AT_ONCE, "Minting too many at once."); uint256 updatedNumAvailableTokens = _numAvailableTokens; for (uint256 i = 0; i < _numToMint; i++) { uint256 newTokenId = useRandomAvailableToken(_numToMint, i); _safeMint(_to, newTokenId); updatedNumAvailableTokens--; } _numAvailableTokens = updatedNumAvailableTokens; } function useRandomAvailableToken(uint256 _numToFetch, uint256 _i) internal returns (uint256) { uint256 randomNum = uint256( keccak256( abi.encode( msg.sender, tx.gasprice, block.number, block.timestamp, blockhash(block.number - 1), _numToFetch, _i ) ) ); uint256 randomIndex = randomNum % _numAvailableTokens; return useAvailableTokenAtIndex(randomIndex); } function useAvailableTokenAtIndex(uint256 indexToUse) internal returns (uint256) { uint256 valAtIndex = _availableTokens[indexToUse]; uint256 result; if (valAtIndex == 0) { // This means the index itself is still an available token result = indexToUse; } else { // This means the index itself is not an available token, but the val at that index is. result = valAtIndex; } uint256 lastIndex = _numAvailableTokens - 1; if (indexToUse != lastIndex) { // Replace the value at indexToUse, now that it's been used. // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards. uint256 lastValInArray = _availableTokens[lastIndex]; if (lastValInArray == 0) { // This means the index itself is still an available token _availableTokens[indexToUse] = lastIndex; } else { // This means the index itself is not an available token, but the val at that index is. _availableTokens[indexToUse] = lastValInArray; } } _numAvailableTokens--; return result; } function changePunkName(uint _tokenId, string memory _name) public { require(ownerOf(_tokenId) == msg.sender, "Hey, your wallet doesn't own this punk!"); require(sha256(bytes(_name)) != sha256(bytes(punkNames[_tokenId])), "New name is same as the current one"); punkNames[_tokenId] = _name; emit punkNameChange(msg.sender, _tokenId, _name); } function viewPunkName(uint _tokenId) public view returns( string memory ){ require( _tokenId < totalSupply(), "Choose a punk within range" ); return punkNames[_tokenId]; } function punkNamesOfOwner(address _owner) external view returns(string[] memory ) { uint256 tokenCount = balanceOf(_owner); if (tokenCount == 0) { // Return an empty array return new string[](0); } else { string[] memory result = new string[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = punkNames[ tokenOfOwnerByIndex(_owner, index) ] ; } return result; } } function getPrice() public view returns (uint256){ return _price; } function getCostForMintingPunks(uint256 _numToMint) public view returns (uint256) { require( totalSupply() + _numToMint <= numTotalPunks(), "There are not this many punks left." ); require( _numToMint <= MAX_MINTABLE_AT_ONCE, "You cannot mint that many punks." ); return _numToMint * _price; } function getPunksBelongingToOwner(address _owner) external view returns (uint256[] memory) { uint256 numPunks = balanceOf(_owner); if (numPunks == 0) { return new uint256[](0); } else { uint256[] memory result = new uint256[](numPunks); for (uint256 i = 0; i < numPunks; i++) { result[i] = tokenOfOwnerByIndex(_owner, i); } return result; } } string private _baseTokenURI; function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { string memory base = _baseURI(); string memory _tokenURI = Strings.toString(_tokenId); string memory ending = ".json"; // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } return string(abi.encodePacked(base, _tokenURI, ending)); } function setPrice(uint256 _newPrice) public onlyOwner() { _price = _newPrice; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function setBaseURI(string memory baseURI) external onlyOwner { _baseTokenURI = baseURI; } function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"punkNameChange","type":"event"},{"inputs":[],"name":"MAX_MINTABLE_AT_ONCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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"},{"internalType":"string","name":"_name","type":"string"}],"name":"changePunkName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToMint","type":"uint256"}],"name":"getCostForMintingPunks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getPunksBelongingToOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numToMint","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTotalPunks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"punkNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"punkNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reservePunks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"viewPunkName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c60006101000a81548160ff02191690831515021790555068056bc75e2d63100000600e5561271061271f5560c861272055612710612721553480156200004d57600080fd5b506040518060400160405280600a81526020017f4d6174696350756e6b73000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d504e4b000000000000000000000000000000000000000000000000000000008152506000620000cc620001ac60201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350816001908051906020019062000182929190620001b4565b5080600290805190602001906200019b929190620001b4565b5050506001600b81905550620002c9565b600033905090565b828054620001c29062000264565b90600052602060002090601f016020900481019282620001e6576000855562000232565b82601f106200020157805160ff191683800117855562000232565b8280016001018555821562000232579182015b828111156200023157825182559160200191906001019062000214565b5b50905062000241919062000245565b5090565b5b808211156200026057600081600090555060010162000246565b5090565b600060028204905060018216806200027d57607f821691505b602082108114156200029457620002936200029a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61538380620002d96000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063b88d4fde116100a0578063e8e732a11161006f578063e8e732a11461076a578063e985e9c5146107a7578063eb8d2444146107e4578063f2fde38b1461080f578063ff9627fb1461083857610204565b8063b88d4fde1461069c578063bc4eda10146106c5578063c87b56dd14610702578063cbf775b21461073f57610204565b806391b7f5ed116100e757806391b7f5ed146105d857806395d89b411461060157806398d5fdca1461062c578063a0712d6814610657578063a22cb4651461067357610204565b8063715018a6146105305780637a5bba231461054757806383db3c18146105705780638da5cb5b146105ad57610204565b806334918dfd1161019b57806355f804b31161016a57806355f804b3146104255780635b5a493d1461044e5780636352211e14610479578063709ab2d8146104b657806370a08231146104f357610204565b806334918dfd146103915780633ccfd60b146103a857806342842e0e146103bf5780634f6ccce7146103e857610204565b806318160ddd116101d757806318160ddd146102d757806318576dbe1461030257806323b872dd1461032b5780632f745c591461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613aca565b610875565b60405161023d9190614a13565b60405180910390f35b34801561025257600080fd5b5061025b610887565b6040516102689190614a2e565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613b5d565b610919565b6040516102a591906148bb565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613a65565b61099e565b005b3480156102e357600080fd5b506102ec610ab6565b6040516102f99190614dd0565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613a65565b610ac3565b005b34801561033757600080fd5b50610352600480360381019061034d919061395f565b610c17565b005b34801561036057600080fd5b5061037b60048036038101906103769190613a65565b610c77565b6040516103889190614dd0565b60405180910390f35b34801561039d57600080fd5b506103a6610d1c565b005b3480156103b457600080fd5b506103bd610dc4565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061395f565b610e8f565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190613b5d565b610eaf565b60405161041c9190614dd0565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613b1c565b610f46565b005b34801561045a57600080fd5b50610463610fdd565b6040516104709190614dd0565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190613b5d565b610fe7565b6040516104ad91906148bb565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613b5d565b611099565b6040516104ea9190614a2e565b60405180910390f35b3480156104ff57600080fd5b5061051a600480360381019061051591906138fa565b611187565b6040516105279190614dd0565b60405180910390f35b34801561053c57600080fd5b5061054561123f565b005b34801561055357600080fd5b5061056e60048036038101906105699190613b86565b611379565b005b34801561057c57600080fd5b50610597600480360381019061059291906138fa565b611549565b6040516105a491906149cf565b60405180910390f35b3480156105b957600080fd5b506105c2611769565b6040516105cf91906148bb565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190613b5d565b611792565b005b34801561060d57600080fd5b50610616611818565b6040516106239190614a2e565b60405180910390f35b34801561063857600080fd5b506106416118aa565b60405161064e9190614dd0565b60405180910390f35b610671600480360381019061066c9190613b5d565b6118b4565b005b34801561067f57600080fd5b5061069a60048036038101906106959190613a29565b611a78565b005b3480156106a857600080fd5b506106c360048036038101906106be91906139ae565b611bf9565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613b5d565b611c5b565b6040516106f99190614dd0565b60405180910390f35b34801561070e57600080fd5b5061072960048036038101906107249190613b5d565b611d12565b6040516107369190614a2e565b60405180910390f35b34801561074b57600080fd5b50610754611dab565b6040516107619190614dd0565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906138fa565b611db0565b60405161079e91906149f1565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c99190613923565b611f2c565b6040516107db9190614a13565b60405180910390f35b3480156107f057600080fd5b506107f9611fc0565b6040516108069190614a13565b60405180910390f35b34801561081b57600080fd5b50610836600480360381019061083191906138fa565b611fd3565b005b34801561084457600080fd5b5061085f600480360381019061085a9190613b5d565b61217c565b60405161086c9190614a2e565b60405180910390f35b60006108808261221c565b9050919050565b60606001805461089690615161565b80601f01602080910402602001604051908101604052809291908181526020018280546108c290615161565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b600061092482612296565b610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095a90614c30565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a982610fe7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1190614cf0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a39612302565b73ffffffffffffffffffffffffffffffffffffffff161480610a685750610a6781610a62612302565b611f2c565b5b610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90614b70565b60405180910390fd5b610ab1838361230a565b505050565b6000600980549050905090565b610acb612302565b73ffffffffffffffffffffffffffffffffffffffff16610ae9611769565b73ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3690614c50565b60405180910390fd5b6000610b49610ab6565b9050610b53610fdd565b8282610b5f9190614f62565b1115610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790614d70565b60405180910390fd5b600082118015610bb35750612720548211155b610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990614af0565b60405180910390fd5b610bfc83836123c3565b8161272054610c0b9190615043565b61272081905550505050565b610c28610c22612302565b826124de565b610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90614d30565b60405180910390fd5b610c728383836125bc565b505050565b6000610c8283611187565b8210610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90614a70565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d24612302565b73ffffffffffffffffffffffffffffffffffffffff16610d42611769565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90614c50565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610dcc612302565b73ffffffffffffffffffffffffffffffffffffffff16610dea611769565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790614c50565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e8b573d6000803e3d6000fd5b5050565b610eaa83838360405180602001604052806000815250611bf9565b505050565b6000610eb9610ab6565b8210610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190614d50565b60405180910390fd5b60098281548110610f34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f4e612302565b73ffffffffffffffffffffffffffffffffffffffff16610f6c611769565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990614c50565b60405180910390fd5b806127229080519060200190610fd9929190613709565b5050565b6000612710905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790614bd0565b60405180910390fd5b80915050919050565b60606110a3610ab6565b82106110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90614d90565b60405180910390fd5b600d6000838152602001908152602001600020805461110290615161565b80601f016020809104026020016040519081016040528092919081815260200182805461112e90615161565b801561117b5780601f106111505761010080835404028352916020019161117b565b820191906000526020600020905b81548152906001019060200180831161115e57829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614bb0565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611247612302565b73ffffffffffffffffffffffffffffffffffffffff16611265611769565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614c50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1661139983610fe7565b73ffffffffffffffffffffffffffffffffffffffff16146113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690614cb0565b60405180910390fd5b6002600d60008481526020019081526020016000206040516114119190614873565b602060405180830381855afa15801561142e573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906114519190613aa1565b600282604051611461919061485c565b602060405180830381855afa15801561147e573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906114a19190613aa1565b14156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990614c90565b60405180910390fd5b80600d60008481526020019081526020016000209080519060200190611509929190613709565b507f99538d87dfb7b682ffe83c19f1ed4d493ad9048cab00e6cf62fc1ff533cc09f933838360405161153d93929190614922565b60405180910390a15050565b6060600061155683611187565b905060008114156115de57600067ffffffffffffffff8111156115a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115d557816020015b60608152602001906001900390816115c05790505b50915050611764565b60008167ffffffffffffffff811115611620577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561165357816020015b606081526020019060019003908161163e5790505b50905060005b8281101561175d57600d600061166f8784610c77565b8152602001908152602001600020805461168890615161565b80601f01602080910402602001604051908101604052809291908181526020018280546116b490615161565b80156117015780601f106116d657610100808354040283529160200191611701565b820191906000526020600020905b8154815290600101906020018083116116e457829003601f168201915b505050505082828151811061173f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250808061175590615193565b915050611659565b8193505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61179a612302565b73ffffffffffffffffffffffffffffffffffffffff166117b8611769565b73ffffffffffffffffffffffffffffffffffffffff161461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590614c50565b60405180910390fd5b80600e8190555050565b60606002805461182790615161565b80601f016020809104026020016040519081016040528092919081815260200182805461185390615161565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b6000600e54905090565b6002600b5414156118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f190614db0565b60405180910390fd5b6002600b81905550600c60009054906101000a900460ff16611951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194890614a50565b60405180910390fd5b600061195b610ab6565b9050611965610fdd565b82826119719190614f62565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614d70565b60405180910390fd5b600082600e546119c29190614fe9565b905080341015611a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fe90614b90565b60405180910390fd5b80341115611a62573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611a359190615043565b9081150290604051600060405180830381858888f19350505050158015611a60573d6000803e3d6000fd5b505b611a6b83612818565b50506001600b8190555050565b611a80612302565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590614b30565b60405180910390fd5b8060066000611afb612302565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ba8612302565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bed9190614a13565b60405180910390a35050565b611c0a611c04612302565b836124de565b611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090614d30565b60405180910390fd5b611c55848484846128b6565b50505050565b6000611c65610fdd565b82611c6e610ab6565b611c789190614f62565b1115611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090614d10565b60405180910390fd5b6014821115611cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf490614c10565b60405180910390fd5b600e5482611d0b9190614fe9565b9050919050565b60606000611d1e612912565b90506000611d2b846129a5565b905060006040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152509050600083511415611d7c57819350505050611da6565b828282604051602001611d919392919061488a565b60405160208183030381529060405293505050505b919050565b601481565b60606000611dbd83611187565b90506000811415611e4057600067ffffffffffffffff811115611e09577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e375781602001602082028036833780820191505090505b50915050611f27565b60008167ffffffffffffffff811115611e82577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611eb05781602001602082028036833780820191505090505b50905060005b82811015611f2057611ec88582610c77565b828281518110611f01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611f1890615193565b915050611eb6565b5080925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611fdb612302565b73ffffffffffffffffffffffffffffffffffffffff16611ff9611769565b73ffffffffffffffffffffffffffffffffffffffff161461204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204690614c50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b690614ab0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d602052806000526040600020600091509050805461219b90615161565b80601f01602080910402602001604051908101604052809291908181526020018280546121c790615161565b80156122145780601f106121e957610100808354040283529160200191612214565b820191906000526020600020905b8154815290600101906020018083116121f757829003601f168201915b505050505081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061228f575061228e82612b52565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661237d83610fe7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123cb612302565b73ffffffffffffffffffffffffffffffffffffffff166123e9611769565b73ffffffffffffffffffffffffffffffffffffffff161461243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690614c50565b60405180910390fd5b6014811115612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90614cd0565b60405180910390fd5b600061271f54905060005b828110156124d05760006124a28483612c34565b90506124ae8582612ca2565b82806124b990615137565b9350505080806124c890615193565b91505061248e565b508061271f81905550505050565b60006124e982612296565b612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90614b50565b60405180910390fd5b600061253383610fe7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125a257508373ffffffffffffffffffffffffffffffffffffffff1661258a84610919565b73ffffffffffffffffffffffffffffffffffffffff16145b806125b357506125b28185611f2c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125dc82610fe7565b73ffffffffffffffffffffffffffffffffffffffff1614612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614c70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269990614b10565b60405180910390fd5b6126ad838383612cc0565b6126b860008261230a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127089190615043565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461275f9190614f62565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b601481111561285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285390614cd0565b60405180910390fd5b600061271f54905060005b828110156128a957600061287b8483612c34565b90506128873382612ca2565b828061289290615137565b9350505080806128a190615193565b915050612867565b508061271f819055505050565b6128c18484846125bc565b6128cd84848484612cd0565b61290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390614a90565b60405180910390fd5b50505050565b6060612722805461292290615161565b80601f016020809104026020016040519081016040528092919081815260200182805461294e90615161565b801561299b5780601f106129705761010080835404028352916020019161299b565b820191906000526020600020905b81548152906001019060200180831161297e57829003601f168201915b5050505050905090565b606060008214156129ed576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b4d565b600082905060005b60008214612a1f578080612a0890615193565b915050600a82612a189190614fb8565b91506129f5565b60008167ffffffffffffffff811115612a61577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a935781602001600182028036833780820191505090505b5090505b60008514612b4657600182612aac9190615043565b9150600a85612abb91906151dc565b6030612ac79190614f62565b60f81b818381518110612b03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b3f9190614fb8565b9450612a97565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c1d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c2d5750612c2c82612e67565b5b9050919050565b600080333a4342600143612c489190615043565b408888604051602001612c619796959493929190614960565b6040516020818303038152906040528051906020012060001c9050600061271f5482612c8d91906151dc565b9050612c9881612ed1565b9250505092915050565b612cbc82826040518060200160405280600081525061303c565b5050565b612ccb838383613097565b505050565b6000612cf18473ffffffffffffffffffffffffffffffffffffffff166131ab565b15612e5a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1a612302565b8786866040518563ffffffff1660e01b8152600401612d3c94939291906148d6565b602060405180830381600087803b158015612d5657600080fd5b505af1925050508015612d8757506040513d601f19601f82011682018060405250810190612d849190613af3565b60015b612e0a573d8060008114612db7576040519150601f19603f3d011682016040523d82523d6000602084013e612dbc565b606091505b50600081511415612e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df990614a90565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e5f565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600f836127108110612f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050600080821415612f2557839050612f29565b8190505b6000600161271f54612f3b9190615043565b9050808514613018576000600f826127108110612f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015490506000811415612fd45781600f876127108110612fca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550613016565b80600f876127108110613010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b505b61271f600081548092919061302c90615137565b9190505550819350505050919050565b61304683836131be565b6130536000848484612cd0565b613092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308990614a90565b60405180910390fd5b505050565b6130a283838361338c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130e5576130e081613391565b613124565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131235761312283826133da565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131675761316281613547565b6131a6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131a5576131a4828261368a565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561322e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322590614bf0565b60405180910390fd5b61323781612296565b15613277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326e90614ad0565b60405180910390fd5b61328360008383612cc0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132d39190614f62565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133e784611187565b6133f19190615043565b90506000600860008481526020019081526020016000205490508181146134d6576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061355b9190615043565b90506000600a60008481526020019081526020016000205490506000600983815481106135b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600983815481106135f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061366e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061369583611187565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461371590615161565b90600052602060002090601f016020900481019282613737576000855561377e565b82601f1061375057805160ff191683800117855561377e565b8280016001018555821561377e579182015b8281111561377d578251825591602001919060010190613762565b5b50905061378b919061378f565b5090565b5b808211156137a8576000816000905550600101613790565b5090565b60006137bf6137ba84614e1c565b614deb565b9050828152602081018484840111156137d757600080fd5b6137e28482856150f5565b509392505050565b60006137fd6137f884614e4c565b614deb565b90508281526020810184848401111561381557600080fd5b6138208482856150f5565b509392505050565b600081359050613837816152da565b92915050565b60008135905061384c816152f1565b92915050565b60008151905061386181615308565b92915050565b6000813590506138768161531f565b92915050565b60008151905061388b8161531f565b92915050565b600082601f8301126138a257600080fd5b81356138b28482602086016137ac565b91505092915050565b600082601f8301126138cc57600080fd5b81356138dc8482602086016137ea565b91505092915050565b6000813590506138f481615336565b92915050565b60006020828403121561390c57600080fd5b600061391a84828501613828565b91505092915050565b6000806040838503121561393657600080fd5b600061394485828601613828565b925050602061395585828601613828565b9150509250929050565b60008060006060848603121561397457600080fd5b600061398286828701613828565b935050602061399386828701613828565b92505060406139a4868287016138e5565b9150509250925092565b600080600080608085870312156139c457600080fd5b60006139d287828801613828565b94505060206139e387828801613828565b93505060406139f4878288016138e5565b925050606085013567ffffffffffffffff811115613a1157600080fd5b613a1d87828801613891565b91505092959194509250565b60008060408385031215613a3c57600080fd5b6000613a4a85828601613828565b9250506020613a5b8582860161383d565b9150509250929050565b60008060408385031215613a7857600080fd5b6000613a8685828601613828565b9250506020613a97858286016138e5565b9150509250929050565b600060208284031215613ab357600080fd5b6000613ac184828501613852565b91505092915050565b600060208284031215613adc57600080fd5b6000613aea84828501613867565b91505092915050565b600060208284031215613b0557600080fd5b6000613b138482850161387c565b91505092915050565b600060208284031215613b2e57600080fd5b600082013567ffffffffffffffff811115613b4857600080fd5b613b54848285016138bb565b91505092915050565b600060208284031215613b6f57600080fd5b6000613b7d848285016138e5565b91505092915050565b60008060408385031215613b9957600080fd5b6000613ba7858286016138e5565b925050602083013567ffffffffffffffff811115613bc457600080fd5b613bd0858286016138bb565b9150509250929050565b6000613be68383613def565b905092915050565b6000613bfa838361483e565b60208301905092915050565b613c0f81615077565b82525050565b6000613c2082614eb1565b613c2a8185614ef7565b935083602082028501613c3c85614e7c565b8060005b85811015613c785784840389528151613c598582613bda565b9450613c6483614edd565b925060208a01995050600181019050613c40565b50829750879550505050505092915050565b6000613c9582614ebc565b613c9f8185614f08565b9350613caa83614e8c565b8060005b83811015613cdb578151613cc28882613bee565b9750613ccd83614eea565b925050600181019050613cae565b5085935050505092915050565b613cf181615089565b82525050565b613d0081615095565b82525050565b6000613d1182614ec7565b613d1b8185614f19565b9350613d2b818560208601615104565b613d34816152c9565b840191505092915050565b6000613d4a82614ec7565b613d548185614f2a565b9350613d64818560208601615104565b80840191505092915050565b60008154613d7d81615161565b613d878186614f2a565b94506001821660008114613da25760018114613db357613de6565b60ff19831686528186019350613de6565b613dbc85614e9c565b60005b83811015613dde57815481890152600182019150602081019050613dbf565b838801955050505b50505092915050565b6000613dfa82614ed2565b613e048185614f35565b9350613e14818560208601615104565b613e1d816152c9565b840191505092915050565b6000613e3382614ed2565b613e3d8185614f46565b9350613e4d818560208601615104565b613e56816152c9565b840191505092915050565b6000613e6c82614ed2565b613e768185614f57565b9350613e86818560208601615104565b80840191505092915050565b6000613e9f601483614f46565b91507f53616c65206861736e277420737461727465642e0000000000000000000000006000830152602082019050919050565b6000613edf602b83614f46565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613f45603283614f46565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613fab602683614f46565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614011601c83614f46565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614051602083614f46565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000614091602483614f46565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f7601983614f46565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614137602c83614f46565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061419d603883614f46565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614203602883614f46565b91507f546f6f206c6974746c652073656e742c20706c656173652073656e64206d6f7260008301527f65204d415449432e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614269602a83614f46565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006142cf602983614f46565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614335602083614f46565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614375602083614f46565b91507f596f752063616e6e6f74206d696e742074686174206d616e792070756e6b732e6000830152602082019050919050565b60006143b5602c83614f46565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061441b602083614f46565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061445b602983614f46565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c1602383614f46565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614527602783614f46565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f732070756e6b21000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061458d601983614f46565b91507f4d696e74696e6720746f6f206d616e79206174206f6e63652e000000000000006000830152602082019050919050565b60006145cd602183614f46565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614633602383614f46565b91507f546865726520617265206e6f742074686973206d616e792070756e6b73206c6560008301527f66742e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614699603183614f46565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006146ff602c83614f46565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614765602283614f46565b91507f5468657265206172656e27742074686973206d616e792070756e6b73206c656660008301527f742e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147cb601a83614f46565b91507f43686f6f736520612070756e6b2077697468696e2072616e67650000000000006000830152602082019050919050565b600061480b601f83614f46565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b614847816150eb565b82525050565b614856816150eb565b82525050565b60006148688284613d3f565b915081905092915050565b600061487f8284613d70565b915081905092915050565b60006148968286613e61565b91506148a28285613e61565b91506148ae8284613e61565b9150819050949350505050565b60006020820190506148d06000830184613c06565b92915050565b60006080820190506148eb6000830187613c06565b6148f86020830186613c06565b614905604083018561484d565b81810360608301526149178184613d06565b905095945050505050565b60006060820190506149376000830186613c06565b614944602083018561484d565b81810360408301526149568184613e28565b9050949350505050565b600060e082019050614975600083018a613c06565b614982602083018961484d565b61498f604083018861484d565b61499c606083018761484d565b6149a96080830186613cf7565b6149b660a083018561484d565b6149c360c083018461484d565b98975050505050505050565b600060208201905081810360008301526149e98184613c15565b905092915050565b60006020820190508181036000830152614a0b8184613c8a565b905092915050565b6000602082019050614a286000830184613ce8565b92915050565b60006020820190508181036000830152614a488184613e28565b905092915050565b60006020820190508181036000830152614a6981613e92565b9050919050565b60006020820190508181036000830152614a8981613ed2565b9050919050565b60006020820190508181036000830152614aa981613f38565b9050919050565b60006020820190508181036000830152614ac981613f9e565b9050919050565b60006020820190508181036000830152614ae981614004565b9050919050565b60006020820190508181036000830152614b0981614044565b9050919050565b60006020820190508181036000830152614b2981614084565b9050919050565b60006020820190508181036000830152614b49816140ea565b9050919050565b60006020820190508181036000830152614b698161412a565b9050919050565b60006020820190508181036000830152614b8981614190565b9050919050565b60006020820190508181036000830152614ba9816141f6565b9050919050565b60006020820190508181036000830152614bc98161425c565b9050919050565b60006020820190508181036000830152614be9816142c2565b9050919050565b60006020820190508181036000830152614c0981614328565b9050919050565b60006020820190508181036000830152614c2981614368565b9050919050565b60006020820190508181036000830152614c49816143a8565b9050919050565b60006020820190508181036000830152614c698161440e565b9050919050565b60006020820190508181036000830152614c898161444e565b9050919050565b60006020820190508181036000830152614ca9816144b4565b9050919050565b60006020820190508181036000830152614cc98161451a565b9050919050565b60006020820190508181036000830152614ce981614580565b9050919050565b60006020820190508181036000830152614d09816145c0565b9050919050565b60006020820190508181036000830152614d2981614626565b9050919050565b60006020820190508181036000830152614d498161468c565b9050919050565b60006020820190508181036000830152614d69816146f2565b9050919050565b60006020820190508181036000830152614d8981614758565b9050919050565b60006020820190508181036000830152614da9816147be565b9050919050565b60006020820190508181036000830152614dc9816147fe565b9050919050565b6000602082019050614de5600083018461484d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e1257614e1161529a565b5b8060405250919050565b600067ffffffffffffffff821115614e3757614e3661529a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614e6757614e6661529a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f6d826150eb565b9150614f78836150eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fad57614fac61520d565b5b828201905092915050565b6000614fc3826150eb565b9150614fce836150eb565b925082614fde57614fdd61523c565b5b828204905092915050565b6000614ff4826150eb565b9150614fff836150eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150385761503761520d565b5b828202905092915050565b600061504e826150eb565b9150615059836150eb565b92508282101561506c5761506b61520d565b5b828203905092915050565b6000615082826150cb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615122578082015181840152602081019050615107565b83811115615131576000848401525b50505050565b6000615142826150eb565b915060008214156151565761515561520d565b5b600182039050919050565b6000600282049050600182168061517957607f821691505b6020821081141561518d5761518c61526b565b5b50919050565b600061519e826150eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151d1576151d061520d565b5b600182019050919050565b60006151e7826150eb565b91506151f2836150eb565b9250826152025761520161523c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6152e381615077565b81146152ee57600080fd5b50565b6152fa81615089565b811461530557600080fd5b50565b61531181615095565b811461531c57600080fd5b50565b6153288161509f565b811461533357600080fd5b50565b61533f816150eb565b811461534a57600080fd5b5056fea26469706673582212203c6553008e88197be6a1ffbcb5ba26e024395d3c7fe8b88b7e4bef11a1e6bfef64736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102045760003560e01c8063715018a611610118578063b88d4fde116100a0578063e8e732a11161006f578063e8e732a11461076a578063e985e9c5146107a7578063eb8d2444146107e4578063f2fde38b1461080f578063ff9627fb1461083857610204565b8063b88d4fde1461069c578063bc4eda10146106c5578063c87b56dd14610702578063cbf775b21461073f57610204565b806391b7f5ed116100e757806391b7f5ed146105d857806395d89b411461060157806398d5fdca1461062c578063a0712d6814610657578063a22cb4651461067357610204565b8063715018a6146105305780637a5bba231461054757806383db3c18146105705780638da5cb5b146105ad57610204565b806334918dfd1161019b57806355f804b31161016a57806355f804b3146104255780635b5a493d1461044e5780636352211e14610479578063709ab2d8146104b657806370a08231146104f357610204565b806334918dfd146103915780633ccfd60b146103a857806342842e0e146103bf5780634f6ccce7146103e857610204565b806318160ddd116101d757806318160ddd146102d757806318576dbe1461030257806323b872dd1461032b5780632f745c591461035457610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613aca565b610875565b60405161023d9190614a13565b60405180910390f35b34801561025257600080fd5b5061025b610887565b6040516102689190614a2e565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613b5d565b610919565b6040516102a591906148bb565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613a65565b61099e565b005b3480156102e357600080fd5b506102ec610ab6565b6040516102f99190614dd0565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613a65565b610ac3565b005b34801561033757600080fd5b50610352600480360381019061034d919061395f565b610c17565b005b34801561036057600080fd5b5061037b60048036038101906103769190613a65565b610c77565b6040516103889190614dd0565b60405180910390f35b34801561039d57600080fd5b506103a6610d1c565b005b3480156103b457600080fd5b506103bd610dc4565b005b3480156103cb57600080fd5b506103e660048036038101906103e1919061395f565b610e8f565b005b3480156103f457600080fd5b5061040f600480360381019061040a9190613b5d565b610eaf565b60405161041c9190614dd0565b60405180910390f35b34801561043157600080fd5b5061044c60048036038101906104479190613b1c565b610f46565b005b34801561045a57600080fd5b50610463610fdd565b6040516104709190614dd0565b60405180910390f35b34801561048557600080fd5b506104a0600480360381019061049b9190613b5d565b610fe7565b6040516104ad91906148bb565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613b5d565b611099565b6040516104ea9190614a2e565b60405180910390f35b3480156104ff57600080fd5b5061051a600480360381019061051591906138fa565b611187565b6040516105279190614dd0565b60405180910390f35b34801561053c57600080fd5b5061054561123f565b005b34801561055357600080fd5b5061056e60048036038101906105699190613b86565b611379565b005b34801561057c57600080fd5b50610597600480360381019061059291906138fa565b611549565b6040516105a491906149cf565b60405180910390f35b3480156105b957600080fd5b506105c2611769565b6040516105cf91906148bb565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa9190613b5d565b611792565b005b34801561060d57600080fd5b50610616611818565b6040516106239190614a2e565b60405180910390f35b34801561063857600080fd5b506106416118aa565b60405161064e9190614dd0565b60405180910390f35b610671600480360381019061066c9190613b5d565b6118b4565b005b34801561067f57600080fd5b5061069a60048036038101906106959190613a29565b611a78565b005b3480156106a857600080fd5b506106c360048036038101906106be91906139ae565b611bf9565b005b3480156106d157600080fd5b506106ec60048036038101906106e79190613b5d565b611c5b565b6040516106f99190614dd0565b60405180910390f35b34801561070e57600080fd5b5061072960048036038101906107249190613b5d565b611d12565b6040516107369190614a2e565b60405180910390f35b34801561074b57600080fd5b50610754611dab565b6040516107619190614dd0565b60405180910390f35b34801561077657600080fd5b50610791600480360381019061078c91906138fa565b611db0565b60405161079e91906149f1565b60405180910390f35b3480156107b357600080fd5b506107ce60048036038101906107c99190613923565b611f2c565b6040516107db9190614a13565b60405180910390f35b3480156107f057600080fd5b506107f9611fc0565b6040516108069190614a13565b60405180910390f35b34801561081b57600080fd5b50610836600480360381019061083191906138fa565b611fd3565b005b34801561084457600080fd5b5061085f600480360381019061085a9190613b5d565b61217c565b60405161086c9190614a2e565b60405180910390f35b60006108808261221c565b9050919050565b60606001805461089690615161565b80601f01602080910402602001604051908101604052809291908181526020018280546108c290615161565b801561090f5780601f106108e45761010080835404028352916020019161090f565b820191906000526020600020905b8154815290600101906020018083116108f257829003601f168201915b5050505050905090565b600061092482612296565b610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095a90614c30565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109a982610fe7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1190614cf0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a39612302565b73ffffffffffffffffffffffffffffffffffffffff161480610a685750610a6781610a62612302565b611f2c565b5b610aa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9e90614b70565b60405180910390fd5b610ab1838361230a565b505050565b6000600980549050905090565b610acb612302565b73ffffffffffffffffffffffffffffffffffffffff16610ae9611769565b73ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3690614c50565b60405180910390fd5b6000610b49610ab6565b9050610b53610fdd565b8282610b5f9190614f62565b1115610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9790614d70565b60405180910390fd5b600082118015610bb35750612720548211155b610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990614af0565b60405180910390fd5b610bfc83836123c3565b8161272054610c0b9190615043565b61272081905550505050565b610c28610c22612302565b826124de565b610c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5e90614d30565b60405180910390fd5b610c728383836125bc565b505050565b6000610c8283611187565b8210610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90614a70565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d24612302565b73ffffffffffffffffffffffffffffffffffffffff16610d42611769565b73ffffffffffffffffffffffffffffffffffffffff1614610d98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8f90614c50565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b610dcc612302565b73ffffffffffffffffffffffffffffffffffffffff16610dea611769565b73ffffffffffffffffffffffffffffffffffffffff1614610e40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3790614c50565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e8b573d6000803e3d6000fd5b5050565b610eaa83838360405180602001604052806000815250611bf9565b505050565b6000610eb9610ab6565b8210610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190614d50565b60405180910390fd5b60098281548110610f34577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f4e612302565b73ffffffffffffffffffffffffffffffffffffffff16610f6c611769565b73ffffffffffffffffffffffffffffffffffffffff1614610fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb990614c50565b60405180910390fd5b806127229080519060200190610fd9929190613709565b5050565b6000612710905090565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108790614bd0565b60405180910390fd5b80915050919050565b60606110a3610ab6565b82106110e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110db90614d90565b60405180910390fd5b600d6000838152602001908152602001600020805461110290615161565b80601f016020809104026020016040519081016040528092919081815260200182805461112e90615161565b801561117b5780601f106111505761010080835404028352916020019161117b565b820191906000526020600020905b81548152906001019060200180831161115e57829003601f168201915b50505050509050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ef90614bb0565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611247612302565b73ffffffffffffffffffffffffffffffffffffffff16611265611769565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b290614c50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b3373ffffffffffffffffffffffffffffffffffffffff1661139983610fe7565b73ffffffffffffffffffffffffffffffffffffffff16146113ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e690614cb0565b60405180910390fd5b6002600d60008481526020019081526020016000206040516114119190614873565b602060405180830381855afa15801561142e573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906114519190613aa1565b600282604051611461919061485c565b602060405180830381855afa15801561147e573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906114a19190613aa1565b14156114e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d990614c90565b60405180910390fd5b80600d60008481526020019081526020016000209080519060200190611509929190613709565b507f99538d87dfb7b682ffe83c19f1ed4d493ad9048cab00e6cf62fc1ff533cc09f933838360405161153d93929190614922565b60405180910390a15050565b6060600061155683611187565b905060008114156115de57600067ffffffffffffffff8111156115a2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115d557816020015b60608152602001906001900390816115c05790505b50915050611764565b60008167ffffffffffffffff811115611620577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561165357816020015b606081526020019060019003908161163e5790505b50905060005b8281101561175d57600d600061166f8784610c77565b8152602001908152602001600020805461168890615161565b80601f01602080910402602001604051908101604052809291908181526020018280546116b490615161565b80156117015780601f106116d657610100808354040283529160200191611701565b820191906000526020600020905b8154815290600101906020018083116116e457829003601f168201915b505050505082828151811061173f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181905250808061175590615193565b915050611659565b8193505050505b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61179a612302565b73ffffffffffffffffffffffffffffffffffffffff166117b8611769565b73ffffffffffffffffffffffffffffffffffffffff161461180e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180590614c50565b60405180910390fd5b80600e8190555050565b60606002805461182790615161565b80601f016020809104026020016040519081016040528092919081815260200182805461185390615161565b80156118a05780601f10611875576101008083540402835291602001916118a0565b820191906000526020600020905b81548152906001019060200180831161188357829003601f168201915b5050505050905090565b6000600e54905090565b6002600b5414156118fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f190614db0565b60405180910390fd5b6002600b81905550600c60009054906101000a900460ff16611951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194890614a50565b60405180910390fd5b600061195b610ab6565b9050611965610fdd565b82826119719190614f62565b11156119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990614d70565b60405180910390fd5b600082600e546119c29190614fe9565b905080341015611a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fe90614b90565b60405180910390fd5b80341115611a62573373ffffffffffffffffffffffffffffffffffffffff166108fc8234611a359190615043565b9081150290604051600060405180830381858888f19350505050158015611a60573d6000803e3d6000fd5b505b611a6b83612818565b50506001600b8190555050565b611a80612302565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae590614b30565b60405180910390fd5b8060066000611afb612302565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ba8612302565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bed9190614a13565b60405180910390a35050565b611c0a611c04612302565b836124de565b611c49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4090614d30565b60405180910390fd5b611c55848484846128b6565b50505050565b6000611c65610fdd565b82611c6e610ab6565b611c789190614f62565b1115611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090614d10565b60405180910390fd5b6014821115611cfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf490614c10565b60405180910390fd5b600e5482611d0b9190614fe9565b9050919050565b60606000611d1e612912565b90506000611d2b846129a5565b905060006040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152509050600083511415611d7c57819350505050611da6565b828282604051602001611d919392919061488a565b60405160208183030381529060405293505050505b919050565b601481565b60606000611dbd83611187565b90506000811415611e4057600067ffffffffffffffff811115611e09577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611e375781602001602082028036833780820191505090505b50915050611f27565b60008167ffffffffffffffff811115611e82577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611eb05781602001602082028036833780820191505090505b50905060005b82811015611f2057611ec88582610c77565b828281518110611f01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611f1890615193565b915050611eb6565b5080925050505b919050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611fdb612302565b73ffffffffffffffffffffffffffffffffffffffff16611ff9611769565b73ffffffffffffffffffffffffffffffffffffffff161461204f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204690614c50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b690614ab0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600d602052806000526040600020600091509050805461219b90615161565b80601f01602080910402602001604051908101604052809291908181526020018280546121c790615161565b80156122145780601f106121e957610100808354040283529160200191612214565b820191906000526020600020905b8154815290600101906020018083116121f757829003601f168201915b505050505081565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061228f575061228e82612b52565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661237d83610fe7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6123cb612302565b73ffffffffffffffffffffffffffffffffffffffff166123e9611769565b73ffffffffffffffffffffffffffffffffffffffff161461243f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243690614c50565b60405180910390fd5b6014811115612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247a90614cd0565b60405180910390fd5b600061271f54905060005b828110156124d05760006124a28483612c34565b90506124ae8582612ca2565b82806124b990615137565b9350505080806124c890615193565b91505061248e565b508061271f81905550505050565b60006124e982612296565b612528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251f90614b50565b60405180910390fd5b600061253383610fe7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125a257508373ffffffffffffffffffffffffffffffffffffffff1661258a84610919565b73ffffffffffffffffffffffffffffffffffffffff16145b806125b357506125b28185611f2c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125dc82610fe7565b73ffffffffffffffffffffffffffffffffffffffff1614612632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262990614c70565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269990614b10565b60405180910390fd5b6126ad838383612cc0565b6126b860008261230a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127089190615043565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461275f9190614f62565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b601481111561285c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285390614cd0565b60405180910390fd5b600061271f54905060005b828110156128a957600061287b8483612c34565b90506128873382612ca2565b828061289290615137565b9350505080806128a190615193565b915050612867565b508061271f819055505050565b6128c18484846125bc565b6128cd84848484612cd0565b61290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290390614a90565b60405180910390fd5b50505050565b6060612722805461292290615161565b80601f016020809104026020016040519081016040528092919081815260200182805461294e90615161565b801561299b5780601f106129705761010080835404028352916020019161299b565b820191906000526020600020905b81548152906001019060200180831161297e57829003601f168201915b5050505050905090565b606060008214156129ed576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b4d565b600082905060005b60008214612a1f578080612a0890615193565b915050600a82612a189190614fb8565b91506129f5565b60008167ffffffffffffffff811115612a61577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612a935781602001600182028036833780820191505090505b5090505b60008514612b4657600182612aac9190615043565b9150600a85612abb91906151dc565b6030612ac79190614f62565b60f81b818381518110612b03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b3f9190614fb8565b9450612a97565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c1d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c2d5750612c2c82612e67565b5b9050919050565b600080333a4342600143612c489190615043565b408888604051602001612c619796959493929190614960565b6040516020818303038152906040528051906020012060001c9050600061271f5482612c8d91906151dc565b9050612c9881612ed1565b9250505092915050565b612cbc82826040518060200160405280600081525061303c565b5050565b612ccb838383613097565b505050565b6000612cf18473ffffffffffffffffffffffffffffffffffffffff166131ab565b15612e5a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d1a612302565b8786866040518563ffffffff1660e01b8152600401612d3c94939291906148d6565b602060405180830381600087803b158015612d5657600080fd5b505af1925050508015612d8757506040513d601f19601f82011682018060405250810190612d849190613af3565b60015b612e0a573d8060008114612db7576040519150601f19603f3d011682016040523d82523d6000602084013e612dbc565b606091505b50600081511415612e02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612df990614a90565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e5f565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080600f836127108110612f0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01549050600080821415612f2557839050612f29565b8190505b6000600161271f54612f3b9190615043565b9050808514613018576000600f826127108110612f81577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b015490506000811415612fd45781600f876127108110612fca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0181905550613016565b80600f876127108110613010577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01819055505b505b61271f600081548092919061302c90615137565b9190505550819350505050919050565b61304683836131be565b6130536000848484612cd0565b613092576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308990614a90565b60405180910390fd5b505050565b6130a283838361338c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130e5576130e081613391565b613124565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131235761312283826133da565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131675761316281613547565b6131a6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131a5576131a4828261368a565b5b5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561322e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161322590614bf0565b60405180910390fd5b61323781612296565b15613277576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161326e90614ad0565b60405180910390fd5b61328360008383612cc0565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132d39190614f62565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016133e784611187565b6133f19190615043565b90506000600860008481526020019081526020016000205490508181146134d6576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160098054905061355b9190615043565b90506000600a60008481526020019081526020016000205490506000600983815481106135b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600983815481106135f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061366e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061369583611187565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b82805461371590615161565b90600052602060002090601f016020900481019282613737576000855561377e565b82601f1061375057805160ff191683800117855561377e565b8280016001018555821561377e579182015b8281111561377d578251825591602001919060010190613762565b5b50905061378b919061378f565b5090565b5b808211156137a8576000816000905550600101613790565b5090565b60006137bf6137ba84614e1c565b614deb565b9050828152602081018484840111156137d757600080fd5b6137e28482856150f5565b509392505050565b60006137fd6137f884614e4c565b614deb565b90508281526020810184848401111561381557600080fd5b6138208482856150f5565b509392505050565b600081359050613837816152da565b92915050565b60008135905061384c816152f1565b92915050565b60008151905061386181615308565b92915050565b6000813590506138768161531f565b92915050565b60008151905061388b8161531f565b92915050565b600082601f8301126138a257600080fd5b81356138b28482602086016137ac565b91505092915050565b600082601f8301126138cc57600080fd5b81356138dc8482602086016137ea565b91505092915050565b6000813590506138f481615336565b92915050565b60006020828403121561390c57600080fd5b600061391a84828501613828565b91505092915050565b6000806040838503121561393657600080fd5b600061394485828601613828565b925050602061395585828601613828565b9150509250929050565b60008060006060848603121561397457600080fd5b600061398286828701613828565b935050602061399386828701613828565b92505060406139a4868287016138e5565b9150509250925092565b600080600080608085870312156139c457600080fd5b60006139d287828801613828565b94505060206139e387828801613828565b93505060406139f4878288016138e5565b925050606085013567ffffffffffffffff811115613a1157600080fd5b613a1d87828801613891565b91505092959194509250565b60008060408385031215613a3c57600080fd5b6000613a4a85828601613828565b9250506020613a5b8582860161383d565b9150509250929050565b60008060408385031215613a7857600080fd5b6000613a8685828601613828565b9250506020613a97858286016138e5565b9150509250929050565b600060208284031215613ab357600080fd5b6000613ac184828501613852565b91505092915050565b600060208284031215613adc57600080fd5b6000613aea84828501613867565b91505092915050565b600060208284031215613b0557600080fd5b6000613b138482850161387c565b91505092915050565b600060208284031215613b2e57600080fd5b600082013567ffffffffffffffff811115613b4857600080fd5b613b54848285016138bb565b91505092915050565b600060208284031215613b6f57600080fd5b6000613b7d848285016138e5565b91505092915050565b60008060408385031215613b9957600080fd5b6000613ba7858286016138e5565b925050602083013567ffffffffffffffff811115613bc457600080fd5b613bd0858286016138bb565b9150509250929050565b6000613be68383613def565b905092915050565b6000613bfa838361483e565b60208301905092915050565b613c0f81615077565b82525050565b6000613c2082614eb1565b613c2a8185614ef7565b935083602082028501613c3c85614e7c565b8060005b85811015613c785784840389528151613c598582613bda565b9450613c6483614edd565b925060208a01995050600181019050613c40565b50829750879550505050505092915050565b6000613c9582614ebc565b613c9f8185614f08565b9350613caa83614e8c565b8060005b83811015613cdb578151613cc28882613bee565b9750613ccd83614eea565b925050600181019050613cae565b5085935050505092915050565b613cf181615089565b82525050565b613d0081615095565b82525050565b6000613d1182614ec7565b613d1b8185614f19565b9350613d2b818560208601615104565b613d34816152c9565b840191505092915050565b6000613d4a82614ec7565b613d548185614f2a565b9350613d64818560208601615104565b80840191505092915050565b60008154613d7d81615161565b613d878186614f2a565b94506001821660008114613da25760018114613db357613de6565b60ff19831686528186019350613de6565b613dbc85614e9c565b60005b83811015613dde57815481890152600182019150602081019050613dbf565b838801955050505b50505092915050565b6000613dfa82614ed2565b613e048185614f35565b9350613e14818560208601615104565b613e1d816152c9565b840191505092915050565b6000613e3382614ed2565b613e3d8185614f46565b9350613e4d818560208601615104565b613e56816152c9565b840191505092915050565b6000613e6c82614ed2565b613e768185614f57565b9350613e86818560208601615104565b80840191505092915050565b6000613e9f601483614f46565b91507f53616c65206861736e277420737461727465642e0000000000000000000000006000830152602082019050919050565b6000613edf602b83614f46565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613f45603283614f46565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613fab602683614f46565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614011601c83614f46565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614051602083614f46565b91507f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d6000830152602082019050919050565b6000614091602483614f46565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006140f7601983614f46565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614137602c83614f46565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061419d603883614f46565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614203602883614f46565b91507f546f6f206c6974746c652073656e742c20706c656173652073656e64206d6f7260008301527f65204d415449432e0000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614269602a83614f46565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006142cf602983614f46565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614335602083614f46565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614375602083614f46565b91507f596f752063616e6e6f74206d696e742074686174206d616e792070756e6b732e6000830152602082019050919050565b60006143b5602c83614f46565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061441b602083614f46565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061445b602983614f46565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006144c1602383614f46565b91507f4e6577206e616d652069732073616d65206173207468652063757272656e742060008301527f6f6e6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614527602783614f46565b91507f4865792c20796f75722077616c6c657420646f65736e2774206f776e2074686960008301527f732070756e6b21000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061458d601983614f46565b91507f4d696e74696e6720746f6f206d616e79206174206f6e63652e000000000000006000830152602082019050919050565b60006145cd602183614f46565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614633602383614f46565b91507f546865726520617265206e6f742074686973206d616e792070756e6b73206c6560008301527f66742e00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614699603183614f46565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006146ff602c83614f46565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614765602283614f46565b91507f5468657265206172656e27742074686973206d616e792070756e6b73206c656660008301527f742e0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147cb601a83614f46565b91507f43686f6f736520612070756e6b2077697468696e2072616e67650000000000006000830152602082019050919050565b600061480b601f83614f46565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b614847816150eb565b82525050565b614856816150eb565b82525050565b60006148688284613d3f565b915081905092915050565b600061487f8284613d70565b915081905092915050565b60006148968286613e61565b91506148a28285613e61565b91506148ae8284613e61565b9150819050949350505050565b60006020820190506148d06000830184613c06565b92915050565b60006080820190506148eb6000830187613c06565b6148f86020830186613c06565b614905604083018561484d565b81810360608301526149178184613d06565b905095945050505050565b60006060820190506149376000830186613c06565b614944602083018561484d565b81810360408301526149568184613e28565b9050949350505050565b600060e082019050614975600083018a613c06565b614982602083018961484d565b61498f604083018861484d565b61499c606083018761484d565b6149a96080830186613cf7565b6149b660a083018561484d565b6149c360c083018461484d565b98975050505050505050565b600060208201905081810360008301526149e98184613c15565b905092915050565b60006020820190508181036000830152614a0b8184613c8a565b905092915050565b6000602082019050614a286000830184613ce8565b92915050565b60006020820190508181036000830152614a488184613e28565b905092915050565b60006020820190508181036000830152614a6981613e92565b9050919050565b60006020820190508181036000830152614a8981613ed2565b9050919050565b60006020820190508181036000830152614aa981613f38565b9050919050565b60006020820190508181036000830152614ac981613f9e565b9050919050565b60006020820190508181036000830152614ae981614004565b9050919050565b60006020820190508181036000830152614b0981614044565b9050919050565b60006020820190508181036000830152614b2981614084565b9050919050565b60006020820190508181036000830152614b49816140ea565b9050919050565b60006020820190508181036000830152614b698161412a565b9050919050565b60006020820190508181036000830152614b8981614190565b9050919050565b60006020820190508181036000830152614ba9816141f6565b9050919050565b60006020820190508181036000830152614bc98161425c565b9050919050565b60006020820190508181036000830152614be9816142c2565b9050919050565b60006020820190508181036000830152614c0981614328565b9050919050565b60006020820190508181036000830152614c2981614368565b9050919050565b60006020820190508181036000830152614c49816143a8565b9050919050565b60006020820190508181036000830152614c698161440e565b9050919050565b60006020820190508181036000830152614c898161444e565b9050919050565b60006020820190508181036000830152614ca9816144b4565b9050919050565b60006020820190508181036000830152614cc98161451a565b9050919050565b60006020820190508181036000830152614ce981614580565b9050919050565b60006020820190508181036000830152614d09816145c0565b9050919050565b60006020820190508181036000830152614d2981614626565b9050919050565b60006020820190508181036000830152614d498161468c565b9050919050565b60006020820190508181036000830152614d69816146f2565b9050919050565b60006020820190508181036000830152614d8981614758565b9050919050565b60006020820190508181036000830152614da9816147be565b9050919050565b60006020820190508181036000830152614dc9816147fe565b9050919050565b6000602082019050614de5600083018461484d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614e1257614e1161529a565b5b8060405250919050565b600067ffffffffffffffff821115614e3757614e3661529a565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614e6757614e6661529a565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614f6d826150eb565b9150614f78836150eb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614fad57614fac61520d565b5b828201905092915050565b6000614fc3826150eb565b9150614fce836150eb565b925082614fde57614fdd61523c565b5b828204905092915050565b6000614ff4826150eb565b9150614fff836150eb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156150385761503761520d565b5b828202905092915050565b600061504e826150eb565b9150615059836150eb565b92508282101561506c5761506b61520d565b5b828203905092915050565b6000615082826150cb565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615122578082015181840152602081019050615107565b83811115615131576000848401525b50505050565b6000615142826150eb565b915060008214156151565761515561520d565b5b600182039050919050565b6000600282049050600182168061517957607f821691505b6020821081141561518d5761518c61526b565b5b50919050565b600061519e826150eb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156151d1576151d061520d565b5b600182019050919050565b60006151e7826150eb565b91506151f2836150eb565b9250826152025761520161523c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6152e381615077565b81146152ee57600080fd5b50565b6152fa81615089565b811461530557600080fd5b50565b61531181615095565b811461531c57600080fd5b50565b6153288161509f565b811461533357600080fd5b50565b61533f816150eb565b811461534a57600080fd5b5056fea26469706673582212203c6553008e88197be6a1ffbcb5ba26e024395d3c7fe8b88b7e4bef11a1e6bfef64736f6c63430008000033
Deployed Bytecode Sourcemap
45858:7860:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53522:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27946:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29406:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28943:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40317:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46592:437;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30296:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39985:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52982:85;;;;;;;;;;;;;:::i;:::-;;53181:130;;;;;;;;;;;;;:::i;:::-;;30672:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40507:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53075:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46496:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27640:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50694:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27370:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19311:148;;;;;;;;;;;;;:::i;:::-;;50323:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50892:505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18660:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52889;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28115:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51403:75;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47037:598;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29699:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30894:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51486:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52445:434;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46087:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51861:427;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30065:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46001:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19614:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46040:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53522:193;53650:4;53673:36;53697:11;53673:23;:36::i;:::-;53666:43;;53522:193;;;:::o;27946:100::-;28000:13;28033:5;28026:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27946:100;:::o;29406:221::-;29482:7;29510:16;29518:7;29510;:16::i;:::-;29502:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29595:15;:24;29611:7;29595:24;;;;;;;;;;;;;;;;;;;;;29588:31;;29406:221;;;:::o;28943:397::-;29024:13;29040:23;29055:7;29040:14;:23::i;:::-;29024:39;;29088:5;29082:11;;:2;:11;;;;29074:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29168:5;29152:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29177:37;29194:5;29201:12;:10;:12::i;:::-;29177:16;:37::i;:::-;29152:62;29144:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29311:21;29320:2;29324:7;29311:8;:21::i;:::-;28943:397;;;:::o;40317:113::-;40378:7;40405:10;:17;;;;40398:24;;40317:113;:::o;46592:437::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46675:19:::1;46697:13;:11;:13::i;:::-;46675:35;;46757:15;:13;:15::i;:::-;46739:14;46725:11;:28;;;;:::i;:::-;:47;;46717:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;46852:1;46835:14;:18;:51;;;;;46875:11;;46857:14;:29;;46835:51;46827:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;46939:33;46952:3;46957:14;46939:12;:33::i;:::-;47009:14;46995:11;;:28;;;;:::i;:::-;46981:11;:42;;;;18951:1;46592:437:::0;;:::o;30296:305::-;30457:41;30476:12;:10;:12::i;:::-;30490:7;30457:18;:41::i;:::-;30449:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30565:28;30575:4;30581:2;30585:7;30565:9;:28::i;:::-;30296:305;;;:::o;39985:256::-;40082:7;40118:23;40135:5;40118:16;:23::i;:::-;40110:5;:31;40102:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;40207:12;:19;40220:5;40207:19;;;;;;;;;;;;;;;:26;40227:5;40207:26;;;;;;;;;;;;40200:33;;39985:256;;;;:::o;52982:85::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53047:12:::1;;;;;;;;;;;53046:13;53031:12;;:28;;;;;;;;;;;;;;;;;;52982:85::o:0;53181:130::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53225:12:::1;53240:21;53225:36;;53276:10;53268:28;;:37;53297:7;53268:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;18951:1;53181:130::o:0;30672:151::-;30776:39;30793:4;30799:2;30803:7;30776:39;;;;;;;;;;;;:16;:39::i;:::-;30672:151;;;:::o;40507:233::-;40582:7;40618:30;:28;:30::i;:::-;40610:5;:38;40602:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;40715:10;40726:5;40715:17;;;;;;;;;;;;;;;;;;;;;;;;40708:24;;40507:233;;;:::o;53075:98::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53160:7:::1;53144:13;:23;;;;;;;;;;;;:::i;:::-;;53075:98:::0;:::o;46496:88::-;46550:7;46573:5;46566:12;;46496:88;:::o;27640:239::-;27712:7;27732:13;27748:7;:16;27756:7;27748:16;;;;;;;;;;;;;;;;;;;;;27732:32;;27800:1;27783:19;;:5;:19;;;;27775:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27866:5;27859:12;;;27640:239;;;:::o;50694:192::-;50752:13;50798;:11;:13::i;:::-;50787:8;:24;50778:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50861:9;:19;50871:8;50861:19;;;;;;;;;;;50854:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50694:192;;;:::o;27370:208::-;27442:7;27487:1;27470:19;;:5;:19;;;;27462:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27554:9;:16;27564:5;27554:16;;;;;;;;;;;;;;;;27547:23;;27370:208;;;:::o;19311:148::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19418:1:::1;19381:40;;19402:6;::::0;::::1;;;;;;;;19381:40;;;;;;;;;;;;19449:1;19432:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;19311:148::o:0;50323:365::-;50426:10;50405:31;;:17;50413:8;50405:7;:17::i;:::-;:31;;;50397:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50519:34;50532:9;:19;50542:8;50532:19;;;;;;;;;;;50519:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50495:20;50508:5;50495:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;50487:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;50622:5;50600:9;:19;50610:8;50600:19;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;50639:43;50654:10;50666:8;50676:5;50639:43;;;;;;;;:::i;:::-;;;;;;;;50323:365;;:::o;50892:505::-;50956:15;50981:18;51002:17;51012:6;51002:9;:17::i;:::-;50981:38;;51044:1;51030:10;:15;51026:364;;;51112:1;51099:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51092:22;;;;;51026:364;51139:22;51177:10;51164:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51139:49;;51199:13;51223:136;51247:10;51239:5;:18;51223:136;;;51299:9;:47;51310:34;51330:6;51338:5;51310:19;:34::i;:::-;51299:47;;;;;;;;;;;51283:63;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;51290:5;51283:13;;;;;;;;;;;;;;;;;;;;;:63;;;;51259:7;;;;;:::i;:::-;;;;51223:136;;;51376:6;51369:13;;;;;50892:505;;;;:::o;18660:87::-;18706:7;18733:6;;;;;;;;;;;18726:13;;18660:87;:::o;52889:::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52961:9:::1;52952:6;:18;;;;52889:87:::0;:::o;28115:104::-;28171:13;28204:7;28197:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28115:104;:::o;51403:75::-;51444:7;51466:6;;51459:13;;51403:75;:::o;47037:598::-;21543:1;22140:7;;:19;;22132:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;21543:1;22273:7;:18;;;;47116:12:::1;;;;;;;;;;;47108:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;47160:19;47182:13;:11;:13::i;:::-;47160:35;;47246:15;:13;:15::i;:::-;47232:10;47218:11;:24;;;;:::i;:::-;:43;;47202:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47320:27;47359:10;47350:6;;:19;;;;:::i;:::-;47320:49;;47405:19;47392:9;:32;;47376:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;47505:19;47493:9;:31;47489:115;;;47543:10;47535:28;;:61;47576:19;47564:9;:31;;;;:::i;:::-;47535:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;47489:115;47612:17;47618:10;47612:5;:17::i;:::-;22304:1;;21499::::0;22452:7;:22;;;;47037:598;:::o;29699:295::-;29814:12;:10;:12::i;:::-;29802:24;;:8;:24;;;;29794:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29914:8;29869:18;:32;29888:12;:10;:12::i;:::-;29869:32;;;;;;;;;;;;;;;:42;29902:8;29869:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29967:8;29938:48;;29953:12;:10;:12::i;:::-;29938:48;;;29977:8;29938:48;;;;;;:::i;:::-;;;;;;;;29699:295;;:::o;30894:285::-;31026:41;31045:12;:10;:12::i;:::-;31059:7;31026:18;:41::i;:::-;31018:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31132:39;31146:4;31152:2;31156:7;31165:5;31132:13;:39::i;:::-;30894:285;;;;:::o;51486:369::-;51574:7;51639:15;:13;:15::i;:::-;51625:10;51609:13;:11;:13::i;:::-;:26;;;;:::i;:::-;:45;;51593:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;46134:2;51730:10;:34;;51714:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;51841:6;;51828:10;:19;;;;:::i;:::-;51821:26;;51486:369;;;:::o;52445:434::-;52531:13;52556:18;52577:10;:8;:10::i;:::-;52556:31;;52594:23;52620:26;52637:8;52620:16;:26::i;:::-;52594:52;;52653:20;:30;;;;;;;;;;;;;;;;;;;52773:1;52757:4;52751:18;:23;52747:62;;;52792:9;52785:16;;;;;;;52747:62;52848:4;52854:9;52865:6;52831:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52817:56;;;;;52445:434;;;;:::o;46087:49::-;46134:2;46087:49;:::o;51861:427::-;51949:16;51977;51996:17;52006:6;51996:9;:17::i;:::-;51977:36;;52036:1;52024:8;:13;52020:263;;;52069:1;52055:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52048:23;;;;;52020:263;52094:23;52134:8;52120:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52094:49;;52157:9;52152:102;52176:8;52172:1;:12;52152:102;;;52214:30;52234:6;52242:1;52214:19;:30::i;:::-;52202:6;52209:1;52202:9;;;;;;;;;;;;;;;;;;;;;:42;;;;;52186:3;;;;;:::i;:::-;;;;52152:102;;;;52269:6;52262:13;;;;51861:427;;;;:::o;30065:164::-;30162:4;30186:18;:25;30205:5;30186:25;;;;;;;;;;;;;;;:35;30212:8;30186:35;;;;;;;;;;;;;;;;;;;;;;;;;30179:42;;30065:164;;;;:::o;46001:32::-;;;;;;;;;;;;;:::o;19614:244::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;19723:1:::1;19703:22;;:8;:22;;;;19695:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19813:8;19784:38;;19805:6;::::0;::::1;;;;;;;;19784:38;;;;;;;;;;;;19842:8;19833:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;19614:244:::0;:::o;46040:40::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39664:237::-;39766:4;39805:35;39790:50;;;:11;:50;;;;:103;;;;39857:36;39881:11;39857:23;:36::i;:::-;39790:103;39783:110;;39664:237;;;:::o;32646:127::-;32711:4;32763:1;32735:30;;:7;:16;32743:7;32735:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32728:37;;32646:127;;;:::o;601:98::-;654:7;681:10;674:17;;601:98;:::o;36523:174::-;36625:2;36598:15;:24;36614:7;36598:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36681:7;36677:2;36643:46;;36652:23;36667:7;36652:14;:23::i;:::-;36643:46;;;;;;;;;;;;36523:174;;:::o;48127:470::-;18891:12;:10;:12::i;:::-;18880:23;;:7;:5;:7::i;:::-;:23;;;18872:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46134:2:::1;48215:10;:34;;48207:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;48288:33;48324:19;;48288:55;;48355:9;48350:188;48374:10;48370:1;:14;48350:188;;;48400:18;48421:38;48445:10;48457:1;48421:23;:38::i;:::-;48400:59;;48468:26;48478:3;48483:10;48468:9;:26::i;:::-;48503:27;;;;;:::i;:::-;;;;48350:188;48386:3;;;;;:::i;:::-;;;;48350:188;;;;48566:25;48544:19;:47;;;;18951:1;48127:470:::0;;:::o;32940:348::-;33033:4;33058:16;33066:7;33058;:16::i;:::-;33050:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33134:13;33150:23;33165:7;33150:14;:23::i;:::-;33134:39;;33203:5;33192:16;;:7;:16;;;:51;;;;33236:7;33212:31;;:20;33224:7;33212:11;:20::i;:::-;:31;;;33192:51;:87;;;;33247:32;33264:5;33271:7;33247:16;:32::i;:::-;33192:87;33184:96;;;32940:348;;;;:::o;35861:544::-;35986:4;35959:31;;:23;35974:7;35959:14;:23::i;:::-;:31;;;35951:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36069:1;36055:16;;:2;:16;;;;36047:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36125:39;36146:4;36152:2;36156:7;36125:20;:39::i;:::-;36229:29;36246:1;36250:7;36229:8;:29::i;:::-;36290:1;36271:9;:15;36281:4;36271:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36319:1;36302:9;:13;36312:2;36302:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36350:2;36331:7;:16;36339:7;36331:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36389:7;36385:2;36370:27;;36379:4;36370:27;;;;;;;;;;;;35861:544;;;:::o;47673:448::-;46134:2;47732:10;:34;;47724:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;47805:33;47841:19;;47805:55;;47872:9;47867:195;47891:10;47887:1;:14;47867:195;;;47917:18;47938:38;47962:10;47974:1;47938:23;:38::i;:::-;47917:59;;47985:33;47995:10;48007;47985:9;:33::i;:::-;48027:27;;;;;:::i;:::-;;;;47867:195;47903:3;;;;;:::i;:::-;;;;47867:195;;;;48090:25;48068:19;:47;;;;47673:448;;:::o;32061:272::-;32175:28;32185:4;32191:2;32195:7;32175:9;:28::i;:::-;32222:48;32245:4;32251:2;32255:7;32264:5;32222:22;:48::i;:::-;32214:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32061:272;;;;:::o;52331:108::-;52391:13;52420;52413:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52331:108;:::o;23995:723::-;24051:13;24281:1;24272:5;:10;24268:53;;;24299:10;;;;;;;;;;;;;;;;;;;;;24268:53;24331:12;24346:5;24331:20;;24362:14;24387:78;24402:1;24394:4;:9;24387:78;;24420:8;;;;;:::i;:::-;;;;24451:2;24443:10;;;;;:::i;:::-;;;24387:78;;;24475:19;24507:6;24497:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24475:39;;24525:154;24541:1;24532:5;:10;24525:154;;24569:1;24559:11;;;;;:::i;:::-;;;24636:2;24628:5;:10;;;;:::i;:::-;24615:2;:24;;;;:::i;:::-;24602:39;;24585:6;24592;24585:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;24665:2;24656:11;;;;;:::i;:::-;;;24525:154;;;24703:6;24689:21;;;;;23995:723;;;;:::o;27014:292::-;27116:4;27155:25;27140:40;;;:11;:40;;;;:105;;;;27212:33;27197:48;;;:11;:48;;;;27140:105;:158;;;;27262:36;27286:11;27262:23;:36::i;:::-;27140:158;27133:165;;27014:292;;;:::o;48603:533::-;48697:7;48716:17;48808:10;48833:11;48859:12;48886:15;48941:1;48926:12;:16;;;;:::i;:::-;48916:27;48958:11;48984:2;48783:216;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48761:249;;;;;;48743:276;;48716:303;;49026:19;49060;;49048:9;:31;;;;:::i;:::-;49026:53;;49093:37;49118:11;49093:24;:37::i;:::-;49086:44;;;;48603:533;;;;:::o;33630:110::-;33706:26;33716:2;33720:7;33706:26;;;;;;;;;;;;:9;:26::i;:::-;33630:110;;:::o;53321:195::-;53465:45;53492:4;53498:2;53502:7;53465:26;:45::i;:::-;53321:195;;;:::o;37262:843::-;37383:4;37409:15;:2;:13;;;:15::i;:::-;37405:693;;;37461:2;37445:36;;;37482:12;:10;:12::i;:::-;37496:4;37502:7;37511:5;37445:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37441:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37708:1;37691:6;:13;:18;37687:341;;;37734:60;;;;;;;;;;:::i;:::-;;;;;;;;37687:341;37978:6;37972:13;37963:6;37959:2;37955:15;37948:38;37441:602;37578:45;;;37568:55;;;:6;:55;;;;37561:62;;;;;37405:693;38082:4;38075:11;;37262:843;;;;;;;:::o;9492:157::-;9577:4;9616:25;9601:40;;;:11;:40;;;;9594:47;;9492:157;;;:::o;49142:1175::-;49224:7;49243:18;49264:16;49281:10;49264:28;;;;;;;;;;;;;;;;;49243:49;;49299:14;49338:1;49324:10;:15;49320:260;;;49425:10;49416:19;;49320:260;;;49562:10;49553:19;;49320:260;49588:17;49630:1;49608:19;;:23;;;;:::i;:::-;49588:43;;49656:9;49642:10;:23;49638:624;;49871:22;49896:16;49913:9;49896:27;;;;;;;;;;;;;;;;;49871:52;;49954:1;49936:14;:19;49932:323;;;50067:9;50036:16;50053:10;50036:28;;;;;;;;;;;;;;;;:40;;;;49932:323;;;50231:14;50200:16;50217:10;50200:28;;;;;;;;;;;;;;;;:45;;;;49932:323;49638:624;;50270:19;;:21;;;;;;;;;:::i;:::-;;;;;;50305:6;50298:13;;;;;49142:1175;;;:::o;33967:250::-;34063:18;34069:2;34073:7;34063:5;:18::i;:::-;34100:54;34131:1;34135:2;34139:7;34148:5;34100:22;:54::i;:::-;34092:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;33967:250;;;:::o;41353:555::-;41463:45;41490:4;41496:2;41500:7;41463:26;:45::i;:::-;41541:1;41525:18;;:4;:18;;;41521:187;;;41560:40;41592:7;41560:31;:40::i;:::-;41521:187;;;41630:2;41622:10;;:4;:10;;;41618:90;;41649:47;41682:4;41688:7;41649:32;:47::i;:::-;41618:90;41521:187;41736:1;41722:16;;:2;:16;;;41718:183;;;41755:45;41792:7;41755:36;:45::i;:::-;41718:183;;;41828:4;41822:10;;:2;:10;;;41818:83;;41849:40;41877:2;41881:7;41849:27;:40::i;:::-;41818:83;41718:183;41353:555;;;:::o;10364:422::-;10424:4;10632:12;10743:7;10731:20;10723:28;;10777:1;10770:4;:8;10763:15;;;10364:422;;;:::o;34553:382::-;34647:1;34633:16;;:2;:16;;;;34625:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34706:16;34714:7;34706;:16::i;:::-;34705:17;34697:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34768:45;34797:1;34801:2;34805:7;34768:20;:45::i;:::-;34843:1;34826:9;:13;34836:2;34826:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34874:2;34855:7;:16;34863:7;34855:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34919:7;34915:2;34894:33;;34911:1;34894:33;;;;;;;;;;;;34553:382;;:::o;38716:93::-;;;;:::o;42631:164::-;42735:10;:17;;;;42708:15;:24;42724:7;42708:24;;;;;;;;;;;:44;;;;42763:10;42779:7;42763:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42631:164;:::o;43422:988::-;43688:22;43738:1;43713:22;43730:4;43713:16;:22::i;:::-;:26;;;;:::i;:::-;43688:51;;43750:18;43771:17;:26;43789:7;43771:26;;;;;;;;;;;;43750:47;;43918:14;43904:10;:28;43900:328;;43949:19;43971:12;:18;43984:4;43971:18;;;;;;;;;;;;;;;:34;43990:14;43971:34;;;;;;;;;;;;43949:56;;44055:11;44022:12;:18;44035:4;44022:18;;;;;;;;;;;;;;;:30;44041:10;44022:30;;;;;;;;;;;:44;;;;44172:10;44139:17;:30;44157:11;44139:30;;;;;;;;;;;:43;;;;43900:328;;44324:17;:26;44342:7;44324:26;;;;;;;;;;;44317:33;;;44368:12;:18;44381:4;44368:18;;;;;;;;;;;;;;;:34;44387:14;44368:34;;;;;;;;;;;44361:41;;;43422:988;;;;:::o;44705:1079::-;44958:22;45003:1;44983:10;:17;;;;:21;;;;:::i;:::-;44958:46;;45015:18;45036:15;:24;45052:7;45036:24;;;;;;;;;;;;45015:45;;45387:19;45409:10;45420:14;45409:26;;;;;;;;;;;;;;;;;;;;;;;;45387:48;;45473:11;45448:10;45459;45448:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;45584:10;45553:15;:28;45569:11;45553:28;;;;;;;;;;;:41;;;;45725:15;:24;45741:7;45725:24;;;;;;;;;;;45718:31;;;45760:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44705:1079;;;;:::o;42209:221::-;42294:14;42311:20;42328:2;42311:16;:20::i;:::-;42294:37;;42369:7;42342:12;:16;42355:2;42342:16;;;;;;;;;;;;;;;:24;42359:6;42342:24;;;;;;;;;;;:34;;;;42416:6;42387:17;:26;42405:7;42387:26;;;;;;;;;;;:35;;;;42209:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:143::-;;1077:6;1071:13;1062:22;;1093:33;1120:5;1093:33;:::i;:::-;1052:80;;;;:::o;1138:137::-;;1221:6;1208:20;1199:29;;1237:32;1263:5;1237:32;:::i;:::-;1189:86;;;;:::o;1281:141::-;;1368:6;1362:13;1353:22;;1384:32;1410:5;1384:32;:::i;:::-;1343:79;;;;:::o;1441:271::-;;1545:3;1538:4;1530:6;1526:17;1522:27;1512:2;;1563:1;1560;1553:12;1512:2;1603:6;1590:20;1628:78;1702:3;1694:6;1687:4;1679:6;1675:17;1628:78;:::i;:::-;1619:87;;1502:210;;;;;:::o;1732:273::-;;1837:3;1830:4;1822:6;1818:17;1814:27;1804:2;;1855:1;1852;1845:12;1804:2;1895:6;1882:20;1920:79;1995:3;1987:6;1980:4;1972:6;1968:17;1920:79;:::i;:::-;1911:88;;1794:211;;;;;:::o;2011:139::-;;2095:6;2082:20;2073:29;;2111:33;2138:5;2111:33;:::i;:::-;2063:87;;;;:::o;2156:262::-;;2264:2;2252:9;2243:7;2239:23;2235:32;2232:2;;;2280:1;2277;2270:12;2232:2;2323:1;2348:53;2393:7;2384:6;2373:9;2369:22;2348:53;:::i;:::-;2338:63;;2294:117;2222:196;;;;:::o;2424:407::-;;;2549:2;2537:9;2528:7;2524:23;2520:32;2517:2;;;2565:1;2562;2555:12;2517:2;2608:1;2633:53;2678:7;2669:6;2658:9;2654:22;2633:53;:::i;:::-;2623:63;;2579:117;2735:2;2761:53;2806:7;2797:6;2786:9;2782:22;2761:53;:::i;:::-;2751:63;;2706:118;2507:324;;;;;:::o;2837:552::-;;;;2979:2;2967:9;2958:7;2954:23;2950:32;2947:2;;;2995:1;2992;2985:12;2947:2;3038:1;3063:53;3108:7;3099:6;3088:9;3084:22;3063:53;:::i;:::-;3053:63;;3009:117;3165:2;3191:53;3236:7;3227:6;3216:9;3212:22;3191:53;:::i;:::-;3181:63;;3136:118;3293:2;3319:53;3364:7;3355:6;3344:9;3340:22;3319:53;:::i;:::-;3309:63;;3264:118;2937:452;;;;;:::o;3395:809::-;;;;;3563:3;3551:9;3542:7;3538:23;3534:33;3531:2;;;3580:1;3577;3570:12;3531:2;3623:1;3648:53;3693:7;3684:6;3673:9;3669:22;3648:53;:::i;:::-;3638:63;;3594:117;3750:2;3776:53;3821:7;3812:6;3801:9;3797:22;3776:53;:::i;:::-;3766:63;;3721:118;3878:2;3904:53;3949:7;3940:6;3929:9;3925:22;3904:53;:::i;:::-;3894:63;;3849:118;4034:2;4023:9;4019:18;4006:32;4065:18;4057:6;4054:30;4051:2;;;4097:1;4094;4087:12;4051:2;4125:62;4179:7;4170:6;4159:9;4155:22;4125:62;:::i;:::-;4115:72;;3977:220;3521:683;;;;;;;:::o;4210:401::-;;;4332:2;4320:9;4311:7;4307:23;4303:32;4300:2;;;4348:1;4345;4338:12;4300:2;4391:1;4416:53;4461:7;4452:6;4441:9;4437:22;4416:53;:::i;:::-;4406:63;;4362:117;4518:2;4544:50;4586:7;4577:6;4566:9;4562:22;4544:50;:::i;:::-;4534:60;;4489:115;4290:321;;;;;:::o;4617:407::-;;;4742:2;4730:9;4721:7;4717:23;4713:32;4710:2;;;4758:1;4755;4748:12;4710:2;4801:1;4826:53;4871:7;4862:6;4851:9;4847:22;4826:53;:::i;:::-;4816:63;;4772:117;4928:2;4954:53;4999:7;4990:6;4979:9;4975:22;4954:53;:::i;:::-;4944:63;;4899:118;4700:324;;;;;:::o;5030:284::-;;5149:2;5137:9;5128:7;5124:23;5120:32;5117:2;;;5165:1;5162;5155:12;5117:2;5208:1;5233:64;5289:7;5280:6;5269:9;5265:22;5233:64;:::i;:::-;5223:74;;5179:128;5107:207;;;;:::o;5320:260::-;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;5443:1;5440;5433:12;5395:2;5486:1;5511:52;5555:7;5546:6;5535:9;5531:22;5511:52;:::i;:::-;5501:62;;5457:116;5385:195;;;;:::o;5586:282::-;;5704:2;5692:9;5683:7;5679:23;5675:32;5672:2;;;5720:1;5717;5710:12;5672:2;5763:1;5788:63;5843:7;5834:6;5823:9;5819:22;5788:63;:::i;:::-;5778:73;;5734:127;5662:206;;;;:::o;5874:375::-;;5992:2;5980:9;5971:7;5967:23;5963:32;5960:2;;;6008:1;6005;5998:12;5960:2;6079:1;6068:9;6064:17;6051:31;6109:18;6101:6;6098:30;6095:2;;;6141:1;6138;6131:12;6095:2;6169:63;6224:7;6215:6;6204:9;6200:22;6169:63;:::i;:::-;6159:73;;6022:220;5950:299;;;;:::o;6255:262::-;;6363:2;6351:9;6342:7;6338:23;6334:32;6331:2;;;6379:1;6376;6369:12;6331:2;6422:1;6447:53;6492:7;6483:6;6472:9;6468:22;6447:53;:::i;:::-;6437:63;;6393:117;6321:196;;;;:::o;6523:520::-;;;6658:2;6646:9;6637:7;6633:23;6629:32;6626:2;;;6674:1;6671;6664:12;6626:2;6717:1;6742:53;6787:7;6778:6;6767:9;6763:22;6742:53;:::i;:::-;6732:63;;6688:117;6872:2;6861:9;6857:18;6844:32;6903:18;6895:6;6892:30;6889:2;;;6935:1;6932;6925:12;6889:2;6963:63;7018:7;7009:6;6998:9;6994:22;6963:63;:::i;:::-;6953:73;;6815:221;6616:427;;;;;:::o;7049:196::-;;7173:66;7235:3;7227:6;7173:66;:::i;:::-;7159:80;;7149:96;;;;:::o;7251:179::-;;7341:46;7383:3;7375:6;7341:46;:::i;:::-;7419:4;7414:3;7410:14;7396:28;;7331:99;;;;:::o;7436:118::-;7523:24;7541:5;7523:24;:::i;:::-;7518:3;7511:37;7501:53;;:::o;7588:991::-;;7756:64;7814:5;7756:64;:::i;:::-;7836:96;7925:6;7920:3;7836:96;:::i;:::-;7829:103;;7958:3;8003:4;7995:6;7991:17;7986:3;7982:27;8033:66;8093:5;8033:66;:::i;:::-;8122:7;8153:1;8138:396;8163:6;8160:1;8157:13;8138:396;;;8234:9;8228:4;8224:20;8219:3;8212:33;8285:6;8279:13;8313:84;8392:4;8377:13;8313:84;:::i;:::-;8305:92;;8420:70;8483:6;8420:70;:::i;:::-;8410:80;;8519:4;8514:3;8510:14;8503:21;;8198:336;8185:1;8182;8178:9;8173:14;;8138:396;;;8142:14;8550:4;8543:11;;8570:3;8563:10;;7732:847;;;;;;;;;:::o;8615:732::-;;8763:54;8811:5;8763:54;:::i;:::-;8833:86;8912:6;8907:3;8833:86;:::i;:::-;8826:93;;8943:56;8993:5;8943:56;:::i;:::-;9022:7;9053:1;9038:284;9063:6;9060:1;9057:13;9038:284;;;9139:6;9133:13;9166:63;9225:3;9210:13;9166:63;:::i;:::-;9159:70;;9252:60;9305:6;9252:60;:::i;:::-;9242:70;;9098:224;9085:1;9082;9078:9;9073:14;;9038:284;;;9042:14;9338:3;9331:10;;8739:608;;;;;;;:::o;9353:109::-;9434:21;9449:5;9434:21;:::i;:::-;9429:3;9422:34;9412:50;;:::o;9468:118::-;9555:24;9573:5;9555:24;:::i;:::-;9550:3;9543:37;9533:53;;:::o;9592:360::-;;9706:38;9738:5;9706:38;:::i;:::-;9760:70;9823:6;9818:3;9760:70;:::i;:::-;9753:77;;9839:52;9884:6;9879:3;9872:4;9865:5;9861:16;9839:52;:::i;:::-;9916:29;9938:6;9916:29;:::i;:::-;9911:3;9907:39;9900:46;;9682:270;;;;;:::o;9958:373::-;;10090:38;10122:5;10090:38;:::i;:::-;10144:88;10225:6;10220:3;10144:88;:::i;:::-;10137:95;;10241:52;10286:6;10281:3;10274:4;10267:5;10263:16;10241:52;:::i;:::-;10318:6;10313:3;10309:16;10302:23;;10066:265;;;;;:::o;10359:849::-;;10501:5;10495:12;10530:36;10556:9;10530:36;:::i;:::-;10582:88;10663:6;10658:3;10582:88;:::i;:::-;10575:95;;10701:1;10690:9;10686:17;10717:1;10712:137;;;;10863:1;10858:344;;;;10679:523;;10712:137;10796:4;10792:9;10781;10777:25;10772:3;10765:38;10832:6;10827:3;10823:16;10816:23;;10712:137;;10858:344;10925:41;10960:5;10925:41;:::i;:::-;10988:1;11002:154;11016:6;11013:1;11010:13;11002:154;;;11090:7;11084:14;11080:1;11075:3;11071:11;11064:35;11140:1;11131:7;11127:15;11116:26;;11038:4;11035:1;11031:12;11026:17;;11002:154;;;11185:6;11180:3;11176:16;11169:23;;10865:337;;10679:523;;10468:740;;;;;;:::o;11214:344::-;;11320:39;11353:5;11320:39;:::i;:::-;11375:61;11429:6;11424:3;11375:61;:::i;:::-;11368:68;;11445:52;11490:6;11485:3;11478:4;11471:5;11467:16;11445:52;:::i;:::-;11522:29;11544:6;11522:29;:::i;:::-;11517:3;11513:39;11506:46;;11296:262;;;;;:::o;11564:364::-;;11680:39;11713:5;11680:39;:::i;:::-;11735:71;11799:6;11794:3;11735:71;:::i;:::-;11728:78;;11815:52;11860:6;11855:3;11848:4;11841:5;11837:16;11815:52;:::i;:::-;11892:29;11914:6;11892:29;:::i;:::-;11887:3;11883:39;11876:46;;11656:272;;;;;:::o;11934:377::-;;12068:39;12101:5;12068:39;:::i;:::-;12123:89;12205:6;12200:3;12123:89;:::i;:::-;12116:96;;12221:52;12266:6;12261:3;12254:4;12247:5;12243:16;12221:52;:::i;:::-;12298:6;12293:3;12289:16;12282:23;;12044:267;;;;;:::o;12317:318::-;;12480:67;12544:2;12539:3;12480:67;:::i;:::-;12473:74;;12577:22;12573:1;12568:3;12564:11;12557:43;12626:2;12621:3;12617:12;12610:19;;12463:172;;;:::o;12641:375::-;;12804:67;12868:2;12863:3;12804:67;:::i;:::-;12797:74;;12901:34;12897:1;12892:3;12888:11;12881:55;12967:13;12962:2;12957:3;12953:12;12946:35;13007:2;13002:3;12998:12;12991:19;;12787:229;;;:::o;13022:382::-;;13185:67;13249:2;13244:3;13185:67;:::i;:::-;13178:74;;13282:34;13278:1;13273:3;13269:11;13262:55;13348:20;13343:2;13338:3;13334:12;13327:42;13395:2;13390:3;13386:12;13379:19;;13168:236;;;:::o;13410:370::-;;13573:67;13637:2;13632:3;13573:67;:::i;:::-;13566:74;;13670:34;13666:1;13661:3;13657:11;13650:55;13736:8;13731:2;13726:3;13722:12;13715:30;13771:2;13766:3;13762:12;13755:19;;13556:224;;;:::o;13786:326::-;;13949:67;14013:2;14008:3;13949:67;:::i;:::-;13942:74;;14046:30;14042:1;14037:3;14033:11;14026:51;14103:2;14098:3;14094:12;14087:19;;13932:180;;;:::o;14118:330::-;;14281:67;14345:2;14340:3;14281:67;:::i;:::-;14274:74;;14378:34;14374:1;14369:3;14365:11;14358:55;14439:2;14434:3;14430:12;14423:19;;14264:184;;;:::o;14454:368::-;;14617:67;14681:2;14676:3;14617:67;:::i;:::-;14610:74;;14714:34;14710:1;14705:3;14701:11;14694:55;14780:6;14775:2;14770:3;14766:12;14759:28;14813:2;14808:3;14804:12;14797:19;;14600:222;;;:::o;14828:323::-;;14991:67;15055:2;15050:3;14991:67;:::i;:::-;14984:74;;15088:27;15084:1;15079:3;15075:11;15068:48;15142:2;15137:3;15133:12;15126:19;;14974:177;;;:::o;15157:376::-;;15320:67;15384:2;15379:3;15320:67;:::i;:::-;15313:74;;15417:34;15413:1;15408:3;15404:11;15397:55;15483:14;15478:2;15473:3;15469:12;15462:36;15524:2;15519:3;15515:12;15508:19;;15303:230;;;:::o;15539:388::-;;15702:67;15766:2;15761:3;15702:67;:::i;:::-;15695:74;;15799:34;15795:1;15790:3;15786:11;15779:55;15865:26;15860:2;15855:3;15851:12;15844:48;15918:2;15913:3;15909:12;15902:19;;15685:242;;;:::o;15933:372::-;;16096:67;16160:2;16155:3;16096:67;:::i;:::-;16089:74;;16193:34;16189:1;16184:3;16180:11;16173:55;16259:10;16254:2;16249:3;16245:12;16238:32;16296:2;16291:3;16287:12;16280:19;;16079:226;;;:::o;16311:374::-;;16474:67;16538:2;16533:3;16474:67;:::i;:::-;16467:74;;16571:34;16567:1;16562:3;16558:11;16551:55;16637:12;16632:2;16627:3;16623:12;16616:34;16676:2;16671:3;16667:12;16660:19;;16457:228;;;:::o;16691:373::-;;16854:67;16918:2;16913:3;16854:67;:::i;:::-;16847:74;;16951:34;16947:1;16942:3;16938:11;16931:55;17017:11;17012:2;17007:3;17003:12;16996:33;17055:2;17050:3;17046:12;17039:19;;16837:227;;;:::o;17070:330::-;;17233:67;17297:2;17292:3;17233:67;:::i;:::-;17226:74;;17330:34;17326:1;17321:3;17317:11;17310:55;17391:2;17386:3;17382:12;17375:19;;17216:184;;;:::o;17406:330::-;;17569:67;17633:2;17628:3;17569:67;:::i;:::-;17562:74;;17666:34;17662:1;17657:3;17653:11;17646:55;17727:2;17722:3;17718:12;17711:19;;17552:184;;;:::o;17742:376::-;;17905:67;17969:2;17964:3;17905:67;:::i;:::-;17898:74;;18002:34;17998:1;17993:3;17989:11;17982:55;18068:14;18063:2;18058:3;18054:12;18047:36;18109:2;18104:3;18100:12;18093:19;;17888:230;;;:::o;18124:330::-;;18287:67;18351:2;18346:3;18287:67;:::i;:::-;18280:74;;18384:34;18380:1;18375:3;18371:11;18364:55;18445:2;18440:3;18436:12;18429:19;;18270:184;;;:::o;18460:373::-;;18623:67;18687:2;18682:3;18623:67;:::i;:::-;18616:74;;18720:34;18716:1;18711:3;18707:11;18700:55;18786:11;18781:2;18776:3;18772:12;18765:33;18824:2;18819:3;18815:12;18808:19;;18606:227;;;:::o;18839:367::-;;19002:67;19066:2;19061:3;19002:67;:::i;:::-;18995:74;;19099:34;19095:1;19090:3;19086:11;19079:55;19165:5;19160:2;19155:3;19151:12;19144:27;19197:2;19192:3;19188:12;19181:19;;18985:221;;;:::o;19212:371::-;;19375:67;19439:2;19434:3;19375:67;:::i;:::-;19368:74;;19472:34;19468:1;19463:3;19459:11;19452:55;19538:9;19533:2;19528:3;19524:12;19517:31;19574:2;19569:3;19565:12;19558:19;;19358:225;;;:::o;19589:323::-;;19752:67;19816:2;19811:3;19752:67;:::i;:::-;19745:74;;19849:27;19845:1;19840:3;19836:11;19829:48;19903:2;19898:3;19894:12;19887:19;;19735:177;;;:::o;19918:365::-;;20081:67;20145:2;20140:3;20081:67;:::i;:::-;20074:74;;20178:34;20174:1;20169:3;20165:11;20158:55;20244:3;20239:2;20234:3;20230:12;20223:25;20274:2;20269:3;20265:12;20258:19;;20064:219;;;:::o;20289:367::-;;20452:67;20516:2;20511:3;20452:67;:::i;:::-;20445:74;;20549:34;20545:1;20540:3;20536:11;20529:55;20615:5;20610:2;20605:3;20601:12;20594:27;20647:2;20642:3;20638:12;20631:19;;20435:221;;;:::o;20662:381::-;;20825:67;20889:2;20884:3;20825:67;:::i;:::-;20818:74;;20922:34;20918:1;20913:3;20909:11;20902:55;20988:19;20983:2;20978:3;20974:12;20967:41;21034:2;21029:3;21025:12;21018:19;;20808:235;;;:::o;21049:376::-;;21212:67;21276:2;21271:3;21212:67;:::i;:::-;21205:74;;21309:34;21305:1;21300:3;21296:11;21289:55;21375:14;21370:2;21365:3;21361:12;21354:36;21416:2;21411:3;21407:12;21400:19;;21195:230;;;:::o;21431:366::-;;21594:67;21658:2;21653:3;21594:67;:::i;:::-;21587:74;;21691:34;21687:1;21682:3;21678:11;21671:55;21757:4;21752:2;21747:3;21743:12;21736:26;21788:2;21783:3;21779:12;21772:19;;21577:220;;;:::o;21803:324::-;;21966:67;22030:2;22025:3;21966:67;:::i;:::-;21959:74;;22063:28;22059:1;22054:3;22050:11;22043:49;22118:2;22113:3;22109:12;22102:19;;21949:178;;;:::o;22133:329::-;;22296:67;22360:2;22355:3;22296:67;:::i;:::-;22289:74;;22393:33;22389:1;22384:3;22380:11;22373:54;22453:2;22448:3;22444:12;22437:19;;22279:183;;;:::o;22468:108::-;22545:24;22563:5;22545:24;:::i;:::-;22540:3;22533:37;22523:53;;:::o;22582:118::-;22669:24;22687:5;22669:24;:::i;:::-;22664:3;22657:37;22647:53;;:::o;22706:271::-;;22858:93;22947:3;22938:6;22858:93;:::i;:::-;22851:100;;22968:3;22961:10;;22840:137;;;;:::o;22983:273::-;;23136:94;23226:3;23217:6;23136:94;:::i;:::-;23129:101;;23247:3;23240:10;;23118:138;;;;:::o;23262:595::-;;23512:95;23603:3;23594:6;23512:95;:::i;:::-;23505:102;;23624:95;23715:3;23706:6;23624:95;:::i;:::-;23617:102;;23736:95;23827:3;23818:6;23736:95;:::i;:::-;23729:102;;23848:3;23841:10;;23494:363;;;;;;:::o;23863:222::-;;23994:2;23983:9;23979:18;23971:26;;24007:71;24075:1;24064:9;24060:17;24051:6;24007:71;:::i;:::-;23961:124;;;;:::o;24091:640::-;;24324:3;24313:9;24309:19;24301:27;;24338:71;24406:1;24395:9;24391:17;24382:6;24338:71;:::i;:::-;24419:72;24487:2;24476:9;24472:18;24463:6;24419:72;:::i;:::-;24501;24569:2;24558:9;24554:18;24545:6;24501:72;:::i;:::-;24620:9;24614:4;24610:20;24605:2;24594:9;24590:18;24583:48;24648:76;24719:4;24710:6;24648:76;:::i;:::-;24640:84;;24291:440;;;;;;;:::o;24737:533::-;;24944:2;24933:9;24929:18;24921:26;;24957:71;25025:1;25014:9;25010:17;25001:6;24957:71;:::i;:::-;25038:72;25106:2;25095:9;25091:18;25082:6;25038:72;:::i;:::-;25157:9;25151:4;25147:20;25142:2;25131:9;25127:18;25120:48;25185:78;25258:4;25249:6;25185:78;:::i;:::-;25177:86;;24911:359;;;;;;:::o;25276:886::-;;25575:3;25564:9;25560:19;25552:27;;25589:71;25657:1;25646:9;25642:17;25633:6;25589:71;:::i;:::-;25670:72;25738:2;25727:9;25723:18;25714:6;25670:72;:::i;:::-;25752;25820:2;25809:9;25805:18;25796:6;25752:72;:::i;:::-;25834;25902:2;25891:9;25887:18;25878:6;25834:72;:::i;:::-;25916:73;25984:3;25973:9;25969:19;25960:6;25916:73;:::i;:::-;25999;26067:3;26056:9;26052:19;26043:6;25999:73;:::i;:::-;26082;26150:3;26139:9;26135:19;26126:6;26082:73;:::i;:::-;25542:620;;;;;;;;;;:::o;26168:413::-;;26369:2;26358:9;26354:18;26346:26;;26418:9;26412:4;26408:20;26404:1;26393:9;26389:17;26382:47;26446:128;26569:4;26560:6;26446:128;:::i;:::-;26438:136;;26336:245;;;;:::o;26587:373::-;;26768:2;26757:9;26753:18;26745:26;;26817:9;26811:4;26807:20;26803:1;26792:9;26788:17;26781:47;26845:108;26948:4;26939:6;26845:108;:::i;:::-;26837:116;;26735:225;;;;:::o;26966:210::-;;27091:2;27080:9;27076:18;27068:26;;27104:65;27166:1;27155:9;27151:17;27142:6;27104:65;:::i;:::-;27058:118;;;;:::o;27182:313::-;;27333:2;27322:9;27318:18;27310:26;;27382:9;27376:4;27372:20;27368:1;27357:9;27353:17;27346:47;27410:78;27483:4;27474:6;27410:78;:::i;:::-;27402:86;;27300:195;;;;:::o;27501:419::-;;27705:2;27694:9;27690:18;27682:26;;27754:9;27748:4;27744:20;27740:1;27729:9;27725:17;27718:47;27782:131;27908:4;27782:131;:::i;:::-;27774:139;;27672:248;;;:::o;27926:419::-;;28130:2;28119:9;28115:18;28107:26;;28179:9;28173:4;28169:20;28165:1;28154:9;28150:17;28143:47;28207:131;28333:4;28207:131;:::i;:::-;28199:139;;28097:248;;;:::o;28351:419::-;;28555:2;28544:9;28540:18;28532:26;;28604:9;28598:4;28594:20;28590:1;28579:9;28575:17;28568:47;28632:131;28758:4;28632:131;:::i;:::-;28624:139;;28522:248;;;:::o;28776:419::-;;28980:2;28969:9;28965:18;28957:26;;29029:9;29023:4;29019:20;29015:1;29004:9;29000:17;28993:47;29057:131;29183:4;29057:131;:::i;:::-;29049:139;;28947:248;;;:::o;29201:419::-;;29405:2;29394:9;29390:18;29382:26;;29454:9;29448:4;29444:20;29440:1;29429:9;29425:17;29418:47;29482:131;29608:4;29482:131;:::i;:::-;29474:139;;29372:248;;;:::o;29626:419::-;;29830:2;29819:9;29815:18;29807:26;;29879:9;29873:4;29869:20;29865:1;29854:9;29850:17;29843:47;29907:131;30033:4;29907:131;:::i;:::-;29899:139;;29797:248;;;:::o;30051:419::-;;30255:2;30244:9;30240:18;30232:26;;30304:9;30298:4;30294:20;30290:1;30279:9;30275:17;30268:47;30332:131;30458:4;30332:131;:::i;:::-;30324:139;;30222:248;;;:::o;30476:419::-;;30680:2;30669:9;30665:18;30657:26;;30729:9;30723:4;30719:20;30715:1;30704:9;30700:17;30693:47;30757:131;30883:4;30757:131;:::i;:::-;30749:139;;30647:248;;;:::o;30901:419::-;;31105:2;31094:9;31090:18;31082:26;;31154:9;31148:4;31144:20;31140:1;31129:9;31125:17;31118:47;31182:131;31308:4;31182:131;:::i;:::-;31174:139;;31072:248;;;:::o;31326:419::-;;31530:2;31519:9;31515:18;31507:26;;31579:9;31573:4;31569:20;31565:1;31554:9;31550:17;31543:47;31607:131;31733:4;31607:131;:::i;:::-;31599:139;;31497:248;;;:::o;31751:419::-;;31955:2;31944:9;31940:18;31932:26;;32004:9;31998:4;31994:20;31990:1;31979:9;31975:17;31968:47;32032:131;32158:4;32032:131;:::i;:::-;32024:139;;31922:248;;;:::o;32176:419::-;;32380:2;32369:9;32365:18;32357:26;;32429:9;32423:4;32419:20;32415:1;32404:9;32400:17;32393:47;32457:131;32583:4;32457:131;:::i;:::-;32449:139;;32347:248;;;:::o;32601:419::-;;32805:2;32794:9;32790:18;32782:26;;32854:9;32848:4;32844:20;32840:1;32829:9;32825:17;32818:47;32882:131;33008:4;32882:131;:::i;:::-;32874:139;;32772:248;;;:::o;33026:419::-;;33230:2;33219:9;33215:18;33207:26;;33279:9;33273:4;33269:20;33265:1;33254:9;33250:17;33243:47;33307:131;33433:4;33307:131;:::i;:::-;33299:139;;33197:248;;;:::o;33451:419::-;;33655:2;33644:9;33640:18;33632:26;;33704:9;33698:4;33694:20;33690:1;33679:9;33675:17;33668:47;33732:131;33858:4;33732:131;:::i;:::-;33724:139;;33622:248;;;:::o;33876:419::-;;34080:2;34069:9;34065:18;34057:26;;34129:9;34123:4;34119:20;34115:1;34104:9;34100:17;34093:47;34157:131;34283:4;34157:131;:::i;:::-;34149:139;;34047:248;;;:::o;34301:419::-;;34505:2;34494:9;34490:18;34482:26;;34554:9;34548:4;34544:20;34540:1;34529:9;34525:17;34518:47;34582:131;34708:4;34582:131;:::i;:::-;34574:139;;34472:248;;;:::o;34726:419::-;;34930:2;34919:9;34915:18;34907:26;;34979:9;34973:4;34969:20;34965:1;34954:9;34950:17;34943:47;35007:131;35133:4;35007:131;:::i;:::-;34999:139;;34897:248;;;:::o;35151:419::-;;35355:2;35344:9;35340:18;35332:26;;35404:9;35398:4;35394:20;35390:1;35379:9;35375:17;35368:47;35432:131;35558:4;35432:131;:::i;:::-;35424:139;;35322:248;;;:::o;35576:419::-;;35780:2;35769:9;35765:18;35757:26;;35829:9;35823:4;35819:20;35815:1;35804:9;35800:17;35793:47;35857:131;35983:4;35857:131;:::i;:::-;35849:139;;35747:248;;;:::o;36001:419::-;;36205:2;36194:9;36190:18;36182:26;;36254:9;36248:4;36244:20;36240:1;36229:9;36225:17;36218:47;36282:131;36408:4;36282:131;:::i;:::-;36274:139;;36172:248;;;:::o;36426:419::-;;36630:2;36619:9;36615:18;36607:26;;36679:9;36673:4;36669:20;36665:1;36654:9;36650:17;36643:47;36707:131;36833:4;36707:131;:::i;:::-;36699:139;;36597:248;;;:::o;36851:419::-;;37055:2;37044:9;37040:18;37032:26;;37104:9;37098:4;37094:20;37090:1;37079:9;37075:17;37068:47;37132:131;37258:4;37132:131;:::i;:::-;37124:139;;37022:248;;;:::o;37276:419::-;;37480:2;37469:9;37465:18;37457:26;;37529:9;37523:4;37519:20;37515:1;37504:9;37500:17;37493:47;37557:131;37683:4;37557:131;:::i;:::-;37549:139;;37447:248;;;:::o;37701:419::-;;37905:2;37894:9;37890:18;37882:26;;37954:9;37948:4;37944:20;37940:1;37929:9;37925:17;37918:47;37982:131;38108:4;37982:131;:::i;:::-;37974:139;;37872:248;;;:::o;38126:419::-;;38330:2;38319:9;38315:18;38307:26;;38379:9;38373:4;38369:20;38365:1;38354:9;38350:17;38343:47;38407:131;38533:4;38407:131;:::i;:::-;38399:139;;38297:248;;;:::o;38551:419::-;;38755:2;38744:9;38740:18;38732:26;;38804:9;38798:4;38794:20;38790:1;38779:9;38775:17;38768:47;38832:131;38958:4;38832:131;:::i;:::-;38824:139;;38722:248;;;:::o;38976:419::-;;39180:2;39169:9;39165:18;39157:26;;39229:9;39223:4;39219:20;39215:1;39204:9;39200:17;39193:47;39257:131;39383:4;39257:131;:::i;:::-;39249:139;;39147:248;;;:::o;39401:222::-;;39532:2;39521:9;39517:18;39509:26;;39545:71;39613:1;39602:9;39598:17;39589:6;39545:71;:::i;:::-;39499:124;;;;:::o;39629:283::-;;39695:2;39689:9;39679:19;;39737:4;39729:6;39725:17;39844:6;39832:10;39829:22;39808:18;39796:10;39793:34;39790:62;39787:2;;;39855:18;;:::i;:::-;39787:2;39895:10;39891:2;39884:22;39669:243;;;;:::o;39918:331::-;;40069:18;40061:6;40058:30;40055:2;;;40091:18;;:::i;:::-;40055:2;40176:4;40172:9;40165:4;40157:6;40153:17;40149:33;40141:41;;40237:4;40231;40227:15;40219:23;;39984:265;;;:::o;40255:332::-;;40407:18;40399:6;40396:30;40393:2;;;40429:18;;:::i;:::-;40393:2;40514:4;40510:9;40503:4;40495:6;40491:17;40487:33;40479:41;;40575:4;40569;40565:15;40557:23;;40322:265;;;:::o;40593:142::-;;40693:3;40685:11;;40723:4;40718:3;40714:14;40706:22;;40675:60;;;:::o;40741:132::-;;40831:3;40823:11;;40861:4;40856:3;40852:14;40844:22;;40813:60;;;:::o;40879:144::-;;40954:3;40946:11;;40977:3;40974:1;40967:14;41011:4;41008:1;40998:18;40990:26;;40936:87;;;:::o;41029:124::-;;41140:5;41134:12;41124:22;;41113:40;;;:::o;41159:114::-;;41260:5;41254:12;41244:22;;41233:40;;;:::o;41279:98::-;;41364:5;41358:12;41348:22;;41337:40;;;:::o;41383:99::-;;41469:5;41463:12;41453:22;;41442:40;;;:::o;41488:123::-;;41600:4;41595:3;41591:14;41583:22;;41573:38;;;:::o;41617:113::-;;41719:4;41714:3;41710:14;41702:22;;41692:38;;;:::o;41736:194::-;;41879:6;41874:3;41867:19;41919:4;41914:3;41910:14;41895:29;;41857:73;;;;:::o;41936:184::-;;42069:6;42064:3;42057:19;42109:4;42104:3;42100:14;42085:29;;42047:73;;;;:::o;42126:168::-;;42243:6;42238:3;42231:19;42283:4;42278:3;42274:14;42259:29;;42221:73;;;;:::o;42300:147::-;;42438:3;42423:18;;42413:34;;;;:::o;42453:159::-;;42561:6;42556:3;42549:19;42601:4;42596:3;42592:14;42577:29;;42539:73;;;;:::o;42618:169::-;;42736:6;42731:3;42724:19;42776:4;42771:3;42767:14;42752:29;;42714:73;;;;:::o;42793:148::-;;42932:3;42917:18;;42907:34;;;;:::o;42947:305::-;;43006:20;43024:1;43006:20;:::i;:::-;43001:25;;43040:20;43058:1;43040:20;:::i;:::-;43035:25;;43194:1;43126:66;43122:74;43119:1;43116:81;43113:2;;;43200:18;;:::i;:::-;43113:2;43244:1;43241;43237:9;43230:16;;42991:261;;;;:::o;43258:185::-;;43315:20;43333:1;43315:20;:::i;:::-;43310:25;;43349:20;43367:1;43349:20;:::i;:::-;43344:25;;43388:1;43378:2;;43393:18;;:::i;:::-;43378:2;43435:1;43432;43428:9;43423:14;;43300:143;;;;:::o;43449:348::-;;43512:20;43530:1;43512:20;:::i;:::-;43507:25;;43546:20;43564:1;43546:20;:::i;:::-;43541:25;;43734:1;43666:66;43662:74;43659:1;43656:81;43651:1;43644:9;43637:17;43633:105;43630:2;;;43741:18;;:::i;:::-;43630:2;43789:1;43786;43782:9;43771:20;;43497:300;;;;:::o;43803:191::-;;43863:20;43881:1;43863:20;:::i;:::-;43858:25;;43897:20;43915:1;43897:20;:::i;:::-;43892:25;;43936:1;43933;43930:8;43927:2;;;43941:18;;:::i;:::-;43927:2;43986:1;43983;43979:9;43971:17;;43848:146;;;;:::o;44000:96::-;;44066:24;44084:5;44066:24;:::i;:::-;44055:35;;44045:51;;;:::o;44102:90::-;;44179:5;44172:13;44165:21;44154:32;;44144:48;;;:::o;44198:77::-;;44264:5;44253:16;;44243:32;;;:::o;44281:149::-;;44357:66;44350:5;44346:78;44335:89;;44325:105;;;:::o;44436:126::-;;44513:42;44506:5;44502:54;44491:65;;44481:81;;;:::o;44568:77::-;;44634:5;44623:16;;44613:32;;;:::o;44651:154::-;44735:6;44730:3;44725;44712:30;44797:1;44788:6;44783:3;44779:16;44772:27;44702:103;;;:::o;44811:307::-;44879:1;44889:113;44903:6;44900:1;44897:13;44889:113;;;44988:1;44983:3;44979:11;44973:18;44969:1;44964:3;44960:11;44953:39;44925:2;44922:1;44918:10;44913:15;;44889:113;;;45020:6;45017:1;45014:13;45011:2;;;45100:1;45091:6;45086:3;45082:16;45075:27;45011:2;44860:258;;;;:::o;45124:171::-;;45186:24;45204:5;45186:24;:::i;:::-;45177:33;;45232:4;45225:5;45222:15;45219:2;;;45240:18;;:::i;:::-;45219:2;45287:1;45280:5;45276:13;45269:20;;45167:128;;;:::o;45301:320::-;;45382:1;45376:4;45372:12;45362:22;;45429:1;45423:4;45419:12;45450:18;45440:2;;45506:4;45498:6;45494:17;45484:27;;45440:2;45568;45560:6;45557:14;45537:18;45534:38;45531:2;;;45587:18;;:::i;:::-;45531:2;45352:269;;;;:::o;45627:233::-;;45689:24;45707:5;45689:24;:::i;:::-;45680:33;;45735:66;45728:5;45725:77;45722:2;;;45805:18;;:::i;:::-;45722:2;45852:1;45845:5;45841:13;45834:20;;45670:190;;;:::o;45866:176::-;;45915:20;45933:1;45915:20;:::i;:::-;45910:25;;45949:20;45967:1;45949:20;:::i;:::-;45944:25;;45988:1;45978:2;;45993:18;;:::i;:::-;45978:2;46034:1;46031;46027:9;46022:14;;45900:142;;;;:::o;46048:180::-;46096:77;46093:1;46086:88;46193:4;46190:1;46183:15;46217:4;46214:1;46207:15;46234:180;46282:77;46279:1;46272:88;46379:4;46376:1;46369:15;46403:4;46400:1;46393:15;46420:180;46468:77;46465:1;46458:88;46565:4;46562:1;46555:15;46589:4;46586:1;46579:15;46606:180;46654:77;46651:1;46644:88;46751:4;46748:1;46741:15;46775:4;46772:1;46765:15;46792:102;;46884:2;46880:7;46875:2;46868:5;46864:14;46860:28;46850:38;;46840:54;;;:::o;46900:122::-;46973:24;46991:5;46973:24;:::i;:::-;46966:5;46963:35;46953:2;;47012:1;47009;47002:12;46953:2;46943:79;:::o;47028:116::-;47098:21;47113:5;47098:21;:::i;:::-;47091:5;47088:32;47078:2;;47134:1;47131;47124:12;47078:2;47068:76;:::o;47150:122::-;47223:24;47241:5;47223:24;:::i;:::-;47216:5;47213:35;47203:2;;47262:1;47259;47252:12;47203:2;47193:79;:::o;47278:120::-;47350:23;47367:5;47350:23;:::i;:::-;47343:5;47340:34;47330:2;;47388:1;47385;47378:12;47330:2;47320:78;:::o;47404:122::-;47477:24;47495:5;47477:24;:::i;:::-;47470:5;47467:35;47457:2;;47516:1;47513;47506:12;47457:2;47447:79;:::o
Swarm Source
ipfs://3c6553008e88197be6a1ffbcb5ba26e024395d3c7fe8b88b7e4bef11a1e6bfef
Loading...
Loading
OVERVIEW
MaticPunks are NFTs on the Polygon(Matic) blockchain. Each of these 10,000 MaticPunks has attributes that make them unique according to a defined rarity system.Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.