ERC-721
Overview
Max Total Supply
1 FNS
Holders
1
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
1 FNSLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
FantomsArtNameSystem
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-02-26 */ pragma solidity >=0.8.0 <0.9.0; //SPDX-License-Identifier: Unlisence //IERC20 interface interface IERC20 { function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transferFrom( address sender, address recipient, uint amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } 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); } } library Strings2 { /** * Concat (High gas cost) * * Appends two strings together and returns a new value * * @param _base When being used for a data type this is the extended object * otherwise this is the string which will be the concatenated * prefix * @param _value The value to be the concatenated suffix * @return string The resulting string from combinging the base and value */ function concat(string memory _base, string memory _value) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); assert(_valueBytes.length > 0); string memory _tmpValue = new string(_baseBytes.length + _valueBytes.length); bytes memory _newValue = bytes(_tmpValue); uint i; uint j; for (i = 0; i < _baseBytes.length; i++) { _newValue[j++] = _baseBytes[i]; } for (i = 0; i < _valueBytes.length; i++) { _newValue[j++] = _valueBytes[i]; } return string(_newValue); } /** * Index Of * * Locates and returns the position of a character within a string * * @param _base When being used for a data type this is the extended object * otherwise this is the string acting as the haystack to be * searched * @param _value The needle to search for, at present this is currently * limited to one character * @return int The position of the needle starting from 0 and returning -1 * in the case of no matches found */ function indexOf(string memory _base, string memory _value) internal pure returns (int) { return _indexOf(_base, _value, 0); } /** * Index Of * * Locates and returns the position of a character within a string starting * from a defined offset * * @param _base When being used for a data type this is the extended object * otherwise this is the string acting as the haystack to be * searched * @param _value The needle to search for, at present this is currently * limited to one character * @param _offset The starting point to start searching from which can start * from 0, but must not exceed the length of the string * @return int The position of the needle starting from 0 and returning -1 * in the case of no matches found */ function _indexOf(string memory _base, string memory _value, uint _offset) internal pure returns (int) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); assert(_valueBytes.length == 1); for (uint i = _offset; i < _baseBytes.length; i++) { if (_baseBytes[i] == _valueBytes[0]) { return int(i); } } return -1; } /** * Length * * Returns the length of the specified string * * @param _base When being used for a data type this is the extended object * otherwise this is the string to be measured * @return uint The length of the passed string */ function length(string memory _base) internal pure returns (uint) { bytes memory _baseBytes = bytes(_base); return _baseBytes.length; } /** * Sub String * * Extracts the beginning part of a string based on the desired length * * @param _base When being used for a data type this is the extended object * otherwise this is the string that will be used for * extracting the sub string from * @param _length The length of the sub string to be extracted from the base * @return string The extracted sub string */ function substring(string memory _base, int _length) internal pure returns (string memory) { return _substring(_base, _length, 0); } /** * Sub String * * Extracts the part of a string based on the desired length and offset. The * offset and length must not exceed the lenth of the base string. * * @param _base When being used for a data type this is the extended object * otherwise this is the string that will be used for * extracting the sub string from * @param _length The length of the sub string to be extracted from the base * @param _offset The starting point to extract the sub string from * @return string The extracted sub string */ function _substring(string memory _base, int _length, int _offset) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); assert(uint(_offset + _length) <= _baseBytes.length); string memory _tmp = new string(uint(_length)); bytes memory _tmpBytes = bytes(_tmp); uint j = 0; for (uint i = uint(_offset); i < uint(_offset + _length); i++) { _tmpBytes[j++] = _baseBytes[i]; } return string(_tmpBytes); } /** * String Split (Very high gas cost) * * Splits a string into an array of strings based off the delimiter value. * Please note this can be quite a gas expensive function due to the use of * storage so only use if really required. * * @param _base When being used for a data type this is the extended object * otherwise this is the string value to be split. * @param _value The delimiter to split the string on which must be a single * character */ function split(string memory _base, string memory _value) internal pure returns (string[] memory splitArr) { bytes memory _baseBytes = bytes(_base); uint _offset = 0; uint _splitsCount = 1; while (_offset < _baseBytes.length - 1) { int _limit = _indexOf(_base, _value, _offset); if (_limit == -1) break; else { _splitsCount++; _offset = uint(_limit) + 1; } } splitArr = new string[](_splitsCount); _offset = 0; _splitsCount = 0; while (_offset < _baseBytes.length - 1) { int _limit = _indexOf(_base, _value, _offset); if (_limit == - 1) { _limit = int(_baseBytes.length); } string memory _tmp = new string(uint(_limit) - _offset); bytes memory _tmpBytes = bytes(_tmp); uint j = 0; for (uint i = _offset; i < uint(_limit); i++) { _tmpBytes[j++] = _baseBytes[i]; } _offset = uint(_limit) + 1; splitArr[_splitsCount++] = string(_tmpBytes); } return splitArr; } /** * Compare To * * Compares the characters of two strings, to ensure that they have an * identical footprint * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to compare against * @param _value The string the base is being compared to * @return bool Simply notates if the two string have an equivalent */ function compareTo(string memory _base, string memory _value) internal pure returns (bool) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); if (_baseBytes.length != _valueBytes.length) { return false; } for (uint i = 0; i < _baseBytes.length; i++) { if (_baseBytes[i] != _valueBytes[i]) { return false; } } return true; } /** * Compare To Ignore Case (High gas cost) * * Compares the characters of two strings, converting them to the same case * where applicable to alphabetic characters to distinguish if the values * match. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to compare against * @param _value The string the base is being compared to * @return bool Simply notates if the two string have an equivalent value * discarding case */ function compareToIgnoreCase(string memory _base, string memory _value) internal pure returns (bool) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); if (_baseBytes.length != _valueBytes.length) { return false; } for (uint i = 0; i < _baseBytes.length; i++) { if (_baseBytes[i] != _valueBytes[i] && _upper(_baseBytes[i]) != _upper(_valueBytes[i])) { return false; } } return true; } /** * Upper * * Converts all the values of a string to their corresponding upper case * value. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to convert to upper case * @return string */ function upper(string memory _base) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { _baseBytes[i] = _upper(_baseBytes[i]); } return string(_baseBytes); } /** * Lower * * Converts all the values of a string to their corresponding lower case * value. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to convert to lower case * @return string */ function lower(string memory _base) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { _baseBytes[i] = _lower(_baseBytes[i]); } return string(_baseBytes); } /** * Upper * * Convert an alphabetic character to upper case and return the original * value when not alphabetic * * @param _b1 The byte to be converted to upper case * @return bytes1 The converted value if the passed value was alphabetic * and in a lower case otherwise returns the original value */ function _upper(bytes1 _b1) private pure returns (bytes1) { if (_b1 >= 0x61 && _b1 <= 0x7A) { return bytes1(uint8(_b1) - 32); } return _b1; } /** * Lower * * Convert an alphabetic character to lower case and return the original * value when not alphabetic * * @param _b1 The byte to be converted to lower case * @return bytes1 The converted value if the passed value was alphabetic * and in a upper case otherwise returns the original value */ function _lower(bytes1 _b1) private pure returns (bytes1) { if (_b1 >= 0x41 && _b1 <= 0x5A) { return bytes1(uint8(_b1) + 32); } return _b1; } } 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); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } 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); } } 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); } library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } abstract contract ERC165Storage is ERC165 { /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return super.supportsInterface(interfaceId) || _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } 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; } 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); } 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); } interface IWrappedFantom { // deposit wraps received FTM tokens as wFTM in 1:1 ratio by minting // the received amount of FTMs in wFTM on the sender's address. function deposit() external payable returns (uint256); } 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); } 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.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 {} } 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(); } } interface IERC2981 is IERC165 { // ERC165 bytes to add to interface array - set in parent contract // implementing this standard // // bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a // bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; // _registerInterface(_INTERFACE_ID_ERC2981); // @notice Called with the sale price to determine how much royalty // is owed and to whom. // @param _tokenId - the NFT asset queried for royalty information // @param _salePrice - the sale price of the NFT asset specified by _tokenId // @return receiver - address of who should be sent the royalty payment // @return royaltyAmount - the royalty payment amount for _salePrice function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount); } abstract contract ERC2981Collection is IERC2981 { // Bytes4 Code for EIP-2981 bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a; // Mappings _tokenID -> values address private recieverTemp; mapping(uint256 => address) receiverAddresses; mapping(uint256 => uint256) royaltyPercentage; // Set to be internal function _setReceiver function _setReceiver(uint256 _tokenId, address _address) internal { receiverAddresses[_tokenId] = _address; } // Set to be internal function _setRoyaltyPercentage function _setRoyaltyPercentage(uint256 _tokenId, uint256 _royaltyPercentage) internal { royaltyPercentage[_tokenId] = _royaltyPercentage; } // Override for royaltyInfo(uint256, uint256) // royaltyInfo(uint256,uint256) => 0x2a55205a function royaltyInfo( uint256 _tokenId, uint256 _salePrice ) external view override(IERC2981) returns ( address receiver, uint256 royaltyAmount ) { receiver = receiverAddresses[_tokenId]; // This sets percentages by price * percentage / 100 royaltyAmount = _salePrice * royaltyPercentage[_tokenId] / 100; } } contract FantomsArtNameSystem is ERC721Enumerable, ERC165Storage, Ownable { using Counters for Counters.Counter; //using Address for address; Counters.Counter private _tokenIdCounter; address private constant wFTMa = 0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83; IWrappedFantom private constant wFTMc = IWrappedFantom(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); IERC20 private constant wFTM = IERC20(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83); address private constant MULTISIG_TREASURY = 0x87f385d152944689f92Ed523e9e5E9Bd58Ea62ef; address private constant deployer = 0x3e522051A9B1958Aa1e828AC24Afba4a551DF37d; uint256 public FEE_AMT = 0 ether; // bytes4 constants for ERC165 bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; //event UpdatedFees(uint256 _newFee); event UpdatedURI(string _newURI); event NameTransferred(string _name, address _from, address _to); //event ConsoleLog(string _msg); event LinkUpdated(string _name, string _lnk); event AvatarUpdated(string _name, string _avatarLink); constructor() ERC721("fantoms.art Basic Fantom Name System", "FNS") { // ERC165 Interfaces Supported _registerInterface(_INTERFACE_ID_ERC721); } struct FantomsArtName { string _name; uint256 _tokenId; address _owner; bool _exists; string _IPFSAttrLink; string _avatar; //mapping(string => string) _more; } struct NameApproval { string _name; address _user; } mapping(uint256 => FantomsArtName) private _tokenIdToStruct; mapping(string => uint256) private _reverseSearch; mapping(address => string) private _search; mapping(address => bool) private _exists2; mapping(string => bool) private _nameExists; mapping(string => address) private _rSearch2; mapping(string => NameApproval) private _approvals; //function changeFee(uint256 _newFee) public onlyOwner { // FEE_AMT = _newFee; // emit UpdatedFees(_newFee); //} function changeFee(uint256 _newFee) public onlyOwner { FEE_AMT = _newFee; } function getNameFromOwner(address _owner) public view returns(string memory) { return _search[_owner]; } function isOwnedByMapping(string memory _name) public view returns(bool) { return _nameExists[_name]; } function getOwnerOfName(string memory _name) public view returns(address) { _name = Strings2.upper(_name); uint256 _searchFor = _reverseSearch[_name]; FantomsArtName memory x = _tokenIdToStruct[_searchFor]; return x._owner; } function invertBool(bool _bool) private pure returns(bool) { if (_bool) { return false; } else { return true; } } // check why _nameExists[_name] isnt set to true function registerName(string memory _name) public payable { _name = Strings2.upper(_name); require(msg.value == FEE_AMT, "FNS: You need to pay the right amount >:(");// VvV require(invertBool(_nameExists[_name]), "FNS: You cant take other peoples name"); require(invertBool(_exists2[msg.sender]), "FNS: You cant own more than one name"); // the answer is --> NO <-- wFTMc.deposit{value: msg.value}(); // /\ wFTM.transfer(MULTISIG_TREASURY, wFTM.balanceOf(address(this))); FantomsArtName memory _tempName = FantomsArtName(_name,_tokenIdCounter.current(),msg.sender,true,"",""); _search[msg.sender] = _name; _nameExists[_name] = true; _exists2[msg.sender] = true; _tokenIdToStruct[_tokenIdCounter.current()] = _tempName; _reverseSearch[_name] = _tokenIdCounter.current(); _safeMint(msg.sender, _tokenIdCounter.current()); _tokenIdCounter.increment(); } function approveName(string memory _name, address owner, address spender) public { address nOwner = _rSearch2[_name]; require(msg.sender == owner, "FNS: err. code 0002"); require(nOwner == owner, "FNS: err. code 0003"); NameApproval memory _tempApproval = NameApproval(_name,spender); _approvals[_name] = _tempApproval; } function isApprovedTo(string memory _name, address _to) public view returns(bool) { return (_approvals[_name]._user == _to); } /* function basicNameApproval(string memory _name, address _owner, address _spender) public { address nOwner = _rSearch2[_name]; require(msg.sender == owner); require(nOwner == owner); approveName(_name,_owner,_spender,block.timestamp + 30); } */ //function getOwnerOfTokenId(uint256 _tokenID) public view returns(address) { // return ownerOf(_tokenID); //} function sendFTMToName(string memory _name) public payable { _name = Strings2.upper(_name); payable(getOwnerOfName(_name)).transfer(msg.value); } function sendERC20ToName(address _token, uint256 _amount, string memory _name) public { _name = Strings2.upper(_name); IERC20(_token).transferFrom(msg.sender,getOwnerOfName(_name),_amount); } function sendERC721ToName(address _token, uint256 _tokenId, string memory _name) public { _name = Strings2.upper(_name); IERC721(_token).safeTransferFrom(msg.sender,getOwnerOfName(_name),_tokenId); } function transferName(address _from, address _to, string memory _name) public { require(invertBool(_exists2[_to]),"FNS: You cant overwrite someones name, idiot"); address nOwner = getOwnerOfName(_name); if (_approvals[_name]._user == msg.sender) { // do nothing } else { require(msg.sender == nOwner, "FNS: err. code 0003"); } string memory _searchFromOld = _search[_from]; uint256 _reverseFromOld = _reverseSearch[_searchFromOld]; //address _rSearch2Old = _rSearch2[_name]; //FantomsArtName memory _idk = _tokenIdToStruct[_reverseFromOld]; _rSearch2[_name] = _to; _exists2[_from] = false; _exists2[_to] = true; _search[_to] = _search[_from]; _search[_from] = string(abi.encodePacked(uint(0))); _tokenIdToStruct[_reverseSearch[_search[_to]]] = _tokenIdToStruct[_reverseFromOld]; _tokenIdToStruct[_reverseFromOld] = FantomsArtName(_name,_reverseSearch[_search[_to]],_to,true,"",""); transferFrom(_from,_to,_reverseFromOld); emit NameTransferred(_name,_from,_to); } function setIPFSAttrLink(string memory _name, string memory _lnk) public { require(_nameExists[_name],"FNS: You cant set a link for a non-existing name"); require(_tokenIdToStruct[_reverseSearch[_name]]._owner == msg.sender); _tokenIdToStruct[_reverseSearch[_name]]._IPFSAttrLink = _lnk; emit LinkUpdated(_name,_lnk); } function getAttrLink(string memory _name) public view returns(string memory) { return _tokenIdToStruct[_reverseSearch[_name]]._IPFSAttrLink; } function setAvatar(string memory _name, string memory _avatar) public { require(_nameExists[_name],"FNS: You cant set a link for a non-existing name"); require(_tokenIdToStruct[_reverseSearch[_name]]._owner == msg.sender); _tokenIdToStruct[_reverseSearch[_name]]._avatar = _avatar; emit AvatarUpdated(_name,_avatar); } function getAvatar(string memory _name) public view returns(string memory) { return _tokenIdToStruct[_reverseSearch[_name]]._avatar; } //function safeTransferFrom(address _from, address _to, string memory _name) public { // transferName(_from,_to,_name); //} // @notice solidity required override for supportsInterface(bytes4) function supportsInterface(bytes4 interfaceId) public view override(ERC165Storage,ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } }
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":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"string","name":"_avatarLink","type":"string"}],"name":"AvatarUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"string","name":"_lnk","type":"string"}],"name":"LinkUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"}],"name":"NameTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_newURI","type":"string"}],"name":"UpdatedURI","type":"event"},{"inputs":[],"name":"FEE_AMT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"approveName","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":"_newFee","type":"uint256"}],"name":"changeFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getAttrLink","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getAvatar","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getNameFromOwner","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"getOwnerOfName","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":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_to","type":"address"}],"name":"isApprovedTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"isOwnedByMapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"registerName","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":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"sendERC20ToName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"sendERC721ToName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"sendFTMToName","outputs":[],"stateMutability":"payable","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":"_name","type":"string"},{"internalType":"string","name":"_avatar","type":"string"}],"name":"setAvatar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_lnk","type":"string"}],"name":"setIPFSAttrLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"_name","type":"string"}],"name":"transferName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600d553480156200001657600080fd5b50604051806060016040528060248152602001620062b2602491396040518060400160405280600381526020017f464e53000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200007f92919062000280565b5080600190805190602001906200009892919062000280565b505050620000bb620000af620000d960201b60201c565b620000e160201b60201c565b620000d36380ac58cd60e01b620001a760201b60201c565b62000418565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200020a9062000357565b60405180910390fd5b6001600a6000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8280546200028e906200038a565b90600052602060002090601f016020900481019282620002b25760008555620002fe565b82601f10620002cd57805160ff1916838001178555620002fe565b82800160010185558215620002fe579182015b82811115620002fd578251825591602001919060010190620002e0565b5b5090506200030d919062000311565b5090565b5b808211156200032c57600081600090555060010162000312565b5090565b60006200033f601c8362000379565b91506200034c82620003ef565b602082019050919050565b60006020820190508181036000830152620003728162000330565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620003a357607f821691505b60208210811415620003ba57620003b9620003c0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b615e8a80620004286000396000f3fe6080604052600436106102045760003560e01c80636a1db1bf11610118578063ace4ee28116100a0578063d3189e061161006f578063d3189e06146107b9578063e985e9c5146107e2578063f2fde38b1461081f578063f42c2a2314610848578063f5cc229f1461087157610204565b8063ace4ee28146106ed578063b465fe7e14610716578063b88d4fde14610753578063c87b56dd1461077c57610204565b806381758129116100e757806381758129146105f45780638da5cb5b1461063157806395d89b411461065c578063a141c33514610687578063a22cb465146106c457610204565b80636a1db1bf1461053a57806370a0823114610563578063715018a6146105a05780637d840ed5146105b757610204565b806318160ddd1161019b5780633f34d5fb1161016a5780633f34d5fb1461042f57806342842e0e1461046c5780634f6ccce7146104955780636352211e146104d2578063635740d61461050f57610204565b806318160ddd1461037557806323b872dd146103a05780632f745c59146103c95780633706da3d1461040657610204565b8063095ea7b3116101d7578063095ea7b3146102ca5780630b6476c4146102f35780630fc2ccc01461031c5780631309de151461035957610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc146102715780630830602b146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061463c565b61089a565b60405161023d9190614e81565b60405180910390f35b34801561025257600080fd5b5061025b6108ac565b6040516102689190614e9c565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190614822565b61093e565b6040516102a59190614dba565b60405180910390f35b6102c860048036038101906102c39190614696565b6109c3565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190614560565b610f8a565b005b3480156102ff57600080fd5b5061031a600480360381019061031591906145a0565b6110a2565b005b34801561032857600080fd5b50610343600480360381019061033e9190614696565b61114a565b6040516103509190614e81565b60405180910390f35b610373600480360381019061036e9190614696565b61117f565b005b34801561038157600080fd5b5061038a6111dc565b6040516103979190615253565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061444a565b6111e9565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190614560565b611249565b6040516103fd9190615253565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906143db565b6112ee565b005b34801561043b57600080fd5b50610456600480360381019061045191906146df565b611aed565b6040516104639190614e81565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061444a565b611b67565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190614822565b611b87565b6040516104c99190615253565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190614822565b611bf8565b6040516105069190614dba565b60405180910390f35b34801561051b57600080fd5b50610524611caa565b6040516105319190615253565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190614822565b611cb0565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061436e565b611d36565b6040516105979190615253565b60405180910390f35b3480156105ac57600080fd5b506105b5611dee565b005b3480156105c357600080fd5b506105de60048036038101906105d99190614696565b611e76565b6040516105eb9190614e9c565b60405180910390f35b34801561060057600080fd5b5061061b6004803603810190610616919061436e565b611f3c565b6040516106289190614e9c565b60405180910390f35b34801561063d57600080fd5b5061064661200d565b6040516106539190614dba565b60405180910390f35b34801561066857600080fd5b50610671612037565b60405161067e9190614e9c565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190614696565b6120c9565b6040516106bb9190614e9c565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190614520565b61218f565b005b3480156106f957600080fd5b50610714600480360381019061070f91906145a0565b612310565b005b34801561072257600080fd5b5061073d60048036038101906107389190614696565b612397565b60405161074a9190614dba565b60405180910390f35b34801561075f57600080fd5b5061077a6004803603810190610775919061449d565b612628565b005b34801561078857600080fd5b506107a3600480360381019061079e9190614822565b61268a565b6040516107b09190614e9c565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db91906147aa565b612731565b005b3480156107ee57600080fd5b506108096004803603810190610804919061439b565b6128ae565b6040516108169190614e81565b60405180910390f35b34801561082b57600080fd5b506108466004803603810190610841919061436e565b612942565b005b34801561085457600080fd5b5061086f600480360381019061086a91906147aa565b612a3a565b005b34801561087d57600080fd5b506108986004803603810190610893919061473b565b612bb7565b005b60006108a582612d92565b9050919050565b6060600080546108bb906154ff565b80601f01602080910402602001604051908101604052809291908181526020018280546108e7906154ff565b80156109345780601f1061090957610100808354040283529160200191610934565b820191906000526020600020905b81548152906001019060200180831161091757829003601f168201915b5050505050905090565b600061094982612e0a565b610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90615113565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109cc81612e76565b9050600d543414610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0990615033565b60405180910390fd5b610a46601282604051610a259190614d4d565b908152602001604051809103902060009054906101000a900460ff16612f0e565b610a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7c906151f3565b60405180910390fd5b610ada601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f0e565b610b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b10906150d3565b60405180910390fd5b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b158015610b7557600080fd5b505af1158015610b89573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610bae919061484f565b507321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7387f385d152944689f92ed523e9e5e9bd58ea62ef7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c419190614dba565b60206040518083038186803b158015610c5957600080fd5b505afa158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c91919061484f565b6040518363ffffffff1660e01b8152600401610cae929190614e58565b602060405180830381600087803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d00919061460f565b5060006040518060c00160405280838152602001610d1e600c612f29565b81526020013373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200160405180602001604052806000815250815260200160405180602001604052806000815250815250905081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610dc592919061403e565b506001601283604051610dd89190614d4d565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600e6000610e64600c612f29565b81526020019081526020016000206000820151816000019080519060200190610e8e92919061403e565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160146101000a81548160ff0219169083151502179055506080820151816003019080519060200190610f1c92919061403e565b5060a0820151816004019080519060200190610f3992919061403e565b50905050610f47600c612f29565b600f83604051610f579190614d4d565b908152602001604051809103902081905550610f7c33610f77600c612f29565b612f37565b610f86600c612f55565b5050565b6000610f9582611bf8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90615193565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611025612f6b565b73ffffffffffffffffffffffffffffffffffffffff16148061105457506110538161104e612f6b565b6128ae565b5b611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90615053565b60405180910390fd5b61109d8383612f73565b505050565b6110ab81612e76565b90508273ffffffffffffffffffffffffffffffffffffffff166323b872dd336110d384612397565b856040518463ffffffff1660e01b81526004016110f293929190614dd5565b602060405180830381600087803b15801561110c57600080fd5b505af1158015611120573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611144919061460f565b50505050565b600060128260405161115c9190614d4d565b908152602001604051809103902060009054906101000a900460ff169050919050565b61118881612e76565b905061119381612397565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156111d8573d6000803e3d6000fd5b5050565b6000600880549050905090565b6111fa6111f4612f6b565b8261302c565b611239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611230906151d3565b60405180910390fd5b61124483838361310a565b505050565b600061125483611d36565b8210611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90614f33565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611343601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f0e565b611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990615233565b60405180910390fd5b600061138d82612397565b90503373ffffffffffffffffffffffffffffffffffffffff166014836040516113b69190614d4d565b908152602001604051809103902060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140957611478565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906151b3565b60405180910390fd5b5b6000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080546114c4906154ff565b80601f01602080910402602001604051908101604052809291908181526020018280546114f0906154ff565b801561153d5780601f106115125761010080835404028352916020019161153d565b820191906000526020600020905b81548152906001019060200180831161152057829003601f168201915b505050505090506000600f826040516115569190614d4d565b9081526020016040518091039020549050846013856040516115789190614d4d565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080546116fe906154ff565b6117099291906140c4565b50600060405160200161171c9190614d9f565b604051602081830303815290604052601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020908051906020019061177d92919061403e565b50600e6000828152602001908152602001600020600e6000600f601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040516117e39190614d88565b90815260200160405180910390205481526020019081526020016000206000820181600001908054611814906154ff565b61181f929190614151565b50600182015481600101556002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002820160149054906101000a900460ff168160020160146101000a81548160ff02191690831515021790555060038201816003019080546118d2906154ff565b6118dd929190614151565b5060048201816004019080546118f2906154ff565b6118fd929190614151565b509050506040518060c00160405280858152602001600f601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040516119609190614d88565b90815260200160405180910390205481526020018673ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200160405180602001604052806000815250815260200160405180602001604052806000815250815250600e600083815260200190815260200160002060008201518160000190805190602001906119f092919061403e565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160146101000a81548160ff0219169083151502179055506080820151816003019080519060200190611a7e92919061403e565b5060a0820151816004019080519060200190611a9b92919061403e565b50905050611aaa8686836111e9565b7f21e177c2bf9adbd548d25cc65d54b697122f907257d8318bddc22375fe666de8848787604051611add93929190614ebe565b60405180910390a1505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16601484604051611b169190614d4d565b908152602001604051809103902060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b611b8283838360405180602001604052806000815250612628565b505050565b6000611b916111dc565b8210611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990615213565b60405180910390fd5b60088281548110611be657611be56156a2565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890615093565b60405180910390fd5b80915050919050565b600d5481565b611cb8612f6b565b73ffffffffffffffffffffffffffffffffffffffff16611cd661200d565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390615133565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90615073565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611df6612f6b565b73ffffffffffffffffffffffffffffffffffffffff16611e1461200d565b73ffffffffffffffffffffffffffffffffffffffff1614611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190615133565b60405180910390fd5b611e746000613366565b565b6060600e6000600f84604051611e8c9190614d4d565b90815260200160405180910390205481526020019081526020016000206004018054611eb7906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee3906154ff565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b50505050509050919050565b6060601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054611f88906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb4906154ff565b80156120015780601f10611fd657610100808354040283529160200191612001565b820191906000526020600020905b815481529060010190602001808311611fe457829003601f168201915b50505050509050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054612046906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612072906154ff565b80156120bf5780601f10612094576101008083540402835291602001916120bf565b820191906000526020600020905b8154815290600101906020018083116120a257829003601f168201915b5050505050905090565b6060600e6000600f846040516120df9190614d4d565b9081526020016040518091039020548152602001908152602001600020600301805461210a906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612136906154ff565b80156121835780601f1061215857610100808354040283529160200191612183565b820191906000526020600020905b81548152906001019060200180831161216657829003601f168201915b50505050509050919050565b612197612f6b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fc90614ff3565b60405180910390fd5b8060056000612212612f6b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122bf612f6b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123049190614e81565b60405180910390a35050565b61231981612e76565b90508273ffffffffffffffffffffffffffffffffffffffff166342842e0e3361234184612397565b856040518463ffffffff1660e01b815260040161236093929190614dd5565b600060405180830381600087803b15801561237a57600080fd5b505af115801561238e573d6000803e3d6000fd5b50505050505050565b60006123a282612e76565b91506000600f836040516123b69190614d4d565b90815260200160405180910390205490506000600e60008381526020019081526020016000206040518060c00160405290816000820180546123f7906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612423906154ff565b80156124705780601f1061244557610100808354040283529160200191612470565b820191906000526020600020905b81548152906001019060200180831161245357829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160149054906101000a900460ff16151515158152602001600382018054612504906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612530906154ff565b801561257d5780601f106125525761010080835404028352916020019161257d565b820191906000526020600020905b81548152906001019060200180831161256057829003601f168201915b50505050508152602001600482018054612596906154ff565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906154ff565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b5050505050815250509050806040015192505050919050565b612639612633612f6b565b8361302c565b612678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266f906151d3565b60405180910390fd5b6126848484848461342c565b50505050565b606061269582612e0a565b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90615173565b60405180910390fd5b60006126de613488565b905060008151116126fe5760405180602001604052806000815250612729565b806127088461349f565b604051602001612719929190614d64565b6040516020818303038152906040525b915050919050565b6012826040516127419190614d4d565b908152602001604051809103902060009054906101000a900460ff1661279c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612793906150f3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e6000600f856040516127c79190614d4d565b908152602001604051809103902054815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461282857600080fd5b80600e6000600f8560405161283d9190614d4d565b9081526020016040518091039020548152602001908152602001600020600401908051906020019061287092919061403e565b507f71e2bdc25aff7e0cc31169435b52e69cb1cef797a1873a42427c7cc974ae668882826040516128a2929190614efc565b60405180910390a15050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61294a612f6b565b73ffffffffffffffffffffffffffffffffffffffff1661296861200d565b73ffffffffffffffffffffffffffffffffffffffff16146129be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b590615133565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2590614f73565b60405180910390fd5b612a3781613366565b50565b601282604051612a4a9190614d4d565b908152602001604051809103902060009054906101000a900460ff16612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c906150f3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e6000600f85604051612ad09190614d4d565b908152602001604051809103902054815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b3157600080fd5b80600e6000600f85604051612b469190614d4d565b90815260200160405180910390205481526020019081526020016000206003019080519060200190612b7992919061403e565b507fabb889df50ccf9074905ecd54649276aeebe36bcd16aa139f629e14f92c7a93a8282604051612bab929190614efc565b60405180910390a15050565b6000601384604051612bc99190614d4d565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90614fb3565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd906151b3565b60405180910390fd5b600060405180604001604052808681526020018473ffffffffffffffffffffffffffffffffffffffff16815250905080601486604051612d169190614d4d565b90815260200160405180910390206000820151816000019080519060200190612d4092919061403e565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b6000612d9d82613600565b80612e035750600a6000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600082905060005b8151811015612f0457612eaf828281518110612e9f57612e9e6156a2565b5b602001015160f81c60f81b61367a565b828281518110612ec257612ec16156a2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612efc90615562565b915050612e80565b5080915050919050565b60008115612f1f5760009050612f24565b600190505b919050565b600081600001549050919050565b612f51828260405180602001604052806000815250613700565b5050565b6001816000016000828254019250508190555050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612fe683611bf8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061303782612e0a565b613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d90615013565b60405180910390fd5b600061308183611bf8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806130f057508373ffffffffffffffffffffffffffffffffffffffff166130d88461093e565b73ffffffffffffffffffffffffffffffffffffffff16145b80613101575061310081856128ae565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661312a82611bf8565b73ffffffffffffffffffffffffffffffffffffffff1614613180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317790615153565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e790614fd3565b60405180910390fd5b6131fb83838361375b565b613206600082612f73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461325691906153d4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132ad919061534d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61343784848461310a565b6134438484848461386f565b613482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347990614f53565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606060008214156134e7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135fb565b600082905060005b6000821461351957808061350290615562565b915050600a8261351291906153a3565b91506134ef565b60008167ffffffffffffffff811115613535576135346156d1565b5b6040519080825280601f01601f1916602001820160405280156135675781602001600182028036833780820191505090505b5090505b600085146135f45760018261358091906153d4565b9150600a8561358f91906155b5565b603061359b919061534d565b60f81b8183815181106135b1576135b06156a2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135ed91906153a3565b945061356b565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613673575061367282613a06565b5b9050919050565b6000606160f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156136d85750607a60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b156136f75760208260f81c6136ed9190615408565b60f81b90506136fb565b8190505b919050565b61370a8383613ae8565b613717600084848461386f565b613756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374d90614f53565b60405180910390fd5b505050565b613766838383613cb6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137a9576137a481613cbb565b6137e8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137e7576137e68382613d04565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561382b5761382681613e71565b61386a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613869576138688282613f42565b5b5b505050565b60006138908473ffffffffffffffffffffffffffffffffffffffff16613fc1565b156139f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138b9612f6b565b8786866040518563ffffffff1660e01b81526004016138db9493929190614e0c565b602060405180830381600087803b1580156138f557600080fd5b505af192505050801561392657506040513d601f19601f820116820180604052508101906139239190614669565b60015b6139a9573d8060008114613956576040519150601f19603f3d011682016040523d82523d6000602084013e61395b565b606091505b506000815114156139a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399890614f53565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139fe565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613ad157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613ae15750613ae082613fd4565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4f906150b3565b60405180910390fd5b613b6181612e0a565b15613ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9890614f93565b60405180910390fd5b613bad6000838361375b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bfd919061534d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613d1184611d36565b613d1b91906153d4565b9050600060076000848152602001908152602001600020549050818114613e00576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e8591906153d4565b9050600060096000848152602001908152602001600020549050600060088381548110613eb557613eb46156a2565b5b906000526020600020015490508060088381548110613ed757613ed66156a2565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613f2657613f25615673565b5b6001900381819060005260206000200160009055905550505050565b6000613f4d83611d36565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461404a906154ff565b90600052602060002090601f01602090048101928261406c57600085556140b3565b82601f1061408557805160ff19168380011785556140b3565b828001600101855582156140b3579182015b828111156140b2578251825591602001919060010190614097565b5b5090506140c091906141de565b5090565b8280546140d0906154ff565b90600052602060002090601f0160209004810192826140f25760008555614140565b82601f106141035780548555614140565b8280016001018555821561414057600052602060002091601f016020900482015b8281111561413f578254825591600101919060010190614124565b5b50905061414d91906141de565b5090565b82805461415d906154ff565b90600052602060002090601f01602090048101928261417f57600085556141cd565b82601f1061419057805485556141cd565b828001600101855582156141cd57600052602060002091601f016020900482015b828111156141cc5782548255916001019190600101906141b1565b5b5090506141da91906141de565b5090565b5b808211156141f75760008160009055506001016141df565b5090565b600061420e61420984615293565b61526e565b90508281526020810184848401111561422a57614229615705565b5b6142358482856154bd565b509392505050565b600061425061424b846152c4565b61526e565b90508281526020810184848401111561426c5761426b615705565b5b6142778482856154bd565b509392505050565b60008135905061428e81615df8565b92915050565b6000813590506142a381615e0f565b92915050565b6000815190506142b881615e0f565b92915050565b6000813590506142cd81615e26565b92915050565b6000815190506142e281615e26565b92915050565b600082601f8301126142fd576142fc615700565b5b813561430d8482602086016141fb565b91505092915050565b600082601f83011261432b5761432a615700565b5b813561433b84826020860161423d565b91505092915050565b60008135905061435381615e3d565b92915050565b60008151905061436881615e3d565b92915050565b6000602082840312156143845761438361570f565b5b60006143928482850161427f565b91505092915050565b600080604083850312156143b2576143b161570f565b5b60006143c08582860161427f565b92505060206143d18582860161427f565b9150509250929050565b6000806000606084860312156143f4576143f361570f565b5b60006144028682870161427f565b93505060206144138682870161427f565b925050604084013567ffffffffffffffff8111156144345761443361570a565b5b61444086828701614316565b9150509250925092565b6000806000606084860312156144635761446261570f565b5b60006144718682870161427f565b93505060206144828682870161427f565b925050604061449386828701614344565b9150509250925092565b600080600080608085870312156144b7576144b661570f565b5b60006144c58782880161427f565b94505060206144d68782880161427f565b93505060406144e787828801614344565b925050606085013567ffffffffffffffff8111156145085761450761570a565b5b614514878288016142e8565b91505092959194509250565b600080604083850312156145375761453661570f565b5b60006145458582860161427f565b925050602061455685828601614294565b9150509250929050565b600080604083850312156145775761457661570f565b5b60006145858582860161427f565b925050602061459685828601614344565b9150509250929050565b6000806000606084860312156145b9576145b861570f565b5b60006145c78682870161427f565b93505060206145d886828701614344565b925050604084013567ffffffffffffffff8111156145f9576145f861570a565b5b61460586828701614316565b9150509250925092565b6000602082840312156146255761462461570f565b5b6000614633848285016142a9565b91505092915050565b6000602082840312156146525761465161570f565b5b6000614660848285016142be565b91505092915050565b60006020828403121561467f5761467e61570f565b5b600061468d848285016142d3565b91505092915050565b6000602082840312156146ac576146ab61570f565b5b600082013567ffffffffffffffff8111156146ca576146c961570a565b5b6146d684828501614316565b91505092915050565b600080604083850312156146f6576146f561570f565b5b600083013567ffffffffffffffff8111156147145761471361570a565b5b61472085828601614316565b92505060206147318582860161427f565b9150509250929050565b6000806000606084860312156147545761475361570f565b5b600084013567ffffffffffffffff8111156147725761477161570a565b5b61477e86828701614316565b935050602061478f8682870161427f565b92505060406147a08682870161427f565b9150509250925092565b600080604083850312156147c1576147c061570f565b5b600083013567ffffffffffffffff8111156147df576147de61570a565b5b6147eb85828601614316565b925050602083013567ffffffffffffffff81111561480c5761480b61570a565b5b61481885828601614316565b9150509250929050565b6000602082840312156148385761483761570f565b5b600061484684828501614344565b91505092915050565b6000602082840312156148655761486461570f565b5b600061487384828501614359565b91505092915050565b6148858161543c565b82525050565b6148948161544e565b82525050565b60006148a58261530a565b6148af8185615320565b93506148bf8185602086016154cc565b6148c881615714565b840191505092915050565b60006148de82615315565b6148e88185615331565b93506148f88185602086016154cc565b61490181615714565b840191505092915050565b600061491782615315565b6149218185615342565b93506149318185602086016154cc565b80840191505092915050565b6000815461494a816154ff565b6149548186615342565b9450600182166000811461496f5760018114614980576149b3565b60ff198316865281860193506149b3565b614989856152f5565b60005b838110156149ab5781548189015260018201915060208101905061498c565b838801955050505b50505092915050565b60006149c9602b83615331565b91506149d482615725565b604082019050919050565b60006149ec603283615331565b91506149f782615774565b604082019050919050565b6000614a0f602683615331565b9150614a1a826157c3565b604082019050919050565b6000614a32601c83615331565b9150614a3d82615812565b602082019050919050565b6000614a55601383615331565b9150614a608261583b565b602082019050919050565b6000614a78602483615331565b9150614a8382615864565b604082019050919050565b6000614a9b601983615331565b9150614aa6826158b3565b602082019050919050565b6000614abe602c83615331565b9150614ac9826158dc565b604082019050919050565b6000614ae1602983615331565b9150614aec8261592b565b604082019050919050565b6000614b04603883615331565b9150614b0f8261597a565b604082019050919050565b6000614b27602a83615331565b9150614b32826159c9565b604082019050919050565b6000614b4a602983615331565b9150614b5582615a18565b604082019050919050565b6000614b6d602083615331565b9150614b7882615a67565b602082019050919050565b6000614b90602483615331565b9150614b9b82615a90565b604082019050919050565b6000614bb3603083615331565b9150614bbe82615adf565b604082019050919050565b6000614bd6602c83615331565b9150614be182615b2e565b604082019050919050565b6000614bf9602083615331565b9150614c0482615b7d565b602082019050919050565b6000614c1c602983615331565b9150614c2782615ba6565b604082019050919050565b6000614c3f602f83615331565b9150614c4a82615bf5565b604082019050919050565b6000614c62602183615331565b9150614c6d82615c44565b604082019050919050565b6000614c85601383615331565b9150614c9082615c93565b602082019050919050565b6000614ca8603183615331565b9150614cb382615cbc565b604082019050919050565b6000614ccb602583615331565b9150614cd682615d0b565b604082019050919050565b6000614cee602c83615331565b9150614cf982615d5a565b604082019050919050565b6000614d11602c83615331565b9150614d1c82615da9565b604082019050919050565b614d30816154a6565b82525050565b614d47614d42826154a6565b6155ab565b82525050565b6000614d59828461490c565b915081905092915050565b6000614d70828561490c565b9150614d7c828461490c565b91508190509392505050565b6000614d94828461493d565b915081905092915050565b6000614dab8284614d36565b60208201915081905092915050565b6000602082019050614dcf600083018461487c565b92915050565b6000606082019050614dea600083018661487c565b614df7602083018561487c565b614e046040830184614d27565b949350505050565b6000608082019050614e21600083018761487c565b614e2e602083018661487c565b614e3b6040830185614d27565b8181036060830152614e4d818461489a565b905095945050505050565b6000604082019050614e6d600083018561487c565b614e7a6020830184614d27565b9392505050565b6000602082019050614e96600083018461488b565b92915050565b60006020820190508181036000830152614eb681846148d3565b905092915050565b60006060820190508181036000830152614ed881866148d3565b9050614ee7602083018561487c565b614ef4604083018461487c565b949350505050565b60006040820190508181036000830152614f1681856148d3565b90508181036020830152614f2a81846148d3565b90509392505050565b60006020820190508181036000830152614f4c816149bc565b9050919050565b60006020820190508181036000830152614f6c816149df565b9050919050565b60006020820190508181036000830152614f8c81614a02565b9050919050565b60006020820190508181036000830152614fac81614a25565b9050919050565b60006020820190508181036000830152614fcc81614a48565b9050919050565b60006020820190508181036000830152614fec81614a6b565b9050919050565b6000602082019050818103600083015261500c81614a8e565b9050919050565b6000602082019050818103600083015261502c81614ab1565b9050919050565b6000602082019050818103600083015261504c81614ad4565b9050919050565b6000602082019050818103600083015261506c81614af7565b9050919050565b6000602082019050818103600083015261508c81614b1a565b9050919050565b600060208201905081810360008301526150ac81614b3d565b9050919050565b600060208201905081810360008301526150cc81614b60565b9050919050565b600060208201905081810360008301526150ec81614b83565b9050919050565b6000602082019050818103600083015261510c81614ba6565b9050919050565b6000602082019050818103600083015261512c81614bc9565b9050919050565b6000602082019050818103600083015261514c81614bec565b9050919050565b6000602082019050818103600083015261516c81614c0f565b9050919050565b6000602082019050818103600083015261518c81614c32565b9050919050565b600060208201905081810360008301526151ac81614c55565b9050919050565b600060208201905081810360008301526151cc81614c78565b9050919050565b600060208201905081810360008301526151ec81614c9b565b9050919050565b6000602082019050818103600083015261520c81614cbe565b9050919050565b6000602082019050818103600083015261522c81614ce1565b9050919050565b6000602082019050818103600083015261524c81614d04565b9050919050565b60006020820190506152686000830184614d27565b92915050565b6000615278615289565b90506152848282615531565b919050565b6000604051905090565b600067ffffffffffffffff8211156152ae576152ad6156d1565b5b6152b782615714565b9050602081019050919050565b600067ffffffffffffffff8211156152df576152de6156d1565b5b6152e882615714565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615358826154a6565b9150615363836154a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615398576153976155e6565b5b828201905092915050565b60006153ae826154a6565b91506153b9836154a6565b9250826153c9576153c8615615565b5b828204905092915050565b60006153df826154a6565b91506153ea836154a6565b9250828210156153fd576153fc6155e6565b5b828203905092915050565b6000615413826154b0565b915061541e836154b0565b925082821015615431576154306155e6565b5b828203905092915050565b600061544782615486565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156154ea5780820151818401526020810190506154cf565b838111156154f9576000848401525b50505050565b6000600282049050600182168061551757607f821691505b6020821081141561552b5761552a615644565b5b50919050565b61553a82615714565b810181811067ffffffffffffffff82111715615559576155586156d1565b5b80604052505050565b600061556d826154a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155a05761559f6155e6565b5b600182019050919050565b6000819050919050565b60006155c0826154a6565b91506155cb836154a6565b9250826155db576155da615615565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f464e533a206572722e20636f6465203030303200000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f464e533a20596f75206e65656420746f2070617920746865207269676874206160008201527f6d6f756e74203e3a280000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f464e533a20596f752063616e74206f776e206d6f7265207468616e206f6e652060008201527f6e616d6500000000000000000000000000000000000000000000000000000000602082015250565b7f464e533a20596f752063616e74207365742061206c696e6b20666f722061206e60008201527f6f6e2d6578697374696e67206e616d6500000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f464e533a206572722e20636f6465203030303300000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f464e533a20596f752063616e742074616b65206f746865722070656f706c657360008201527f206e616d65000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f464e533a20596f752063616e74206f766572777269746520736f6d656f6e657360008201527f206e616d652c206964696f740000000000000000000000000000000000000000602082015250565b615e018161543c565b8114615e0c57600080fd5b50565b615e188161544e565b8114615e2357600080fd5b50565b615e2f8161545a565b8114615e3a57600080fd5b50565b615e46816154a6565b8114615e5157600080fd5b5056fea2646970667358221220a90d5d97379b79e2dd8d4d139f7579eb7a8d680d8a43dec8e0ab54f3c8eb86d564736f6c6343000807003366616e746f6d732e6172742042617369632046616e746f6d204e616d652053797374656d
Deployed Bytecode
0x6080604052600436106102045760003560e01c80636a1db1bf11610118578063ace4ee28116100a0578063d3189e061161006f578063d3189e06146107b9578063e985e9c5146107e2578063f2fde38b1461081f578063f42c2a2314610848578063f5cc229f1461087157610204565b8063ace4ee28146106ed578063b465fe7e14610716578063b88d4fde14610753578063c87b56dd1461077c57610204565b806381758129116100e757806381758129146105f45780638da5cb5b1461063157806395d89b411461065c578063a141c33514610687578063a22cb465146106c457610204565b80636a1db1bf1461053a57806370a0823114610563578063715018a6146105a05780637d840ed5146105b757610204565b806318160ddd1161019b5780633f34d5fb1161016a5780633f34d5fb1461042f57806342842e0e1461046c5780634f6ccce7146104955780636352211e146104d2578063635740d61461050f57610204565b806318160ddd1461037557806323b872dd146103a05780632f745c59146103c95780633706da3d1461040657610204565b8063095ea7b3116101d7578063095ea7b3146102ca5780630b6476c4146102f35780630fc2ccc01461031c5780631309de151461035957610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc146102715780630830602b146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061463c565b61089a565b60405161023d9190614e81565b60405180910390f35b34801561025257600080fd5b5061025b6108ac565b6040516102689190614e9c565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190614822565b61093e565b6040516102a59190614dba565b60405180910390f35b6102c860048036038101906102c39190614696565b6109c3565b005b3480156102d657600080fd5b506102f160048036038101906102ec9190614560565b610f8a565b005b3480156102ff57600080fd5b5061031a600480360381019061031591906145a0565b6110a2565b005b34801561032857600080fd5b50610343600480360381019061033e9190614696565b61114a565b6040516103509190614e81565b60405180910390f35b610373600480360381019061036e9190614696565b61117f565b005b34801561038157600080fd5b5061038a6111dc565b6040516103979190615253565b60405180910390f35b3480156103ac57600080fd5b506103c760048036038101906103c2919061444a565b6111e9565b005b3480156103d557600080fd5b506103f060048036038101906103eb9190614560565b611249565b6040516103fd9190615253565b60405180910390f35b34801561041257600080fd5b5061042d600480360381019061042891906143db565b6112ee565b005b34801561043b57600080fd5b50610456600480360381019061045191906146df565b611aed565b6040516104639190614e81565b60405180910390f35b34801561047857600080fd5b50610493600480360381019061048e919061444a565b611b67565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190614822565b611b87565b6040516104c99190615253565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190614822565b611bf8565b6040516105069190614dba565b60405180910390f35b34801561051b57600080fd5b50610524611caa565b6040516105319190615253565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190614822565b611cb0565b005b34801561056f57600080fd5b5061058a6004803603810190610585919061436e565b611d36565b6040516105979190615253565b60405180910390f35b3480156105ac57600080fd5b506105b5611dee565b005b3480156105c357600080fd5b506105de60048036038101906105d99190614696565b611e76565b6040516105eb9190614e9c565b60405180910390f35b34801561060057600080fd5b5061061b6004803603810190610616919061436e565b611f3c565b6040516106289190614e9c565b60405180910390f35b34801561063d57600080fd5b5061064661200d565b6040516106539190614dba565b60405180910390f35b34801561066857600080fd5b50610671612037565b60405161067e9190614e9c565b60405180910390f35b34801561069357600080fd5b506106ae60048036038101906106a99190614696565b6120c9565b6040516106bb9190614e9c565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190614520565b61218f565b005b3480156106f957600080fd5b50610714600480360381019061070f91906145a0565b612310565b005b34801561072257600080fd5b5061073d60048036038101906107389190614696565b612397565b60405161074a9190614dba565b60405180910390f35b34801561075f57600080fd5b5061077a6004803603810190610775919061449d565b612628565b005b34801561078857600080fd5b506107a3600480360381019061079e9190614822565b61268a565b6040516107b09190614e9c565b60405180910390f35b3480156107c557600080fd5b506107e060048036038101906107db91906147aa565b612731565b005b3480156107ee57600080fd5b506108096004803603810190610804919061439b565b6128ae565b6040516108169190614e81565b60405180910390f35b34801561082b57600080fd5b506108466004803603810190610841919061436e565b612942565b005b34801561085457600080fd5b5061086f600480360381019061086a91906147aa565b612a3a565b005b34801561087d57600080fd5b506108986004803603810190610893919061473b565b612bb7565b005b60006108a582612d92565b9050919050565b6060600080546108bb906154ff565b80601f01602080910402602001604051908101604052809291908181526020018280546108e7906154ff565b80156109345780601f1061090957610100808354040283529160200191610934565b820191906000526020600020905b81548152906001019060200180831161091757829003601f168201915b5050505050905090565b600061094982612e0a565b610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90615113565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109cc81612e76565b9050600d543414610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0990615033565b60405180910390fd5b610a46601282604051610a259190614d4d565b908152602001604051809103902060009054906101000a900460ff16612f0e565b610a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7c906151f3565b60405180910390fd5b610ada601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f0e565b610b19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b10906150d3565b60405180910390fd5b7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016020604051808303818588803b158015610b7557600080fd5b505af1158015610b89573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610bae919061484f565b507321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7387f385d152944689f92ed523e9e5e9bd58ea62ef7321be370d5312f44cb42ce377bc9b8a0cef1a4c8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c419190614dba565b60206040518083038186803b158015610c5957600080fd5b505afa158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c91919061484f565b6040518363ffffffff1660e01b8152600401610cae929190614e58565b602060405180830381600087803b158015610cc857600080fd5b505af1158015610cdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d00919061460f565b5060006040518060c00160405280838152602001610d1e600c612f29565b81526020013373ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200160405180602001604052806000815250815260200160405180602001604052806000815250815250905081601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190610dc592919061403e565b506001601283604051610dd89190614d4d565b908152602001604051809103902060006101000a81548160ff0219169083151502179055506001601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080600e6000610e64600c612f29565b81526020019081526020016000206000820151816000019080519060200190610e8e92919061403e565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160146101000a81548160ff0219169083151502179055506080820151816003019080519060200190610f1c92919061403e565b5060a0820151816004019080519060200190610f3992919061403e565b50905050610f47600c612f29565b600f83604051610f579190614d4d565b908152602001604051809103902081905550610f7c33610f77600c612f29565b612f37565b610f86600c612f55565b5050565b6000610f9582611bf8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611006576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffd90615193565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611025612f6b565b73ffffffffffffffffffffffffffffffffffffffff16148061105457506110538161104e612f6b565b6128ae565b5b611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90615053565b60405180910390fd5b61109d8383612f73565b505050565b6110ab81612e76565b90508273ffffffffffffffffffffffffffffffffffffffff166323b872dd336110d384612397565b856040518463ffffffff1660e01b81526004016110f293929190614dd5565b602060405180830381600087803b15801561110c57600080fd5b505af1158015611120573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611144919061460f565b50505050565b600060128260405161115c9190614d4d565b908152602001604051809103902060009054906101000a900460ff169050919050565b61118881612e76565b905061119381612397565b73ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156111d8573d6000803e3d6000fd5b5050565b6000600880549050905090565b6111fa6111f4612f6b565b8261302c565b611239576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611230906151d3565b60405180910390fd5b61124483838361310a565b505050565b600061125483611d36565b8210611295576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128c90614f33565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b611343601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f0e565b611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137990615233565b60405180910390fd5b600061138d82612397565b90503373ffffffffffffffffffffffffffffffffffffffff166014836040516113b69190614d4d565b908152602001604051809103902060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561140957611478565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e906151b3565b60405180910390fd5b5b6000601060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080546114c4906154ff565b80601f01602080910402602001604051908101604052809291908181526020018280546114f0906154ff565b801561153d5780601f106115125761010080835404028352916020019161153d565b820191906000526020600020905b81548152906001019060200180831161152057829003601f168201915b505050505090506000600f826040516115569190614d4d565b9081526020016040518091039020549050846013856040516115789190614d4d565b908152602001604051809103902060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000601160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001601160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020601060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080546116fe906154ff565b6117099291906140c4565b50600060405160200161171c9190614d9f565b604051602081830303815290604052601060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020908051906020019061177d92919061403e565b50600e6000828152602001908152602001600020600e6000600f601060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040516117e39190614d88565b90815260200160405180910390205481526020019081526020016000206000820181600001908054611814906154ff565b61181f929190614151565b50600182015481600101556002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002820160149054906101000a900460ff168160020160146101000a81548160ff02191690831515021790555060038201816003019080546118d2906154ff565b6118dd929190614151565b5060048201816004019080546118f2906154ff565b6118fd929190614151565b509050506040518060c00160405280858152602001600f601060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040516119609190614d88565b90815260200160405180910390205481526020018673ffffffffffffffffffffffffffffffffffffffff16815260200160011515815260200160405180602001604052806000815250815260200160405180602001604052806000815250815250600e600083815260200190815260200160002060008201518160000190805190602001906119f092919061403e565b506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060608201518160020160146101000a81548160ff0219169083151502179055506080820151816003019080519060200190611a7e92919061403e565b5060a0820151816004019080519060200190611a9b92919061403e565b50905050611aaa8686836111e9565b7f21e177c2bf9adbd548d25cc65d54b697122f907257d8318bddc22375fe666de8848787604051611add93929190614ebe565b60405180910390a1505050505050565b60008173ffffffffffffffffffffffffffffffffffffffff16601484604051611b169190614d4d565b908152602001604051809103902060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b611b8283838360405180602001604052806000815250612628565b505050565b6000611b916111dc565b8210611bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc990615213565b60405180910390fd5b60088281548110611be657611be56156a2565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ca1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9890615093565b60405180910390fd5b80915050919050565b600d5481565b611cb8612f6b565b73ffffffffffffffffffffffffffffffffffffffff16611cd661200d565b73ffffffffffffffffffffffffffffffffffffffff1614611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2390615133565b60405180910390fd5b80600d8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9e90615073565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611df6612f6b565b73ffffffffffffffffffffffffffffffffffffffff16611e1461200d565b73ffffffffffffffffffffffffffffffffffffffff1614611e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6190615133565b60405180910390fd5b611e746000613366565b565b6060600e6000600f84604051611e8c9190614d4d565b90815260200160405180910390205481526020019081526020016000206004018054611eb7906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee3906154ff565b8015611f305780601f10611f0557610100808354040283529160200191611f30565b820191906000526020600020905b815481529060010190602001808311611f1357829003601f168201915b50505050509050919050565b6060601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054611f88906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054611fb4906154ff565b80156120015780601f10611fd657610100808354040283529160200191612001565b820191906000526020600020905b815481529060010190602001808311611fe457829003601f168201915b50505050509050919050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054612046906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612072906154ff565b80156120bf5780601f10612094576101008083540402835291602001916120bf565b820191906000526020600020905b8154815290600101906020018083116120a257829003601f168201915b5050505050905090565b6060600e6000600f846040516120df9190614d4d565b9081526020016040518091039020548152602001908152602001600020600301805461210a906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612136906154ff565b80156121835780601f1061215857610100808354040283529160200191612183565b820191906000526020600020905b81548152906001019060200180831161216657829003601f168201915b50505050509050919050565b612197612f6b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612205576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121fc90614ff3565b60405180910390fd5b8060056000612212612f6b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122bf612f6b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123049190614e81565b60405180910390a35050565b61231981612e76565b90508273ffffffffffffffffffffffffffffffffffffffff166342842e0e3361234184612397565b856040518463ffffffff1660e01b815260040161236093929190614dd5565b600060405180830381600087803b15801561237a57600080fd5b505af115801561238e573d6000803e3d6000fd5b50505050505050565b60006123a282612e76565b91506000600f836040516123b69190614d4d565b90815260200160405180910390205490506000600e60008381526020019081526020016000206040518060c00160405290816000820180546123f7906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612423906154ff565b80156124705780601f1061244557610100808354040283529160200191612470565b820191906000526020600020905b81548152906001019060200180831161245357829003601f168201915b50505050508152602001600182015481526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160149054906101000a900460ff16151515158152602001600382018054612504906154ff565b80601f0160208091040260200160405190810160405280929190818152602001828054612530906154ff565b801561257d5780601f106125525761010080835404028352916020019161257d565b820191906000526020600020905b81548152906001019060200180831161256057829003601f168201915b50505050508152602001600482018054612596906154ff565b80601f01602080910402602001604051908101604052809291908181526020018280546125c2906154ff565b801561260f5780601f106125e45761010080835404028352916020019161260f565b820191906000526020600020905b8154815290600101906020018083116125f257829003601f168201915b5050505050815250509050806040015192505050919050565b612639612633612f6b565b8361302c565b612678576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266f906151d3565b60405180910390fd5b6126848484848461342c565b50505050565b606061269582612e0a565b6126d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126cb90615173565b60405180910390fd5b60006126de613488565b905060008151116126fe5760405180602001604052806000815250612729565b806127088461349f565b604051602001612719929190614d64565b6040516020818303038152906040525b915050919050565b6012826040516127419190614d4d565b908152602001604051809103902060009054906101000a900460ff1661279c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612793906150f3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e6000600f856040516127c79190614d4d565b908152602001604051809103902054815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461282857600080fd5b80600e6000600f8560405161283d9190614d4d565b9081526020016040518091039020548152602001908152602001600020600401908051906020019061287092919061403e565b507f71e2bdc25aff7e0cc31169435b52e69cb1cef797a1873a42427c7cc974ae668882826040516128a2929190614efc565b60405180910390a15050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61294a612f6b565b73ffffffffffffffffffffffffffffffffffffffff1661296861200d565b73ffffffffffffffffffffffffffffffffffffffff16146129be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b590615133565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2590614f73565b60405180910390fd5b612a3781613366565b50565b601282604051612a4a9190614d4d565b908152602001604051809103902060009054906101000a900460ff16612aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9c906150f3565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600e6000600f85604051612ad09190614d4d565b908152602001604051809103902054815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b3157600080fd5b80600e6000600f85604051612b469190614d4d565b90815260200160405180910390205481526020019081526020016000206003019080519060200190612b7992919061403e565b507fabb889df50ccf9074905ecd54649276aeebe36bcd16aa139f629e14f92c7a93a8282604051612bab929190614efc565b60405180910390a15050565b6000601384604051612bc99190614d4d565b908152602001604051809103902060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90614fb3565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ccd906151b3565b60405180910390fd5b600060405180604001604052808681526020018473ffffffffffffffffffffffffffffffffffffffff16815250905080601486604051612d169190614d4d565b90815260200160405180910390206000820151816000019080519060200190612d4092919061403e565b5060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050505050505050565b6000612d9d82613600565b80612e035750600a6000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff165b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600082905060005b8151811015612f0457612eaf828281518110612e9f57612e9e6156a2565b5b602001015160f81c60f81b61367a565b828281518110612ec257612ec16156a2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080612efc90615562565b915050612e80565b5080915050919050565b60008115612f1f5760009050612f24565b600190505b919050565b600081600001549050919050565b612f51828260405180602001604052806000815250613700565b5050565b6001816000016000828254019250508190555050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612fe683611bf8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061303782612e0a565b613076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306d90615013565b60405180910390fd5b600061308183611bf8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806130f057508373ffffffffffffffffffffffffffffffffffffffff166130d88461093e565b73ffffffffffffffffffffffffffffffffffffffff16145b80613101575061310081856128ae565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661312a82611bf8565b73ffffffffffffffffffffffffffffffffffffffff1614613180576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317790615153565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e790614fd3565b60405180910390fd5b6131fb83838361375b565b613206600082612f73565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461325691906153d4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132ad919061534d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61343784848461310a565b6134438484848461386f565b613482576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161347990614f53565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606060008214156134e7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135fb565b600082905060005b6000821461351957808061350290615562565b915050600a8261351291906153a3565b91506134ef565b60008167ffffffffffffffff811115613535576135346156d1565b5b6040519080825280601f01601f1916602001820160405280156135675781602001600182028036833780820191505090505b5090505b600085146135f45760018261358091906153d4565b9150600a8561358f91906155b5565b603061359b919061534d565b60f81b8183815181106135b1576135b06156a2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135ed91906153a3565b945061356b565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613673575061367282613a06565b5b9050919050565b6000606160f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916101580156136d85750607a60f81b827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b156136f75760208260f81c6136ed9190615408565b60f81b90506136fb565b8190505b919050565b61370a8383613ae8565b613717600084848461386f565b613756576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374d90614f53565b60405180910390fd5b505050565b613766838383613cb6565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137a9576137a481613cbb565b6137e8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137e7576137e68382613d04565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561382b5761382681613e71565b61386a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613869576138688282613f42565b5b5b505050565b60006138908473ffffffffffffffffffffffffffffffffffffffff16613fc1565b156139f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138b9612f6b565b8786866040518563ffffffff1660e01b81526004016138db9493929190614e0c565b602060405180830381600087803b1580156138f557600080fd5b505af192505050801561392657506040513d601f19601f820116820180604052508101906139239190614669565b60015b6139a9573d8060008114613956576040519150601f19603f3d011682016040523d82523d6000602084013e61395b565b606091505b506000815114156139a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161399890614f53565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506139fe565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613ad157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80613ae15750613ae082613fd4565b5b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b4f906150b3565b60405180910390fd5b613b6181612e0a565b15613ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9890614f93565b60405180910390fd5b613bad6000838361375b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bfd919061534d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613d1184611d36565b613d1b91906153d4565b9050600060076000848152602001908152602001600020549050818114613e00576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613e8591906153d4565b9050600060096000848152602001908152602001600020549050600060088381548110613eb557613eb46156a2565b5b906000526020600020015490508060088381548110613ed757613ed66156a2565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613f2657613f25615673565b5b6001900381819060005260206000200160009055905550505050565b6000613f4d83611d36565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461404a906154ff565b90600052602060002090601f01602090048101928261406c57600085556140b3565b82601f1061408557805160ff19168380011785556140b3565b828001600101855582156140b3579182015b828111156140b2578251825591602001919060010190614097565b5b5090506140c091906141de565b5090565b8280546140d0906154ff565b90600052602060002090601f0160209004810192826140f25760008555614140565b82601f106141035780548555614140565b8280016001018555821561414057600052602060002091601f016020900482015b8281111561413f578254825591600101919060010190614124565b5b50905061414d91906141de565b5090565b82805461415d906154ff565b90600052602060002090601f01602090048101928261417f57600085556141cd565b82601f1061419057805485556141cd565b828001600101855582156141cd57600052602060002091601f016020900482015b828111156141cc5782548255916001019190600101906141b1565b5b5090506141da91906141de565b5090565b5b808211156141f75760008160009055506001016141df565b5090565b600061420e61420984615293565b61526e565b90508281526020810184848401111561422a57614229615705565b5b6142358482856154bd565b509392505050565b600061425061424b846152c4565b61526e565b90508281526020810184848401111561426c5761426b615705565b5b6142778482856154bd565b509392505050565b60008135905061428e81615df8565b92915050565b6000813590506142a381615e0f565b92915050565b6000815190506142b881615e0f565b92915050565b6000813590506142cd81615e26565b92915050565b6000815190506142e281615e26565b92915050565b600082601f8301126142fd576142fc615700565b5b813561430d8482602086016141fb565b91505092915050565b600082601f83011261432b5761432a615700565b5b813561433b84826020860161423d565b91505092915050565b60008135905061435381615e3d565b92915050565b60008151905061436881615e3d565b92915050565b6000602082840312156143845761438361570f565b5b60006143928482850161427f565b91505092915050565b600080604083850312156143b2576143b161570f565b5b60006143c08582860161427f565b92505060206143d18582860161427f565b9150509250929050565b6000806000606084860312156143f4576143f361570f565b5b60006144028682870161427f565b93505060206144138682870161427f565b925050604084013567ffffffffffffffff8111156144345761443361570a565b5b61444086828701614316565b9150509250925092565b6000806000606084860312156144635761446261570f565b5b60006144718682870161427f565b93505060206144828682870161427f565b925050604061449386828701614344565b9150509250925092565b600080600080608085870312156144b7576144b661570f565b5b60006144c58782880161427f565b94505060206144d68782880161427f565b93505060406144e787828801614344565b925050606085013567ffffffffffffffff8111156145085761450761570a565b5b614514878288016142e8565b91505092959194509250565b600080604083850312156145375761453661570f565b5b60006145458582860161427f565b925050602061455685828601614294565b9150509250929050565b600080604083850312156145775761457661570f565b5b60006145858582860161427f565b925050602061459685828601614344565b9150509250929050565b6000806000606084860312156145b9576145b861570f565b5b60006145c78682870161427f565b93505060206145d886828701614344565b925050604084013567ffffffffffffffff8111156145f9576145f861570a565b5b61460586828701614316565b9150509250925092565b6000602082840312156146255761462461570f565b5b6000614633848285016142a9565b91505092915050565b6000602082840312156146525761465161570f565b5b6000614660848285016142be565b91505092915050565b60006020828403121561467f5761467e61570f565b5b600061468d848285016142d3565b91505092915050565b6000602082840312156146ac576146ab61570f565b5b600082013567ffffffffffffffff8111156146ca576146c961570a565b5b6146d684828501614316565b91505092915050565b600080604083850312156146f6576146f561570f565b5b600083013567ffffffffffffffff8111156147145761471361570a565b5b61472085828601614316565b92505060206147318582860161427f565b9150509250929050565b6000806000606084860312156147545761475361570f565b5b600084013567ffffffffffffffff8111156147725761477161570a565b5b61477e86828701614316565b935050602061478f8682870161427f565b92505060406147a08682870161427f565b9150509250925092565b600080604083850312156147c1576147c061570f565b5b600083013567ffffffffffffffff8111156147df576147de61570a565b5b6147eb85828601614316565b925050602083013567ffffffffffffffff81111561480c5761480b61570a565b5b61481885828601614316565b9150509250929050565b6000602082840312156148385761483761570f565b5b600061484684828501614344565b91505092915050565b6000602082840312156148655761486461570f565b5b600061487384828501614359565b91505092915050565b6148858161543c565b82525050565b6148948161544e565b82525050565b60006148a58261530a565b6148af8185615320565b93506148bf8185602086016154cc565b6148c881615714565b840191505092915050565b60006148de82615315565b6148e88185615331565b93506148f88185602086016154cc565b61490181615714565b840191505092915050565b600061491782615315565b6149218185615342565b93506149318185602086016154cc565b80840191505092915050565b6000815461494a816154ff565b6149548186615342565b9450600182166000811461496f5760018114614980576149b3565b60ff198316865281860193506149b3565b614989856152f5565b60005b838110156149ab5781548189015260018201915060208101905061498c565b838801955050505b50505092915050565b60006149c9602b83615331565b91506149d482615725565b604082019050919050565b60006149ec603283615331565b91506149f782615774565b604082019050919050565b6000614a0f602683615331565b9150614a1a826157c3565b604082019050919050565b6000614a32601c83615331565b9150614a3d82615812565b602082019050919050565b6000614a55601383615331565b9150614a608261583b565b602082019050919050565b6000614a78602483615331565b9150614a8382615864565b604082019050919050565b6000614a9b601983615331565b9150614aa6826158b3565b602082019050919050565b6000614abe602c83615331565b9150614ac9826158dc565b604082019050919050565b6000614ae1602983615331565b9150614aec8261592b565b604082019050919050565b6000614b04603883615331565b9150614b0f8261597a565b604082019050919050565b6000614b27602a83615331565b9150614b32826159c9565b604082019050919050565b6000614b4a602983615331565b9150614b5582615a18565b604082019050919050565b6000614b6d602083615331565b9150614b7882615a67565b602082019050919050565b6000614b90602483615331565b9150614b9b82615a90565b604082019050919050565b6000614bb3603083615331565b9150614bbe82615adf565b604082019050919050565b6000614bd6602c83615331565b9150614be182615b2e565b604082019050919050565b6000614bf9602083615331565b9150614c0482615b7d565b602082019050919050565b6000614c1c602983615331565b9150614c2782615ba6565b604082019050919050565b6000614c3f602f83615331565b9150614c4a82615bf5565b604082019050919050565b6000614c62602183615331565b9150614c6d82615c44565b604082019050919050565b6000614c85601383615331565b9150614c9082615c93565b602082019050919050565b6000614ca8603183615331565b9150614cb382615cbc565b604082019050919050565b6000614ccb602583615331565b9150614cd682615d0b565b604082019050919050565b6000614cee602c83615331565b9150614cf982615d5a565b604082019050919050565b6000614d11602c83615331565b9150614d1c82615da9565b604082019050919050565b614d30816154a6565b82525050565b614d47614d42826154a6565b6155ab565b82525050565b6000614d59828461490c565b915081905092915050565b6000614d70828561490c565b9150614d7c828461490c565b91508190509392505050565b6000614d94828461493d565b915081905092915050565b6000614dab8284614d36565b60208201915081905092915050565b6000602082019050614dcf600083018461487c565b92915050565b6000606082019050614dea600083018661487c565b614df7602083018561487c565b614e046040830184614d27565b949350505050565b6000608082019050614e21600083018761487c565b614e2e602083018661487c565b614e3b6040830185614d27565b8181036060830152614e4d818461489a565b905095945050505050565b6000604082019050614e6d600083018561487c565b614e7a6020830184614d27565b9392505050565b6000602082019050614e96600083018461488b565b92915050565b60006020820190508181036000830152614eb681846148d3565b905092915050565b60006060820190508181036000830152614ed881866148d3565b9050614ee7602083018561487c565b614ef4604083018461487c565b949350505050565b60006040820190508181036000830152614f1681856148d3565b90508181036020830152614f2a81846148d3565b90509392505050565b60006020820190508181036000830152614f4c816149bc565b9050919050565b60006020820190508181036000830152614f6c816149df565b9050919050565b60006020820190508181036000830152614f8c81614a02565b9050919050565b60006020820190508181036000830152614fac81614a25565b9050919050565b60006020820190508181036000830152614fcc81614a48565b9050919050565b60006020820190508181036000830152614fec81614a6b565b9050919050565b6000602082019050818103600083015261500c81614a8e565b9050919050565b6000602082019050818103600083015261502c81614ab1565b9050919050565b6000602082019050818103600083015261504c81614ad4565b9050919050565b6000602082019050818103600083015261506c81614af7565b9050919050565b6000602082019050818103600083015261508c81614b1a565b9050919050565b600060208201905081810360008301526150ac81614b3d565b9050919050565b600060208201905081810360008301526150cc81614b60565b9050919050565b600060208201905081810360008301526150ec81614b83565b9050919050565b6000602082019050818103600083015261510c81614ba6565b9050919050565b6000602082019050818103600083015261512c81614bc9565b9050919050565b6000602082019050818103600083015261514c81614bec565b9050919050565b6000602082019050818103600083015261516c81614c0f565b9050919050565b6000602082019050818103600083015261518c81614c32565b9050919050565b600060208201905081810360008301526151ac81614c55565b9050919050565b600060208201905081810360008301526151cc81614c78565b9050919050565b600060208201905081810360008301526151ec81614c9b565b9050919050565b6000602082019050818103600083015261520c81614cbe565b9050919050565b6000602082019050818103600083015261522c81614ce1565b9050919050565b6000602082019050818103600083015261524c81614d04565b9050919050565b60006020820190506152686000830184614d27565b92915050565b6000615278615289565b90506152848282615531565b919050565b6000604051905090565b600067ffffffffffffffff8211156152ae576152ad6156d1565b5b6152b782615714565b9050602081019050919050565b600067ffffffffffffffff8211156152df576152de6156d1565b5b6152e882615714565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615358826154a6565b9150615363836154a6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615398576153976155e6565b5b828201905092915050565b60006153ae826154a6565b91506153b9836154a6565b9250826153c9576153c8615615565b5b828204905092915050565b60006153df826154a6565b91506153ea836154a6565b9250828210156153fd576153fc6155e6565b5b828203905092915050565b6000615413826154b0565b915061541e836154b0565b925082821015615431576154306155e6565b5b828203905092915050565b600061544782615486565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156154ea5780820151818401526020810190506154cf565b838111156154f9576000848401525b50505050565b6000600282049050600182168061551757607f821691505b6020821081141561552b5761552a615644565b5b50919050565b61553a82615714565b810181811067ffffffffffffffff82111715615559576155586156d1565b5b80604052505050565b600061556d826154a6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155a05761559f6155e6565b5b600182019050919050565b6000819050919050565b60006155c0826154a6565b91506155cb836154a6565b9250826155db576155da615615565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f464e533a206572722e20636f6465203030303200000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f464e533a20596f75206e65656420746f2070617920746865207269676874206160008201527f6d6f756e74203e3a280000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f464e533a20596f752063616e74206f776e206d6f7265207468616e206f6e652060008201527f6e616d6500000000000000000000000000000000000000000000000000000000602082015250565b7f464e533a20596f752063616e74207365742061206c696e6b20666f722061206e60008201527f6f6e2d6578697374696e67206e616d6500000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f464e533a206572722e20636f6465203030303300000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f464e533a20596f752063616e742074616b65206f746865722070656f706c657360008201527f206e616d65000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f464e533a20596f752063616e74206f766572777269746520736f6d656f6e657360008201527f206e616d652c206964696f740000000000000000000000000000000000000000602082015250565b615e018161543c565b8114615e0c57600080fd5b50565b615e188161544e565b8114615e2357600080fd5b50565b615e2f8161545a565b8114615e3a57600080fd5b50565b615e46816154a6565b8114615e5157600080fd5b5056fea2646970667358221220a90d5d97379b79e2dd8d4d139f7579eb7a8d680d8a43dec8e0ab54f3c8eb86d564736f6c63430008070033
Deployed Bytecode Sourcemap
56076:7745:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63647:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36119:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37678:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58866:999;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37201:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60934:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58290:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60770:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48548:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38568:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48216:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61362:1071;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60226:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38978:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48738:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35813:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56723:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58083:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35543:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23974:94;;;;;;;;;;;;;:::i;:::-;;63290:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58172:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23323:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36288:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62787:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37971:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61144:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58407:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39234:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36463:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62943:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38337:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24223:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62439:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59871:349;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63647:171;63756:4;63776:36;63800:11;63776:23;:36::i;:::-;63769:43;;63647:171;;;:::o;36119:100::-;36173:13;36206:5;36199:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36119:100;:::o;37678:221::-;37754:7;37782:16;37790:7;37782;:16::i;:::-;37774:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37867:15;:24;37883:7;37867:24;;;;;;;;;;;;;;;;;;;;;37860:31;;37678:221;;;:::o;58866:999::-;58939:21;58954:5;58939:14;:21::i;:::-;58931:29;;58988:7;;58975:9;:20;58967:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;59080:30;59091:11;59103:5;59091:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;59080:10;:30::i;:::-;59072:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;59167:32;59178:8;:20;59187:10;59178:20;;;;;;;;;;;;;;;;;;;;;;;;;59167:10;:32::i;:::-;59159:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;56407:42;59275:13;;;59296:9;59275:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;56493:42;59379:13;;;56590:42;56493;59412:14;;;59435:4;59412:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59379:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;59449:31;59483:69;;;;;;;;59498:5;59483:69;;;;59504:25;:15;:23;:25::i;:::-;59483:69;;;;59530:10;59483:69;;;;;;59541:4;59483:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59449:103;;59581:5;59559:7;:19;59567:10;59559:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;59614:4;59593:11;59605:5;59593:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;59648:4;59625:8;:20;59634:10;59625:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;59705:9;59659:16;:43;59676:25;:15;:23;:25::i;:::-;59659:43;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;59745:25;:15;:23;:25::i;:::-;59721:14;59736:5;59721:21;;;;;;:::i;:::-;;;;;;;;;;;;;:49;;;;59777:48;59787:10;59799:25;:15;:23;:25::i;:::-;59777:9;:48::i;:::-;59832:27;:15;:25;:27::i;:::-;58924:941;58866:999;:::o;37201:411::-;37282:13;37298:23;37313:7;37298:14;:23::i;:::-;37282:39;;37346:5;37340:11;;:2;:11;;;;37332:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;37440:5;37424:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37449:37;37466:5;37473:12;:10;:12::i;:::-;37449:16;:37::i;:::-;37424:62;37402:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;37583:21;37592:2;37596:7;37583:8;:21::i;:::-;37271:341;37201:411;;:::o;60934:204::-;61035:21;61050:5;61035:14;:21::i;:::-;61027:29;;61070:6;61063:27;;;61091:10;61102:21;61117:5;61102:14;:21::i;:::-;61124:7;61063:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;60934:204;;;:::o;58290:111::-;58357:4;58377:11;58389:5;58377:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;58370:25;;58290:111;;;:::o;60770:158::-;60844:21;60859:5;60844:14;:21::i;:::-;60836:29;;60880:21;60895:5;60880:14;:21::i;:::-;60872:39;;:50;60912:9;60872:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60770:158;:::o;48548:113::-;48609:7;48636:10;:17;;;;48629:24;;48548:113;:::o;38568:339::-;38763:41;38782:12;:10;:12::i;:::-;38796:7;38763:18;:41::i;:::-;38755:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;38871:28;38881:4;38887:2;38891:7;38871:9;:28::i;:::-;38568:339;;;:::o;48216:256::-;48313:7;48349:23;48366:5;48349:16;:23::i;:::-;48341:5;:31;48333:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48438:12;:19;48451:5;48438:19;;;;;;;;;;;;;;;:26;48458:5;48438:26;;;;;;;;;;;;48431:33;;48216:256;;;;:::o;61362:1071::-;61455:25;61466:8;:13;61475:3;61466:13;;;;;;;;;;;;;;;;;;;;;;;;;61455:10;:25::i;:::-;61447:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;61535:14;61552:21;61567:5;61552:14;:21::i;:::-;61535:38;;61611:10;61584:37;;:10;61595:5;61584:17;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;:37;;;61580:140;;;;;;61682:6;61668:20;;:10;:20;;;61660:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;61580:140;61726:28;61757:7;:14;61765:5;61757:14;;;;;;;;;;;;;;;61726:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61778:23;61804:14;61819;61804:30;;;;;;:::i;:::-;;;;;;;;;;;;;;61778:56;;61981:3;61962:9;61972:5;61962:16;;;;;;:::i;:::-;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;62009:5;61991:8;:15;62000:5;61991:15;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;62037:4;62021:8;:13;62030:3;62021:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;62065:7;:14;62073:5;62065:14;;;;;;;;;;;;;;;62050:7;:12;62058:3;62050:12;;;;;;;;;;;;;;;:29;;;;;;:::i;:::-;;;;;;:::i;:::-;;62132:1;62110:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;62086:7;:14;62094:5;62086:14;;;;;;;;;;;;;;;:50;;;;;;;;;;;;:::i;:::-;;62194:16;:33;62211:15;62194:33;;;;;;;;;;;62145:16;:46;62162:14;62177:7;:12;62185:3;62177:12;;;;;;;;;;;;;;;62162:28;;;;;;:::i;:::-;;;;;;;;;;;;;;62145:46;;;;;;;;;;;:82;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;62270:65;;;;;;;;62285:5;62270:65;;;;62291:14;62306:7;:12;62314:3;62306:12;;;;;;;;;;;;;;;62291:28;;;;;;:::i;:::-;;;;;;;;;;;;;;62270:65;;;;62320:3;62270:65;;;;;;62324:4;62270:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62234:16;:33;62251:15;62234:33;;;;;;;;;;;:101;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;62344:39;62357:5;62363:3;62367:15;62344:12;:39::i;:::-;62395:32;62411:5;62417;62423:3;62395:32;;;;;;;;:::i;:::-;;;;;;;;61440:993;;;61362:1071;;;:::o;60226:134::-;60302:4;60350:3;60323:30;;:10;60334:5;60323:17;;;;;;:::i;:::-;;;;;;;;;;;;;:23;;;;;;;;;;;;:30;;;60315:39;;60226:134;;;;:::o;38978:185::-;39116:39;39133:4;39139:2;39143:7;39116:39;;;;;;;;;;;;:16;:39::i;:::-;38978:185;;;:::o;48738:233::-;48813:7;48849:30;:28;:30::i;:::-;48841:5;:38;48833:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48946:10;48957:5;48946:17;;;;;;;;:::i;:::-;;;;;;;;;;48939:24;;48738:233;;;:::o;35813:239::-;35885:7;35905:13;35921:7;:16;35929:7;35921:16;;;;;;;;;;;;;;;;;;;;;35905:32;;35973:1;35956:19;;:5;:19;;;;35948:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36039:5;36032:12;;;35813:239;;;:::o;56723:32::-;;;;:::o;58083:83::-;23554:12;:10;:12::i;:::-;23543:23;;:7;:5;:7::i;:::-;:23;;;23535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58153:7:::1;58143;:17;;;;58083:83:::0;:::o;35543:208::-;35615:7;35660:1;35643:19;;:5;:19;;;;35635:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35727:9;:16;35737:5;35727:16;;;;;;;;;;;;;;;;35720:23;;35543:208;;;:::o;23974:94::-;23554:12;:10;:12::i;:::-;23543:23;;:7;:5;:7::i;:::-;:23;;;23535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24039:21:::1;24057:1;24039:9;:21::i;:::-;23974:94::o:0;63290:144::-;63350:13;63381:16;:39;63398:14;63413:5;63398:21;;;;;;:::i;:::-;;;;;;;;;;;;;;63381:39;;;;;;;;;;;:47;;63374:54;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63290:144;;;:::o;58172:112::-;58234:13;58263:7;:15;58271:6;58263:15;;;;;;;;;;;;;;;58256:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58172:112;;;:::o;23323:87::-;23369:7;23396:6;;;;;;;;;;;23389:13;;23323:87;:::o;36288:104::-;36344:13;36377:7;36370:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36288:104;:::o;62787:150::-;62849:13;62878:16;:39;62895:14;62910:5;62895:21;;;;;;:::i;:::-;;;;;;;;;;;;;;62878:39;;;;;;;;;;;:53;;62871:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62787:150;;;:::o;37971:295::-;38086:12;:10;:12::i;:::-;38074:24;;:8;:24;;;;38066:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;38186:8;38141:18;:32;38160:12;:10;:12::i;:::-;38141:32;;;;;;;;;;;;;;;:42;38174:8;38141:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;38239:8;38210:48;;38225:12;:10;:12::i;:::-;38210:48;;;38249:8;38210:48;;;;;;:::i;:::-;;;;;;;;37971:295;;:::o;61144:212::-;61247:21;61262:5;61247:14;:21::i;:::-;61239:29;;61283:6;61275:32;;;61308:10;61319:21;61334:5;61319:14;:21::i;:::-;61341:8;61275:75;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61144:212;;;:::o;58407:248::-;58472:7;58496:21;58511:5;58496:14;:21::i;:::-;58488:29;;58524:18;58545:14;58560:5;58545:21;;;;;;:::i;:::-;;;;;;;;;;;;;;58524:42;;58573:23;58599:16;:28;58616:10;58599:28;;;;;;;;;;;58573:54;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58641:1;:8;;;58634:15;;;;58407:248;;;:::o;39234:328::-;39409:41;39428:12;:10;:12::i;:::-;39442:7;39409:18;:41::i;:::-;39401:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39515:39;39529:4;39535:2;39539:7;39548:5;39515:13;:39::i;:::-;39234:328;;;;:::o;36463:334::-;36536:13;36570:16;36578:7;36570;:16::i;:::-;36562:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36651:21;36675:10;:8;:10::i;:::-;36651:34;;36727:1;36709:7;36703:21;:25;:86;;;;;;;;;;;;;;;;;36755:7;36764:18;:7;:16;:18::i;:::-;36738:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36703:86;36696:93;;;36463:334;;;:::o;62943:341::-;63028:11;63040:5;63028:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;63020:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;63163:10;63113:60;;:16;:39;63130:14;63145:5;63130:21;;;;;;:::i;:::-;;;;;;;;;;;;;;63113:39;;;;;;;;;;;:46;;;;;;;;;;;;:60;;;63105:69;;;;;;63231:7;63181:16;:39;63198:14;63213:5;63198:21;;;;;;:::i;:::-;;;;;;;;;;;;;;63181:39;;;;;;;;;;;:47;;:57;;;;;;;;;;;;:::i;:::-;;63250:28;63264:5;63270:7;63250:28;;;;;;;:::i;:::-;;;;;;;;62943:341;;:::o;38337:164::-;38434:4;38458:18;:25;38477:5;38458:25;;;;;;;;;;;;;;;:35;38484:8;38458:35;;;;;;;;;;;;;;;;;;;;;;;;;38451:42;;38337:164;;;;:::o;24223:192::-;23554:12;:10;:12::i;:::-;23543:23;;:7;:5;:7::i;:::-;:23;;;23535:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24332:1:::1;24312:22;;:8;:22;;;;24304:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24388:19;24398:8;24388:9;:19::i;:::-;24223:192:::0;:::o;62439:342::-;62527:11;62539:5;62527:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;62519:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;62662:10;62612:60;;:16;:39;62629:14;62644:5;62629:21;;;;;;:::i;:::-;;;;;;;;;;;;;;62612:39;;;;;;;;;;;:46;;;;;;;;;;;;:60;;;62604:69;;;;;;62736:4;62680:16;:39;62697:14;62712:5;62697:21;;;;;;:::i;:::-;;;;;;;;;;;;;;62680:39;;;;;;;;;;;:53;;:60;;;;;;;;;;;;:::i;:::-;;62752:23;62764:5;62770:4;62752:23;;;;;;;:::i;:::-;;;;;;;;62439:342;;:::o;59871:349::-;59959:14;59976:9;59986:5;59976:16;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;59959:33;;60021:5;60007:19;;:10;:19;;;59999:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;60075:5;60065:15;;:6;:15;;;60057:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;60111:33;60147:27;;;;;;;;60160:5;60147:27;;;;60166:7;60147:27;;;;;60111:63;;60201:13;60181:10;60192:5;60181:17;;;;;;:::i;:::-;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59952:268;;59871:349;;;:::o;26607:190::-;26692:4;26716:36;26740:11;26716:23;:36::i;:::-;:73;;;;26756:20;:33;26777:11;26756:33;;;;;;;;;;;;;;;;;;;;;;;;;;;26716:73;26709:80;;26607:190;;;:::o;41072:127::-;41137:4;41189:1;41161:30;;:7;:16;41169:7;41161:16;;;;;;;;;;;;;;;;;;;;;:30;;;;41154:37;;41072:127;;;:::o;12558:313::-;12644:13;12670:23;12702:5;12670:38;;12724:6;12719:109;12740:10;:17;12736:1;:21;12719:109;;;12795:21;12802:10;12813:1;12802:13;;;;;;;;:::i;:::-;;;;;;;;;;12795:6;:21::i;:::-;12779:10;12790:1;12779:13;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;12759:3;;;;;:::i;:::-;;;;12719:109;;;;12852:10;12838:25;;;12558:313;;;:::o;58661:145::-;58714:4;58731:5;58727:74;;;58754:5;58747:12;;;;58727:74;58789:4;58782:11;;58661:145;;;;:::o;25477:114::-;25542:7;25569;:14;;;25562:21;;25477:114;;;:::o;42056:110::-;42132:26;42142:2;42146:7;42132:26;;;;;;;;;;;;:9;:26::i;:::-;42056:110;;:::o;25599:127::-;25706:1;25688:7;:14;;;:19;;;;;;;;;;;25599:127;:::o;22704:98::-;22757:7;22784:10;22777:17;;22704:98;:::o;45054:174::-;45156:2;45129:15;:24;45145:7;45129:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45212:7;45208:2;45174:46;;45183:23;45198:7;45183:14;:23::i;:::-;45174:46;;;;;;;;;;;;45054:174;;:::o;41366:348::-;41459:4;41484:16;41492:7;41484;:16::i;:::-;41476:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41560:13;41576:23;41591:7;41576:14;:23::i;:::-;41560:39;;41629:5;41618:16;;:7;:16;;;:51;;;;41662:7;41638:31;;:20;41650:7;41638:11;:20::i;:::-;:31;;;41618:51;:87;;;;41673:32;41690:5;41697:7;41673:16;:32::i;:::-;41618:87;41610:96;;;41366:348;;;;:::o;44358:578::-;44517:4;44490:31;;:23;44505:7;44490:14;:23::i;:::-;:31;;;44482:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;44600:1;44586:16;;:2;:16;;;;44578:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44656:39;44677:4;44683:2;44687:7;44656:20;:39::i;:::-;44760:29;44777:1;44781:7;44760:8;:29::i;:::-;44821:1;44802:9;:15;44812:4;44802:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44850:1;44833:9;:13;44843:2;44833:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44881:2;44862:7;:16;44870:7;44862:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44920:7;44916:2;44901:27;;44910:4;44901:27;;;;;;;;;;;;44358:578;;;:::o;24423:173::-;24479:16;24498:6;;;;;;;;;;;24479:25;;24524:8;24515:6;;:17;;;;;;;;;;;;;;;;;;24579:8;24548:40;;24569:8;24548:40;;;;;;;;;;;;24468:128;24423:173;:::o;40444:315::-;40601:28;40611:4;40617:2;40621:7;40601:9;:28::i;:::-;40648:48;40671:4;40677:2;40681:7;40690:5;40648:22;:48::i;:::-;40640:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;40444:315;;;;:::o;37045:94::-;37096:13;37122:9;;;;;;;;;;;;;;37045:94;:::o;972:723::-;1028:13;1258:1;1249:5;:10;1245:53;;;1276:10;;;;;;;;;;;;;;;;;;;;;1245:53;1308:12;1323:5;1308:20;;1339:14;1364:78;1379:1;1371:4;:9;1364:78;;1397:8;;;;;:::i;:::-;;;;1428:2;1420:10;;;;;:::i;:::-;;;1364:78;;;1452:19;1484:6;1474:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1452:39;;1502:154;1518:1;1509:5;:10;1502:154;;1546:1;1536:11;;;;;:::i;:::-;;;1613:2;1605:5;:10;;;;:::i;:::-;1592:2;:24;;;;:::i;:::-;1579:39;;1562:6;1569;1562:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1642:2;1633:11;;;;;:::i;:::-;;;1502:154;;;1680:6;1666:21;;;;;972:723;;;;:::o;47908:224::-;48010:4;48049:35;48034:50;;;:11;:50;;;;:90;;;;48088:36;48112:11;48088:23;:36::i;:::-;48034:90;48027:97;;47908:224;;;:::o;13901:217::-;13978:6;14010:4;14003:11;;:3;:11;;;;;:26;;;;;14025:4;14018:11;;:3;:11;;;;;14003:26;13999:89;;;14073:2;14066:3;14060:10;;:15;;;;:::i;:::-;14053:23;;14046:30;;;;13999:89;14107:3;14100:10;;13901:217;;;;:::o;42393:321::-;42523:18;42529:2;42533:7;42523:5;:18::i;:::-;42574:54;42605:1;42609:2;42613:7;42622:5;42574:22;:54::i;:::-;42552:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;42393:321;;;:::o;49584:589::-;49728:45;49755:4;49761:2;49765:7;49728:26;:45::i;:::-;49806:1;49790:18;;:4;:18;;;49786:187;;;49825:40;49857:7;49825:31;:40::i;:::-;49786:187;;;49895:2;49887:10;;:4;:10;;;49883:90;;49914:47;49947:4;49953:7;49914:32;:47::i;:::-;49883:90;49786:187;50001:1;49987:16;;:2;:16;;;49983:183;;;50020:45;50057:7;50020:36;:45::i;:::-;49983:183;;;50093:4;50087:10;;:2;:10;;;50083:83;;50114:40;50142:2;50146:7;50114:27;:40::i;:::-;50083:83;49983:183;49584:589;;;:::o;45793:799::-;45948:4;45969:15;:2;:13;;;:15::i;:::-;45965:620;;;46021:2;46005:36;;;46042:12;:10;:12::i;:::-;46056:4;46062:7;46071:5;46005:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46001:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46264:1;46247:6;:13;:18;46243:272;;;46290:60;;;;;;;;;;:::i;:::-;;;;;;;;46243:272;46465:6;46459:13;46450:6;46446:2;46442:15;46435:38;46001:529;46138:41;;;46128:51;;;:6;:51;;;;46121:58;;;;;45965:620;46569:4;46562:11;;45793:799;;;;;;;:::o;35174:305::-;35276:4;35328:25;35313:40;;;:11;:40;;;;:105;;;;35385:33;35370:48;;;:11;:48;;;;35313:105;:158;;;;35435:36;35459:11;35435:23;:36::i;:::-;35313:158;35293:178;;35174:305;;;:::o;43050:382::-;43144:1;43130:16;;:2;:16;;;;43122:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43203:16;43211:7;43203;:16::i;:::-;43202:17;43194:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43265:45;43294:1;43298:2;43302:7;43265:20;:45::i;:::-;43340:1;43323:9;:13;43333:2;43323:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43371:2;43352:7;:16;43360:7;43352:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43416:7;43412:2;43391:33;;43408:1;43391:33;;;;;;;;;;;;43050:382;;:::o;47164:126::-;;;;:::o;50896:164::-;51000:10;:17;;;;50973:15;:24;50989:7;50973:24;;;;;;;;;;;:44;;;;51028:10;51044:7;51028:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50896:164;:::o;51687:988::-;51953:22;52003:1;51978:22;51995:4;51978:16;:22::i;:::-;:26;;;;:::i;:::-;51953:51;;52015:18;52036:17;:26;52054:7;52036:26;;;;;;;;;;;;52015:47;;52183:14;52169:10;:28;52165:328;;52214:19;52236:12;:18;52249:4;52236:18;;;;;;;;;;;;;;;:34;52255:14;52236:34;;;;;;;;;;;;52214:56;;52320:11;52287:12;:18;52300:4;52287:18;;;;;;;;;;;;;;;:30;52306:10;52287:30;;;;;;;;;;;:44;;;;52437:10;52404:17;:30;52422:11;52404:30;;;;;;;;;;;:43;;;;52199:294;52165:328;52589:17;:26;52607:7;52589:26;;;;;;;;;;;52582:33;;;52633:12;:18;52646:4;52633:18;;;;;;;;;;;;;;;:34;52652:14;52633:34;;;;;;;;;;;52626:41;;;51768:907;;51687:988;;:::o;52970:1079::-;53223:22;53268:1;53248:10;:17;;;;:21;;;;:::i;:::-;53223:46;;53280:18;53301:15;:24;53317:7;53301:24;;;;;;;;;;;;53280:45;;53652:19;53674:10;53685:14;53674:26;;;;;;;;:::i;:::-;;;;;;;;;;53652:48;;53738:11;53713:10;53724;53713:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53849:10;53818:15;:28;53834:11;53818:28;;;;;;;;;;;:41;;;;53990:15;:24;54006:7;53990:24;;;;;;;;;;;53983:31;;;54025:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;53041:1008;;;52970:1079;:::o;50474:221::-;50559:14;50576:20;50593:2;50576:16;:20::i;:::-;50559:37;;50634:7;50607:12;:16;50620:2;50607:16;;;;;;;;;;;;;;;:24;50624:6;50607:24;;;;;;;;;;;:34;;;;50681:6;50652:17;:26;50670:7;50652:26;;;;;;;;;;;:35;;;;50548:147;50474:221;;:::o;15340:387::-;15400:4;15608:12;15675:7;15663:20;15655:28;;15718:1;15711:4;:8;15704:15;;;15340:387;;;:::o;26177:157::-;26262:4;26301:25;26286:40;;;:11;:40;;;;26279:47;;26177:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:143::-;2477:5;2508:6;2502:13;2493:22;;2524:33;2551:5;2524:33;:::i;:::-;2420:143;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:474::-;2972:6;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;2904:474;;;;;:::o;3384:799::-;3471:6;3479;3487;3536:2;3524:9;3515:7;3511:23;3507:32;3504:119;;;3542:79;;:::i;:::-;3504:119;3662:1;3687:53;3732:7;3723:6;3712:9;3708:22;3687:53;:::i;:::-;3677:63;;3633:117;3789:2;3815:53;3860:7;3851:6;3840:9;3836:22;3815:53;:::i;:::-;3805:63;;3760:118;3945:2;3934:9;3930:18;3917:32;3976:18;3968:6;3965:30;3962:117;;;3998:79;;:::i;:::-;3962:117;4103:63;4158:7;4149:6;4138:9;4134:22;4103:63;:::i;:::-;4093:73;;3888:288;3384:799;;;;;:::o;4189:619::-;4266:6;4274;4282;4331:2;4319:9;4310:7;4306:23;4302:32;4299:119;;;4337:79;;:::i;:::-;4299:119;4457:1;4482:53;4527:7;4518:6;4507:9;4503:22;4482:53;:::i;:::-;4472:63;;4428:117;4584:2;4610:53;4655:7;4646:6;4635:9;4631:22;4610:53;:::i;:::-;4600:63;;4555:118;4712:2;4738:53;4783:7;4774:6;4763:9;4759:22;4738:53;:::i;:::-;4728:63;;4683:118;4189:619;;;;;:::o;4814:943::-;4909:6;4917;4925;4933;4982:3;4970:9;4961:7;4957:23;4953:33;4950:120;;;4989:79;;:::i;:::-;4950:120;5109:1;5134:53;5179:7;5170:6;5159:9;5155:22;5134:53;:::i;:::-;5124:63;;5080:117;5236:2;5262:53;5307:7;5298:6;5287:9;5283:22;5262:53;:::i;:::-;5252:63;;5207:118;5364:2;5390:53;5435:7;5426:6;5415:9;5411:22;5390:53;:::i;:::-;5380:63;;5335:118;5520:2;5509:9;5505:18;5492:32;5551:18;5543:6;5540:30;5537:117;;;5573:79;;:::i;:::-;5537:117;5678:62;5732:7;5723:6;5712:9;5708:22;5678:62;:::i;:::-;5668:72;;5463:287;4814:943;;;;;;;:::o;5763:468::-;5828:6;5836;5885:2;5873:9;5864:7;5860:23;5856:32;5853:119;;;5891:79;;:::i;:::-;5853:119;6011:1;6036:53;6081:7;6072:6;6061:9;6057:22;6036:53;:::i;:::-;6026:63;;5982:117;6138:2;6164:50;6206:7;6197:6;6186:9;6182:22;6164:50;:::i;:::-;6154:60;;6109:115;5763:468;;;;;:::o;6237:474::-;6305:6;6313;6362:2;6350:9;6341:7;6337:23;6333:32;6330:119;;;6368:79;;:::i;:::-;6330:119;6488:1;6513:53;6558:7;6549:6;6538:9;6534:22;6513:53;:::i;:::-;6503:63;;6459:117;6615:2;6641:53;6686:7;6677:6;6666:9;6662:22;6641:53;:::i;:::-;6631:63;;6586:118;6237:474;;;;;:::o;6717:799::-;6804:6;6812;6820;6869:2;6857:9;6848:7;6844:23;6840:32;6837:119;;;6875:79;;:::i;:::-;6837:119;6995:1;7020:53;7065:7;7056:6;7045:9;7041:22;7020:53;:::i;:::-;7010:63;;6966:117;7122:2;7148:53;7193:7;7184:6;7173:9;7169:22;7148:53;:::i;:::-;7138:63;;7093:118;7278:2;7267:9;7263:18;7250:32;7309:18;7301:6;7298:30;7295:117;;;7331:79;;:::i;:::-;7295:117;7436:63;7491:7;7482:6;7471:9;7467:22;7436:63;:::i;:::-;7426:73;;7221:288;6717:799;;;;;:::o;7522:345::-;7589:6;7638:2;7626:9;7617:7;7613:23;7609:32;7606:119;;;7644:79;;:::i;:::-;7606:119;7764:1;7789:61;7842:7;7833:6;7822:9;7818:22;7789:61;:::i;:::-;7779:71;;7735:125;7522:345;;;;:::o;7873:327::-;7931:6;7980:2;7968:9;7959:7;7955:23;7951:32;7948:119;;;7986:79;;:::i;:::-;7948:119;8106:1;8131:52;8175:7;8166:6;8155:9;8151:22;8131:52;:::i;:::-;8121:62;;8077:116;7873:327;;;;:::o;8206:349::-;8275:6;8324:2;8312:9;8303:7;8299:23;8295:32;8292:119;;;8330:79;;:::i;:::-;8292:119;8450:1;8475:63;8530:7;8521:6;8510:9;8506:22;8475:63;:::i;:::-;8465:73;;8421:127;8206:349;;;;:::o;8561:509::-;8630:6;8679:2;8667:9;8658:7;8654:23;8650:32;8647:119;;;8685:79;;:::i;:::-;8647:119;8833:1;8822:9;8818:17;8805:31;8863:18;8855:6;8852:30;8849:117;;;8885:79;;:::i;:::-;8849:117;8990:63;9045:7;9036:6;9025:9;9021:22;8990:63;:::i;:::-;8980:73;;8776:287;8561:509;;;;:::o;9076:654::-;9154:6;9162;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9365:1;9354:9;9350:17;9337:31;9395:18;9387:6;9384:30;9381:117;;;9417:79;;:::i;:::-;9381:117;9522:63;9577:7;9568:6;9557:9;9553:22;9522:63;:::i;:::-;9512:73;;9308:287;9634:2;9660:53;9705:7;9696:6;9685:9;9681:22;9660:53;:::i;:::-;9650:63;;9605:118;9076:654;;;;;:::o;9736:799::-;9823:6;9831;9839;9888:2;9876:9;9867:7;9863:23;9859:32;9856:119;;;9894:79;;:::i;:::-;9856:119;10042:1;10031:9;10027:17;10014:31;10072:18;10064:6;10061:30;10058:117;;;10094:79;;:::i;:::-;10058:117;10199:63;10254:7;10245:6;10234:9;10230:22;10199:63;:::i;:::-;10189:73;;9985:287;10311:2;10337:53;10382:7;10373:6;10362:9;10358:22;10337:53;:::i;:::-;10327:63;;10282:118;10439:2;10465:53;10510:7;10501:6;10490:9;10486:22;10465:53;:::i;:::-;10455:63;;10410:118;9736:799;;;;;:::o;10541:834::-;10629:6;10637;10686:2;10674:9;10665:7;10661:23;10657:32;10654:119;;;10692:79;;:::i;:::-;10654:119;10840:1;10829:9;10825:17;10812:31;10870:18;10862:6;10859:30;10856:117;;;10892:79;;:::i;:::-;10856:117;10997:63;11052:7;11043:6;11032:9;11028:22;10997:63;:::i;:::-;10987:73;;10783:287;11137:2;11126:9;11122:18;11109:32;11168:18;11160:6;11157:30;11154:117;;;11190:79;;:::i;:::-;11154:117;11295:63;11350:7;11341:6;11330:9;11326:22;11295:63;:::i;:::-;11285:73;;11080:288;10541:834;;;;;:::o;11381:329::-;11440:6;11489:2;11477:9;11468:7;11464:23;11460:32;11457:119;;;11495:79;;:::i;:::-;11457:119;11615:1;11640:53;11685:7;11676:6;11665:9;11661:22;11640:53;:::i;:::-;11630:63;;11586:117;11381:329;;;;:::o;11716:351::-;11786:6;11835:2;11823:9;11814:7;11810:23;11806:32;11803:119;;;11841:79;;:::i;:::-;11803:119;11961:1;11986:64;12042:7;12033:6;12022:9;12018:22;11986:64;:::i;:::-;11976:74;;11932:128;11716:351;;;;:::o;12073:118::-;12160:24;12178:5;12160:24;:::i;:::-;12155:3;12148:37;12073:118;;:::o;12197:109::-;12278:21;12293:5;12278:21;:::i;:::-;12273:3;12266:34;12197:109;;:::o;12312:360::-;12398:3;12426:38;12458:5;12426:38;:::i;:::-;12480:70;12543:6;12538:3;12480:70;:::i;:::-;12473:77;;12559:52;12604:6;12599:3;12592:4;12585:5;12581:16;12559:52;:::i;:::-;12636:29;12658:6;12636:29;:::i;:::-;12631:3;12627:39;12620:46;;12402:270;12312:360;;;;:::o;12678:364::-;12766:3;12794:39;12827:5;12794:39;:::i;:::-;12849:71;12913:6;12908:3;12849:71;:::i;:::-;12842:78;;12929:52;12974:6;12969:3;12962:4;12955:5;12951:16;12929:52;:::i;:::-;13006:29;13028:6;13006:29;:::i;:::-;13001:3;12997:39;12990:46;;12770:272;12678:364;;;;:::o;13048:377::-;13154:3;13182:39;13215:5;13182:39;:::i;:::-;13237:89;13319:6;13314:3;13237:89;:::i;:::-;13230:96;;13335:52;13380:6;13375:3;13368:4;13361:5;13357:16;13335:52;:::i;:::-;13412:6;13407:3;13403:16;13396:23;;13158:267;13048:377;;;;:::o;13455:845::-;13558:3;13595:5;13589:12;13624:36;13650:9;13624:36;:::i;:::-;13676:89;13758:6;13753:3;13676:89;:::i;:::-;13669:96;;13796:1;13785:9;13781:17;13812:1;13807:137;;;;13958:1;13953:341;;;;13774:520;;13807:137;13891:4;13887:9;13876;13872:25;13867:3;13860:38;13927:6;13922:3;13918:16;13911:23;;13807:137;;13953:341;14020:38;14052:5;14020:38;:::i;:::-;14080:1;14094:154;14108:6;14105:1;14102:13;14094:154;;;14182:7;14176:14;14172:1;14167:3;14163:11;14156:35;14232:1;14223:7;14219:15;14208:26;;14130:4;14127:1;14123:12;14118:17;;14094:154;;;14277:6;14272:3;14268:16;14261:23;;13960:334;;13774:520;;13562:738;;13455:845;;;;:::o;14306:366::-;14448:3;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14545:93;14634:3;14545:93;:::i;:::-;14663:2;14658:3;14654:12;14647:19;;14306:366;;;:::o;14678:::-;14820:3;14841:67;14905:2;14900:3;14841:67;:::i;:::-;14834:74;;14917:93;15006:3;14917:93;:::i;:::-;15035:2;15030:3;15026:12;15019:19;;14678:366;;;:::o;15050:::-;15192:3;15213:67;15277:2;15272:3;15213:67;:::i;:::-;15206:74;;15289:93;15378:3;15289:93;:::i;:::-;15407:2;15402:3;15398:12;15391:19;;15050:366;;;:::o;15422:::-;15564:3;15585:67;15649:2;15644:3;15585:67;:::i;:::-;15578:74;;15661:93;15750:3;15661:93;:::i;:::-;15779:2;15774:3;15770:12;15763:19;;15422:366;;;:::o;15794:::-;15936:3;15957:67;16021:2;16016:3;15957:67;:::i;:::-;15950:74;;16033:93;16122:3;16033:93;:::i;:::-;16151:2;16146:3;16142:12;16135:19;;15794:366;;;:::o;16166:::-;16308:3;16329:67;16393:2;16388:3;16329:67;:::i;:::-;16322:74;;16405:93;16494:3;16405:93;:::i;:::-;16523:2;16518:3;16514:12;16507:19;;16166:366;;;:::o;16538:::-;16680:3;16701:67;16765:2;16760:3;16701:67;:::i;:::-;16694:74;;16777:93;16866:3;16777:93;:::i;:::-;16895:2;16890:3;16886:12;16879:19;;16538:366;;;:::o;16910:::-;17052:3;17073:67;17137:2;17132:3;17073:67;:::i;:::-;17066:74;;17149:93;17238:3;17149:93;:::i;:::-;17267:2;17262:3;17258:12;17251:19;;16910:366;;;:::o;17282:::-;17424:3;17445:67;17509:2;17504:3;17445:67;:::i;:::-;17438:74;;17521:93;17610:3;17521:93;:::i;:::-;17639:2;17634:3;17630:12;17623:19;;17282:366;;;:::o;17654:::-;17796:3;17817:67;17881:2;17876:3;17817:67;:::i;:::-;17810:74;;17893:93;17982:3;17893:93;:::i;:::-;18011:2;18006:3;18002:12;17995:19;;17654:366;;;:::o;18026:::-;18168:3;18189:67;18253:2;18248:3;18189:67;:::i;:::-;18182:74;;18265:93;18354:3;18265:93;:::i;:::-;18383:2;18378:3;18374:12;18367:19;;18026:366;;;:::o;18398:::-;18540:3;18561:67;18625:2;18620:3;18561:67;:::i;:::-;18554:74;;18637:93;18726:3;18637:93;:::i;:::-;18755:2;18750:3;18746:12;18739:19;;18398:366;;;:::o;18770:::-;18912:3;18933:67;18997:2;18992:3;18933:67;:::i;:::-;18926:74;;19009:93;19098:3;19009:93;:::i;:::-;19127:2;19122:3;19118:12;19111:19;;18770:366;;;:::o;19142:::-;19284:3;19305:67;19369:2;19364:3;19305:67;:::i;:::-;19298:74;;19381:93;19470:3;19381:93;:::i;:::-;19499:2;19494:3;19490:12;19483:19;;19142:366;;;:::o;19514:::-;19656:3;19677:67;19741:2;19736:3;19677:67;:::i;:::-;19670:74;;19753:93;19842:3;19753:93;:::i;:::-;19871:2;19866:3;19862:12;19855:19;;19514:366;;;:::o;19886:::-;20028:3;20049:67;20113:2;20108:3;20049:67;:::i;:::-;20042:74;;20125:93;20214:3;20125:93;:::i;:::-;20243:2;20238:3;20234:12;20227:19;;19886:366;;;:::o;20258:::-;20400:3;20421:67;20485:2;20480:3;20421:67;:::i;:::-;20414:74;;20497:93;20586:3;20497:93;:::i;:::-;20615:2;20610:3;20606:12;20599:19;;20258:366;;;:::o;20630:::-;20772:3;20793:67;20857:2;20852:3;20793:67;:::i;:::-;20786:74;;20869:93;20958:3;20869:93;:::i;:::-;20987:2;20982:3;20978:12;20971:19;;20630:366;;;:::o;21002:::-;21144:3;21165:67;21229:2;21224:3;21165:67;:::i;:::-;21158:74;;21241:93;21330:3;21241:93;:::i;:::-;21359:2;21354:3;21350:12;21343:19;;21002:366;;;:::o;21374:::-;21516:3;21537:67;21601:2;21596:3;21537:67;:::i;:::-;21530:74;;21613:93;21702:3;21613:93;:::i;:::-;21731:2;21726:3;21722:12;21715:19;;21374:366;;;:::o;21746:::-;21888:3;21909:67;21973:2;21968:3;21909:67;:::i;:::-;21902:74;;21985:93;22074:3;21985:93;:::i;:::-;22103:2;22098:3;22094:12;22087:19;;21746:366;;;:::o;22118:::-;22260:3;22281:67;22345:2;22340:3;22281:67;:::i;:::-;22274:74;;22357:93;22446:3;22357:93;:::i;:::-;22475:2;22470:3;22466:12;22459:19;;22118:366;;;:::o;22490:::-;22632:3;22653:67;22717:2;22712:3;22653:67;:::i;:::-;22646:74;;22729:93;22818:3;22729:93;:::i;:::-;22847:2;22842:3;22838:12;22831:19;;22490:366;;;:::o;22862:::-;23004:3;23025:67;23089:2;23084:3;23025:67;:::i;:::-;23018:74;;23101:93;23190:3;23101:93;:::i;:::-;23219:2;23214:3;23210:12;23203:19;;22862:366;;;:::o;23234:::-;23376:3;23397:67;23461:2;23456:3;23397:67;:::i;:::-;23390:74;;23473:93;23562:3;23473:93;:::i;:::-;23591:2;23586:3;23582:12;23575:19;;23234:366;;;:::o;23606:118::-;23693:24;23711:5;23693:24;:::i;:::-;23688:3;23681:37;23606:118;;:::o;23730:157::-;23835:45;23855:24;23873:5;23855:24;:::i;:::-;23835:45;:::i;:::-;23830:3;23823:58;23730:157;;:::o;23893:275::-;24025:3;24047:95;24138:3;24129:6;24047:95;:::i;:::-;24040:102;;24159:3;24152:10;;23893:275;;;;:::o;24174:435::-;24354:3;24376:95;24467:3;24458:6;24376:95;:::i;:::-;24369:102;;24488:95;24579:3;24570:6;24488:95;:::i;:::-;24481:102;;24600:3;24593:10;;24174:435;;;;;:::o;24615:269::-;24744:3;24766:92;24854:3;24845:6;24766:92;:::i;:::-;24759:99;;24875:3;24868:10;;24615:269;;;;:::o;24890:256::-;25002:3;25017:75;25088:3;25079:6;25017:75;:::i;:::-;25117:2;25112:3;25108:12;25101:19;;25137:3;25130:10;;24890:256;;;;:::o;25152:222::-;25245:4;25283:2;25272:9;25268:18;25260:26;;25296:71;25364:1;25353:9;25349:17;25340:6;25296:71;:::i;:::-;25152:222;;;;:::o;25380:442::-;25529:4;25567:2;25556:9;25552:18;25544:26;;25580:71;25648:1;25637:9;25633:17;25624:6;25580:71;:::i;:::-;25661:72;25729:2;25718:9;25714:18;25705:6;25661:72;:::i;:::-;25743;25811:2;25800:9;25796:18;25787:6;25743:72;:::i;:::-;25380:442;;;;;;:::o;25828:640::-;26023:4;26061:3;26050:9;26046:19;26038:27;;26075:71;26143:1;26132:9;26128:17;26119:6;26075:71;:::i;:::-;26156:72;26224:2;26213:9;26209:18;26200:6;26156:72;:::i;:::-;26238;26306:2;26295:9;26291:18;26282:6;26238:72;:::i;:::-;26357:9;26351:4;26347:20;26342:2;26331:9;26327:18;26320:48;26385:76;26456:4;26447:6;26385:76;:::i;:::-;26377:84;;25828:640;;;;;;;:::o;26474:332::-;26595:4;26633:2;26622:9;26618:18;26610:26;;26646:71;26714:1;26703:9;26699:17;26690:6;26646:71;:::i;:::-;26727:72;26795:2;26784:9;26780:18;26771:6;26727:72;:::i;:::-;26474:332;;;;;:::o;26812:210::-;26899:4;26937:2;26926:9;26922:18;26914:26;;26950:65;27012:1;27001:9;26997:17;26988:6;26950:65;:::i;:::-;26812:210;;;;:::o;27028:313::-;27141:4;27179:2;27168:9;27164:18;27156:26;;27228:9;27222:4;27218:20;27214:1;27203:9;27199:17;27192:47;27256:78;27329:4;27320:6;27256:78;:::i;:::-;27248:86;;27028:313;;;;:::o;27347:533::-;27516:4;27554:2;27543:9;27539:18;27531:26;;27603:9;27597:4;27593:20;27589:1;27578:9;27574:17;27567:47;27631:78;27704:4;27695:6;27631:78;:::i;:::-;27623:86;;27719:72;27787:2;27776:9;27772:18;27763:6;27719:72;:::i;:::-;27801;27869:2;27858:9;27854:18;27845:6;27801:72;:::i;:::-;27347:533;;;;;;:::o;27886:514::-;28047:4;28085:2;28074:9;28070:18;28062:26;;28134:9;28128:4;28124:20;28120:1;28109:9;28105:17;28098:47;28162:78;28235:4;28226:6;28162:78;:::i;:::-;28154:86;;28287:9;28281:4;28277:20;28272:2;28261:9;28257:18;28250:48;28315:78;28388:4;28379:6;28315:78;:::i;:::-;28307:86;;27886:514;;;;;:::o;28406:419::-;28572:4;28610:2;28599:9;28595:18;28587:26;;28659:9;28653:4;28649:20;28645:1;28634:9;28630:17;28623:47;28687:131;28813:4;28687:131;:::i;:::-;28679:139;;28406:419;;;:::o;28831:::-;28997:4;29035:2;29024:9;29020:18;29012:26;;29084:9;29078:4;29074:20;29070:1;29059:9;29055:17;29048:47;29112:131;29238:4;29112:131;:::i;:::-;29104:139;;28831:419;;;:::o;29256:::-;29422:4;29460:2;29449:9;29445:18;29437:26;;29509:9;29503:4;29499:20;29495:1;29484:9;29480:17;29473:47;29537:131;29663:4;29537:131;:::i;:::-;29529:139;;29256:419;;;:::o;29681:::-;29847:4;29885:2;29874:9;29870:18;29862:26;;29934:9;29928:4;29924:20;29920:1;29909:9;29905:17;29898:47;29962:131;30088:4;29962:131;:::i;:::-;29954:139;;29681:419;;;:::o;30106:::-;30272:4;30310:2;30299:9;30295:18;30287:26;;30359:9;30353:4;30349:20;30345:1;30334:9;30330:17;30323:47;30387:131;30513:4;30387:131;:::i;:::-;30379:139;;30106:419;;;:::o;30531:::-;30697:4;30735:2;30724:9;30720:18;30712:26;;30784:9;30778:4;30774:20;30770:1;30759:9;30755:17;30748:47;30812:131;30938:4;30812:131;:::i;:::-;30804:139;;30531:419;;;:::o;30956:::-;31122:4;31160:2;31149:9;31145:18;31137:26;;31209:9;31203:4;31199:20;31195:1;31184:9;31180:17;31173:47;31237:131;31363:4;31237:131;:::i;:::-;31229:139;;30956:419;;;:::o;31381:::-;31547:4;31585:2;31574:9;31570:18;31562:26;;31634:9;31628:4;31624:20;31620:1;31609:9;31605:17;31598:47;31662:131;31788:4;31662:131;:::i;:::-;31654:139;;31381:419;;;:::o;31806:::-;31972:4;32010:2;31999:9;31995:18;31987:26;;32059:9;32053:4;32049:20;32045:1;32034:9;32030:17;32023:47;32087:131;32213:4;32087:131;:::i;:::-;32079:139;;31806:419;;;:::o;32231:::-;32397:4;32435:2;32424:9;32420:18;32412:26;;32484:9;32478:4;32474:20;32470:1;32459:9;32455:17;32448:47;32512:131;32638:4;32512:131;:::i;:::-;32504:139;;32231:419;;;:::o;32656:::-;32822:4;32860:2;32849:9;32845:18;32837:26;;32909:9;32903:4;32899:20;32895:1;32884:9;32880:17;32873:47;32937:131;33063:4;32937:131;:::i;:::-;32929:139;;32656:419;;;:::o;33081:::-;33247:4;33285:2;33274:9;33270:18;33262:26;;33334:9;33328:4;33324:20;33320:1;33309:9;33305:17;33298:47;33362:131;33488:4;33362:131;:::i;:::-;33354:139;;33081:419;;;:::o;33506:::-;33672:4;33710:2;33699:9;33695:18;33687:26;;33759:9;33753:4;33749:20;33745:1;33734:9;33730:17;33723:47;33787:131;33913:4;33787:131;:::i;:::-;33779:139;;33506:419;;;:::o;33931:::-;34097:4;34135:2;34124:9;34120:18;34112:26;;34184:9;34178:4;34174:20;34170:1;34159:9;34155:17;34148:47;34212:131;34338:4;34212:131;:::i;:::-;34204:139;;33931:419;;;:::o;34356:::-;34522:4;34560:2;34549:9;34545:18;34537:26;;34609:9;34603:4;34599:20;34595:1;34584:9;34580:17;34573:47;34637:131;34763:4;34637:131;:::i;:::-;34629:139;;34356:419;;;:::o;34781:::-;34947:4;34985:2;34974:9;34970:18;34962:26;;35034:9;35028:4;35024:20;35020:1;35009:9;35005:17;34998:47;35062:131;35188:4;35062:131;:::i;:::-;35054:139;;34781:419;;;:::o;35206:::-;35372:4;35410:2;35399:9;35395:18;35387:26;;35459:9;35453:4;35449:20;35445:1;35434:9;35430:17;35423:47;35487:131;35613:4;35487:131;:::i;:::-;35479:139;;35206:419;;;:::o;35631:::-;35797:4;35835:2;35824:9;35820:18;35812:26;;35884:9;35878:4;35874:20;35870:1;35859:9;35855:17;35848:47;35912:131;36038:4;35912:131;:::i;:::-;35904:139;;35631:419;;;:::o;36056:::-;36222:4;36260:2;36249:9;36245:18;36237:26;;36309:9;36303:4;36299:20;36295:1;36284:9;36280:17;36273:47;36337:131;36463:4;36337:131;:::i;:::-;36329:139;;36056:419;;;:::o;36481:::-;36647:4;36685:2;36674:9;36670:18;36662:26;;36734:9;36728:4;36724:20;36720:1;36709:9;36705:17;36698:47;36762:131;36888:4;36762:131;:::i;:::-;36754:139;;36481:419;;;:::o;36906:::-;37072:4;37110:2;37099:9;37095:18;37087:26;;37159:9;37153:4;37149:20;37145:1;37134:9;37130:17;37123:47;37187:131;37313:4;37187:131;:::i;:::-;37179:139;;36906:419;;;:::o;37331:::-;37497:4;37535:2;37524:9;37520:18;37512:26;;37584:9;37578:4;37574:20;37570:1;37559:9;37555:17;37548:47;37612:131;37738:4;37612:131;:::i;:::-;37604:139;;37331:419;;;:::o;37756:::-;37922:4;37960:2;37949:9;37945:18;37937:26;;38009:9;38003:4;37999:20;37995:1;37984:9;37980:17;37973:47;38037:131;38163:4;38037:131;:::i;:::-;38029:139;;37756:419;;;:::o;38181:::-;38347:4;38385:2;38374:9;38370:18;38362:26;;38434:9;38428:4;38424:20;38420:1;38409:9;38405:17;38398:47;38462:131;38588:4;38462:131;:::i;:::-;38454:139;;38181:419;;;:::o;38606:::-;38772:4;38810:2;38799:9;38795:18;38787:26;;38859:9;38853:4;38849:20;38845:1;38834:9;38830:17;38823:47;38887:131;39013:4;38887:131;:::i;:::-;38879:139;;38606:419;;;:::o;39031:222::-;39124:4;39162:2;39151:9;39147:18;39139:26;;39175:71;39243:1;39232:9;39228:17;39219:6;39175:71;:::i;:::-;39031:222;;;;:::o;39259:129::-;39293:6;39320:20;;:::i;:::-;39310:30;;39349:33;39377:4;39369:6;39349:33;:::i;:::-;39259:129;;;:::o;39394:75::-;39427:6;39460:2;39454:9;39444:19;;39394:75;:::o;39475:307::-;39536:4;39626:18;39618:6;39615:30;39612:56;;;39648:18;;:::i;:::-;39612:56;39686:29;39708:6;39686:29;:::i;:::-;39678:37;;39770:4;39764;39760:15;39752:23;;39475:307;;;:::o;39788:308::-;39850:4;39940:18;39932:6;39929:30;39926:56;;;39962:18;;:::i;:::-;39926:56;40000:29;40022:6;40000:29;:::i;:::-;39992:37;;40084:4;40078;40074:15;40066:23;;39788:308;;;:::o;40102:141::-;40151:4;40174:3;40166:11;;40197:3;40194:1;40187:14;40231:4;40228:1;40218:18;40210:26;;40102:141;;;:::o;40249:98::-;40300:6;40334:5;40328:12;40318:22;;40249:98;;;:::o;40353:99::-;40405:6;40439:5;40433:12;40423:22;;40353:99;;;:::o;40458:168::-;40541:11;40575:6;40570:3;40563:19;40615:4;40610:3;40606:14;40591:29;;40458:168;;;;:::o;40632:169::-;40716:11;40750:6;40745:3;40738:19;40790:4;40785:3;40781:14;40766:29;;40632:169;;;;:::o;40807:148::-;40909:11;40946:3;40931:18;;40807:148;;;;:::o;40961:305::-;41001:3;41020:20;41038:1;41020:20;:::i;:::-;41015:25;;41054:20;41072:1;41054:20;:::i;:::-;41049:25;;41208:1;41140:66;41136:74;41133:1;41130:81;41127:107;;;41214:18;;:::i;:::-;41127:107;41258:1;41255;41251:9;41244:16;;40961:305;;;;:::o;41272:185::-;41312:1;41329:20;41347:1;41329:20;:::i;:::-;41324:25;;41363:20;41381:1;41363:20;:::i;:::-;41358:25;;41402:1;41392:35;;41407:18;;:::i;:::-;41392:35;41449:1;41446;41442:9;41437:14;;41272:185;;;;:::o;41463:191::-;41503:4;41523:20;41541:1;41523:20;:::i;:::-;41518:25;;41557:20;41575:1;41557:20;:::i;:::-;41552:25;;41596:1;41593;41590:8;41587:34;;;41601:18;;:::i;:::-;41587:34;41646:1;41643;41639:9;41631:17;;41463:191;;;;:::o;41660:185::-;41698:4;41718:18;41734:1;41718:18;:::i;:::-;41713:23;;41750:18;41766:1;41750:18;:::i;:::-;41745:23;;41787:1;41784;41781:8;41778:34;;;41792:18;;:::i;:::-;41778:34;41837:1;41834;41830:9;41822:17;;41660:185;;;;:::o;41851:96::-;41888:7;41917:24;41935:5;41917:24;:::i;:::-;41906:35;;41851:96;;;:::o;41953:90::-;41987:7;42030:5;42023:13;42016:21;42005:32;;41953:90;;;:::o;42049:149::-;42085:7;42125:66;42118:5;42114:78;42103:89;;42049:149;;;:::o;42204:126::-;42241:7;42281:42;42274:5;42270:54;42259:65;;42204:126;;;:::o;42336:77::-;42373:7;42402:5;42391:16;;42336:77;;;:::o;42419:86::-;42454:7;42494:4;42487:5;42483:16;42472:27;;42419:86;;;:::o;42511:154::-;42595:6;42590:3;42585;42572:30;42657:1;42648:6;42643:3;42639:16;42632:27;42511:154;;;:::o;42671:307::-;42739:1;42749:113;42763:6;42760:1;42757:13;42749:113;;;42848:1;42843:3;42839:11;42833:18;42829:1;42824:3;42820:11;42813:39;42785:2;42782:1;42778:10;42773:15;;42749:113;;;42880:6;42877:1;42874:13;42871:101;;;42960:1;42951:6;42946:3;42942:16;42935:27;42871:101;42720:258;42671:307;;;:::o;42984:320::-;43028:6;43065:1;43059:4;43055:12;43045:22;;43112:1;43106:4;43102:12;43133:18;43123:81;;43189:4;43181:6;43177:17;43167:27;;43123:81;43251:2;43243:6;43240:14;43220:18;43217:38;43214:84;;;43270:18;;:::i;:::-;43214:84;43035:269;42984:320;;;:::o;43310:281::-;43393:27;43415:4;43393:27;:::i;:::-;43385:6;43381:40;43523:6;43511:10;43508:22;43487:18;43475:10;43472:34;43469:62;43466:88;;;43534:18;;:::i;:::-;43466:88;43574:10;43570:2;43563:22;43353:238;43310:281;;:::o;43597:233::-;43636:3;43659:24;43677:5;43659:24;:::i;:::-;43650:33;;43705:66;43698:5;43695:77;43692:103;;;43775:18;;:::i;:::-;43692:103;43822:1;43815:5;43811:13;43804:20;;43597:233;;;:::o;43836:79::-;43875:7;43904:5;43893:16;;43836:79;;;:::o;43921:176::-;43953:1;43970:20;43988:1;43970:20;:::i;:::-;43965:25;;44004:20;44022:1;44004:20;:::i;:::-;43999:25;;44043:1;44033:35;;44048:18;;:::i;:::-;44033:35;44089:1;44086;44082:9;44077:14;;43921:176;;;;:::o;44103:180::-;44151:77;44148:1;44141:88;44248:4;44245:1;44238:15;44272:4;44269:1;44262:15;44289:180;44337:77;44334:1;44327:88;44434:4;44431:1;44424:15;44458:4;44455:1;44448:15;44475:180;44523:77;44520:1;44513:88;44620:4;44617:1;44610:15;44644:4;44641:1;44634:15;44661:180;44709:77;44706:1;44699:88;44806:4;44803:1;44796:15;44830:4;44827:1;44820:15;44847:180;44895:77;44892:1;44885:88;44992:4;44989:1;44982:15;45016:4;45013:1;45006:15;45033:180;45081:77;45078:1;45071:88;45178:4;45175:1;45168:15;45202:4;45199:1;45192:15;45219:117;45328:1;45325;45318:12;45342:117;45451:1;45448;45441:12;45465:117;45574:1;45571;45564:12;45588:117;45697:1;45694;45687:12;45711:102;45752:6;45803:2;45799:7;45794:2;45787:5;45783:14;45779:28;45769:38;;45711:102;;;:::o;45819:230::-;45959:34;45955:1;45947:6;45943:14;45936:58;46028:13;46023:2;46015:6;46011:15;46004:38;45819:230;:::o;46055:237::-;46195:34;46191:1;46183:6;46179:14;46172:58;46264:20;46259:2;46251:6;46247:15;46240:45;46055:237;:::o;46298:225::-;46438:34;46434:1;46426:6;46422:14;46415:58;46507:8;46502:2;46494:6;46490:15;46483:33;46298:225;:::o;46529:178::-;46669:30;46665:1;46657:6;46653:14;46646:54;46529:178;:::o;46713:169::-;46853:21;46849:1;46841:6;46837:14;46830:45;46713:169;:::o;46888:223::-;47028:34;47024:1;47016:6;47012:14;47005:58;47097:6;47092:2;47084:6;47080:15;47073:31;46888:223;:::o;47117:175::-;47257:27;47253:1;47245:6;47241:14;47234:51;47117:175;:::o;47298:231::-;47438:34;47434:1;47426:6;47422:14;47415:58;47507:14;47502:2;47494:6;47490:15;47483:39;47298:231;:::o;47535:232::-;47675:34;47671:1;47663:6;47659:14;47652:58;47744:11;47739:2;47731:6;47727:15;47720:36;47535:232;:::o;47777:255::-;47921:34;47917:1;47909:6;47905:14;47898:58;47994:26;47989:2;47981:6;47977:15;47970:51;47777:255;:::o;48042:241::-;48186:34;48182:1;48174:6;48170:14;48163:58;48259:12;48254:2;48246:6;48242:15;48235:37;48042:241;:::o;48293:240::-;48437:34;48433:1;48425:6;48421:14;48414:58;48510:11;48505:2;48497:6;48493:15;48486:36;48293:240;:::o;48543:190::-;48687:34;48683:1;48675:6;48671:14;48664:58;48543:190;:::o;48743:235::-;48887:34;48883:1;48875:6;48871:14;48864:58;48960:6;48955:2;48947:6;48943:15;48936:31;48743:235;:::o;48988:247::-;49132:34;49128:1;49120:6;49116:14;49109:58;49205:18;49200:2;49192:6;49188:15;49181:43;48988:247;:::o;49245:243::-;49389:34;49385:1;49377:6;49373:14;49366:58;49462:14;49457:2;49449:6;49445:15;49438:39;49245:243;:::o;49498:190::-;49642:34;49638:1;49630:6;49626:14;49619:58;49498:190;:::o;49698:240::-;49842:34;49838:1;49830:6;49826:14;49819:58;49915:11;49910:2;49902:6;49898:15;49891:36;49698:240;:::o;49948:246::-;50092:34;50088:1;50080:6;50076:14;50069:58;50165:17;50160:2;50152:6;50148:15;50141:42;49948:246;:::o;50204:232::-;50348:34;50344:1;50336:6;50332:14;50325:58;50421:3;50416:2;50408:6;50404:15;50397:28;50204:232;:::o;50446:177::-;50590:21;50586:1;50578:6;50574:14;50567:45;50446:177;:::o;50633:248::-;50777:34;50773:1;50765:6;50761:14;50754:58;50850:19;50845:2;50837:6;50833:15;50826:44;50633:248;:::o;50891:236::-;51035:34;51031:1;51023:6;51019:14;51012:58;51108:7;51103:2;51095:6;51091:15;51084:32;50891:236;:::o;51137:243::-;51281:34;51277:1;51269:6;51265:14;51258:58;51354:14;51349:2;51341:6;51337:15;51330:39;51137:243;:::o;51390:::-;51534:34;51530:1;51522:6;51518:14;51511:58;51607:14;51602:2;51594:6;51590:15;51583:39;51390:243;:::o;51643:130::-;51720:24;51738:5;51720:24;:::i;:::-;51713:5;51710:35;51700:63;;51759:1;51756;51749:12;51700:63;51643:130;:::o;51783:124::-;51857:21;51872:5;51857:21;:::i;:::-;51850:5;51847:32;51837:60;;51893:1;51890;51883:12;51837:60;51783:124;:::o;51917:128::-;51993:23;52010:5;51993:23;:::i;:::-;51986:5;51983:34;51973:62;;52031:1;52028;52021:12;51973:62;51917:128;:::o;52055:130::-;52132:24;52150:5;52132:24;:::i;:::-;52125:5;52122:35;52112:63;;52171:1;52168;52161:12;52112:63;52055:130;:::o
Swarm Source
ipfs://a90d5d97379b79e2dd8d4d139f7579eb7a8d680d8a43dec8e0ab54f3c8eb86d5
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.