Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
3,333 PANTHERS
Holders
1,110
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 PANTHERSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Panthers
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import './Ownable.sol'; import "./Strings.sol"; import "./ERC721Enumerable.sol"; contract Panthers is ERC721Enumerable, Ownable { using Strings for uint; // CONSTANTS uint public MAX_SUPPLY = 3333; // SEMI-CONSTANTS uint public minting_price = 0.05 ether; // VARIABLES mapping(address => uint) public presale_allocations; mapping(address => uint8) public free_allocations; bool public minting_allowed = false; string base_uri = "https://crazypanthersparty.com/metadata/"; constructor() ERC721 ("Crazy Panthers Party", "PANTHERS") { } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return string(abi.encodePacked(base_uri, (tokenId + 1).toString())); } function freeMint(uint _quantity) external { require(free_allocations[msg.sender] >= _quantity, "Insufficient presale allocation"); require(totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left to mint"); for (uint i = 0; i < _quantity; ++i) { _safeMint(msg.sender, totalSupply()); free_allocations[msg.sender]--; } } function presaleMint(uint _quantity) external payable { require(presale_allocations[msg.sender] >= _quantity, "Insufficient presale allocation"); require(msg.value == _quantity * minting_price, "Incorrect ETH sent to premint"); require(totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left to mint"); for (uint i = 0; i < _quantity; ++i) { _safeMint(msg.sender, totalSupply()); presale_allocations[msg.sender]--; } } function publicSaleMint(uint _quantity) external payable { require(minting_allowed, "Minting is currently disabled"); require(_quantity <= 20, "Invalid number of tokens queries for minting"); require(msg.value == _quantity * minting_price, "Incorrect ETH sent to mint"); require(totalSupply() + _quantity <= MAX_SUPPLY, "Not enough tokens left to mint"); for (uint i = 0; i < _quantity; ++i) { _safeMint(msg.sender, totalSupply()); } } function ownerMint(address _to, uint _quantity) external onlyOwner { require(totalSupply() + _quantity <= MAX_SUPPLY, "Not enough left to mint"); for (uint i = 0; i < _quantity; ++i) _safeMint(_to, totalSupply()); } function setMintingPrice(uint _minting_price) external onlyOwner { minting_price = _minting_price; } function setBaseURI(string memory _new_uri) external onlyOwner { base_uri = _new_uri; } function toggleMinting() external onlyOwner { minting_allowed = !minting_allowed; } function withdraw() external onlyOwner { address main_team = 0x2Bd2ae185E6EB8Fc6d60efC6ED560126f25159b5; address dev_1_address = 0x22438B6e5732d0827Dd95Fb5762B93B721001380; address dev_2_address = 0x9408c666a65F2867A3ef3060766077462f84C717; payable(main_team).transfer(70 * address(this).balance / 100); payable(dev_1_address).transfer(address(this).balance / 2); payable(dev_2_address).transfer(address(this).balance); } function addFreeMint(address [] memory addresses) external onlyOwner { for (uint i = 0; i < addresses.length; ++i) { free_allocations[addresses[i]]++; } } function addPresale(address [] memory addresses) external onlyOwner { for (uint i = 0; i < addresses.length; ++i) { presale_allocations[addresses[i]]++; } } }
// SPDX-License-Identifier: MIT 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); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @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 {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @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(); } }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT 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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; /** * @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); } }
// SPDX-License-Identifier: MIT 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); } }
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":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addPresale","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":"_quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"free_allocations","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minting_allowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minting_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presale_allocations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","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":"_new_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minting_price","type":"uint256"}],"name":"setMintingPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052610d05600b5566b1a2bc2ec50000600c556000600f60006101000a81548160ff02191690831515021790555060405180606001604052806028815260200162004afe60289139601090805190602001906200006192919062000204565b503480156200006f57600080fd5b506040518060400160405280601481526020017f4372617a792050616e74686572732050617274790000000000000000000000008152506040518060400160405280600881526020017f50414e54484552530000000000000000000000000000000000000000000000008152508160009080519060200190620000f492919062000204565b5080600190805190602001906200010d92919062000204565b50505062000130620001246200013660201b60201c565b6200013e60201b60201c565b62000319565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021290620002b4565b90600052602060002090601f01602090048101928262000236576000855562000282565b82601f106200025157805160ff191683800117855562000282565b8280016001018555821562000282579182015b828111156200028157825182559160200191906001019062000264565b5b50905062000291919062000295565b5090565b5b80821115620002b057600081600090555060010162000296565b5090565b60006002820490506001821680620002cd57607f821691505b60208210811415620002e457620002e3620002ea565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6147d580620003296000396000f3fe6080604052600436106101f95760003560e01c80637c928fe91161010d578063b09afa30116100a0578063c9b298f11161006f578063c9b298f11461070c578063ce3c124f14610728578063e985e9c514610765578063f2b3ea5d146107a2578063f2fde38b146107cd576101f9565b8063b09afa3014610661578063b3ab66b01461068a578063b88d4fde146106a6578063c87b56dd146106cf576101f9565b80638b2c1435116100dc5780638b2c1435146105b75780638da5cb5b146105e257806395d89b411461060d578063a22cb46514610638576101f9565b80637c928fe9146105115780637d55094d1461053a5780638417b47f146105515780638a43d1661461057a576101f9565b80633ccfd60b1161019057806355f804b31161015f57806355f804b31461042e5780635fcc98d3146104575780636352211e1461048057806370a08231146104bd578063715018a6146104fa576101f9565b80633ccfd60b1461038857806342842e0e1461039f578063484b973c146103c85780634f6ccce7146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613433565b6107f6565b6040516102329190613eec565b60405180910390f35b34801561024757600080fd5b50610250610870565b60405161025d9190613f07565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906134c6565b610902565b60405161029a9190613e85565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906133b6565b610987565b005b3480156102d857600080fd5b506102e1610a9f565b6040516102ee9190614229565b60405180910390f35b34801561030357600080fd5b5061031e600480360381019061031991906132b0565b610aac565b005b34801561032c57600080fd5b50610347600480360381019061034291906133b6565b610b0c565b6040516103549190614229565b60405180910390f35b34801561036957600080fd5b50610372610bb1565b60405161037f9190614229565b60405180910390f35b34801561039457600080fd5b5061039d610bb7565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906132b0565b610d7c565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906133b6565b610d9c565b005b3480156103fd57600080fd5b50610418600480360381019061041391906134c6565b610ea1565b6040516104259190614229565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613485565b610f38565b005b34801561046357600080fd5b5061047e600480360381019061047991906133f2565b610fce565b005b34801561048c57600080fd5b506104a760048036038101906104a291906134c6565b611120565b6040516104b49190613e85565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df919061324b565b6111d2565b6040516104f19190614229565b60405180910390f35b34801561050657600080fd5b5061050f61128a565b005b34801561051d57600080fd5b50610538600480360381019061053391906134c6565b611312565b005b34801561054657600080fd5b5061054f6114a1565b005b34801561055d57600080fd5b50610578600480360381019061057391906134c6565b611549565b005b34801561058657600080fd5b506105a1600480360381019061059c919061324b565b6115cf565b6040516105ae9190614244565b60405180910390f35b3480156105c357600080fd5b506105cc6115ef565b6040516105d99190613eec565b60405180910390f35b3480156105ee57600080fd5b506105f7611602565b6040516106049190613e85565b60405180910390f35b34801561061957600080fd5b5061062261162c565b60405161062f9190613f07565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a919061337a565b6116be565b005b34801561066d57600080fd5b50610688600480360381019061068391906133f2565b61183f565b005b6106a4600480360381019061069f91906134c6565b611971565b005b3480156106b257600080fd5b506106cd60048036038101906106c891906132ff565b611adb565b005b3480156106db57600080fd5b506106f660048036038101906106f191906134c6565b611b3d565b6040516107039190613f07565b60405180910390f35b610726600480360381019061072191906134c6565b611b7d565b005b34801561073457600080fd5b5061074f600480360381019061074a919061324b565b611d2b565b60405161075c9190614229565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190613274565b611d43565b6040516107999190613eec565b60405180910390f35b3480156107ae57600080fd5b506107b7611dd7565b6040516107c49190614229565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef919061324b565b611ddd565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610869575061086882611ed5565b5b9050919050565b60606000805461087f906145a0565b80601f01602080910402602001604051908101604052809291908181526020018280546108ab906145a0565b80156108f85780601f106108cd576101008083540402835291602001916108f8565b820191906000526020600020905b8154815290600101906020018083116108db57829003601f168201915b5050505050905090565b600061090d82611fb7565b61094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390614129565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099282611120565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa906141a9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a22612023565b73ffffffffffffffffffffffffffffffffffffffff161480610a515750610a5081610a4b612023565b611d43565b5b610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790614089565b60405180910390fd5b610a9a838361202b565b505050565b6000600880549050905090565b610abd610ab7612023565b826120e4565b610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af3906141c9565b60405180910390fd5b610b078383836121c2565b505050565b6000610b17836111d2565b8210610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f90613f69565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610bbf612023565b73ffffffffffffffffffffffffffffffffffffffff16610bdd611602565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90614149565b60405180910390fd5b6000732bd2ae185e6eb8fc6d60efc6ed560126f25159b5905060007322438b6e5732d0827dd95fb5762b93b72100138090506000739408c666a65f2867a3ef3060766077462f84c71790508273ffffffffffffffffffffffffffffffffffffffff166108fc6064476046610ca791906143fb565b610cb191906143ca565b9081150290604051600060405180830381858888f19350505050158015610cdc573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc600247610d0491906143ca565b9081150290604051600060405180830381858888f19350505050158015610d2f573d6000803e3d6000fd5b508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d76573d6000803e3d6000fd5b50505050565b610d9783838360405180602001604052806000815250611adb565b505050565b610da4612023565b73ffffffffffffffffffffffffffffffffffffffff16610dc2611602565b73ffffffffffffffffffffffffffffffffffffffff1614610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90614149565b60405180910390fd5b600b5481610e24610a9f565b610e2e9190614374565b1115610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690614109565b60405180910390fd5b60005b81811015610e9c57610e8b83610e86610a9f565b61241e565b80610e95906145d2565b9050610e72565b505050565b6000610eab610a9f565b8210610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906141e9565b60405180910390fd5b60088281548110610f26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f40612023565b73ffffffffffffffffffffffffffffffffffffffff16610f5e611602565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90614149565b60405180910390fd5b8060109080519060200190610fca929190612fd9565b5050565b610fd6612023565b73ffffffffffffffffffffffffffffffffffffffff16610ff4611602565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190614149565b60405180910390fd5b60005b815181101561111c57600e6000838381518110611093577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906110f29061461b565b91906101000a81548160ff021916908360ff1602179055505080611115906145d2565b905061104d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906140c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a906140a9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611292612023565b73ffffffffffffffffffffffffffffffffffffffff166112b0611602565b73ffffffffffffffffffffffffffffffffffffffff1614611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90614149565b60405180910390fd5b611310600061243c565b565b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1610156113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90613f49565b60405180910390fd5b600b54816113b0610a9f565b6113ba9190614374565b11156113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290614189565b60405180910390fd5b60005b8181101561149d5761141733611412610a9f565b61241e565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff168092919061147390614576565b91906101000a81548160ff021916908360ff1602179055505080611496906145d2565b90506113fe565b5050565b6114a9612023565b73ffffffffffffffffffffffffffffffffffffffff166114c7611602565b73ffffffffffffffffffffffffffffffffffffffff161461151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614149565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611551612023565b73ffffffffffffffffffffffffffffffffffffffff1661156f611602565b73ffffffffffffffffffffffffffffffffffffffff16146115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90614149565b60405180910390fd5b80600c8190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b600f60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461163b906145a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611667906145a0565b80156116b45780601f10611689576101008083540402835291602001916116b4565b820191906000526020600020905b81548152906001019060200180831161169757829003601f168201915b5050505050905090565b6116c6612023565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b90614029565b60405180910390fd5b8060056000611741612023565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117ee612023565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118339190613eec565b60405180910390a35050565b611847612023565b73ffffffffffffffffffffffffffffffffffffffff16611865611602565b73ffffffffffffffffffffffffffffffffffffffff16146118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290614149565b60405180910390fd5b60005b815181101561196d57600d6000838381518110611904577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611957906145d2565b919050555080611966906145d2565b90506118be565b5050565b600f60009054906101000a900460ff166119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b790614069565b60405180910390fd5b6014811115611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb90613f89565b60405180910390fd5b600c5481611a1291906143fb565b3414611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614209565b60405180910390fd5b600b5481611a5f610a9f565b611a699190614374565b1115611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190614189565b60405180910390fd5b60005b81811015611ad757611ac633611ac1610a9f565b61241e565b80611ad0906145d2565b9050611aad565b5050565b611aec611ae6612023565b836120e4565b611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906141c9565b60405180910390fd5b611b3784848484612502565b50505050565b60606010611b56600184611b519190614374565b61255e565b604051602001611b67929190613e61565b6040516020818303038152906040529050919050565b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613f49565b60405180910390fd5b600c5481611c0d91906143fb565b3414611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590613f29565b60405180910390fd5b600b5481611c5a610a9f565b611c649190614374565b1115611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90614189565b60405180910390fd5b60005b81811015611d2757611cc133611cbc610a9f565b61241e565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d119061454c565b919050555080611d20906145d2565b9050611ca8565b5050565b600d6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b611de5612023565b73ffffffffffffffffffffffffffffffffffffffff16611e03611602565b73ffffffffffffffffffffffffffffffffffffffff1614611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614149565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec090613fc9565b60405180910390fd5b611ed28161243c565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fa057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fb05750611faf8261270b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661209e83611120565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006120ef82611fb7565b61212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212590614049565b60405180910390fd5b600061213983611120565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121a857508373ffffffffffffffffffffffffffffffffffffffff1661219084610902565b73ffffffffffffffffffffffffffffffffffffffff16145b806121b957506121b88185611d43565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121e282611120565b73ffffffffffffffffffffffffffffffffffffffff1614612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222f90614169565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614009565b60405180910390fd5b6122b3838383612775565b6122be60008261202b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230e9190614455565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123659190614374565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612438828260405180602001604052806000815250612889565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61250d8484846121c2565b612519848484846128e4565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613fa9565b60405180910390fd5b50505050565b606060008214156125a6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612706565b600082905060005b600082146125d85780806125c1906145d2565b915050600a826125d191906143ca565b91506125ae565b60008167ffffffffffffffff81111561261a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561264c5781602001600182028036833780820191505090505b5090505b600085146126ff576001826126659190614455565b9150600a856126749190614645565b60306126809190614374565b60f81b8183815181106126bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126f891906143ca565b9450612650565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612780838383612a7b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127c3576127be81612a80565b612802565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612801576128008382612ac9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128455761284081612c36565b612884565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612883576128828282612d79565b5b5b505050565b6128938383612df8565b6128a060008484846128e4565b6128df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d690613fa9565b60405180910390fd5b505050565b60006129058473ffffffffffffffffffffffffffffffffffffffff16612fc6565b15612a6e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292e612023565b8786866040518563ffffffff1660e01b81526004016129509493929190613ea0565b602060405180830381600087803b15801561296a57600080fd5b505af192505050801561299b57506040513d601f19601f82011682018060405250810190612998919061345c565b60015b612a1e573d80600081146129cb576040519150601f19603f3d011682016040523d82523d6000602084013e6129d0565b606091505b50600081511415612a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0d90613fa9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a73565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ad6846111d2565b612ae09190614455565b9050600060076000848152602001908152602001600020549050818114612bc5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c4a9190614455565b9050600060096000848152602001908152602001600020549050600060088381548110612ca0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612ce8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612d5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d84836111d2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5f906140e9565b60405180910390fd5b612e7181611fb7565b15612eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea890613fe9565b60405180910390fd5b612ebd60008383612775565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0d9190614374565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612fe5906145a0565b90600052602060002090601f016020900481019282613007576000855561304e565b82601f1061302057805160ff191683800117855561304e565b8280016001018555821561304e579182015b8281111561304d578251825591602001919060010190613032565b5b50905061305b919061305f565b5090565b5b80821115613078576000816000905550600101613060565b5090565b600061308f61308a84614290565b61425f565b905080838252602082019050828560208602820111156130ae57600080fd5b60005b858110156130de57816130c48882613164565b8452602084019350602083019250506001810190506130b1565b5050509392505050565b60006130fb6130f6846142bc565b61425f565b90508281526020810184848401111561311357600080fd5b61311e84828561450a565b509392505050565b6000613139613134846142ec565b61425f565b90508281526020810184848401111561315157600080fd5b61315c84828561450a565b509392505050565b60008135905061317381614743565b92915050565b600082601f83011261318a57600080fd5b813561319a84826020860161307c565b91505092915050565b6000813590506131b28161475a565b92915050565b6000813590506131c781614771565b92915050565b6000815190506131dc81614771565b92915050565b600082601f8301126131f357600080fd5b81356132038482602086016130e8565b91505092915050565b600082601f83011261321d57600080fd5b813561322d848260208601613126565b91505092915050565b60008135905061324581614788565b92915050565b60006020828403121561325d57600080fd5b600061326b84828501613164565b91505092915050565b6000806040838503121561328757600080fd5b600061329585828601613164565b92505060206132a685828601613164565b9150509250929050565b6000806000606084860312156132c557600080fd5b60006132d386828701613164565b93505060206132e486828701613164565b92505060406132f586828701613236565b9150509250925092565b6000806000806080858703121561331557600080fd5b600061332387828801613164565b945050602061333487828801613164565b935050604061334587828801613236565b925050606085013567ffffffffffffffff81111561336257600080fd5b61336e878288016131e2565b91505092959194509250565b6000806040838503121561338d57600080fd5b600061339b85828601613164565b92505060206133ac858286016131a3565b9150509250929050565b600080604083850312156133c957600080fd5b60006133d785828601613164565b92505060206133e885828601613236565b9150509250929050565b60006020828403121561340457600080fd5b600082013567ffffffffffffffff81111561341e57600080fd5b61342a84828501613179565b91505092915050565b60006020828403121561344557600080fd5b6000613453848285016131b8565b91505092915050565b60006020828403121561346e57600080fd5b600061347c848285016131cd565b91505092915050565b60006020828403121561349757600080fd5b600082013567ffffffffffffffff8111156134b157600080fd5b6134bd8482850161320c565b91505092915050565b6000602082840312156134d857600080fd5b60006134e684828501613236565b91505092915050565b6134f881614489565b82525050565b6135078161449b565b82525050565b600061351882614331565b6135228185614347565b9350613532818560208601614519565b61353b81614732565b840191505092915050565b60006135518261433c565b61355b8185614358565b935061356b818560208601614519565b61357481614732565b840191505092915050565b600061358a8261433c565b6135948185614369565b93506135a4818560208601614519565b80840191505092915050565b600081546135bd816145a0565b6135c78186614369565b945060018216600081146135e257600181146135f357613626565b60ff19831686528186019350613626565b6135fc8561431c565b60005b8381101561361e578154818901526001820191506020810190506135ff565b838801955050505b50505092915050565b600061363c601d83614358565b91507f496e636f7272656374204554482073656e7420746f207072656d696e740000006000830152602082019050919050565b600061367c601f83614358565b91507f496e73756666696369656e742070726573616c6520616c6c6f636174696f6e006000830152602082019050919050565b60006136bc602b83614358565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613722602c83614358565b91507f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008301527f20666f72206d696e74696e6700000000000000000000000000000000000000006020830152604082019050919050565b6000613788603283614358565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006137ee602683614358565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613854601c83614358565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613894602483614358565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138fa601983614358565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061393a602c83614358565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139a0601d83614358565b91507f4d696e74696e672069732063757272656e746c792064697361626c65640000006000830152602082019050919050565b60006139e0603883614358565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613a46602a83614358565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613aac602983614358565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b12602083614358565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b52601783614358565b91507f4e6f7420656e6f756768206c65667420746f206d696e740000000000000000006000830152602082019050919050565b6000613b92602c83614358565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bf8602083614358565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c38602983614358565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9e601e83614358565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e7400006000830152602082019050919050565b6000613cde602183614358565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d44603183614358565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613daa602c83614358565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613e10601a83614358565b91507f496e636f7272656374204554482073656e7420746f206d696e740000000000006000830152602082019050919050565b613e4c816144f3565b82525050565b613e5b816144fd565b82525050565b6000613e6d82856135b0565b9150613e79828461357f565b91508190509392505050565b6000602082019050613e9a60008301846134ef565b92915050565b6000608082019050613eb560008301876134ef565b613ec260208301866134ef565b613ecf6040830185613e43565b8181036060830152613ee1818461350d565b905095945050505050565b6000602082019050613f0160008301846134fe565b92915050565b60006020820190508181036000830152613f218184613546565b905092915050565b60006020820190508181036000830152613f428161362f565b9050919050565b60006020820190508181036000830152613f628161366f565b9050919050565b60006020820190508181036000830152613f82816136af565b9050919050565b60006020820190508181036000830152613fa281613715565b9050919050565b60006020820190508181036000830152613fc28161377b565b9050919050565b60006020820190508181036000830152613fe2816137e1565b9050919050565b6000602082019050818103600083015261400281613847565b9050919050565b6000602082019050818103600083015261402281613887565b9050919050565b60006020820190508181036000830152614042816138ed565b9050919050565b600060208201905081810360008301526140628161392d565b9050919050565b6000602082019050818103600083015261408281613993565b9050919050565b600060208201905081810360008301526140a2816139d3565b9050919050565b600060208201905081810360008301526140c281613a39565b9050919050565b600060208201905081810360008301526140e281613a9f565b9050919050565b6000602082019050818103600083015261410281613b05565b9050919050565b6000602082019050818103600083015261412281613b45565b9050919050565b6000602082019050818103600083015261414281613b85565b9050919050565b6000602082019050818103600083015261416281613beb565b9050919050565b6000602082019050818103600083015261418281613c2b565b9050919050565b600060208201905081810360008301526141a281613c91565b9050919050565b600060208201905081810360008301526141c281613cd1565b9050919050565b600060208201905081810360008301526141e281613d37565b9050919050565b6000602082019050818103600083015261420281613d9d565b9050919050565b6000602082019050818103600083015261422281613e03565b9050919050565b600060208201905061423e6000830184613e43565b92915050565b60006020820190506142596000830184613e52565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561428657614285614703565b5b8060405250919050565b600067ffffffffffffffff8211156142ab576142aa614703565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142d7576142d6614703565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561430757614306614703565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061437f826144f3565b915061438a836144f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143bf576143be614676565b5b828201905092915050565b60006143d5826144f3565b91506143e0836144f3565b9250826143f0576143ef6146a5565b5b828204905092915050565b6000614406826144f3565b9150614411836144f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561444a57614449614676565b5b828202905092915050565b6000614460826144f3565b915061446b836144f3565b92508282101561447e5761447d614676565b5b828203905092915050565b6000614494826144d3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561453757808201518184015260208101905061451c565b83811115614546576000848401525b50505050565b6000614557826144f3565b9150600082141561456b5761456a614676565b5b600182039050919050565b6000614581826144fd565b9150600082141561459557614594614676565b5b600182039050919050565b600060028204905060018216806145b857607f821691505b602082108114156145cc576145cb6146d4565b5b50919050565b60006145dd826144f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146105761460f614676565b5b600182019050919050565b6000614626826144fd565b915060ff82141561463a57614639614676565b5b600182019050919050565b6000614650826144f3565b915061465b836144f3565b92508261466b5761466a6146a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61474c81614489565b811461475757600080fd5b50565b6147638161449b565b811461476e57600080fd5b50565b61477a816144a7565b811461478557600080fd5b50565b614791816144f3565b811461479c57600080fd5b5056fea26469706673582212203e8fc6676b584ab49f19654fd0790dbce3a866f0c33605396c505eb634b5b30364736f6c6343000800003368747470733a2f2f6372617a7970616e746865727370617274792e636f6d2f6d657461646174612f
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80637c928fe91161010d578063b09afa30116100a0578063c9b298f11161006f578063c9b298f11461070c578063ce3c124f14610728578063e985e9c514610765578063f2b3ea5d146107a2578063f2fde38b146107cd576101f9565b8063b09afa3014610661578063b3ab66b01461068a578063b88d4fde146106a6578063c87b56dd146106cf576101f9565b80638b2c1435116100dc5780638b2c1435146105b75780638da5cb5b146105e257806395d89b411461060d578063a22cb46514610638576101f9565b80637c928fe9146105115780637d55094d1461053a5780638417b47f146105515780638a43d1661461057a576101f9565b80633ccfd60b1161019057806355f804b31161015f57806355f804b31461042e5780635fcc98d3146104575780636352211e1461048057806370a08231146104bd578063715018a6146104fa576101f9565b80633ccfd60b1461038857806342842e0e1461039f578063484b973c146103c85780634f6ccce7146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613433565b6107f6565b6040516102329190613eec565b60405180910390f35b34801561024757600080fd5b50610250610870565b60405161025d9190613f07565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906134c6565b610902565b60405161029a9190613e85565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c591906133b6565b610987565b005b3480156102d857600080fd5b506102e1610a9f565b6040516102ee9190614229565b60405180910390f35b34801561030357600080fd5b5061031e600480360381019061031991906132b0565b610aac565b005b34801561032c57600080fd5b50610347600480360381019061034291906133b6565b610b0c565b6040516103549190614229565b60405180910390f35b34801561036957600080fd5b50610372610bb1565b60405161037f9190614229565b60405180910390f35b34801561039457600080fd5b5061039d610bb7565b005b3480156103ab57600080fd5b506103c660048036038101906103c191906132b0565b610d7c565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906133b6565b610d9c565b005b3480156103fd57600080fd5b50610418600480360381019061041391906134c6565b610ea1565b6040516104259190614229565b60405180910390f35b34801561043a57600080fd5b5061045560048036038101906104509190613485565b610f38565b005b34801561046357600080fd5b5061047e600480360381019061047991906133f2565b610fce565b005b34801561048c57600080fd5b506104a760048036038101906104a291906134c6565b611120565b6040516104b49190613e85565b60405180910390f35b3480156104c957600080fd5b506104e460048036038101906104df919061324b565b6111d2565b6040516104f19190614229565b60405180910390f35b34801561050657600080fd5b5061050f61128a565b005b34801561051d57600080fd5b50610538600480360381019061053391906134c6565b611312565b005b34801561054657600080fd5b5061054f6114a1565b005b34801561055d57600080fd5b50610578600480360381019061057391906134c6565b611549565b005b34801561058657600080fd5b506105a1600480360381019061059c919061324b565b6115cf565b6040516105ae9190614244565b60405180910390f35b3480156105c357600080fd5b506105cc6115ef565b6040516105d99190613eec565b60405180910390f35b3480156105ee57600080fd5b506105f7611602565b6040516106049190613e85565b60405180910390f35b34801561061957600080fd5b5061062261162c565b60405161062f9190613f07565b60405180910390f35b34801561064457600080fd5b5061065f600480360381019061065a919061337a565b6116be565b005b34801561066d57600080fd5b50610688600480360381019061068391906133f2565b61183f565b005b6106a4600480360381019061069f91906134c6565b611971565b005b3480156106b257600080fd5b506106cd60048036038101906106c891906132ff565b611adb565b005b3480156106db57600080fd5b506106f660048036038101906106f191906134c6565b611b3d565b6040516107039190613f07565b60405180910390f35b610726600480360381019061072191906134c6565b611b7d565b005b34801561073457600080fd5b5061074f600480360381019061074a919061324b565b611d2b565b60405161075c9190614229565b60405180910390f35b34801561077157600080fd5b5061078c60048036038101906107879190613274565b611d43565b6040516107999190613eec565b60405180910390f35b3480156107ae57600080fd5b506107b7611dd7565b6040516107c49190614229565b60405180910390f35b3480156107d957600080fd5b506107f460048036038101906107ef919061324b565b611ddd565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610869575061086882611ed5565b5b9050919050565b60606000805461087f906145a0565b80601f01602080910402602001604051908101604052809291908181526020018280546108ab906145a0565b80156108f85780601f106108cd576101008083540402835291602001916108f8565b820191906000526020600020905b8154815290600101906020018083116108db57829003601f168201915b5050505050905090565b600061090d82611fb7565b61094c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094390614129565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099282611120565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa906141a9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a22612023565b73ffffffffffffffffffffffffffffffffffffffff161480610a515750610a5081610a4b612023565b611d43565b5b610a90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8790614089565b60405180910390fd5b610a9a838361202b565b505050565b6000600880549050905090565b610abd610ab7612023565b826120e4565b610afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af3906141c9565b60405180910390fd5b610b078383836121c2565b505050565b6000610b17836111d2565b8210610b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4f90613f69565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600b5481565b610bbf612023565b73ffffffffffffffffffffffffffffffffffffffff16610bdd611602565b73ffffffffffffffffffffffffffffffffffffffff1614610c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2a90614149565b60405180910390fd5b6000732bd2ae185e6eb8fc6d60efc6ed560126f25159b5905060007322438b6e5732d0827dd95fb5762b93b72100138090506000739408c666a65f2867a3ef3060766077462f84c71790508273ffffffffffffffffffffffffffffffffffffffff166108fc6064476046610ca791906143fb565b610cb191906143ca565b9081150290604051600060405180830381858888f19350505050158015610cdc573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff166108fc600247610d0491906143ca565b9081150290604051600060405180830381858888f19350505050158015610d2f573d6000803e3d6000fd5b508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d76573d6000803e3d6000fd5b50505050565b610d9783838360405180602001604052806000815250611adb565b505050565b610da4612023565b73ffffffffffffffffffffffffffffffffffffffff16610dc2611602565b73ffffffffffffffffffffffffffffffffffffffff1614610e18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0f90614149565b60405180910390fd5b600b5481610e24610a9f565b610e2e9190614374565b1115610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690614109565b60405180910390fd5b60005b81811015610e9c57610e8b83610e86610a9f565b61241e565b80610e95906145d2565b9050610e72565b505050565b6000610eab610a9f565b8210610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee3906141e9565b60405180910390fd5b60088281548110610f26577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f40612023565b73ffffffffffffffffffffffffffffffffffffffff16610f5e611602565b73ffffffffffffffffffffffffffffffffffffffff1614610fb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fab90614149565b60405180910390fd5b8060109080519060200190610fca929190612fd9565b5050565b610fd6612023565b73ffffffffffffffffffffffffffffffffffffffff16610ff4611602565b73ffffffffffffffffffffffffffffffffffffffff161461104a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104190614149565b60405180910390fd5b60005b815181101561111c57600e6000838381518110611093577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff16809291906110f29061461b565b91906101000a81548160ff021916908360ff1602179055505080611115906145d2565b905061104d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c0906140c9565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611243576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123a906140a9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611292612023565b73ffffffffffffffffffffffffffffffffffffffff166112b0611602565b73ffffffffffffffffffffffffffffffffffffffff1614611306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fd90614149565b60405180910390fd5b611310600061243c565b565b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff1610156113a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139b90613f49565b60405180910390fd5b600b54816113b0610a9f565b6113ba9190614374565b11156113fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f290614189565b60405180910390fd5b60005b8181101561149d5761141733611412610a9f565b61241e565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900460ff168092919061147390614576565b91906101000a81548160ff021916908360ff1602179055505080611496906145d2565b90506113fe565b5050565b6114a9612023565b73ffffffffffffffffffffffffffffffffffffffff166114c7611602565b73ffffffffffffffffffffffffffffffffffffffff161461151d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151490614149565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b611551612023565b73ffffffffffffffffffffffffffffffffffffffff1661156f611602565b73ffffffffffffffffffffffffffffffffffffffff16146115c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115bc90614149565b60405180910390fd5b80600c8190555050565b600e6020528060005260406000206000915054906101000a900460ff1681565b600f60009054906101000a900460ff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461163b906145a0565b80601f0160208091040260200160405190810160405280929190818152602001828054611667906145a0565b80156116b45780601f10611689576101008083540402835291602001916116b4565b820191906000526020600020905b81548152906001019060200180831161169757829003601f168201915b5050505050905090565b6116c6612023565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172b90614029565b60405180910390fd5b8060056000611741612023565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117ee612023565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118339190613eec565b60405180910390a35050565b611847612023565b73ffffffffffffffffffffffffffffffffffffffff16611865611602565b73ffffffffffffffffffffffffffffffffffffffff16146118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b290614149565b60405180910390fd5b60005b815181101561196d57600d6000838381518110611904577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611957906145d2565b919050555080611966906145d2565b90506118be565b5050565b600f60009054906101000a900460ff166119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b790614069565b60405180910390fd5b6014811115611a04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fb90613f89565b60405180910390fd5b600c5481611a1291906143fb565b3414611a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4a90614209565b60405180910390fd5b600b5481611a5f610a9f565b611a699190614374565b1115611aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa190614189565b60405180910390fd5b60005b81811015611ad757611ac633611ac1610a9f565b61241e565b80611ad0906145d2565b9050611aad565b5050565b611aec611ae6612023565b836120e4565b611b2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b22906141c9565b60405180910390fd5b611b3784848484612502565b50505050565b60606010611b56600184611b519190614374565b61255e565b604051602001611b67929190613e61565b6040516020818303038152906040529050919050565b80600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611bff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf690613f49565b60405180910390fd5b600c5481611c0d91906143fb565b3414611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590613f29565b60405180910390fd5b600b5481611c5a610a9f565b611c649190614374565b1115611ca5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9c90614189565b60405180910390fd5b60005b81811015611d2757611cc133611cbc610a9f565b61241e565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190611d119061454c565b919050555080611d20906145d2565b9050611ca8565b5050565b600d6020528060005260406000206000915090505481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b611de5612023565b73ffffffffffffffffffffffffffffffffffffffff16611e03611602565b73ffffffffffffffffffffffffffffffffffffffff1614611e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5090614149565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec090613fc9565b60405180910390fd5b611ed28161243c565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fa057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fb05750611faf8261270b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661209e83611120565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006120ef82611fb7565b61212e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212590614049565b60405180910390fd5b600061213983611120565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806121a857508373ffffffffffffffffffffffffffffffffffffffff1661219084610902565b73ffffffffffffffffffffffffffffffffffffffff16145b806121b957506121b88185611d43565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166121e282611120565b73ffffffffffffffffffffffffffffffffffffffff1614612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222f90614169565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229f90614009565b60405180910390fd5b6122b3838383612775565b6122be60008261202b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230e9190614455565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123659190614374565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612438828260405180602001604052806000815250612889565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61250d8484846121c2565b612519848484846128e4565b612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254f90613fa9565b60405180910390fd5b50505050565b606060008214156125a6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612706565b600082905060005b600082146125d85780806125c1906145d2565b915050600a826125d191906143ca565b91506125ae565b60008167ffffffffffffffff81111561261a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561264c5781602001600182028036833780820191505090505b5090505b600085146126ff576001826126659190614455565b9150600a856126749190614645565b60306126809190614374565b60f81b8183815181106126bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126f891906143ca565b9450612650565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612780838383612a7b565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127c3576127be81612a80565b612802565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612801576128008382612ac9565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128455761284081612c36565b612884565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612883576128828282612d79565b5b5b505050565b6128938383612df8565b6128a060008484846128e4565b6128df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d690613fa9565b60405180910390fd5b505050565b60006129058473ffffffffffffffffffffffffffffffffffffffff16612fc6565b15612a6e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261292e612023565b8786866040518563ffffffff1660e01b81526004016129509493929190613ea0565b602060405180830381600087803b15801561296a57600080fd5b505af192505050801561299b57506040513d601f19601f82011682018060405250810190612998919061345c565b60015b612a1e573d80600081146129cb576040519150601f19603f3d011682016040523d82523d6000602084013e6129d0565b606091505b50600081511415612a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0d90613fa9565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a73565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612ad6846111d2565b612ae09190614455565b9050600060076000848152602001908152602001600020549050818114612bc5576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612c4a9190614455565b9050600060096000848152602001908152602001600020549050600060088381548110612ca0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612ce8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612d5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612d84836111d2565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5f906140e9565b60405180910390fd5b612e7181611fb7565b15612eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea890613fe9565b60405180910390fd5b612ebd60008383612775565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f0d9190614374565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612fe5906145a0565b90600052602060002090601f016020900481019282613007576000855561304e565b82601f1061302057805160ff191683800117855561304e565b8280016001018555821561304e579182015b8281111561304d578251825591602001919060010190613032565b5b50905061305b919061305f565b5090565b5b80821115613078576000816000905550600101613060565b5090565b600061308f61308a84614290565b61425f565b905080838252602082019050828560208602820111156130ae57600080fd5b60005b858110156130de57816130c48882613164565b8452602084019350602083019250506001810190506130b1565b5050509392505050565b60006130fb6130f6846142bc565b61425f565b90508281526020810184848401111561311357600080fd5b61311e84828561450a565b509392505050565b6000613139613134846142ec565b61425f565b90508281526020810184848401111561315157600080fd5b61315c84828561450a565b509392505050565b60008135905061317381614743565b92915050565b600082601f83011261318a57600080fd5b813561319a84826020860161307c565b91505092915050565b6000813590506131b28161475a565b92915050565b6000813590506131c781614771565b92915050565b6000815190506131dc81614771565b92915050565b600082601f8301126131f357600080fd5b81356132038482602086016130e8565b91505092915050565b600082601f83011261321d57600080fd5b813561322d848260208601613126565b91505092915050565b60008135905061324581614788565b92915050565b60006020828403121561325d57600080fd5b600061326b84828501613164565b91505092915050565b6000806040838503121561328757600080fd5b600061329585828601613164565b92505060206132a685828601613164565b9150509250929050565b6000806000606084860312156132c557600080fd5b60006132d386828701613164565b93505060206132e486828701613164565b92505060406132f586828701613236565b9150509250925092565b6000806000806080858703121561331557600080fd5b600061332387828801613164565b945050602061333487828801613164565b935050604061334587828801613236565b925050606085013567ffffffffffffffff81111561336257600080fd5b61336e878288016131e2565b91505092959194509250565b6000806040838503121561338d57600080fd5b600061339b85828601613164565b92505060206133ac858286016131a3565b9150509250929050565b600080604083850312156133c957600080fd5b60006133d785828601613164565b92505060206133e885828601613236565b9150509250929050565b60006020828403121561340457600080fd5b600082013567ffffffffffffffff81111561341e57600080fd5b61342a84828501613179565b91505092915050565b60006020828403121561344557600080fd5b6000613453848285016131b8565b91505092915050565b60006020828403121561346e57600080fd5b600061347c848285016131cd565b91505092915050565b60006020828403121561349757600080fd5b600082013567ffffffffffffffff8111156134b157600080fd5b6134bd8482850161320c565b91505092915050565b6000602082840312156134d857600080fd5b60006134e684828501613236565b91505092915050565b6134f881614489565b82525050565b6135078161449b565b82525050565b600061351882614331565b6135228185614347565b9350613532818560208601614519565b61353b81614732565b840191505092915050565b60006135518261433c565b61355b8185614358565b935061356b818560208601614519565b61357481614732565b840191505092915050565b600061358a8261433c565b6135948185614369565b93506135a4818560208601614519565b80840191505092915050565b600081546135bd816145a0565b6135c78186614369565b945060018216600081146135e257600181146135f357613626565b60ff19831686528186019350613626565b6135fc8561431c565b60005b8381101561361e578154818901526001820191506020810190506135ff565b838801955050505b50505092915050565b600061363c601d83614358565b91507f496e636f7272656374204554482073656e7420746f207072656d696e740000006000830152602082019050919050565b600061367c601f83614358565b91507f496e73756666696369656e742070726573616c6520616c6c6f636174696f6e006000830152602082019050919050565b60006136bc602b83614358565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000613722602c83614358565b91507f496e76616c6964206e756d626572206f6620746f6b656e73207175657269657360008301527f20666f72206d696e74696e6700000000000000000000000000000000000000006020830152604082019050919050565b6000613788603283614358565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006137ee602683614358565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613854601c83614358565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613894602483614358565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138fa601983614358565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061393a602c83614358565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006139a0601d83614358565b91507f4d696e74696e672069732063757272656e746c792064697361626c65640000006000830152602082019050919050565b60006139e0603883614358565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613a46602a83614358565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613aac602983614358565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b12602083614358565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613b52601783614358565b91507f4e6f7420656e6f756768206c65667420746f206d696e740000000000000000006000830152602082019050919050565b6000613b92602c83614358565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613bf8602083614358565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c38602983614358565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c9e601e83614358565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420746f206d696e7400006000830152602082019050919050565b6000613cde602183614358565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d44603183614358565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613daa602c83614358565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613e10601a83614358565b91507f496e636f7272656374204554482073656e7420746f206d696e740000000000006000830152602082019050919050565b613e4c816144f3565b82525050565b613e5b816144fd565b82525050565b6000613e6d82856135b0565b9150613e79828461357f565b91508190509392505050565b6000602082019050613e9a60008301846134ef565b92915050565b6000608082019050613eb560008301876134ef565b613ec260208301866134ef565b613ecf6040830185613e43565b8181036060830152613ee1818461350d565b905095945050505050565b6000602082019050613f0160008301846134fe565b92915050565b60006020820190508181036000830152613f218184613546565b905092915050565b60006020820190508181036000830152613f428161362f565b9050919050565b60006020820190508181036000830152613f628161366f565b9050919050565b60006020820190508181036000830152613f82816136af565b9050919050565b60006020820190508181036000830152613fa281613715565b9050919050565b60006020820190508181036000830152613fc28161377b565b9050919050565b60006020820190508181036000830152613fe2816137e1565b9050919050565b6000602082019050818103600083015261400281613847565b9050919050565b6000602082019050818103600083015261402281613887565b9050919050565b60006020820190508181036000830152614042816138ed565b9050919050565b600060208201905081810360008301526140628161392d565b9050919050565b6000602082019050818103600083015261408281613993565b9050919050565b600060208201905081810360008301526140a2816139d3565b9050919050565b600060208201905081810360008301526140c281613a39565b9050919050565b600060208201905081810360008301526140e281613a9f565b9050919050565b6000602082019050818103600083015261410281613b05565b9050919050565b6000602082019050818103600083015261412281613b45565b9050919050565b6000602082019050818103600083015261414281613b85565b9050919050565b6000602082019050818103600083015261416281613beb565b9050919050565b6000602082019050818103600083015261418281613c2b565b9050919050565b600060208201905081810360008301526141a281613c91565b9050919050565b600060208201905081810360008301526141c281613cd1565b9050919050565b600060208201905081810360008301526141e281613d37565b9050919050565b6000602082019050818103600083015261420281613d9d565b9050919050565b6000602082019050818103600083015261422281613e03565b9050919050565b600060208201905061423e6000830184613e43565b92915050565b60006020820190506142596000830184613e52565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561428657614285614703565b5b8060405250919050565b600067ffffffffffffffff8211156142ab576142aa614703565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142d7576142d6614703565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561430757614306614703565b5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061437f826144f3565b915061438a836144f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143bf576143be614676565b5b828201905092915050565b60006143d5826144f3565b91506143e0836144f3565b9250826143f0576143ef6146a5565b5b828204905092915050565b6000614406826144f3565b9150614411836144f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561444a57614449614676565b5b828202905092915050565b6000614460826144f3565b915061446b836144f3565b92508282101561447e5761447d614676565b5b828203905092915050565b6000614494826144d3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561453757808201518184015260208101905061451c565b83811115614546576000848401525b50505050565b6000614557826144f3565b9150600082141561456b5761456a614676565b5b600182039050919050565b6000614581826144fd565b9150600082141561459557614594614676565b5b600182039050919050565b600060028204905060018216806145b857607f821691505b602082108114156145cc576145cb6146d4565b5b50919050565b60006145dd826144f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156146105761460f614676565b5b600182019050919050565b6000614626826144fd565b915060ff82141561463a57614639614676565b5b600182019050919050565b6000614650826144f3565b915061465b836144f3565b92508261466b5761466a6146a5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61474c81614489565b811461475757600080fd5b50565b6147638161449b565b811461476e57600080fd5b50565b61477a816144a7565b811461478557600080fd5b50565b614791816144f3565b811461479c57600080fd5b5056fea26469706673582212203e8fc6676b584ab49f19654fd0790dbce3a866f0c33605396c505eb634b5b30364736f6c63430008000033
Deployed Bytecode Sourcemap
173:3728:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;937:224:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1577:113:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1245:256:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;280:29:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3002:490;;;;;;;;;;;;;:::i;:::-;;5285:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2394:248:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1767:233:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2780:101:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3504:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2120:239:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1850:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:10;;;;;;;;;;;;;:::i;:::-;;923:405:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2893:97;;;;;;;;;;;;;:::i;:::-;;2654:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;472:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;534:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:87:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2595:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4278:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3706:192:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1865:517;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5541:328:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;737:174:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1340:513;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;414:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;345:38:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;937:224:4;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;2426:100:3:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3508:411;;;:::o;1577:113:4:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;4875:339:3:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;1245:256:4:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;280:29:11:-;;;;:::o;3002:490::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3052:17:11::1;3072:42;3052:62;;3125:21;3149:42;3125:66;;3202:21;3226:42;3202:66;;3297:9;3289:27;;:61;3346:3;3322:21;3317:2;:26;;;;:::i;:::-;:32;;;;:::i;:::-;3289:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3369:13;3361:31;;:58;3417:1;3393:21;:25;;;;:::i;:::-;3361:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3438:13;3430:31;;:54;3462:21;3430:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1290:1:10;;;3002:490:11:o:0;5285:185:3:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;2394:248:11:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2509:10:11::1;;2496:9;2480:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;2472:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2573:6;2568:66;2589:9;2585:1;:13;2568:66;;;2605:29;2615:3;2620:13;:11;:13::i;:::-;2605:9;:29::i;:::-;2600:3;;;;:::i;:::-;;;2568:66;;;;2394:248:::0;;:::o;1767:233:4:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;;;;;;;;;;;;;;;;;1968:24;;1767:233;;;:::o;2780:101:11:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2865:8:11::1;2854;:19;;;;;;;;;;;;:::i;:::-;;2780:101:::0;:::o;3504:190::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3589:6:11::1;3584:103;3605:9;:16;3601:1;:20;3584:103;;;3643:16;:30;3660:9;3670:1;3660:12;;;;;;;;;;;;;;;;;;;;;;3643:30;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;3623:3;;;;:::i;:::-;;;3584:103;;;;3504:190:::0;:::o;2120:239:3:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;1850:208::-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:10:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;923:405:11:-;1017:9;985:16;:28;1002:10;985:28;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;977:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1110:10;;1097:9;1081:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;1073:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;1181:6;1176:145;1197:9;1193:1;:13;1176:145;;;1228:36;1238:10;1250:13;:11;:13::i;:::-;1228:9;:36::i;:::-;1279:16;:28;1296:10;1279:28;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;1208:3;;;;:::i;:::-;;;1176:145;;;;923:405;:::o;2893:97::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2967:15:11::1;;;;;;;;;;;2966:16;2948:15;;:34;;;;;;;;;;;;;;;;;;2893:97::o:0;2654:114::-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2746:14:11::1;2730:13;:30;;;;2654:114:::0;:::o;472:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;534:35::-;;;;;;;;;;;;;:::o;999:87:10:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;2595:104:3:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;4278:295::-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;3706:192:11:-;1230:12:10;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3790:6:11::1;3785:106;3806:9;:16;3802:1;:20;3785:106;;;3844:19;:33;3864:9;3874:1;3864:12;;;;;;;;;;;;;;;;;;;;;;3844:33;;;;;;;;;;;;;;;;:35;;;;;;;;;:::i;:::-;;;;;;3824:3;;;;:::i;:::-;;;3785:106;;;;3706:192:::0;:::o;1865:517::-;1941:15;;;;;;;;;;;1933:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;2022:2;2009:9;:15;;2001:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;2117:13;;2105:9;:25;;;;:::i;:::-;2092:9;:38;2084:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;2209:10;;2196:9;2180:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;2172:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;2280:6;2275:100;2296:9;2292:1;:13;2275:100;;;2327:36;2337:10;2349:13;:11;:13::i;:::-;2327:9;:36::i;:::-;2307:3;;;;:::i;:::-;;;2275:100;;;;1865:517;:::o;5541:328:3:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;737:174:11:-;810:13;867:8;877:24;888:1;878:7;:11;;;;:::i;:::-;877:22;:24::i;:::-;850:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;836:67;;737:174;;;:::o;1340:513::-;1448:9;1413:19;:31;1433:10;1413:31;;;;;;;;;;;;;;;;:44;;1405:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;1537:13;;1525:9;:25;;;;:::i;:::-;1512:9;:38;1504:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;1632:10;;1619:9;1603:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;1595:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;1703:6;1698:148;1719:9;1715:1;:13;1698:148;;;1750:36;1760:10;1772:13;:11;:13::i;:::-;1750:9;:36::i;:::-;1801:19;:31;1821:10;1801:31;;;;;;;;;;;;;;;;:33;;;;;;;;;:::i;:::-;;;;;;1730:3;;;;:::i;:::-;;;1698:148;;;;1340:513;:::o;414:51::-;;;;;;;;;;;;;;;;;:::o;4644:164:3:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;345:38:11:-;;;;:::o;1899:192:10:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;1481:305:3:-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;7379:127::-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;11361:174:3:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;7673:348::-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;8363:110::-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;2099:173:10:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2099:173;;:::o;6751:315:3:-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;288:723:12:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;787:157:2:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2613:589:4:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;8700:321:3:-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;12100:803::-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;13475:126::-;;;;:::o;3925:164:4:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5194:328;;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4716:988;;;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;;;;;;;;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5999:1079;;;;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3503:221;;;:::o;9357:382:3:-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:13:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:405::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6001:1;5998;5991:12;5953:2;6072:1;6061:9;6057:17;6044:31;6102:18;6094:6;6091:30;6088:2;;;6134:1;6131;6124:12;6088:2;6162:78;6232:7;6223:6;6212:9;6208:22;6162:78;:::i;:::-;6152:88;;6015:235;5943:314;;;;:::o;6263:260::-;;6370:2;6358:9;6349:7;6345:23;6341:32;6338:2;;;6386:1;6383;6376:12;6338:2;6429:1;6454:52;6498:7;6489:6;6478:9;6474:22;6454:52;:::i;:::-;6444:62;;6400:116;6328:195;;;;:::o;6529:282::-;;6647:2;6635:9;6626:7;6622:23;6618:32;6615:2;;;6663:1;6660;6653:12;6615:2;6706:1;6731:63;6786:7;6777:6;6766:9;6762:22;6731:63;:::i;:::-;6721:73;;6677:127;6605:206;;;;:::o;6817:375::-;;6935:2;6923:9;6914:7;6910:23;6906:32;6903:2;;;6951:1;6948;6941:12;6903:2;7022:1;7011:9;7007:17;6994:31;7052:18;7044:6;7041:30;7038:2;;;7084:1;7081;7074:12;7038:2;7112:63;7167:7;7158:6;7147:9;7143:22;7112:63;:::i;:::-;7102:73;;6965:220;6893:299;;;;:::o;7198:262::-;;7306:2;7294:9;7285:7;7281:23;7277:32;7274:2;;;7322:1;7319;7312:12;7274:2;7365:1;7390:53;7435:7;7426:6;7415:9;7411:22;7390:53;:::i;:::-;7380:63;;7336:117;7264:196;;;;:::o;7466:118::-;7553:24;7571:5;7553:24;:::i;:::-;7548:3;7541:37;7531:53;;:::o;7590:109::-;7671:21;7686:5;7671:21;:::i;:::-;7666:3;7659:34;7649:50;;:::o;7705:360::-;;7819:38;7851:5;7819:38;:::i;:::-;7873:70;7936:6;7931:3;7873:70;:::i;:::-;7866:77;;7952:52;7997:6;7992:3;7985:4;7978:5;7974:16;7952:52;:::i;:::-;8029:29;8051:6;8029:29;:::i;:::-;8024:3;8020:39;8013:46;;7795:270;;;;;:::o;8071:364::-;;8187:39;8220:5;8187:39;:::i;:::-;8242:71;8306:6;8301:3;8242:71;:::i;:::-;8235:78;;8322:52;8367:6;8362:3;8355:4;8348:5;8344:16;8322:52;:::i;:::-;8399:29;8421:6;8399:29;:::i;:::-;8394:3;8390:39;8383:46;;8163:272;;;;;:::o;8441:377::-;;8575:39;8608:5;8575:39;:::i;:::-;8630:89;8712:6;8707:3;8630:89;:::i;:::-;8623:96;;8728:52;8773:6;8768:3;8761:4;8754:5;8750:16;8728:52;:::i;:::-;8805:6;8800:3;8796:16;8789:23;;8551:267;;;;;:::o;8848:845::-;;8988:5;8982:12;9017:36;9043:9;9017:36;:::i;:::-;9069:89;9151:6;9146:3;9069:89;:::i;:::-;9062:96;;9189:1;9178:9;9174:17;9205:1;9200:137;;;;9351:1;9346:341;;;;9167:520;;9200:137;9284:4;9280:9;9269;9265:25;9260:3;9253:38;9320:6;9315:3;9311:16;9304:23;;9200:137;;9346:341;9413:38;9445:5;9413:38;:::i;:::-;9473:1;9487:154;9501:6;9498:1;9495:13;9487:154;;;9575:7;9569:14;9565:1;9560:3;9556:11;9549:35;9625:1;9616:7;9612:15;9601:26;;9523:4;9520:1;9516:12;9511:17;;9487:154;;;9670:6;9665:3;9661:16;9654:23;;9353:334;;9167:520;;8955:738;;;;;;:::o;9699:327::-;;9862:67;9926:2;9921:3;9862:67;:::i;:::-;9855:74;;9959:31;9955:1;9950:3;9946:11;9939:52;10017:2;10012:3;10008:12;10001:19;;9845:181;;;:::o;10032:329::-;;10195:67;10259:2;10254:3;10195:67;:::i;:::-;10188:74;;10292:33;10288:1;10283:3;10279:11;10272:54;10352:2;10347:3;10343:12;10336:19;;10178:183;;;:::o;10367:375::-;;10530:67;10594:2;10589:3;10530:67;:::i;:::-;10523:74;;10627:34;10623:1;10618:3;10614:11;10607:55;10693:13;10688:2;10683:3;10679:12;10672:35;10733:2;10728:3;10724:12;10717:19;;10513:229;;;:::o;10748:376::-;;10911:67;10975:2;10970:3;10911:67;:::i;:::-;10904:74;;11008:34;11004:1;10999:3;10995:11;10988:55;11074:14;11069:2;11064:3;11060:12;11053:36;11115:2;11110:3;11106:12;11099:19;;10894:230;;;:::o;11130:382::-;;11293:67;11357:2;11352:3;11293:67;:::i;:::-;11286:74;;11390:34;11386:1;11381:3;11377:11;11370:55;11456:20;11451:2;11446:3;11442:12;11435:42;11503:2;11498:3;11494:12;11487:19;;11276:236;;;:::o;11518:370::-;;11681:67;11745:2;11740:3;11681:67;:::i;:::-;11674:74;;11778:34;11774:1;11769:3;11765:11;11758:55;11844:8;11839:2;11834:3;11830:12;11823:30;11879:2;11874:3;11870:12;11863:19;;11664:224;;;:::o;11894:326::-;;12057:67;12121:2;12116:3;12057:67;:::i;:::-;12050:74;;12154:30;12150:1;12145:3;12141:11;12134:51;12211:2;12206:3;12202:12;12195:19;;12040:180;;;:::o;12226:368::-;;12389:67;12453:2;12448:3;12389:67;:::i;:::-;12382:74;;12486:34;12482:1;12477:3;12473:11;12466:55;12552:6;12547:2;12542:3;12538:12;12531:28;12585:2;12580:3;12576:12;12569:19;;12372:222;;;:::o;12600:323::-;;12763:67;12827:2;12822:3;12763:67;:::i;:::-;12756:74;;12860:27;12856:1;12851:3;12847:11;12840:48;12914:2;12909:3;12905:12;12898:19;;12746:177;;;:::o;12929:376::-;;13092:67;13156:2;13151:3;13092:67;:::i;:::-;13085:74;;13189:34;13185:1;13180:3;13176:11;13169:55;13255:14;13250:2;13245:3;13241:12;13234:36;13296:2;13291:3;13287:12;13280:19;;13075:230;;;:::o;13311:327::-;;13474:67;13538:2;13533:3;13474:67;:::i;:::-;13467:74;;13571:31;13567:1;13562:3;13558:11;13551:52;13629:2;13624:3;13620:12;13613:19;;13457:181;;;:::o;13644:388::-;;13807:67;13871:2;13866:3;13807:67;:::i;:::-;13800:74;;13904:34;13900:1;13895:3;13891:11;13884:55;13970:26;13965:2;13960:3;13956:12;13949:48;14023:2;14018:3;14014:12;14007:19;;13790:242;;;:::o;14038:374::-;;14201:67;14265:2;14260:3;14201:67;:::i;:::-;14194:74;;14298:34;14294:1;14289:3;14285:11;14278:55;14364:12;14359:2;14354:3;14350:12;14343:34;14403:2;14398:3;14394:12;14387:19;;14184:228;;;:::o;14418:373::-;;14581:67;14645:2;14640:3;14581:67;:::i;:::-;14574:74;;14678:34;14674:1;14669:3;14665:11;14658:55;14744:11;14739:2;14734:3;14730:12;14723:33;14782:2;14777:3;14773:12;14766:19;;14564:227;;;:::o;14797:330::-;;14960:67;15024:2;15019:3;14960:67;:::i;:::-;14953:74;;15057:34;15053:1;15048:3;15044:11;15037:55;15118:2;15113:3;15109:12;15102:19;;14943:184;;;:::o;15133:321::-;;15296:67;15360:2;15355:3;15296:67;:::i;:::-;15289:74;;15393:25;15389:1;15384:3;15380:11;15373:46;15445:2;15440:3;15436:12;15429:19;;15279:175;;;:::o;15460:376::-;;15623:67;15687:2;15682:3;15623:67;:::i;:::-;15616:74;;15720:34;15716:1;15711:3;15707:11;15700:55;15786:14;15781:2;15776:3;15772:12;15765:36;15827:2;15822:3;15818:12;15811:19;;15606:230;;;:::o;15842:330::-;;16005:67;16069:2;16064:3;16005:67;:::i;:::-;15998:74;;16102:34;16098:1;16093:3;16089:11;16082:55;16163:2;16158:3;16154:12;16147:19;;15988:184;;;:::o;16178:373::-;;16341:67;16405:2;16400:3;16341:67;:::i;:::-;16334:74;;16438:34;16434:1;16429:3;16425:11;16418:55;16504:11;16499:2;16494:3;16490:12;16483:33;16542:2;16537:3;16533:12;16526:19;;16324:227;;;:::o;16557:328::-;;16720:67;16784:2;16779:3;16720:67;:::i;:::-;16713:74;;16817:32;16813:1;16808:3;16804:11;16797:53;16876:2;16871:3;16867:12;16860:19;;16703:182;;;:::o;16891:365::-;;17054:67;17118:2;17113:3;17054:67;:::i;:::-;17047:74;;17151:34;17147:1;17142:3;17138:11;17131:55;17217:3;17212:2;17207:3;17203:12;17196:25;17247:2;17242:3;17238:12;17231:19;;17037:219;;;:::o;17262:381::-;;17425:67;17489:2;17484:3;17425:67;:::i;:::-;17418:74;;17522:34;17518:1;17513:3;17509:11;17502:55;17588:19;17583:2;17578:3;17574:12;17567:41;17634:2;17629:3;17625:12;17618:19;;17408:235;;;:::o;17649:376::-;;17812:67;17876:2;17871:3;17812:67;:::i;:::-;17805:74;;17909:34;17905:1;17900:3;17896:11;17889:55;17975:14;17970:2;17965:3;17961:12;17954:36;18016:2;18011:3;18007:12;18000:19;;17795:230;;;:::o;18031:324::-;;18194:67;18258:2;18253:3;18194:67;:::i;:::-;18187:74;;18291:28;18287:1;18282:3;18278:11;18271:49;18346:2;18341:3;18337:12;18330:19;;18177:178;;;:::o;18361:118::-;18448:24;18466:5;18448:24;:::i;:::-;18443:3;18436:37;18426:53;;:::o;18485:112::-;18568:22;18584:5;18568:22;:::i;:::-;18563:3;18556:35;18546:51;;:::o;18603:429::-;;18802:92;18890:3;18881:6;18802:92;:::i;:::-;18795:99;;18911:95;19002:3;18993:6;18911:95;:::i;:::-;18904:102;;19023:3;19016:10;;18784:248;;;;;:::o;19038:222::-;;19169:2;19158:9;19154:18;19146:26;;19182:71;19250:1;19239:9;19235:17;19226:6;19182:71;:::i;:::-;19136:124;;;;:::o;19266:640::-;;19499:3;19488:9;19484:19;19476:27;;19513:71;19581:1;19570:9;19566:17;19557:6;19513:71;:::i;:::-;19594:72;19662:2;19651:9;19647:18;19638:6;19594:72;:::i;:::-;19676;19744:2;19733:9;19729:18;19720:6;19676:72;:::i;:::-;19795:9;19789:4;19785:20;19780:2;19769:9;19765:18;19758:48;19823:76;19894:4;19885:6;19823:76;:::i;:::-;19815:84;;19466:440;;;;;;;:::o;19912:210::-;;20037:2;20026:9;20022:18;20014:26;;20050:65;20112:1;20101:9;20097:17;20088:6;20050:65;:::i;:::-;20004:118;;;;:::o;20128:313::-;;20279:2;20268:9;20264:18;20256:26;;20328:9;20322:4;20318:20;20314:1;20303:9;20299:17;20292:47;20356:78;20429:4;20420:6;20356:78;:::i;:::-;20348:86;;20246:195;;;;:::o;20447:419::-;;20651:2;20640:9;20636:18;20628:26;;20700:9;20694:4;20690:20;20686:1;20675:9;20671:17;20664:47;20728:131;20854:4;20728:131;:::i;:::-;20720:139;;20618:248;;;:::o;20872:419::-;;21076:2;21065:9;21061:18;21053:26;;21125:9;21119:4;21115:20;21111:1;21100:9;21096:17;21089:47;21153:131;21279:4;21153:131;:::i;:::-;21145:139;;21043:248;;;:::o;21297:419::-;;21501:2;21490:9;21486:18;21478:26;;21550:9;21544:4;21540:20;21536:1;21525:9;21521:17;21514:47;21578:131;21704:4;21578:131;:::i;:::-;21570:139;;21468:248;;;:::o;21722:419::-;;21926:2;21915:9;21911:18;21903:26;;21975:9;21969:4;21965:20;21961:1;21950:9;21946:17;21939:47;22003:131;22129:4;22003:131;:::i;:::-;21995:139;;21893:248;;;:::o;22147:419::-;;22351:2;22340:9;22336:18;22328:26;;22400:9;22394:4;22390:20;22386:1;22375:9;22371:17;22364:47;22428:131;22554:4;22428:131;:::i;:::-;22420:139;;22318:248;;;:::o;22572:419::-;;22776:2;22765:9;22761:18;22753:26;;22825:9;22819:4;22815:20;22811:1;22800:9;22796:17;22789:47;22853:131;22979:4;22853:131;:::i;:::-;22845:139;;22743:248;;;:::o;22997:419::-;;23201:2;23190:9;23186:18;23178:26;;23250:9;23244:4;23240:20;23236:1;23225:9;23221:17;23214:47;23278:131;23404:4;23278:131;:::i;:::-;23270:139;;23168:248;;;:::o;23422:419::-;;23626:2;23615:9;23611:18;23603:26;;23675:9;23669:4;23665:20;23661:1;23650:9;23646:17;23639:47;23703:131;23829:4;23703:131;:::i;:::-;23695:139;;23593:248;;;:::o;23847:419::-;;24051:2;24040:9;24036:18;24028:26;;24100:9;24094:4;24090:20;24086:1;24075:9;24071:17;24064:47;24128:131;24254:4;24128:131;:::i;:::-;24120:139;;24018:248;;;:::o;24272:419::-;;24476:2;24465:9;24461:18;24453:26;;24525:9;24519:4;24515:20;24511:1;24500:9;24496:17;24489:47;24553:131;24679:4;24553:131;:::i;:::-;24545:139;;24443:248;;;:::o;24697:419::-;;24901:2;24890:9;24886:18;24878:26;;24950:9;24944:4;24940:20;24936:1;24925:9;24921:17;24914:47;24978:131;25104:4;24978:131;:::i;:::-;24970:139;;24868:248;;;:::o;25122:419::-;;25326:2;25315:9;25311:18;25303:26;;25375:9;25369:4;25365:20;25361:1;25350:9;25346:17;25339:47;25403:131;25529:4;25403:131;:::i;:::-;25395:139;;25293:248;;;:::o;25547:419::-;;25751:2;25740:9;25736:18;25728:26;;25800:9;25794:4;25790:20;25786:1;25775:9;25771:17;25764:47;25828:131;25954:4;25828:131;:::i;:::-;25820:139;;25718:248;;;:::o;25972:419::-;;26176:2;26165:9;26161:18;26153:26;;26225:9;26219:4;26215:20;26211:1;26200:9;26196:17;26189:47;26253:131;26379:4;26253:131;:::i;:::-;26245:139;;26143:248;;;:::o;26397:419::-;;26601:2;26590:9;26586:18;26578:26;;26650:9;26644:4;26640:20;26636:1;26625:9;26621:17;26614:47;26678:131;26804:4;26678:131;:::i;:::-;26670:139;;26568:248;;;:::o;26822:419::-;;27026:2;27015:9;27011:18;27003:26;;27075:9;27069:4;27065:20;27061:1;27050:9;27046:17;27039:47;27103:131;27229:4;27103:131;:::i;:::-;27095:139;;26993:248;;;:::o;27247:419::-;;27451:2;27440:9;27436:18;27428:26;;27500:9;27494:4;27490:20;27486:1;27475:9;27471:17;27464:47;27528:131;27654:4;27528:131;:::i;:::-;27520:139;;27418:248;;;:::o;27672:419::-;;27876:2;27865:9;27861:18;27853:26;;27925:9;27919:4;27915:20;27911:1;27900:9;27896:17;27889:47;27953:131;28079:4;27953:131;:::i;:::-;27945:139;;27843:248;;;:::o;28097:419::-;;28301:2;28290:9;28286:18;28278:26;;28350:9;28344:4;28340:20;28336:1;28325:9;28321:17;28314:47;28378:131;28504:4;28378:131;:::i;:::-;28370:139;;28268:248;;;:::o;28522:419::-;;28726:2;28715:9;28711:18;28703:26;;28775:9;28769:4;28765:20;28761:1;28750:9;28746:17;28739:47;28803:131;28929:4;28803:131;:::i;:::-;28795:139;;28693:248;;;:::o;28947:419::-;;29151:2;29140:9;29136:18;29128:26;;29200:9;29194:4;29190:20;29186:1;29175:9;29171:17;29164:47;29228:131;29354:4;29228:131;:::i;:::-;29220:139;;29118:248;;;:::o;29372:419::-;;29576:2;29565:9;29561:18;29553:26;;29625:9;29619:4;29615:20;29611:1;29600:9;29596:17;29589:47;29653:131;29779:4;29653:131;:::i;:::-;29645:139;;29543:248;;;:::o;29797:419::-;;30001:2;29990:9;29986:18;29978:26;;30050:9;30044:4;30040:20;30036:1;30025:9;30021:17;30014:47;30078:131;30204:4;30078:131;:::i;:::-;30070:139;;29968:248;;;:::o;30222:419::-;;30426:2;30415:9;30411:18;30403:26;;30475:9;30469:4;30465:20;30461:1;30450:9;30446:17;30439:47;30503:131;30629:4;30503:131;:::i;:::-;30495:139;;30393:248;;;:::o;30647:222::-;;30778:2;30767:9;30763:18;30755:26;;30791:71;30859:1;30848:9;30844:17;30835:6;30791:71;:::i;:::-;30745:124;;;;:::o;30875:214::-;;31002:2;30991:9;30987:18;30979:26;;31015:67;31079:1;31068:9;31064:17;31055:6;31015:67;:::i;:::-;30969:120;;;;:::o;31095:283::-;;31161:2;31155:9;31145:19;;31203:4;31195:6;31191:17;31310:6;31298:10;31295:22;31274:18;31262:10;31259:34;31256:62;31253:2;;;31321:18;;:::i;:::-;31253:2;31361:10;31357:2;31350:22;31135:243;;;;:::o;31384:311::-;;31551:18;31543:6;31540:30;31537:2;;;31573:18;;:::i;:::-;31537:2;31623:4;31615:6;31611:17;31603:25;;31683:4;31677;31673:15;31665:23;;31466:229;;;:::o;31701:331::-;;31852:18;31844:6;31841:30;31838:2;;;31874:18;;:::i;:::-;31838:2;31959:4;31955:9;31948:4;31940:6;31936:17;31932:33;31924:41;;32020:4;32014;32010:15;32002:23;;31767:265;;;:::o;32038:332::-;;32190:18;32182:6;32179:30;32176:2;;;32212:18;;:::i;:::-;32176:2;32297:4;32293:9;32286:4;32278:6;32274:17;32270:33;32262:41;;32358:4;32352;32348:15;32340:23;;32105:265;;;:::o;32376:141::-;;32448:3;32440:11;;32471:3;32468:1;32461:14;32505:4;32502:1;32492:18;32484:26;;32430:87;;;:::o;32523:98::-;;32608:5;32602:12;32592:22;;32581:40;;;:::o;32627:99::-;;32713:5;32707:12;32697:22;;32686:40;;;:::o;32732:168::-;;32849:6;32844:3;32837:19;32889:4;32884:3;32880:14;32865:29;;32827:73;;;;:::o;32906:169::-;;33024:6;33019:3;33012:19;33064:4;33059:3;33055:14;33040:29;;33002:73;;;;:::o;33081:148::-;;33220:3;33205:18;;33195:34;;;;:::o;33235:305::-;;33294:20;33312:1;33294:20;:::i;:::-;33289:25;;33328:20;33346:1;33328:20;:::i;:::-;33323:25;;33482:1;33414:66;33410:74;33407:1;33404:81;33401:2;;;33488:18;;:::i;:::-;33401:2;33532:1;33529;33525:9;33518:16;;33279:261;;;;:::o;33546:185::-;;33603:20;33621:1;33603:20;:::i;:::-;33598:25;;33637:20;33655:1;33637:20;:::i;:::-;33632:25;;33676:1;33666:2;;33681:18;;:::i;:::-;33666:2;33723:1;33720;33716:9;33711:14;;33588:143;;;;:::o;33737:348::-;;33800:20;33818:1;33800:20;:::i;:::-;33795:25;;33834:20;33852:1;33834:20;:::i;:::-;33829:25;;34022:1;33954:66;33950:74;33947:1;33944:81;33939:1;33932:9;33925:17;33921:105;33918:2;;;34029:18;;:::i;:::-;33918:2;34077:1;34074;34070:9;34059:20;;33785:300;;;;:::o;34091:191::-;;34151:20;34169:1;34151:20;:::i;:::-;34146:25;;34185:20;34203:1;34185:20;:::i;:::-;34180:25;;34224:1;34221;34218:8;34215:2;;;34229:18;;:::i;:::-;34215:2;34274:1;34271;34267:9;34259:17;;34136:146;;;;:::o;34288:96::-;;34354:24;34372:5;34354:24;:::i;:::-;34343:35;;34333:51;;;:::o;34390:90::-;;34467:5;34460:13;34453:21;34442:32;;34432:48;;;:::o;34486:149::-;;34562:66;34555:5;34551:78;34540:89;;34530:105;;;:::o;34641:126::-;;34718:42;34711:5;34707:54;34696:65;;34686:81;;;:::o;34773:77::-;;34839:5;34828:16;;34818:32;;;:::o;34856:86::-;;34931:4;34924:5;34920:16;34909:27;;34899:43;;;:::o;34948:154::-;35032:6;35027:3;35022;35009:30;35094:1;35085:6;35080:3;35076:16;35069:27;34999:103;;;:::o;35108:307::-;35176:1;35186:113;35200:6;35197:1;35194:13;35186:113;;;35285:1;35280:3;35276:11;35270:18;35266:1;35261:3;35257:11;35250:39;35222:2;35219:1;35215:10;35210:15;;35186:113;;;35317:6;35314:1;35311:13;35308:2;;;35397:1;35388:6;35383:3;35379:16;35372:27;35308:2;35157:258;;;;:::o;35421:171::-;;35483:24;35501:5;35483:24;:::i;:::-;35474:33;;35529:4;35522:5;35519:15;35516:2;;;35537:18;;:::i;:::-;35516:2;35584:1;35577:5;35573:13;35566:20;;35464:128;;;:::o;35598:167::-;;35658:22;35674:5;35658:22;:::i;:::-;35649:31;;35702:4;35695:5;35692:15;35689:2;;;35710:18;;:::i;:::-;35689:2;35757:1;35750:5;35746:13;35739:20;;35639:126;;;:::o;35771:320::-;;35852:1;35846:4;35842:12;35832:22;;35899:1;35893:4;35889:12;35920:18;35910:2;;35976:4;35968:6;35964:17;35954:27;;35910:2;36038;36030:6;36027:14;36007:18;36004:38;36001:2;;;36057:18;;:::i;:::-;36001:2;35822:269;;;;:::o;36097:233::-;;36159:24;36177:5;36159:24;:::i;:::-;36150:33;;36205:66;36198:5;36195:77;36192:2;;;36275:18;;:::i;:::-;36192:2;36322:1;36315:5;36311:13;36304:20;;36140:190;;;:::o;36336:167::-;;36396:22;36412:5;36396:22;:::i;:::-;36387:31;;36440:4;36433:5;36430:15;36427:2;;;36448:18;;:::i;:::-;36427:2;36495:1;36488:5;36484:13;36477:20;;36377:126;;;:::o;36509:176::-;;36558:20;36576:1;36558:20;:::i;:::-;36553:25;;36592:20;36610:1;36592:20;:::i;:::-;36587:25;;36631:1;36621:2;;36636:18;;:::i;:::-;36621:2;36677:1;36674;36670:9;36665:14;;36543:142;;;;:::o;36691:180::-;36739:77;36736:1;36729:88;36836:4;36833:1;36826:15;36860:4;36857:1;36850:15;36877:180;36925:77;36922:1;36915:88;37022:4;37019:1;37012:15;37046:4;37043:1;37036:15;37063:180;37111:77;37108:1;37101:88;37208:4;37205:1;37198:15;37232:4;37229:1;37222:15;37249:180;37297:77;37294:1;37287:88;37394:4;37391:1;37384:15;37418:4;37415:1;37408:15;37435:102;;37527:2;37523:7;37518:2;37511:5;37507:14;37503:28;37493:38;;37483:54;;;:::o;37543:122::-;37616:24;37634:5;37616:24;:::i;:::-;37609:5;37606:35;37596:2;;37655:1;37652;37645:12;37596:2;37586:79;:::o;37671:116::-;37741:21;37756:5;37741:21;:::i;:::-;37734:5;37731:32;37721:2;;37777:1;37774;37767:12;37721:2;37711:76;:::o;37793:120::-;37865:23;37882:5;37865:23;:::i;:::-;37858:5;37855:34;37845:2;;37903:1;37900;37893:12;37845:2;37835:78;:::o;37919:122::-;37992:24;38010:5;37992:24;:::i;:::-;37985:5;37982:35;37972:2;;38031:1;38028;38021:12;37972:2;37962:79;:::o
Swarm Source
ipfs://3e8fc6676b584ab49f19654fd0790dbce3a866f0c33605396c505eb634b5b303
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.