Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
1,001 FRE
Holders
367
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 FRELoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FrensNFT
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-12 */ // File: @openzeppelin/contracts/utils/Counters.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol 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); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @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(); } } pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } pragma solidity 0.8.3; contract FrensNFT is ERC721, ERC721Enumerable,ERC721URIStorage, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIds; uint16 public constant maxSupply = 1001; string private _baseTokenURI; uint256 public _startDate = 1628884800; constructor() ERC721("Non Fungible Frens", "FRE") { } function setStartDate(uint256 startDate) public onlyOwner { _startDate = startDate; } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) { super._burn(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function setBaseURI(string memory _newbaseTokenURI) public onlyOwner { _baseTokenURI = _newbaseTokenURI; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } // Get minting limit (for a single transaction) based on current token supply function getCurrentMintLimit() public pure returns (uint8) { return 10; } // Get ether price based on current token supply function getCurrentPrice() public pure returns (uint64) { return 69_000_000_000_000_000; } function adminMint(uint8 _quantityToMint) public onlyOwner{ require(_quantityToMint >= 1, "Must mint at least 1"); require( _quantityToMint <= getCurrentMintLimit(), "Maximum current buy limit for individual transaction exceeded" ); require( (_quantityToMint + totalSupply()) <= maxSupply, "Exceeds maximum supply" ); for (uint8 i = 0; i < _quantityToMint; i++) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(msg.sender, newItemId); } } // Mint new token(s) function mint(uint8 _quantityToMint) public payable { require(_startDate <= block.timestamp, "Sale is not open"); require(_quantityToMint >= 1, "Must mint at least 1"); require( _quantityToMint <= getCurrentMintLimit(), "Maximum current buy limit for individual transaction exceeded" ); require( (_quantityToMint + totalSupply()) <= maxSupply, "Exceeds maximum supply" ); require( msg.value == (getCurrentPrice() * _quantityToMint), "Ether submitted does not match current price" ); for (uint8 i = 0; i < _quantityToMint; i++) { _tokenIds.increment(); uint256 newItemId = _tokenIds.current(); _mint(msg.sender, newItemId); } } function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } // Withdraw ether from contract function withdraw() public onlyOwner { require(address(this).balance > 0, "Balance must be positive"); (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success == true, "Failed to withdraw ether"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentMintLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newbaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setStartDate","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052636116cf40600e553480156200001957600080fd5b506040518060400160405280601281526020017f4e6f6e2046756e6769626c65204672656e7300000000000000000000000000008152506040518060400160405280600381526020017f465245000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009e929190620001ae565b508060019080519060200190620000b7929190620001ae565b505050620000da620000ce620000e060201b60201c565b620000e860201b60201c565b620002c3565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001bc906200025e565b90600052602060002090601f016020900481019282620001e057600085556200022c565b82601f10620001fb57805160ff19168380011785556200022c565b828001600101855582156200022c579182015b828111156200022b5782518255916020019190600101906200020e565b5b5090506200023b91906200023f565b5090565b5b808211156200025a57600081600090555060010162000240565b5090565b600060028204905060018216806200027757607f821691505b602082108114156200028e576200028d62000294565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6144a680620002d36000396000f3fe6080604052600436106101b75760003560e01c806370a08231116100ec578063ac8daba01161008a578063d5abeb0111610064578063d5abeb01146105fb578063e985e9c514610626578063eb91d37e14610663578063f2fde38b1461068e576101b7565b8063ac8daba01461056a578063b88d4fde14610595578063c87b56dd146105be576101b7565b80638ce667bc116100c65780638ce667bc146104c25780638da5cb5b146104eb57806395d89b4114610516578063a22cb46514610541576101b7565b806370a0823114610445578063715018a61461048257806382d95df514610499576101b7565b8063339181d9116101595780634f6ccce7116101335780634f6ccce71461038657806355f804b3146103c35780636352211e146103ec5780636ecd230614610429576101b7565b8063339181d91461031b5780633ccfd60b1461034657806342842e0e1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b55780632f745c59146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612ea3565b6106b7565b6040516101f091906134d6565b60405180910390f35b34801561020557600080fd5b5061020e6106c9565b60405161021b91906134f1565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612f36565b61075b565b604051610258919061346f565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612e67565b6107e0565b005b34801561029657600080fd5b5061029f6108f8565b6040516102ac919061386e565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612d61565b610905565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612e67565b610965565b604051610312919061386e565b60405180910390f35b34801561032757600080fd5b50610330610a0a565b60405161033d91906138a4565b60405180910390f35b34801561035257600080fd5b5061035b610a13565b005b34801561036957600080fd5b50610384600480360381019061037f9190612d61565b610b88565b005b34801561039257600080fd5b506103ad60048036038101906103a89190612f36565b610ba8565b6040516103ba919061386e565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190612ef5565b610c3f565b005b3480156103f857600080fd5b50610413600480360381019061040e9190612f36565b610cd5565b604051610420919061346f565b60405180910390f35b610443600480360381019061043e9190612f5f565b610d87565b005b34801561045157600080fd5b5061046c60048036038101906104679190612cfc565b610f6d565b604051610479919061386e565b60405180910390f35b34801561048e57600080fd5b50610497611025565b005b3480156104a557600080fd5b506104c060048036038101906104bb9190612f36565b6110ad565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190612f5f565b611133565b005b3480156104f757600080fd5b506105006112ef565b60405161050d919061346f565b60405180910390f35b34801561052257600080fd5b5061052b611319565b60405161053891906134f1565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190612e2b565b6113ab565b005b34801561057657600080fd5b5061057f61152c565b60405161058c919061386e565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612db0565b611532565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190612f36565b611594565b6040516105f291906134f1565b60405180910390f35b34801561060757600080fd5b506106106115a6565b60405161061d9190613853565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190612d25565b6115ac565b60405161065a91906134d6565b60405180910390f35b34801561066f57600080fd5b50610678611640565b6040516106859190613889565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190612cfc565b61164f565b005b60006106c282611747565b9050919050565b6060600080546106d890613b76565b80601f016020809104026020016040519081016040528092919081815260200182805461070490613b76565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b6000610766826117c1565b6107a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079c906136f3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107eb82610cd5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390613793565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087b61182d565b73ffffffffffffffffffffffffffffffffffffffff1614806108aa57506108a9816108a461182d565b6115ac565b5b6108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090613653565b60405180910390fd5b6108f38383611835565b505050565b6000600880549050905090565b61091661091061182d565b826118ee565b610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90613813565b60405180910390fd5b6109608383836119cc565b505050565b600061097083610f6d565b82106109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613513565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600a905090565b610a1b61182d565b73ffffffffffffffffffffffffffffffffffffffff16610a396112ef565b73ffffffffffffffffffffffffffffffffffffffff1614610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613713565b60405180910390fd5b60004711610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac9906135b3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610af89061345a565b60006040518083038185875af1925050503d8060008114610b35576040519150601f19603f3d011682016040523d82523d6000602084013e610b3a565b606091505b505090506001151581151514610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90613773565b60405180910390fd5b50565b610ba383838360405180602001604052806000815250611532565b505050565b6000610bb26108f8565b8210610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea90613833565b60405180910390fd5b60088281548110610c2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c4761182d565b73ffffffffffffffffffffffffffffffffffffffff16610c656112ef565b73ffffffffffffffffffffffffffffffffffffffff1614610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613713565b60405180910390fd5b80600d9080519060200190610cd1929190612b0b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590613693565b60405180910390fd5b80915050919050565b42600e541115610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc3906137f3565b60405180910390fd5b60018160ff161015610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a906137d3565b60405180910390fd5b610e1b610a0a565b60ff168160ff161115610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a906135d3565b60405180910390fd5b6103e961ffff16610e726108f8565b8260ff16610e809190613994565b1115610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb8906137b3565b60405180910390fd5b8060ff16610ecd611640565b610ed79190613a1b565b67ffffffffffffffff163414610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990613533565b60405180910390fd5b60005b8160ff168160ff161015610f6957610f3d600c611c28565b6000610f49600c611c3e565b9050610f553382611c4c565b508080610f6190613c22565b915050610f25565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590613673565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61102d61182d565b73ffffffffffffffffffffffffffffffffffffffff1661104b6112ef565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613713565b60405180910390fd5b6110ab6000611e1a565b565b6110b561182d565b73ffffffffffffffffffffffffffffffffffffffff166110d36112ef565b73ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112090613713565b60405180910390fd5b80600e8190555050565b61113b61182d565b73ffffffffffffffffffffffffffffffffffffffff166111596112ef565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690613713565b60405180910390fd5b60018160ff1610156111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed906137d3565b60405180910390fd5b6111fe610a0a565b60ff168160ff161115611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d906135d3565b60405180910390fd5b6103e961ffff166112556108f8565b8260ff166112639190613994565b11156112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b906137b3565b60405180910390fd5b60005b8160ff168160ff1610156112eb576112bf600c611c28565b60006112cb600c611c3e565b90506112d73382611c4c565b5080806112e390613c22565b9150506112a7565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132890613b76565b80601f016020809104026020016040519081016040528092919081815260200182805461135490613b76565b80156113a15780601f10611376576101008083540402835291602001916113a1565b820191906000526020600020905b81548152906001019060200180831161138457829003601f168201915b5050505050905090565b6113b361182d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613613565b60405180910390fd5b806005600061142e61182d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114db61182d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152091906134d6565b60405180910390a35050565b600e5481565b61154361153d61182d565b836118ee565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613813565b60405180910390fd5b61158e84848484611ee0565b50505050565b606061159f82611f3c565b9050919050565b6103e981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600066f5232269808000905090565b61165761182d565b73ffffffffffffffffffffffffffffffffffffffff166116756112ef565b73ffffffffffffffffffffffffffffffffffffffff16146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290613713565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290613573565b60405180910390fd5b61174481611e1a565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117ba57506117b98261208e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118a883610cd5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118f9826117c1565b611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f90613633565b60405180910390fd5b600061194383610cd5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119b257508373ffffffffffffffffffffffffffffffffffffffff1661199a8461075b565b73ffffffffffffffffffffffffffffffffffffffff16145b806119c357506119c281856115ac565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119ec82610cd5565b73ffffffffffffffffffffffffffffffffffffffff1614611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613733565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906135f3565b60405180910390fd5b611abd838383612170565b611ac8600082611835565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b189190613a5d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6f9190613994565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb3906136b3565b60405180910390fd5b611cc5816117c1565b15611d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfc90613593565b60405180910390fd5b611d1160008383612170565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d619190613994565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611eeb8484846119cc565b611ef784848484612180565b611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90613553565b60405180910390fd5b50505050565b6060611f47826117c1565b611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d906136d3565b60405180910390fd5b6000600a60008481526020019081526020016000208054611fa690613b76565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd290613b76565b801561201f5780601f10611ff45761010080835404028352916020019161201f565b820191906000526020600020905b81548152906001019060200180831161200257829003601f168201915b505050505090506000612030612317565b9050600081511415612046578192505050612089565b60008251111561207b578082604051602001612063929190613436565b60405160208183030381529060405292505050612089565b612084846123a9565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061215957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612169575061216882612450565b5b9050919050565b61217b8383836124ba565b505050565b60006121a18473ffffffffffffffffffffffffffffffffffffffff166125ce565b1561230a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121ca61182d565b8786866040518563ffffffff1660e01b81526004016121ec949392919061348a565b602060405180830381600087803b15801561220657600080fd5b505af192505050801561223757506040513d601f19601f820116820180604052508101906122349190612ecc565b60015b6122ba573d8060008114612267576040519150601f19603f3d011682016040523d82523d6000602084013e61226c565b606091505b506000815114156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a990613553565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061230f565b600190505b949350505050565b6060600d805461232690613b76565b80601f016020809104026020016040519081016040528092919081815260200182805461235290613b76565b801561239f5780601f106123745761010080835404028352916020019161239f565b820191906000526020600020905b81548152906001019060200180831161238257829003601f168201915b5050505050905090565b60606123b4826117c1565b6123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea90613753565b60405180910390fd5b60006123fd612317565b9050600081511161241d5760405180602001604052806000815250612448565b80612427846125e1565b604051602001612438929190613436565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124c583838361278e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125085761250381612793565b612547565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125465761254583826127dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561258a5761258581612949565b6125c9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125c8576125c78282612a8c565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612629576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612789565b600082905060005b6000821461265b57808061264490613bd9565b915050600a8261265491906139ea565b9150612631565b60008167ffffffffffffffff81111561269d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126cf5781602001600182028036833780820191505090505b5090505b60008514612782576001826126e89190613a5d565b9150600a856126f79190613c4c565b60306127039190613994565b60f81b81838151811061273f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561277b91906139ea565b94506126d3565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127e984610f6d565b6127f39190613a5d565b90506000600760008481526020019081526020016000205490508181146128d8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061295d9190613a5d565b90506000600960008481526020019081526020016000205490506000600883815481106129b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a9783610f6d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612b1790613b76565b90600052602060002090601f016020900481019282612b395760008555612b80565b82601f10612b5257805160ff1916838001178555612b80565b82800160010185558215612b80579182015b82811115612b7f578251825591602001919060010190612b64565b5b509050612b8d9190612b91565b5090565b5b80821115612baa576000816000905550600101612b92565b5090565b6000612bc1612bbc846138e4565b6138bf565b905082815260208101848484011115612bd957600080fd5b612be4848285613b34565b509392505050565b6000612bff612bfa84613915565b6138bf565b905082815260208101848484011115612c1757600080fd5b612c22848285613b34565b509392505050565b600081359050612c39816143fd565b92915050565b600081359050612c4e81614414565b92915050565b600081359050612c638161442b565b92915050565b600081519050612c788161442b565b92915050565b600082601f830112612c8f57600080fd5b8135612c9f848260208601612bae565b91505092915050565b600082601f830112612cb957600080fd5b8135612cc9848260208601612bec565b91505092915050565b600081359050612ce181614442565b92915050565b600081359050612cf681614459565b92915050565b600060208284031215612d0e57600080fd5b6000612d1c84828501612c2a565b91505092915050565b60008060408385031215612d3857600080fd5b6000612d4685828601612c2a565b9250506020612d5785828601612c2a565b9150509250929050565b600080600060608486031215612d7657600080fd5b6000612d8486828701612c2a565b9350506020612d9586828701612c2a565b9250506040612da686828701612cd2565b9150509250925092565b60008060008060808587031215612dc657600080fd5b6000612dd487828801612c2a565b9450506020612de587828801612c2a565b9350506040612df687828801612cd2565b925050606085013567ffffffffffffffff811115612e1357600080fd5b612e1f87828801612c7e565b91505092959194509250565b60008060408385031215612e3e57600080fd5b6000612e4c85828601612c2a565b9250506020612e5d85828601612c3f565b9150509250929050565b60008060408385031215612e7a57600080fd5b6000612e8885828601612c2a565b9250506020612e9985828601612cd2565b9150509250929050565b600060208284031215612eb557600080fd5b6000612ec384828501612c54565b91505092915050565b600060208284031215612ede57600080fd5b6000612eec84828501612c69565b91505092915050565b600060208284031215612f0757600080fd5b600082013567ffffffffffffffff811115612f2157600080fd5b612f2d84828501612ca8565b91505092915050565b600060208284031215612f4857600080fd5b6000612f5684828501612cd2565b91505092915050565b600060208284031215612f7157600080fd5b6000612f7f84828501612ce7565b91505092915050565b612f9181613a91565b82525050565b612fa081613aa3565b82525050565b6000612fb182613946565b612fbb818561395c565b9350612fcb818560208601613b43565b612fd481613d39565b840191505092915050565b6000612fea82613951565b612ff48185613978565b9350613004818560208601613b43565b61300d81613d39565b840191505092915050565b600061302382613951565b61302d8185613989565b935061303d818560208601613b43565b80840191505092915050565b6000613056602b83613978565b915061306182613d4a565b604082019050919050565b6000613079602c83613978565b915061308482613d99565b604082019050919050565b600061309c603283613978565b91506130a782613de8565b604082019050919050565b60006130bf602683613978565b91506130ca82613e37565b604082019050919050565b60006130e2601c83613978565b91506130ed82613e86565b602082019050919050565b6000613105601883613978565b915061311082613eaf565b602082019050919050565b6000613128603d83613978565b915061313382613ed8565b604082019050919050565b600061314b602483613978565b915061315682613f27565b604082019050919050565b600061316e601983613978565b915061317982613f76565b602082019050919050565b6000613191602c83613978565b915061319c82613f9f565b604082019050919050565b60006131b4603883613978565b91506131bf82613fee565b604082019050919050565b60006131d7602a83613978565b91506131e28261403d565b604082019050919050565b60006131fa602983613978565b91506132058261408c565b604082019050919050565b600061321d602083613978565b9150613228826140db565b602082019050919050565b6000613240603183613978565b915061324b82614104565b604082019050919050565b6000613263602c83613978565b915061326e82614153565b604082019050919050565b6000613286602083613978565b9150613291826141a2565b602082019050919050565b60006132a9602983613978565b91506132b4826141cb565b604082019050919050565b60006132cc602f83613978565b91506132d78261421a565b604082019050919050565b60006132ef601883613978565b91506132fa82614269565b602082019050919050565b6000613312602183613978565b915061331d82614292565b604082019050919050565b6000613335601683613978565b9150613340826142e1565b602082019050919050565b6000613358601483613978565b91506133638261430a565b602082019050919050565b600061337b601083613978565b915061338682614333565b602082019050919050565b600061339e60008361396d565b91506133a98261435c565b600082019050919050565b60006133c1603183613978565b91506133cc8261435f565b604082019050919050565b60006133e4602c83613978565b91506133ef826143ae565b604082019050919050565b61340381613adb565b82525050565b61341281613b09565b82525050565b61342181613b13565b82525050565b61343081613b27565b82525050565b60006134428285613018565b915061344e8284613018565b91508190509392505050565b600061346582613391565b9150819050919050565b60006020820190506134846000830184612f88565b92915050565b600060808201905061349f6000830187612f88565b6134ac6020830186612f88565b6134b96040830185613409565b81810360608301526134cb8184612fa6565b905095945050505050565b60006020820190506134eb6000830184612f97565b92915050565b6000602082019050818103600083015261350b8184612fdf565b905092915050565b6000602082019050818103600083015261352c81613049565b9050919050565b6000602082019050818103600083015261354c8161306c565b9050919050565b6000602082019050818103600083015261356c8161308f565b9050919050565b6000602082019050818103600083015261358c816130b2565b9050919050565b600060208201905081810360008301526135ac816130d5565b9050919050565b600060208201905081810360008301526135cc816130f8565b9050919050565b600060208201905081810360008301526135ec8161311b565b9050919050565b6000602082019050818103600083015261360c8161313e565b9050919050565b6000602082019050818103600083015261362c81613161565b9050919050565b6000602082019050818103600083015261364c81613184565b9050919050565b6000602082019050818103600083015261366c816131a7565b9050919050565b6000602082019050818103600083015261368c816131ca565b9050919050565b600060208201905081810360008301526136ac816131ed565b9050919050565b600060208201905081810360008301526136cc81613210565b9050919050565b600060208201905081810360008301526136ec81613233565b9050919050565b6000602082019050818103600083015261370c81613256565b9050919050565b6000602082019050818103600083015261372c81613279565b9050919050565b6000602082019050818103600083015261374c8161329c565b9050919050565b6000602082019050818103600083015261376c816132bf565b9050919050565b6000602082019050818103600083015261378c816132e2565b9050919050565b600060208201905081810360008301526137ac81613305565b9050919050565b600060208201905081810360008301526137cc81613328565b9050919050565b600060208201905081810360008301526137ec8161334b565b9050919050565b6000602082019050818103600083015261380c8161336e565b9050919050565b6000602082019050818103600083015261382c816133b4565b9050919050565b6000602082019050818103600083015261384c816133d7565b9050919050565b600060208201905061386860008301846133fa565b92915050565b60006020820190506138836000830184613409565b92915050565b600060208201905061389e6000830184613418565b92915050565b60006020820190506138b96000830184613427565b92915050565b60006138c96138da565b90506138d58282613ba8565b919050565b6000604051905090565b600067ffffffffffffffff8211156138ff576138fe613d0a565b5b61390882613d39565b9050602081019050919050565b600067ffffffffffffffff8211156139305761392f613d0a565b5b61393982613d39565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061399f82613b09565b91506139aa83613b09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139df576139de613c7d565b5b828201905092915050565b60006139f582613b09565b9150613a0083613b09565b925082613a1057613a0f613cac565b5b828204905092915050565b6000613a2682613b13565b9150613a3183613b13565b92508167ffffffffffffffff0483118215151615613a5257613a51613c7d565b5b828202905092915050565b6000613a6882613b09565b9150613a7383613b09565b925082821015613a8657613a85613c7d565b5b828203905092915050565b6000613a9c82613ae9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613b61578082015181840152602081019050613b46565b83811115613b70576000848401525b50505050565b60006002820490506001821680613b8e57607f821691505b60208210811415613ba257613ba1613cdb565b5b50919050565b613bb182613d39565b810181811067ffffffffffffffff82111715613bd057613bcf613d0a565b5b80604052505050565b6000613be482613b09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c1757613c16613c7d565b5b600182019050919050565b6000613c2d82613b27565b915060ff821415613c4157613c40613c7d565b5b600182019050919050565b6000613c5782613b09565b9150613c6283613b09565b925082613c7257613c71613cac565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61440681613a91565b811461441157600080fd5b50565b61441d81613aa3565b811461442857600080fd5b50565b61443481613aaf565b811461443f57600080fd5b50565b61444b81613b09565b811461445657600080fd5b50565b61446281613b27565b811461446d57600080fd5b5056fea2646970667358221220f7d97647680b7073151e29f15a4fab59519d8ddda1b338942b17412fe38351f064736f6c63430008030033
Deployed Bytecode
0x6080604052600436106101b75760003560e01c806370a08231116100ec578063ac8daba01161008a578063d5abeb0111610064578063d5abeb01146105fb578063e985e9c514610626578063eb91d37e14610663578063f2fde38b1461068e576101b7565b8063ac8daba01461056a578063b88d4fde14610595578063c87b56dd146105be576101b7565b80638ce667bc116100c65780638ce667bc146104c25780638da5cb5b146104eb57806395d89b4114610516578063a22cb46514610541576101b7565b806370a0823114610445578063715018a61461048257806382d95df514610499576101b7565b8063339181d9116101595780634f6ccce7116101335780634f6ccce71461038657806355f804b3146103c35780636352211e146103ec5780636ecd230614610429576101b7565b8063339181d91461031b5780633ccfd60b1461034657806342842e0e1461035d576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b55780632f745c59146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612ea3565b6106b7565b6040516101f091906134d6565b60405180910390f35b34801561020557600080fd5b5061020e6106c9565b60405161021b91906134f1565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612f36565b61075b565b604051610258919061346f565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612e67565b6107e0565b005b34801561029657600080fd5b5061029f6108f8565b6040516102ac919061386e565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612d61565b610905565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612e67565b610965565b604051610312919061386e565b60405180910390f35b34801561032757600080fd5b50610330610a0a565b60405161033d91906138a4565b60405180910390f35b34801561035257600080fd5b5061035b610a13565b005b34801561036957600080fd5b50610384600480360381019061037f9190612d61565b610b88565b005b34801561039257600080fd5b506103ad60048036038101906103a89190612f36565b610ba8565b6040516103ba919061386e565b60405180910390f35b3480156103cf57600080fd5b506103ea60048036038101906103e59190612ef5565b610c3f565b005b3480156103f857600080fd5b50610413600480360381019061040e9190612f36565b610cd5565b604051610420919061346f565b60405180910390f35b610443600480360381019061043e9190612f5f565b610d87565b005b34801561045157600080fd5b5061046c60048036038101906104679190612cfc565b610f6d565b604051610479919061386e565b60405180910390f35b34801561048e57600080fd5b50610497611025565b005b3480156104a557600080fd5b506104c060048036038101906104bb9190612f36565b6110ad565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190612f5f565b611133565b005b3480156104f757600080fd5b506105006112ef565b60405161050d919061346f565b60405180910390f35b34801561052257600080fd5b5061052b611319565b60405161053891906134f1565b60405180910390f35b34801561054d57600080fd5b5061056860048036038101906105639190612e2b565b6113ab565b005b34801561057657600080fd5b5061057f61152c565b60405161058c919061386e565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612db0565b611532565b005b3480156105ca57600080fd5b506105e560048036038101906105e09190612f36565b611594565b6040516105f291906134f1565b60405180910390f35b34801561060757600080fd5b506106106115a6565b60405161061d9190613853565b60405180910390f35b34801561063257600080fd5b5061064d60048036038101906106489190612d25565b6115ac565b60405161065a91906134d6565b60405180910390f35b34801561066f57600080fd5b50610678611640565b6040516106859190613889565b60405180910390f35b34801561069a57600080fd5b506106b560048036038101906106b09190612cfc565b61164f565b005b60006106c282611747565b9050919050565b6060600080546106d890613b76565b80601f016020809104026020016040519081016040528092919081815260200182805461070490613b76565b80156107515780601f1061072657610100808354040283529160200191610751565b820191906000526020600020905b81548152906001019060200180831161073457829003601f168201915b5050505050905090565b6000610766826117c1565b6107a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079c906136f3565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107eb82610cd5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085390613793565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087b61182d565b73ffffffffffffffffffffffffffffffffffffffff1614806108aa57506108a9816108a461182d565b6115ac565b5b6108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090613653565b60405180910390fd5b6108f38383611835565b505050565b6000600880549050905090565b61091661091061182d565b826118ee565b610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90613813565b60405180910390fd5b6109608383836119cc565b505050565b600061097083610f6d565b82106109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613513565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600a905090565b610a1b61182d565b73ffffffffffffffffffffffffffffffffffffffff16610a396112ef565b73ffffffffffffffffffffffffffffffffffffffff1614610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613713565b60405180910390fd5b60004711610ad2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac9906135b3565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610af89061345a565b60006040518083038185875af1925050503d8060008114610b35576040519150601f19603f3d011682016040523d82523d6000602084013e610b3a565b606091505b505090506001151581151514610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90613773565b60405180910390fd5b50565b610ba383838360405180602001604052806000815250611532565b505050565b6000610bb26108f8565b8210610bf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bea90613833565b60405180910390fd5b60088281548110610c2d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c4761182d565b73ffffffffffffffffffffffffffffffffffffffff16610c656112ef565b73ffffffffffffffffffffffffffffffffffffffff1614610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613713565b60405180910390fd5b80600d9080519060200190610cd1929190612b0b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590613693565b60405180910390fd5b80915050919050565b42600e541115610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc3906137f3565b60405180910390fd5b60018160ff161015610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a906137d3565b60405180910390fd5b610e1b610a0a565b60ff168160ff161115610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a906135d3565b60405180910390fd5b6103e961ffff16610e726108f8565b8260ff16610e809190613994565b1115610ec1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb8906137b3565b60405180910390fd5b8060ff16610ecd611640565b610ed79190613a1b565b67ffffffffffffffff163414610f22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1990613533565b60405180910390fd5b60005b8160ff168160ff161015610f6957610f3d600c611c28565b6000610f49600c611c3e565b9050610f553382611c4c565b508080610f6190613c22565b915050610f25565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd590613673565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61102d61182d565b73ffffffffffffffffffffffffffffffffffffffff1661104b6112ef565b73ffffffffffffffffffffffffffffffffffffffff16146110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890613713565b60405180910390fd5b6110ab6000611e1a565b565b6110b561182d565b73ffffffffffffffffffffffffffffffffffffffff166110d36112ef565b73ffffffffffffffffffffffffffffffffffffffff1614611129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112090613713565b60405180910390fd5b80600e8190555050565b61113b61182d565b73ffffffffffffffffffffffffffffffffffffffff166111596112ef565b73ffffffffffffffffffffffffffffffffffffffff16146111af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a690613713565b60405180910390fd5b60018160ff1610156111f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ed906137d3565b60405180910390fd5b6111fe610a0a565b60ff168160ff161115611246576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123d906135d3565b60405180910390fd5b6103e961ffff166112556108f8565b8260ff166112639190613994565b11156112a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129b906137b3565b60405180910390fd5b60005b8160ff168160ff1610156112eb576112bf600c611c28565b60006112cb600c611c3e565b90506112d73382611c4c565b5080806112e390613c22565b9150506112a7565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461132890613b76565b80601f016020809104026020016040519081016040528092919081815260200182805461135490613b76565b80156113a15780601f10611376576101008083540402835291602001916113a1565b820191906000526020600020905b81548152906001019060200180831161138457829003601f168201915b5050505050905090565b6113b361182d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141890613613565b60405180910390fd5b806005600061142e61182d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114db61182d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161152091906134d6565b60405180910390a35050565b600e5481565b61154361153d61182d565b836118ee565b611582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157990613813565b60405180910390fd5b61158e84848484611ee0565b50505050565b606061159f82611f3c565b9050919050565b6103e981565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600066f5232269808000905090565b61165761182d565b73ffffffffffffffffffffffffffffffffffffffff166116756112ef565b73ffffffffffffffffffffffffffffffffffffffff16146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c290613713565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561173b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173290613573565b60405180910390fd5b61174481611e1a565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806117ba57506117b98261208e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166118a883610cd5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006118f9826117c1565b611938576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192f90613633565b60405180910390fd5b600061194383610cd5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806119b257508373ffffffffffffffffffffffffffffffffffffffff1661199a8461075b565b73ffffffffffffffffffffffffffffffffffffffff16145b806119c357506119c281856115ac565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119ec82610cd5565b73ffffffffffffffffffffffffffffffffffffffff1614611a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3990613733565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa9906135f3565b60405180910390fd5b611abd838383612170565b611ac8600082611835565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b189190613a5d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b6f9190613994565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb3906136b3565b60405180910390fd5b611cc5816117c1565b15611d05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfc90613593565b60405180910390fd5b611d1160008383612170565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d619190613994565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611eeb8484846119cc565b611ef784848484612180565b611f36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2d90613553565b60405180910390fd5b50505050565b6060611f47826117c1565b611f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7d906136d3565b60405180910390fd5b6000600a60008481526020019081526020016000208054611fa690613b76565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd290613b76565b801561201f5780601f10611ff45761010080835404028352916020019161201f565b820191906000526020600020905b81548152906001019060200180831161200257829003601f168201915b505050505090506000612030612317565b9050600081511415612046578192505050612089565b60008251111561207b578082604051602001612063929190613436565b60405160208183030381529060405292505050612089565b612084846123a9565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061215957507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612169575061216882612450565b5b9050919050565b61217b8383836124ba565b505050565b60006121a18473ffffffffffffffffffffffffffffffffffffffff166125ce565b1561230a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121ca61182d565b8786866040518563ffffffff1660e01b81526004016121ec949392919061348a565b602060405180830381600087803b15801561220657600080fd5b505af192505050801561223757506040513d601f19601f820116820180604052508101906122349190612ecc565b60015b6122ba573d8060008114612267576040519150601f19603f3d011682016040523d82523d6000602084013e61226c565b606091505b506000815114156122b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a990613553565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061230f565b600190505b949350505050565b6060600d805461232690613b76565b80601f016020809104026020016040519081016040528092919081815260200182805461235290613b76565b801561239f5780601f106123745761010080835404028352916020019161239f565b820191906000526020600020905b81548152906001019060200180831161238257829003601f168201915b5050505050905090565b60606123b4826117c1565b6123f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ea90613753565b60405180910390fd5b60006123fd612317565b9050600081511161241d5760405180602001604052806000815250612448565b80612427846125e1565b604051602001612438929190613436565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124c583838361278e565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156125085761250381612793565b612547565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125465761254583826127dc565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561258a5761258581612949565b6125c9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125c8576125c78282612a8c565b5b5b505050565b600080823b905060008111915050919050565b60606000821415612629576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612789565b600082905060005b6000821461265b57808061264490613bd9565b915050600a8261265491906139ea565b9150612631565b60008167ffffffffffffffff81111561269d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156126cf5781602001600182028036833780820191505090505b5090505b60008514612782576001826126e89190613a5d565b9150600a856126f79190613c4c565b60306127039190613994565b60f81b81838151811061273f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561277b91906139ea565b94506126d3565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016127e984610f6d565b6127f39190613a5d565b90506000600760008481526020019081526020016000205490508181146128d8576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061295d9190613a5d565b90506000600960008481526020019081526020016000205490506000600883815481106129b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106129fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a70577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a9783610f6d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612b1790613b76565b90600052602060002090601f016020900481019282612b395760008555612b80565b82601f10612b5257805160ff1916838001178555612b80565b82800160010185558215612b80579182015b82811115612b7f578251825591602001919060010190612b64565b5b509050612b8d9190612b91565b5090565b5b80821115612baa576000816000905550600101612b92565b5090565b6000612bc1612bbc846138e4565b6138bf565b905082815260208101848484011115612bd957600080fd5b612be4848285613b34565b509392505050565b6000612bff612bfa84613915565b6138bf565b905082815260208101848484011115612c1757600080fd5b612c22848285613b34565b509392505050565b600081359050612c39816143fd565b92915050565b600081359050612c4e81614414565b92915050565b600081359050612c638161442b565b92915050565b600081519050612c788161442b565b92915050565b600082601f830112612c8f57600080fd5b8135612c9f848260208601612bae565b91505092915050565b600082601f830112612cb957600080fd5b8135612cc9848260208601612bec565b91505092915050565b600081359050612ce181614442565b92915050565b600081359050612cf681614459565b92915050565b600060208284031215612d0e57600080fd5b6000612d1c84828501612c2a565b91505092915050565b60008060408385031215612d3857600080fd5b6000612d4685828601612c2a565b9250506020612d5785828601612c2a565b9150509250929050565b600080600060608486031215612d7657600080fd5b6000612d8486828701612c2a565b9350506020612d9586828701612c2a565b9250506040612da686828701612cd2565b9150509250925092565b60008060008060808587031215612dc657600080fd5b6000612dd487828801612c2a565b9450506020612de587828801612c2a565b9350506040612df687828801612cd2565b925050606085013567ffffffffffffffff811115612e1357600080fd5b612e1f87828801612c7e565b91505092959194509250565b60008060408385031215612e3e57600080fd5b6000612e4c85828601612c2a565b9250506020612e5d85828601612c3f565b9150509250929050565b60008060408385031215612e7a57600080fd5b6000612e8885828601612c2a565b9250506020612e9985828601612cd2565b9150509250929050565b600060208284031215612eb557600080fd5b6000612ec384828501612c54565b91505092915050565b600060208284031215612ede57600080fd5b6000612eec84828501612c69565b91505092915050565b600060208284031215612f0757600080fd5b600082013567ffffffffffffffff811115612f2157600080fd5b612f2d84828501612ca8565b91505092915050565b600060208284031215612f4857600080fd5b6000612f5684828501612cd2565b91505092915050565b600060208284031215612f7157600080fd5b6000612f7f84828501612ce7565b91505092915050565b612f9181613a91565b82525050565b612fa081613aa3565b82525050565b6000612fb182613946565b612fbb818561395c565b9350612fcb818560208601613b43565b612fd481613d39565b840191505092915050565b6000612fea82613951565b612ff48185613978565b9350613004818560208601613b43565b61300d81613d39565b840191505092915050565b600061302382613951565b61302d8185613989565b935061303d818560208601613b43565b80840191505092915050565b6000613056602b83613978565b915061306182613d4a565b604082019050919050565b6000613079602c83613978565b915061308482613d99565b604082019050919050565b600061309c603283613978565b91506130a782613de8565b604082019050919050565b60006130bf602683613978565b91506130ca82613e37565b604082019050919050565b60006130e2601c83613978565b91506130ed82613e86565b602082019050919050565b6000613105601883613978565b915061311082613eaf565b602082019050919050565b6000613128603d83613978565b915061313382613ed8565b604082019050919050565b600061314b602483613978565b915061315682613f27565b604082019050919050565b600061316e601983613978565b915061317982613f76565b602082019050919050565b6000613191602c83613978565b915061319c82613f9f565b604082019050919050565b60006131b4603883613978565b91506131bf82613fee565b604082019050919050565b60006131d7602a83613978565b91506131e28261403d565b604082019050919050565b60006131fa602983613978565b91506132058261408c565b604082019050919050565b600061321d602083613978565b9150613228826140db565b602082019050919050565b6000613240603183613978565b915061324b82614104565b604082019050919050565b6000613263602c83613978565b915061326e82614153565b604082019050919050565b6000613286602083613978565b9150613291826141a2565b602082019050919050565b60006132a9602983613978565b91506132b4826141cb565b604082019050919050565b60006132cc602f83613978565b91506132d78261421a565b604082019050919050565b60006132ef601883613978565b91506132fa82614269565b602082019050919050565b6000613312602183613978565b915061331d82614292565b604082019050919050565b6000613335601683613978565b9150613340826142e1565b602082019050919050565b6000613358601483613978565b91506133638261430a565b602082019050919050565b600061337b601083613978565b915061338682614333565b602082019050919050565b600061339e60008361396d565b91506133a98261435c565b600082019050919050565b60006133c1603183613978565b91506133cc8261435f565b604082019050919050565b60006133e4602c83613978565b91506133ef826143ae565b604082019050919050565b61340381613adb565b82525050565b61341281613b09565b82525050565b61342181613b13565b82525050565b61343081613b27565b82525050565b60006134428285613018565b915061344e8284613018565b91508190509392505050565b600061346582613391565b9150819050919050565b60006020820190506134846000830184612f88565b92915050565b600060808201905061349f6000830187612f88565b6134ac6020830186612f88565b6134b96040830185613409565b81810360608301526134cb8184612fa6565b905095945050505050565b60006020820190506134eb6000830184612f97565b92915050565b6000602082019050818103600083015261350b8184612fdf565b905092915050565b6000602082019050818103600083015261352c81613049565b9050919050565b6000602082019050818103600083015261354c8161306c565b9050919050565b6000602082019050818103600083015261356c8161308f565b9050919050565b6000602082019050818103600083015261358c816130b2565b9050919050565b600060208201905081810360008301526135ac816130d5565b9050919050565b600060208201905081810360008301526135cc816130f8565b9050919050565b600060208201905081810360008301526135ec8161311b565b9050919050565b6000602082019050818103600083015261360c8161313e565b9050919050565b6000602082019050818103600083015261362c81613161565b9050919050565b6000602082019050818103600083015261364c81613184565b9050919050565b6000602082019050818103600083015261366c816131a7565b9050919050565b6000602082019050818103600083015261368c816131ca565b9050919050565b600060208201905081810360008301526136ac816131ed565b9050919050565b600060208201905081810360008301526136cc81613210565b9050919050565b600060208201905081810360008301526136ec81613233565b9050919050565b6000602082019050818103600083015261370c81613256565b9050919050565b6000602082019050818103600083015261372c81613279565b9050919050565b6000602082019050818103600083015261374c8161329c565b9050919050565b6000602082019050818103600083015261376c816132bf565b9050919050565b6000602082019050818103600083015261378c816132e2565b9050919050565b600060208201905081810360008301526137ac81613305565b9050919050565b600060208201905081810360008301526137cc81613328565b9050919050565b600060208201905081810360008301526137ec8161334b565b9050919050565b6000602082019050818103600083015261380c8161336e565b9050919050565b6000602082019050818103600083015261382c816133b4565b9050919050565b6000602082019050818103600083015261384c816133d7565b9050919050565b600060208201905061386860008301846133fa565b92915050565b60006020820190506138836000830184613409565b92915050565b600060208201905061389e6000830184613418565b92915050565b60006020820190506138b96000830184613427565b92915050565b60006138c96138da565b90506138d58282613ba8565b919050565b6000604051905090565b600067ffffffffffffffff8211156138ff576138fe613d0a565b5b61390882613d39565b9050602081019050919050565b600067ffffffffffffffff8211156139305761392f613d0a565b5b61393982613d39565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061399f82613b09565b91506139aa83613b09565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139df576139de613c7d565b5b828201905092915050565b60006139f582613b09565b9150613a0083613b09565b925082613a1057613a0f613cac565b5b828204905092915050565b6000613a2682613b13565b9150613a3183613b13565b92508167ffffffffffffffff0483118215151615613a5257613a51613c7d565b5b828202905092915050565b6000613a6882613b09565b9150613a7383613b09565b925082821015613a8657613a85613c7d565b5b828203905092915050565b6000613a9c82613ae9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613b61578082015181840152602081019050613b46565b83811115613b70576000848401525b50505050565b60006002820490506001821680613b8e57607f821691505b60208210811415613ba257613ba1613cdb565b5b50919050565b613bb182613d39565b810181811067ffffffffffffffff82111715613bd057613bcf613d0a565b5b80604052505050565b6000613be482613b09565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c1757613c16613c7d565b5b600182019050919050565b6000613c2d82613b27565b915060ff821415613c4157613c40613c7d565b5b600182019050919050565b6000613c5782613b09565b9150613c6283613b09565b925082613c7257613c71613cac565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e742070726963650000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4d6178696d756d2063757272656e7420627579206c696d697420666f7220696e60008201527f646976696475616c207472616e73616374696f6e206578636565646564000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772065746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4d757374206d696e74206174206c656173742031000000000000000000000000600082015250565b7f53616c65206973206e6f74206f70656e00000000000000000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61440681613a91565b811461441157600080fd5b50565b61441d81613aa3565b811461442857600080fd5b50565b61443481613aaf565b811461443f57600080fd5b50565b61444b81613b09565b811461445657600080fd5b50565b61446281613b27565b811461446d57600080fd5b5056fea2646970667358221220f7d97647680b7073151e29f15a4fab59519d8ddda1b338942b17412fe38351f064736f6c63430008030033
Deployed Bytecode Sourcemap
46248:3670:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47090:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26235:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27794:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27317:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38873:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28684:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38541:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47637:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49655:260;;;;;;;;;;;;;:::i;:::-;;29094:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39063:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47312:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25929:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48560:842;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25659:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3868:94;;;;;;;;;;;;;:::i;:::-;;46631:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47902:624;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3217:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26404:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28087:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46502:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29350:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49414:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46415:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28453:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47786:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4117:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47090:212;47229:4;47258:36;47282:11;47258:23;:36::i;:::-;47251:43;;47090:212;;;:::o;26235:100::-;26289:13;26322:5;26315:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26235:100;:::o;27794:221::-;27870:7;27898:16;27906:7;27898;:16::i;:::-;27890:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:15;:24;27999:7;27983:24;;;;;;;;;;;;;;;;;;;;;27976:31;;27794:221;;;:::o;27317:411::-;27398:13;27414:23;27429:7;27414:14;:23::i;:::-;27398:39;;27462:5;27456:11;;:2;:11;;;;27448:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27556:5;27540:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27565:37;27582:5;27589:12;:10;:12::i;:::-;27565:16;:37::i;:::-;27540:62;27518:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27699:21;27708:2;27712:7;27699:8;:21::i;:::-;27317:411;;;:::o;38873:113::-;38934:7;38961:10;:17;;;;38954:24;;38873:113;:::o;28684:339::-;28879:41;28898:12;:10;:12::i;:::-;28912:7;28879:18;:41::i;:::-;28871:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28987:28;28997:4;29003:2;29007:7;28987:9;:28::i;:::-;28684:339;;;:::o;38541:256::-;38638:7;38674:23;38691:5;38674:16;:23::i;:::-;38666:5;:31;38658:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38763:12;:19;38776:5;38763:19;;;;;;;;;;;;;;;:26;38783:5;38763:26;;;;;;;;;;;;38756:33;;38541:256;;;;:::o;47637:87::-;47689:5;47714:2;47707:9;;47637:87;:::o;49655:260::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49735:1:::1;49711:21;:25;49703:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;49777:12;49795:10;:15;;49818:21;49795:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49776:68;;;49874:4;49863:15;;:7;:15;;;49855:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3508:1;49655:260::o:0;29094:185::-;29232:39;29249:4;29255:2;29259:7;29232:39;;;;;;;;;;;;:16;:39::i;:::-;29094:185;;;:::o;39063:233::-;39138:7;39174:30;:28;:30::i;:::-;39166:5;:38;39158:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39271:10;39282:5;39271:17;;;;;;;;;;;;;;;;;;;;;;;;39264:24;;39063:233;;;:::o;47312:120::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47408:16:::1;47392:13;:32;;;;;;;;;;;;:::i;:::-;;47312:120:::0;:::o;25929:239::-;26001:7;26021:13;26037:7;:16;26045:7;26037:16;;;;;;;;;;;;;;;;;;;;;26021:32;;26089:1;26072:19;;:5;:19;;;;26064:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26155:5;26148:12;;;25929:239;;;:::o;48560:842::-;48645:15;48631:10;;:29;;48623:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48719:1;48700:15;:20;;;;48692:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48797:21;:19;:21::i;:::-;48778:40;;:15;:40;;;;48756:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;46450:4;48940:46;;48959:13;:11;:13::i;:::-;48941:15;:31;;;;;;:::i;:::-;48940:46;;48918:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;49103:15;49083:35;;:17;:15;:17::i;:::-;:35;;;;:::i;:::-;49069:50;;:9;:50;49047:144;;;;;;;;;;;;:::i;:::-;;;;;;;;;49209:7;49204:191;49226:15;49222:19;;:1;:19;;;49204:191;;;49263:21;:9;:19;:21::i;:::-;49301:17;49321:19;:9;:17;:19::i;:::-;49301:39;;49355:28;49361:10;49373:9;49355:5;:28::i;:::-;49204:191;49243:3;;;;;:::i;:::-;;;;49204:191;;;;48560:842;:::o;25659:208::-;25731:7;25776:1;25759:19;;:5;:19;;;;25751:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25843:9;:16;25853:5;25843:16;;;;;;;;;;;;;;;;25836:23;;25659:208;;;:::o;3868:94::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3933:21:::1;3951:1;3933:9;:21::i;:::-;3868:94::o:0;46631:99::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46713:9:::1;46700:10;:22;;;;46631:99:::0;:::o;47902:624::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47998:1:::1;47979:15;:20;;;;47971:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48076:21;:19;:21::i;:::-;48057:40;;:15;:40;;;;48035:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;46450:4;48219:46;;48238:13;:11;:13::i;:::-;48220:15;:31;;;;;;:::i;:::-;48219:46;;48197:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48333:7;48328:191;48350:15;48346:19;;:1;:19;;;48328:191;;;48387:21;:9;:19;:21::i;:::-;48425:17;48445:19;:9;:17;:19::i;:::-;48425:39;;48479:28;48485:10;48497:9;48479:5;:28::i;:::-;48328:191;48367:3;;;;;:::i;:::-;;;;48328:191;;;;47902:624:::0;:::o;3217:87::-;3263:7;3290:6;;;;;;;;;;;3283:13;;3217:87;:::o;26404:104::-;26460:13;26493:7;26486:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:104;:::o;28087:295::-;28202:12;:10;:12::i;:::-;28190:24;;:8;:24;;;;28182:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28302:8;28257:18;:32;28276:12;:10;:12::i;:::-;28257:32;;;;;;;;;;;;;;;:42;28290:8;28257:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28355:8;28326:48;;28341:12;:10;:12::i;:::-;28326:48;;;28365:8;28326:48;;;;;;:::i;:::-;;;;;;;;28087:295;;:::o;46502:38::-;;;;:::o;29350:328::-;29525:41;29544:12;:10;:12::i;:::-;29558:7;29525:18;:41::i;:::-;29517:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29631:39;29645:4;29651:2;29655:7;29664:5;29631:13;:39::i;:::-;29350:328;;;;:::o;49414:196::-;49541:13;49579:23;49594:7;49579:14;:23::i;:::-;49572:30;;49414:196;;;:::o;46415:39::-;46450:4;46415:39;:::o;28453:164::-;28550:4;28574:18;:25;28593:5;28574:25;;;;;;;;;;;;;;;:35;28600:8;28574:35;;;;;;;;;;;;;;;;;;;;;;;;;28567:42;;28453:164;;;;:::o;47786:104::-;47834:6;47860:22;47853:29;;47786:104;:::o;4117:192::-;3448:12;:10;:12::i;:::-;3437:23;;:7;:5;:7::i;:::-;:23;;;3429:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4226:1:::1;4206:22;;:8;:22;;;;4198:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4282:19;4292:8;4282:9;:19::i;:::-;4117:192:::0;:::o;38233:224::-;38335:4;38374:35;38359:50;;;:11;:50;;;;:90;;;;38413:36;38437:11;38413:23;:36::i;:::-;38359:90;38352:97;;38233:224;;;:::o;31188:127::-;31253:4;31305:1;31277:30;;:7;:16;31285:7;31277:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31270:37;;31188:127;;;:::o;2062:98::-;2115:7;2142:10;2135:17;;2062:98;:::o;35170:174::-;35272:2;35245:15;:24;35261:7;35245:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35328:7;35324:2;35290:46;;35299:23;35314:7;35299:14;:23::i;:::-;35290:46;;;;;;;;;;;;35170:174;;:::o;31482:348::-;31575:4;31600:16;31608:7;31600;:16::i;:::-;31592:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31676:13;31692:23;31707:7;31692:14;:23::i;:::-;31676:39;;31745:5;31734:16;;:7;:16;;;:51;;;;31778:7;31754:31;;:20;31766:7;31754:11;:20::i;:::-;:31;;;31734:51;:87;;;;31789:32;31806:5;31813:7;31789:16;:32::i;:::-;31734:87;31726:96;;;31482:348;;;;:::o;34474:578::-;34633:4;34606:31;;:23;34621:7;34606:14;:23::i;:::-;:31;;;34598:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34716:1;34702:16;;:2;:16;;;;34694:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34772:39;34793:4;34799:2;34803:7;34772:20;:39::i;:::-;34876:29;34893:1;34897:7;34876:8;:29::i;:::-;34937:1;34918:9;:15;34928:4;34918:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34966:1;34949:9;:13;34959:2;34949:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34997:2;34978:7;:16;34986:7;34978:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35036:7;35032:2;35017:27;;35026:4;35017:27;;;;;;;;;;;;34474:578;;;:::o;970:127::-;1077:1;1059:7;:14;;;:19;;;;;;;;;;;970:127;:::o;848:114::-;913:7;940;:14;;;933:21;;848:114;;;:::o;33166:382::-;33260:1;33246:16;;:2;:16;;;;33238:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33319:16;33327:7;33319;:16::i;:::-;33318:17;33310:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33381:45;33410:1;33414:2;33418:7;33381:20;:45::i;:::-;33456:1;33439:9;:13;33449:2;33439:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33487:2;33468:7;:16;33476:7;33468:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33532:7;33528:2;33507:33;;33524:1;33507:33;;;;;;;;;;;;33166:382;;:::o;4317:173::-;4373:16;4392:6;;;;;;;;;;;4373:25;;4418:8;4409:6;;:17;;;;;;;;;;;;;;;;;;4473:8;4442:40;;4463:8;4442:40;;;;;;;;;;;;4317:173;;:::o;30560:315::-;30717:28;30727:4;30733:2;30737:7;30717:9;:28::i;:::-;30764:48;30787:4;30793:2;30797:7;30806:5;30764:22;:48::i;:::-;30756:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30560:315;;;;:::o;44726:679::-;44799:13;44833:16;44841:7;44833;:16::i;:::-;44825:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;44916:23;44942:10;:19;44953:7;44942:19;;;;;;;;;;;44916:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44972:18;44993:10;:8;:10::i;:::-;44972:31;;45101:1;45085:4;45079:18;:23;45075:72;;;45126:9;45119:16;;;;;;45075:72;45277:1;45257:9;45251:23;:27;45247:108;;;45326:4;45332:9;45309:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45295:48;;;;;;45247:108;45374:23;45389:7;45374:14;:23::i;:::-;45367:30;;;;44726:679;;;;:::o;25290:305::-;25392:4;25444:25;25429:40;;;:11;:40;;;;:105;;;;25501:33;25486:48;;;:11;:48;;;;25429:105;:158;;;;25551:36;25575:11;25551:23;:36::i;:::-;25429:158;25409:178;;25290:305;;;:::o;46740:215::-;46902:45;46929:4;46935:2;46939:7;46902:26;:45::i;:::-;46740:215;;;:::o;35909:803::-;36064:4;36085:15;:2;:13;;;:15::i;:::-;36081:624;;;36137:2;36121:36;;;36158:12;:10;:12::i;:::-;36172:4;36178:7;36187:5;36121:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36117:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36384:1;36367:6;:13;:18;36363:272;;;36410:60;;;;;;;;;;:::i;:::-;;;;;;;;36363:272;36585:6;36579:13;36570:6;36566:2;36562:15;36555:38;36117:533;36254:45;;;36244:55;;;:6;:55;;;;36237:62;;;;;36081:624;36689:4;36682:11;;35909:803;;;;;;;:::o;47440:106::-;47492:13;47525;47518:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47440:106;:::o;26579:334::-;26652:13;26686:16;26694:7;26686;:16::i;:::-;26678:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26767:21;26791:10;:8;:10::i;:::-;26767:34;;26843:1;26825:7;26819:21;:25;:86;;;;;;;;;;;;;;;;;26871:7;26880:18;:7;:16;:18::i;:::-;26854:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26819:86;26812:93;;;26579:334;;;:::o;6328:157::-;6413:4;6452:25;6437:40;;;:11;:40;;;;6430:47;;6328:157;;;:::o;39909:589::-;40053:45;40080:4;40086:2;40090:7;40053:26;:45::i;:::-;40131:1;40115:18;;:4;:18;;;40111:187;;;40150:40;40182:7;40150:31;:40::i;:::-;40111:187;;;40220:2;40212:10;;:4;:10;;;40208:90;;40239:47;40272:4;40278:7;40239:32;:47::i;:::-;40208:90;40111:187;40326:1;40312:16;;:2;:16;;;40308:183;;;40345:45;40382:7;40345:36;:45::i;:::-;40308:183;;;40418:4;40412:10;;:2;:10;;;40408:83;;40439:40;40467:2;40471:7;40439:27;:40::i;:::-;40408:83;40308:183;39909:589;;;:::o;9374:387::-;9434:4;9642:12;9709:7;9697:20;9689:28;;9752:1;9745:4;:8;9738:15;;;9374:387;;;:::o;6799:723::-;6855:13;7085:1;7076:5;:10;7072:53;;;7103:10;;;;;;;;;;;;;;;;;;;;;7072:53;7135:12;7150:5;7135:20;;7166:14;7191:78;7206:1;7198:4;:9;7191:78;;7224:8;;;;;:::i;:::-;;;;7255:2;7247:10;;;;;:::i;:::-;;;7191:78;;;7279:19;7311:6;7301:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7279:39;;7329:154;7345:1;7336:5;:10;7329:154;;7373:1;7363:11;;;;;:::i;:::-;;;7440:2;7432:5;:10;;;;:::i;:::-;7419:2;:24;;;;:::i;:::-;7406:39;;7389:6;7396;7389:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7469:2;7460:11;;;;;:::i;:::-;;;7329:154;;;7507:6;7493:21;;;;;6799:723;;;;:::o;37284:126::-;;;;:::o;41221:164::-;41325:10;:17;;;;41298:15;:24;41314:7;41298:24;;;;;;;;;;;:44;;;;41353:10;41369:7;41353:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41221:164;:::o;42012:988::-;42278:22;42328:1;42303:22;42320:4;42303:16;:22::i;:::-;:26;;;;:::i;:::-;42278:51;;42340:18;42361:17;:26;42379:7;42361:26;;;;;;;;;;;;42340:47;;42508:14;42494:10;:28;42490:328;;42539:19;42561:12;:18;42574:4;42561:18;;;;;;;;;;;;;;;:34;42580:14;42561:34;;;;;;;;;;;;42539:56;;42645:11;42612:12;:18;42625:4;42612:18;;;;;;;;;;;;;;;:30;42631:10;42612:30;;;;;;;;;;;:44;;;;42762:10;42729:17;:30;42747:11;42729:30;;;;;;;;;;;:43;;;;42490:328;;42914:17;:26;42932:7;42914:26;;;;;;;;;;;42907:33;;;42958:12;:18;42971:4;42958:18;;;;;;;;;;;;;;;:34;42977:14;42958:34;;;;;;;;;;;42951:41;;;42012:988;;;;:::o;43295:1079::-;43548:22;43593:1;43573:10;:17;;;;:21;;;;:::i;:::-;43548:46;;43605:18;43626:15;:24;43642:7;43626:24;;;;;;;;;;;;43605:45;;43977:19;43999:10;44010:14;43999:26;;;;;;;;;;;;;;;;;;;;;;;;43977:48;;44063:11;44038:10;44049;44038:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44174:10;44143:15;:28;44159:11;44143:28;;;;;;;;;;;:41;;;;44315:15;:24;44331:7;44315:24;;;;;;;;;;;44308:31;;;44350:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43295:1079;;;;:::o;40799:221::-;40884:14;40901:20;40918:2;40901:16;:20::i;:::-;40884:37;;40959:7;40932:12;:16;40945:2;40932:16;;;;;;;;;;;;;;;:24;40949:6;40932:24;;;;;;;;;;;:34;;;;41006:6;40977:17;:26;40995:7;40977:26;;;;;;;;;;;:35;;;;40799:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:135::-;;2091:6;2078:20;2069:29;;2107:31;2132:5;2107:31;:::i;:::-;2059:85;;;;:::o;2150:262::-;;2258:2;2246:9;2237:7;2233:23;2229:32;2226:2;;;2274:1;2271;2264:12;2226:2;2317:1;2342:53;2387:7;2378:6;2367:9;2363:22;2342:53;:::i;:::-;2332:63;;2288:117;2216:196;;;;:::o;2418:407::-;;;2543:2;2531:9;2522:7;2518:23;2514:32;2511:2;;;2559:1;2556;2549:12;2511:2;2602:1;2627:53;2672:7;2663:6;2652:9;2648:22;2627:53;:::i;:::-;2617:63;;2573:117;2729:2;2755:53;2800:7;2791:6;2780:9;2776:22;2755:53;:::i;:::-;2745:63;;2700:118;2501:324;;;;;:::o;2831:552::-;;;;2973:2;2961:9;2952:7;2948:23;2944:32;2941:2;;;2989:1;2986;2979:12;2941:2;3032:1;3057:53;3102:7;3093:6;3082:9;3078:22;3057:53;:::i;:::-;3047:63;;3003:117;3159:2;3185:53;3230:7;3221:6;3210:9;3206:22;3185:53;:::i;:::-;3175:63;;3130:118;3287:2;3313:53;3358:7;3349:6;3338:9;3334:22;3313:53;:::i;:::-;3303:63;;3258:118;2931:452;;;;;:::o;3389:809::-;;;;;3557:3;3545:9;3536:7;3532:23;3528:33;3525:2;;;3574:1;3571;3564:12;3525:2;3617:1;3642:53;3687:7;3678:6;3667:9;3663:22;3642:53;:::i;:::-;3632:63;;3588:117;3744:2;3770:53;3815:7;3806:6;3795:9;3791:22;3770:53;:::i;:::-;3760:63;;3715:118;3872:2;3898:53;3943:7;3934:6;3923:9;3919:22;3898:53;:::i;:::-;3888:63;;3843:118;4028:2;4017:9;4013:18;4000:32;4059:18;4051:6;4048:30;4045:2;;;4091:1;4088;4081:12;4045:2;4119:62;4173:7;4164:6;4153:9;4149:22;4119:62;:::i;:::-;4109:72;;3971:220;3515:683;;;;;;;:::o;4204:401::-;;;4326:2;4314:9;4305:7;4301:23;4297:32;4294:2;;;4342:1;4339;4332:12;4294:2;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4512:2;4538:50;4580:7;4571:6;4560:9;4556:22;4538:50;:::i;:::-;4528:60;;4483:115;4284:321;;;;;:::o;4611:407::-;;;4736:2;4724:9;4715:7;4711:23;4707:32;4704:2;;;4752:1;4749;4742:12;4704:2;4795:1;4820:53;4865:7;4856:6;4845:9;4841:22;4820:53;:::i;:::-;4810:63;;4766:117;4922:2;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4893:118;4694:324;;;;;:::o;5024:260::-;;5131:2;5119:9;5110:7;5106:23;5102:32;5099:2;;;5147:1;5144;5137:12;5099:2;5190:1;5215:52;5259:7;5250:6;5239:9;5235:22;5215:52;:::i;:::-;5205:62;;5161:116;5089:195;;;;:::o;5290:282::-;;5408:2;5396:9;5387:7;5383:23;5379:32;5376:2;;;5424:1;5421;5414:12;5376:2;5467:1;5492:63;5547:7;5538:6;5527:9;5523:22;5492:63;:::i;:::-;5482:73;;5438:127;5366:206;;;;:::o;5578:375::-;;5696:2;5684:9;5675:7;5671:23;5667:32;5664:2;;;5712:1;5709;5702:12;5664:2;5783:1;5772:9;5768:17;5755:31;5813:18;5805:6;5802:30;5799:2;;;5845:1;5842;5835:12;5799:2;5873:63;5928:7;5919:6;5908:9;5904:22;5873:63;:::i;:::-;5863:73;;5726:220;5654:299;;;;:::o;5959:262::-;;6067:2;6055:9;6046:7;6042:23;6038:32;6035:2;;;6083:1;6080;6073:12;6035:2;6126:1;6151:53;6196:7;6187:6;6176:9;6172:22;6151:53;:::i;:::-;6141:63;;6097:117;6025:196;;;;:::o;6227:258::-;;6333:2;6321:9;6312:7;6308:23;6304:32;6301:2;;;6349:1;6346;6339:12;6301:2;6392:1;6417:51;6460:7;6451:6;6440:9;6436:22;6417:51;:::i;:::-;6407:61;;6363:115;6291:194;;;;:::o;6491:118::-;6578:24;6596:5;6578:24;:::i;:::-;6573:3;6566:37;6556:53;;:::o;6615:109::-;6696:21;6711:5;6696:21;:::i;:::-;6691:3;6684:34;6674:50;;:::o;6730:360::-;;6844:38;6876:5;6844:38;:::i;:::-;6898:70;6961:6;6956:3;6898:70;:::i;:::-;6891:77;;6977:52;7022:6;7017:3;7010:4;7003:5;6999:16;6977:52;:::i;:::-;7054:29;7076:6;7054:29;:::i;:::-;7049:3;7045:39;7038:46;;6820:270;;;;;:::o;7096:364::-;;7212:39;7245:5;7212:39;:::i;:::-;7267:71;7331:6;7326:3;7267:71;:::i;:::-;7260:78;;7347:52;7392:6;7387:3;7380:4;7373:5;7369:16;7347:52;:::i;:::-;7424:29;7446:6;7424:29;:::i;:::-;7419:3;7415:39;7408:46;;7188:272;;;;;:::o;7466:377::-;;7600:39;7633:5;7600:39;:::i;:::-;7655:89;7737:6;7732:3;7655:89;:::i;:::-;7648:96;;7753:52;7798:6;7793:3;7786:4;7779:5;7775:16;7753:52;:::i;:::-;7830:6;7825:3;7821:16;7814:23;;7576:267;;;;;:::o;7849:366::-;;8012:67;8076:2;8071:3;8012:67;:::i;:::-;8005:74;;8088:93;8177:3;8088:93;:::i;:::-;8206:2;8201:3;8197:12;8190:19;;7995:220;;;:::o;8221:366::-;;8384:67;8448:2;8443:3;8384:67;:::i;:::-;8377:74;;8460:93;8549:3;8460:93;:::i;:::-;8578:2;8573:3;8569:12;8562:19;;8367:220;;;:::o;8593:366::-;;8756:67;8820:2;8815:3;8756:67;:::i;:::-;8749:74;;8832:93;8921:3;8832:93;:::i;:::-;8950:2;8945:3;8941:12;8934:19;;8739:220;;;:::o;8965:366::-;;9128:67;9192:2;9187:3;9128:67;:::i;:::-;9121:74;;9204:93;9293:3;9204:93;:::i;:::-;9322:2;9317:3;9313:12;9306:19;;9111:220;;;:::o;9337:366::-;;9500:67;9564:2;9559:3;9500:67;:::i;:::-;9493:74;;9576:93;9665:3;9576:93;:::i;:::-;9694:2;9689:3;9685:12;9678:19;;9483:220;;;:::o;9709:366::-;;9872:67;9936:2;9931:3;9872:67;:::i;:::-;9865:74;;9948:93;10037:3;9948:93;:::i;:::-;10066:2;10061:3;10057:12;10050:19;;9855:220;;;:::o;10081:366::-;;10244:67;10308:2;10303:3;10244:67;:::i;:::-;10237:74;;10320:93;10409:3;10320:93;:::i;:::-;10438:2;10433:3;10429:12;10422:19;;10227:220;;;:::o;10453:366::-;;10616:67;10680:2;10675:3;10616:67;:::i;:::-;10609:74;;10692:93;10781:3;10692:93;:::i;:::-;10810:2;10805:3;10801:12;10794:19;;10599:220;;;:::o;10825:366::-;;10988:67;11052:2;11047:3;10988:67;:::i;:::-;10981:74;;11064:93;11153:3;11064:93;:::i;:::-;11182:2;11177:3;11173:12;11166:19;;10971:220;;;:::o;11197:366::-;;11360:67;11424:2;11419:3;11360:67;:::i;:::-;11353:74;;11436:93;11525:3;11436:93;:::i;:::-;11554:2;11549:3;11545:12;11538:19;;11343:220;;;:::o;11569:366::-;;11732:67;11796:2;11791:3;11732:67;:::i;:::-;11725:74;;11808:93;11897:3;11808:93;:::i;:::-;11926:2;11921:3;11917:12;11910:19;;11715:220;;;:::o;11941:366::-;;12104:67;12168:2;12163:3;12104:67;:::i;:::-;12097:74;;12180:93;12269:3;12180:93;:::i;:::-;12298:2;12293:3;12289:12;12282:19;;12087:220;;;:::o;12313:366::-;;12476:67;12540:2;12535:3;12476:67;:::i;:::-;12469:74;;12552:93;12641:3;12552:93;:::i;:::-;12670:2;12665:3;12661:12;12654:19;;12459:220;;;:::o;12685:366::-;;12848:67;12912:2;12907:3;12848:67;:::i;:::-;12841:74;;12924:93;13013:3;12924:93;:::i;:::-;13042:2;13037:3;13033:12;13026:19;;12831:220;;;:::o;13057:366::-;;13220:67;13284:2;13279:3;13220:67;:::i;:::-;13213:74;;13296:93;13385:3;13296:93;:::i;:::-;13414:2;13409:3;13405:12;13398:19;;13203:220;;;:::o;13429:366::-;;13592:67;13656:2;13651:3;13592:67;:::i;:::-;13585:74;;13668:93;13757:3;13668:93;:::i;:::-;13786:2;13781:3;13777:12;13770:19;;13575:220;;;:::o;13801:366::-;;13964:67;14028:2;14023:3;13964:67;:::i;:::-;13957:74;;14040:93;14129:3;14040:93;:::i;:::-;14158:2;14153:3;14149:12;14142:19;;13947:220;;;:::o;14173:366::-;;14336:67;14400:2;14395:3;14336:67;:::i;:::-;14329:74;;14412:93;14501:3;14412:93;:::i;:::-;14530:2;14525:3;14521:12;14514:19;;14319:220;;;:::o;14545:366::-;;14708:67;14772:2;14767:3;14708:67;:::i;:::-;14701:74;;14784:93;14873:3;14784:93;:::i;:::-;14902:2;14897:3;14893:12;14886:19;;14691:220;;;:::o;14917:366::-;;15080:67;15144:2;15139:3;15080:67;:::i;:::-;15073:74;;15156:93;15245:3;15156:93;:::i;:::-;15274:2;15269:3;15265:12;15258:19;;15063:220;;;:::o;15289:366::-;;15452:67;15516:2;15511:3;15452:67;:::i;:::-;15445:74;;15528:93;15617:3;15528:93;:::i;:::-;15646:2;15641:3;15637:12;15630:19;;15435:220;;;:::o;15661:366::-;;15824:67;15888:2;15883:3;15824:67;:::i;:::-;15817:74;;15900:93;15989:3;15900:93;:::i;:::-;16018:2;16013:3;16009:12;16002:19;;15807:220;;;:::o;16033:366::-;;16196:67;16260:2;16255:3;16196:67;:::i;:::-;16189:74;;16272:93;16361:3;16272:93;:::i;:::-;16390:2;16385:3;16381:12;16374:19;;16179:220;;;:::o;16405:366::-;;16568:67;16632:2;16627:3;16568:67;:::i;:::-;16561:74;;16644:93;16733:3;16644:93;:::i;:::-;16762:2;16757:3;16753:12;16746:19;;16551:220;;;:::o;16777:398::-;;16957:83;17038:1;17033:3;16957:83;:::i;:::-;16950:90;;17049:93;17138:3;17049:93;:::i;:::-;17167:1;17162:3;17158:11;17151:18;;16940:235;;;:::o;17181:366::-;;17344:67;17408:2;17403:3;17344:67;:::i;:::-;17337:74;;17420:93;17509:3;17420:93;:::i;:::-;17538:2;17533:3;17529:12;17522:19;;17327:220;;;:::o;17553:366::-;;17716:67;17780:2;17775:3;17716:67;:::i;:::-;17709:74;;17792:93;17881:3;17792:93;:::i;:::-;17910:2;17905:3;17901:12;17894:19;;17699:220;;;:::o;17925:115::-;18010:23;18027:5;18010:23;:::i;:::-;18005:3;17998:36;17988:52;;:::o;18046:118::-;18133:24;18151:5;18133:24;:::i;:::-;18128:3;18121:37;18111:53;;:::o;18170:115::-;18255:23;18272:5;18255:23;:::i;:::-;18250:3;18243:36;18233:52;;:::o;18291:112::-;18374:22;18390:5;18374:22;:::i;:::-;18369:3;18362:35;18352:51;;:::o;18409:435::-;;18611:95;18702:3;18693:6;18611:95;:::i;:::-;18604:102;;18723:95;18814:3;18805:6;18723:95;:::i;:::-;18716:102;;18835:3;18828:10;;18593:251;;;;;:::o;18850:379::-;;19056:147;19199:3;19056:147;:::i;:::-;19049:154;;19220:3;19213:10;;19038:191;;;:::o;19235:222::-;;19366:2;19355:9;19351:18;19343:26;;19379:71;19447:1;19436:9;19432:17;19423:6;19379:71;:::i;:::-;19333:124;;;;:::o;19463:640::-;;19696:3;19685:9;19681:19;19673:27;;19710:71;19778:1;19767:9;19763:17;19754:6;19710:71;:::i;:::-;19791:72;19859:2;19848:9;19844:18;19835:6;19791:72;:::i;:::-;19873;19941:2;19930:9;19926:18;19917:6;19873:72;:::i;:::-;19992:9;19986:4;19982:20;19977:2;19966:9;19962:18;19955:48;20020:76;20091:4;20082:6;20020:76;:::i;:::-;20012:84;;19663:440;;;;;;;:::o;20109:210::-;;20234:2;20223:9;20219:18;20211:26;;20247:65;20309:1;20298:9;20294:17;20285:6;20247:65;:::i;:::-;20201:118;;;;:::o;20325:313::-;;20476:2;20465:9;20461:18;20453:26;;20525:9;20519:4;20515:20;20511:1;20500:9;20496:17;20489:47;20553:78;20626:4;20617:6;20553:78;:::i;:::-;20545:86;;20443:195;;;;:::o;20644:419::-;;20848:2;20837:9;20833:18;20825:26;;20897:9;20891:4;20887:20;20883:1;20872:9;20868:17;20861:47;20925:131;21051:4;20925:131;:::i;:::-;20917:139;;20815:248;;;:::o;21069:419::-;;21273:2;21262:9;21258:18;21250:26;;21322:9;21316:4;21312:20;21308:1;21297:9;21293:17;21286:47;21350:131;21476:4;21350:131;:::i;:::-;21342:139;;21240:248;;;:::o;21494:419::-;;21698:2;21687:9;21683:18;21675:26;;21747:9;21741:4;21737:20;21733:1;21722:9;21718:17;21711:47;21775:131;21901:4;21775:131;:::i;:::-;21767:139;;21665:248;;;:::o;21919:419::-;;22123:2;22112:9;22108:18;22100:26;;22172:9;22166:4;22162:20;22158:1;22147:9;22143:17;22136:47;22200:131;22326:4;22200:131;:::i;:::-;22192:139;;22090:248;;;:::o;22344:419::-;;22548:2;22537:9;22533:18;22525:26;;22597:9;22591:4;22587:20;22583:1;22572:9;22568:17;22561:47;22625:131;22751:4;22625:131;:::i;:::-;22617:139;;22515:248;;;:::o;22769:419::-;;22973:2;22962:9;22958:18;22950:26;;23022:9;23016:4;23012:20;23008:1;22997:9;22993:17;22986:47;23050:131;23176:4;23050:131;:::i;:::-;23042:139;;22940:248;;;:::o;23194:419::-;;23398:2;23387:9;23383:18;23375:26;;23447:9;23441:4;23437:20;23433:1;23422:9;23418:17;23411:47;23475:131;23601:4;23475:131;:::i;:::-;23467:139;;23365:248;;;:::o;23619:419::-;;23823:2;23812:9;23808:18;23800:26;;23872:9;23866:4;23862:20;23858:1;23847:9;23843:17;23836:47;23900:131;24026:4;23900:131;:::i;:::-;23892:139;;23790:248;;;:::o;24044:419::-;;24248:2;24237:9;24233:18;24225:26;;24297:9;24291:4;24287:20;24283:1;24272:9;24268:17;24261:47;24325:131;24451:4;24325:131;:::i;:::-;24317:139;;24215:248;;;:::o;24469:419::-;;24673:2;24662:9;24658:18;24650:26;;24722:9;24716:4;24712:20;24708:1;24697:9;24693:17;24686:47;24750:131;24876:4;24750:131;:::i;:::-;24742:139;;24640:248;;;:::o;24894:419::-;;25098:2;25087:9;25083:18;25075:26;;25147:9;25141:4;25137:20;25133:1;25122:9;25118:17;25111:47;25175:131;25301:4;25175:131;:::i;:::-;25167:139;;25065:248;;;:::o;25319:419::-;;25523:2;25512:9;25508:18;25500:26;;25572:9;25566:4;25562:20;25558:1;25547:9;25543:17;25536:47;25600:131;25726:4;25600:131;:::i;:::-;25592:139;;25490:248;;;:::o;25744:419::-;;25948:2;25937:9;25933:18;25925:26;;25997:9;25991:4;25987:20;25983:1;25972:9;25968:17;25961:47;26025:131;26151:4;26025:131;:::i;:::-;26017:139;;25915:248;;;:::o;26169:419::-;;26373:2;26362:9;26358:18;26350:26;;26422:9;26416:4;26412:20;26408:1;26397:9;26393:17;26386:47;26450:131;26576:4;26450:131;:::i;:::-;26442:139;;26340:248;;;:::o;26594:419::-;;26798:2;26787:9;26783:18;26775:26;;26847:9;26841:4;26837:20;26833:1;26822:9;26818:17;26811:47;26875:131;27001:4;26875:131;:::i;:::-;26867:139;;26765:248;;;:::o;27019:419::-;;27223:2;27212:9;27208:18;27200:26;;27272:9;27266:4;27262:20;27258:1;27247:9;27243:17;27236:47;27300:131;27426:4;27300:131;:::i;:::-;27292:139;;27190:248;;;:::o;27444:419::-;;27648:2;27637:9;27633:18;27625:26;;27697:9;27691:4;27687:20;27683:1;27672:9;27668:17;27661:47;27725:131;27851:4;27725:131;:::i;:::-;27717:139;;27615:248;;;:::o;27869:419::-;;28073:2;28062:9;28058:18;28050:26;;28122:9;28116:4;28112:20;28108:1;28097:9;28093:17;28086:47;28150:131;28276:4;28150:131;:::i;:::-;28142:139;;28040:248;;;:::o;28294:419::-;;28498:2;28487:9;28483:18;28475:26;;28547:9;28541:4;28537:20;28533:1;28522:9;28518:17;28511:47;28575:131;28701:4;28575:131;:::i;:::-;28567:139;;28465:248;;;:::o;28719:419::-;;28923:2;28912:9;28908:18;28900:26;;28972:9;28966:4;28962:20;28958:1;28947:9;28943:17;28936:47;29000:131;29126:4;29000:131;:::i;:::-;28992:139;;28890:248;;;:::o;29144:419::-;;29348:2;29337:9;29333:18;29325:26;;29397:9;29391:4;29387:20;29383:1;29372:9;29368:17;29361:47;29425:131;29551:4;29425:131;:::i;:::-;29417:139;;29315:248;;;:::o;29569:419::-;;29773:2;29762:9;29758:18;29750:26;;29822:9;29816:4;29812:20;29808:1;29797:9;29793:17;29786:47;29850:131;29976:4;29850:131;:::i;:::-;29842:139;;29740:248;;;:::o;29994:419::-;;30198:2;30187:9;30183:18;30175:26;;30247:9;30241:4;30237:20;30233:1;30222:9;30218:17;30211:47;30275:131;30401:4;30275:131;:::i;:::-;30267:139;;30165:248;;;:::o;30419:419::-;;30623:2;30612:9;30608:18;30600:26;;30672:9;30666:4;30662:20;30658:1;30647:9;30643:17;30636:47;30700:131;30826:4;30700:131;:::i;:::-;30692:139;;30590:248;;;:::o;30844:419::-;;31048:2;31037:9;31033:18;31025:26;;31097:9;31091:4;31087:20;31083:1;31072:9;31068:17;31061:47;31125:131;31251:4;31125:131;:::i;:::-;31117:139;;31015:248;;;:::o;31269:419::-;;31473:2;31462:9;31458:18;31450:26;;31522:9;31516:4;31512:20;31508:1;31497:9;31493:17;31486:47;31550:131;31676:4;31550:131;:::i;:::-;31542:139;;31440:248;;;:::o;31694:218::-;;31823:2;31812:9;31808:18;31800:26;;31836:69;31902:1;31891:9;31887:17;31878:6;31836:69;:::i;:::-;31790:122;;;;:::o;31918:222::-;;32049:2;32038:9;32034:18;32026:26;;32062:71;32130:1;32119:9;32115:17;32106:6;32062:71;:::i;:::-;32016:124;;;;:::o;32146:218::-;;32275:2;32264:9;32260:18;32252:26;;32288:69;32354:1;32343:9;32339:17;32330:6;32288:69;:::i;:::-;32242:122;;;;:::o;32370:214::-;;32497:2;32486:9;32482:18;32474:26;;32510:67;32574:1;32563:9;32559:17;32550:6;32510:67;:::i;:::-;32464:120;;;;:::o;32590:129::-;;32651:20;;:::i;:::-;32641:30;;32680:33;32708:4;32700:6;32680:33;:::i;:::-;32631:88;;;:::o;32725:75::-;;32791:2;32785:9;32775:19;;32765:35;:::o;32806:307::-;;32957:18;32949:6;32946:30;32943:2;;;32979:18;;:::i;:::-;32943:2;33017:29;33039:6;33017:29;:::i;:::-;33009:37;;33101:4;33095;33091:15;33083:23;;32872:241;;;:::o;33119:308::-;;33271:18;33263:6;33260:30;33257:2;;;33293:18;;:::i;:::-;33257:2;33331:29;33353:6;33331:29;:::i;:::-;33323:37;;33415:4;33409;33405:15;33397:23;;33186:241;;;:::o;33433:98::-;;33518:5;33512:12;33502:22;;33491:40;;;:::o;33537:99::-;;33623:5;33617:12;33607:22;;33596:40;;;:::o;33642:168::-;;33759:6;33754:3;33747:19;33799:4;33794:3;33790:14;33775:29;;33737:73;;;;:::o;33816:147::-;;33954:3;33939:18;;33929:34;;;;:::o;33969:169::-;;34087:6;34082:3;34075:19;34127:4;34122:3;34118:14;34103:29;;34065:73;;;;:::o;34144:148::-;;34283:3;34268:18;;34258:34;;;;:::o;34298:305::-;;34357:20;34375:1;34357:20;:::i;:::-;34352:25;;34391:20;34409:1;34391:20;:::i;:::-;34386:25;;34545:1;34477:66;34473:74;34470:1;34467:81;34464:2;;;34551:18;;:::i;:::-;34464:2;34595:1;34592;34588:9;34581:16;;34342:261;;;;:::o;34609:185::-;;34666:20;34684:1;34666:20;:::i;:::-;34661:25;;34700:20;34718:1;34700:20;:::i;:::-;34695:25;;34739:1;34729:2;;34744:18;;:::i;:::-;34729:2;34786:1;34783;34779:9;34774:14;;34651:143;;;;:::o;34800:297::-;;34862:19;34879:1;34862:19;:::i;:::-;34857:24;;34895:19;34912:1;34895:19;:::i;:::-;34890:24;;35034:1;35014:18;35010:26;35007:1;35004:33;34999:1;34992:9;34985:17;34981:57;34978:2;;;35041:18;;:::i;:::-;34978:2;35089:1;35086;35082:9;35071:20;;34847:250;;;;:::o;35103:191::-;;35163:20;35181:1;35163:20;:::i;:::-;35158:25;;35197:20;35215:1;35197:20;:::i;:::-;35192:25;;35236:1;35233;35230:8;35227:2;;;35241:18;;:::i;:::-;35227:2;35286:1;35283;35279:9;35271:17;;35148:146;;;;:::o;35300:96::-;;35366:24;35384:5;35366:24;:::i;:::-;35355:35;;35345:51;;;:::o;35402:90::-;;35479:5;35472:13;35465:21;35454:32;;35444:48;;;:::o;35498:149::-;;35574:66;35567:5;35563:78;35552:89;;35542:105;;;:::o;35653:89::-;;35729:6;35722:5;35718:18;35707:29;;35697:45;;;:::o;35748:126::-;;35825:42;35818:5;35814:54;35803:65;;35793:81;;;:::o;35880:77::-;;35946:5;35935:16;;35925:32;;;:::o;35963:101::-;;36039:18;36032:5;36028:30;36017:41;;36007:57;;;:::o;36070:86::-;;36145:4;36138:5;36134:16;36123:27;;36113:43;;;:::o;36162:154::-;36246:6;36241:3;36236;36223:30;36308:1;36299:6;36294:3;36290:16;36283:27;36213:103;;;:::o;36322:307::-;36390:1;36400:113;36414:6;36411:1;36408:13;36400:113;;;36499:1;36494:3;36490:11;36484:18;36480:1;36475:3;36471:11;36464:39;36436:2;36433:1;36429:10;36424:15;;36400:113;;;36531:6;36528:1;36525:13;36522:2;;;36611:1;36602:6;36597:3;36593:16;36586:27;36522:2;36371:258;;;;:::o;36635:320::-;;36716:1;36710:4;36706:12;36696:22;;36763:1;36757:4;36753:12;36784:18;36774:2;;36840:4;36832:6;36828:17;36818:27;;36774:2;36902;36894:6;36891:14;36871:18;36868:38;36865:2;;;36921:18;;:::i;:::-;36865:2;36686:269;;;;:::o;36961:281::-;37044:27;37066:4;37044:27;:::i;:::-;37036:6;37032:40;37174:6;37162:10;37159:22;37138:18;37126:10;37123:34;37120:62;37117:2;;;37185:18;;:::i;:::-;37117:2;37225:10;37221:2;37214:22;37004:238;;;:::o;37248:233::-;;37310:24;37328:5;37310:24;:::i;:::-;37301:33;;37356:66;37349:5;37346:77;37343:2;;;37426:18;;:::i;:::-;37343:2;37473:1;37466:5;37462:13;37455:20;;37291:190;;;:::o;37487:167::-;;37547:22;37563:5;37547:22;:::i;:::-;37538:31;;37591:4;37584:5;37581:15;37578:2;;;37599:18;;:::i;:::-;37578:2;37646:1;37639:5;37635:13;37628:20;;37528:126;;;:::o;37660:176::-;;37709:20;37727:1;37709:20;:::i;:::-;37704:25;;37743:20;37761:1;37743:20;:::i;:::-;37738:25;;37782:1;37772:2;;37787:18;;:::i;:::-;37772:2;37828:1;37825;37821:9;37816:14;;37694:142;;;;:::o;37842:180::-;37890:77;37887:1;37880:88;37987:4;37984:1;37977:15;38011:4;38008:1;38001:15;38028:180;38076:77;38073:1;38066:88;38173:4;38170:1;38163:15;38197:4;38194:1;38187:15;38214:180;38262:77;38259:1;38252:88;38359:4;38356:1;38349:15;38383:4;38380:1;38373:15;38400:180;38448:77;38445:1;38438:88;38545:4;38542:1;38535:15;38569:4;38566:1;38559:15;38586:102;;38678:2;38674:7;38669:2;38662:5;38658:14;38654:28;38644:38;;38634:54;;;:::o;38694:230::-;38834:34;38830:1;38822:6;38818:14;38811:58;38903:13;38898:2;38890:6;38886:15;38879:38;38800:124;:::o;38930:231::-;39070:34;39066:1;39058:6;39054:14;39047:58;39139:14;39134:2;39126:6;39122:15;39115:39;39036:125;:::o;39167:237::-;39307:34;39303:1;39295:6;39291:14;39284:58;39376:20;39371:2;39363:6;39359:15;39352:45;39273:131;:::o;39410:225::-;39550:34;39546:1;39538:6;39534:14;39527:58;39619:8;39614:2;39606:6;39602:15;39595:33;39516:119;:::o;39641:178::-;39781:30;39777:1;39769:6;39765:14;39758:54;39747:72;:::o;39825:174::-;39965:26;39961:1;39953:6;39949:14;39942:50;39931:68;:::o;40005:248::-;40145:34;40141:1;40133:6;40129:14;40122:58;40214:31;40209:2;40201:6;40197:15;40190:56;40111:142;:::o;40259:223::-;40399:34;40395:1;40387:6;40383:14;40376:58;40468:6;40463:2;40455:6;40451:15;40444:31;40365:117;:::o;40488:175::-;40628:27;40624:1;40616:6;40612:14;40605:51;40594:69;:::o;40669:231::-;40809:34;40805:1;40797:6;40793:14;40786:58;40878:14;40873:2;40865:6;40861:15;40854:39;40775:125;:::o;40906:243::-;41046:34;41042:1;41034:6;41030:14;41023:58;41115:26;41110:2;41102:6;41098:15;41091:51;41012:137;:::o;41155:229::-;41295:34;41291:1;41283:6;41279:14;41272:58;41364:12;41359:2;41351:6;41347:15;41340:37;41261:123;:::o;41390:228::-;41530:34;41526:1;41518:6;41514:14;41507:58;41599:11;41594:2;41586:6;41582:15;41575:36;41496:122;:::o;41624:182::-;41764:34;41760:1;41752:6;41748:14;41741:58;41730:76;:::o;41812:236::-;41952:34;41948:1;41940:6;41936:14;41929:58;42021:19;42016:2;42008:6;42004:15;41997:44;41918:130;:::o;42054:231::-;42194:34;42190:1;42182:6;42178:14;42171:58;42263:14;42258:2;42250:6;42246:15;42239:39;42160:125;:::o;42291:182::-;42431:34;42427:1;42419:6;42415:14;42408:58;42397:76;:::o;42479:228::-;42619:34;42615:1;42607:6;42603:14;42596:58;42688:11;42683:2;42675:6;42671:15;42664:36;42585:122;:::o;42713:234::-;42853:34;42849:1;42841:6;42837:14;42830:58;42922:17;42917:2;42909:6;42905:15;42898:42;42819:128;:::o;42953:174::-;43093:26;43089:1;43081:6;43077:14;43070:50;43059:68;:::o;43133:220::-;43273:34;43269:1;43261:6;43257:14;43250:58;43342:3;43337:2;43329:6;43325:15;43318:28;43239:114;:::o;43359:172::-;43499:24;43495:1;43487:6;43483:14;43476:48;43465:66;:::o;43537:170::-;43677:22;43673:1;43665:6;43661:14;43654:46;43643:64;:::o;43713:166::-;43853:18;43849:1;43841:6;43837:14;43830:42;43819:60;:::o;43885:114::-;43991:8;:::o;44005:236::-;44145:34;44141:1;44133:6;44129:14;44122:58;44214:19;44209:2;44201:6;44197:15;44190:44;44111:130;:::o;44247:231::-;44387:34;44383:1;44375:6;44371:14;44364:58;44456:14;44451:2;44443:6;44439:15;44432:39;44353:125;:::o;44484:122::-;44557:24;44575:5;44557:24;:::i;:::-;44550:5;44547:35;44537:2;;44596:1;44593;44586:12;44537:2;44527:79;:::o;44612:116::-;44682:21;44697:5;44682:21;:::i;:::-;44675:5;44672:32;44662:2;;44718:1;44715;44708:12;44662:2;44652:76;:::o;44734:120::-;44806:23;44823:5;44806:23;:::i;:::-;44799:5;44796:34;44786:2;;44844:1;44841;44834:12;44786:2;44776:78;:::o;44860:122::-;44933:24;44951:5;44933:24;:::i;:::-;44926:5;44923:35;44913:2;;44972:1;44969;44962:12;44913:2;44903:79;:::o;44988:118::-;45059:22;45075:5;45059:22;:::i;:::-;45052:5;45049:33;45039:2;;45096:1;45093;45086:12;45039:2;45029:77;:::o
Swarm Source
ipfs://f7d97647680b7073151e29f15a4fab59519d8ddda1b338942b17412fe38351f0
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.