ERC-721
Overview
Max Total Supply
5,000 BOC
Holders
513
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
20 BOCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BoredOtterClub
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-06 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public 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 { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: BoredOtterClub.sol pragma solidity >= 0.7.0 < 0.9.0; contract BoredOtterClub is ERC721, Ownable { using Strings for uint256; using Counters for Counters.Counter; Counters.Counter private supply; string public uriPrefix = "ipfs://QmQhfcq9woBaD1Swpzi8QkzM6Mq3nTN3MnFvcxtMf4pfTq/"; string public uriSuffix = ".json"; string public hiddenMetadataUri; uint256 public presaleCost = 0.15 ether; uint256 public publicsaleCost = 0.2 ether; uint256 public maxSupply = 5000; uint256 public nftPerAddressLimit = 5; uint256 public nftPresalePerAddressLimit = 5; uint256 public maxMintAmountPerTx = 5; bool public paused = false; bool public presale = true; bool public revealed = false; bool public onlyWhitelisted = true; mapping(address => bool) public whitelistedAddressesList; mapping(address => uint256) public addressMintedBalance; constructor() ERC721("Bored Otter Club", "BOC") { setHiddenMetadataUri("https://boredotterclub.com/placeholder/metadata.json"); } // Mint Compliance modifier mintCompliance(uint256 _mintAmount) { if(presale == true) { if(onlyWhitelisted == true) { require(isInWhiteList(msg.sender), "User is not whitelisted"); } uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(ownerMintedCount + _mintAmount <= nftPresalePerAddressLimit, "Max NFT per address exceeded"); } else { uint256 ownerMintedCount = addressMintedBalance[msg.sender]; require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "Max NFT per address exceeded"); } require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!"); require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!"); _; } // Total Supply function totalSupply() public view returns (uint256) { return supply.current(); } // Mint function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) { require(!paused, "The contract is paused!"); if(presale == true) { require(msg.value >= presaleCost * _mintAmount, "Insufficient funds!"); } else { require(msg.value >= publicsaleCost * _mintAmount, "Insufficient funds!"); } _mintLoop(msg.sender, _mintAmount); withdraw(); } function ownerMint(uint256 _mintAmount) public onlyOwner { require(!paused, "The contract is paused!"); _mintLoop(msg.sender, _mintAmount); } function ownerMintSpecific(uint256 _tokenId) public onlyOwner { require(!paused, "The contract is paused!"); _safeMint(msg.sender, _tokenId); addressMintedBalance[msg.sender]++; } // Mint For Address function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner { _mintLoop(_receiver, _mintAmount); } // Wallet Of Owner function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount); uint256 currentTokenId = 1; uint256 ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) { address currentTokenOwner = ownerOf(currentTokenId); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = currentTokenId; ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } // Token URI function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token"); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ""; } // Presale Cost function setPresaleCost(uint256 _cost) public onlyOwner { presaleCost = _cost; } // Publicsale Cost function setPublicsaleCost(uint256 _cost) public onlyOwner { publicsaleCost = _cost; } // Set NFT Per Address Limit function setNFTPerAddressLimit(uint256 _cost) public onlyOwner { nftPerAddressLimit = _cost; } // Set NFT Presale Per Address Limit function setNFTPresalePerAddressLimit(uint256 _cost) public onlyOwner { nftPresalePerAddressLimit = _cost; } // Set URI Prefix function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } // Set URI Suffix function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } // Set Paused function setPaused(bool _state) public onlyOwner { paused = _state; } // Set Hidden Metadata URI function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } // Set Presale function setPresale(bool _state) public onlyOwner { presale = _state; } // Set Revealed function setRevealed(bool _state) public onlyOwner { revealed = _state; } // Withdraw function withdraw() public payable { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } // Mint Loop function _mintLoop(address _receiver, uint256 _mintAmount) internal { for (uint256 i = 0; i < _mintAmount; i++) { supply.increment(); _safeMint(_receiver, supply.current()); addressMintedBalance[msg.sender]++; } } // Base URI function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } // Set Only Whitelisted function setOnlyWhitelisted(bool _state) public onlyOwner { onlyWhitelisted = _state; } // Whitelist Users function addToWhiteList(address _addr) public onlyOwner { whitelistedAddressesList[_addr] = true; } function addArrayToWhiteList(address[] memory _addrs) public onlyOwner { for (uint256 i = 0;i< _addrs.length; i++) { whitelistedAddressesList[_addrs[i]] = true; } } function removeFromWhiteList(address _addr) public onlyOwner { whitelistedAddressesList[_addr] = false; } function isInWhiteList(address _addr) public view returns (bool) { return whitelistedAddressesList[_addr] || _addr == owner(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"}],"name":"addArrayToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"_addr","type":"address"}],"name":"isInWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPresalePerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerMintSpecific","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicsaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeFromWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setNFTPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setNFTPresalePerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPresaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPublicsaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistedAddressesList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280603681526020016200590a603691396008908051906020019062000035929190620003be565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506009908051906020019062000083929190620003be565b50670214e8348c4f0000600b556702c68af0bb140000600c55611388600d556005600e556005600f5560056010556000601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff0219169083151502179055506001601160036101000a81548160ff0219169083151502179055503480156200012a57600080fd5b506040518060400160405280601081526020017f426f726564204f7474657220436c7562000000000000000000000000000000008152506040518060400160405280600381526020017f424f4300000000000000000000000000000000000000000000000000000000008152508160009080519060200190620001af929190620003be565b508060019080519060200190620001c8929190620003be565b505050620001eb620001df6200021b60201b60201c565b6200022360201b60201c565b620002156040518060600160405280603481526020016200594060349139620002e960201b60201c565b62000556565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002f96200021b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200031f6200039460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000378576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200036f9062000495565b60405180910390fd5b80600a908051906020019062000390929190620003be565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003cc90620004c8565b90600052602060002090601f016020900481019282620003f057600085556200043c565b82601f106200040b57805160ff19168380011785556200043c565b828001600101855582156200043c579182015b828111156200043b5782518255916020019190600101906200041e565b5b5090506200044b91906200044f565b5090565b5b808211156200046a57600081600090555060010162000450565b5090565b60006200047d602083620004b7565b91506200048a826200052d565b602082019050919050565b60006020820190508181036000830152620004b0816200046e565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004e157607f821691505b60208210811415620004f857620004f7620004fe565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6153a480620005666000396000f3fe60806040526004361061031a5760003560e01c8063715018a6116101ab578063ba7d2c76116100f7578063e9058c3711610095578063f19e75d41161006f578063f19e75d414610b8e578063f2fde38b14610bb7578063fa65b59214610be0578063fdea8e0b14610c1d5761031a565b8063e9058c3714610aff578063e985e9c514610b28578063efbd73f414610b655761031a565b8063c87b56dd116100d1578063c87b56dd14610a45578063d5abeb0114610a82578063e08823c514610aad578063e0a8085314610ad65761031a565b8063ba7d2c76146109c8578063c243c6c1146109f3578063c54e73e314610a1c5761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d681461092f578063a22cb4651461094b578063a45ba8e714610974578063b88d4fde1461099f5761031a565b806395d89b411461089c57806396bfc229146108c75780639c70b512146109045761031a565b8063715018a6146107b25780637ec4a659146107c95780638da5cb5b146107f25780638fdcf9421461081d57806392829d741461084657806394354fd0146108715761031a565b806342842e0e1161026a5780635c975abb116102235780636905b184116101fd5780636905b184146106f85780636d47bcab146107215780636f636e8b1461074a57806370a08231146107755761031a565b80635c975abb1461066557806362b99ad4146106905780636352211e146106bb5761031a565b806342842e0e14610557578063438b63001461058057806347ee0394146105bd5780634fdd43cb146105e6578063518302271461060f5780635503a0e81461063a5761031a565b806316c38b3c116102d757806323b872dd116102b157806323b872dd146104d05780632a23d07d146104f95780633c952764146105245780633ccfd60b1461054d5761031a565b806316c38b3c1461043f57806318160ddd1461046857806318cae269146104935761031a565b806301bf66481461031f57806301ffc9a71461034857806306fdde0314610385578063081812fc146103b0578063095ea7b3146103ed57806316ba10e014610416575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190613c8c565b610c48565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613ec5565b610d1f565b60405161037c919061459d565b60405180910390f35b34801561039157600080fd5b5061039a610e01565b6040516103a791906145b8565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190613f68565b610e93565b6040516103e49190614514565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190613e0f565b610f18565b005b34801561042257600080fd5b5061043d60048036038101906104389190613f1f565b611030565b005b34801561044b57600080fd5b5061046660048036038101906104619190613e98565b6110c6565b005b34801561047457600080fd5b5061047d61115f565b60405161048a919061489a565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613c8c565b611170565b6040516104c7919061489a565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613cf9565b611188565b005b34801561050557600080fd5b5061050e6111e8565b60405161051b919061489a565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190613e98565b6111ee565b005b610555611287565b005b34801561056357600080fd5b5061057e60048036038101906105799190613cf9565b611307565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613c8c565b611327565b6040516105b4919061457b565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190613c8c565b611432565b005b3480156105f257600080fd5b5061060d60048036038101906106089190613f1f565b611509565b005b34801561061b57600080fd5b5061062461159f565b604051610631919061459d565b60405180910390f35b34801561064657600080fd5b5061064f6115b2565b60405161065c91906145b8565b60405180910390f35b34801561067157600080fd5b5061067a611640565b604051610687919061459d565b60405180910390f35b34801561069c57600080fd5b506106a5611653565b6040516106b291906145b8565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190613f68565b6116e1565b6040516106ef9190614514565b60405180910390f35b34801561070457600080fd5b5061071f600480360381019061071a9190613f68565b611793565b005b34801561072d57600080fd5b5061074860048036038101906107439190613f68565b611819565b005b34801561075657600080fd5b5061075f61189f565b60405161076c919061489a565b60405180910390f35b34801561078157600080fd5b5061079c60048036038101906107979190613c8c565b6118a5565b6040516107a9919061489a565b60405180910390f35b3480156107be57600080fd5b506107c761195d565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190613f1f565b6119e5565b005b3480156107fe57600080fd5b50610807611a7b565b6040516108149190614514565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190613f68565b611aa5565b005b34801561085257600080fd5b5061085b611b2b565b604051610868919061489a565b60405180910390f35b34801561087d57600080fd5b50610886611b31565b604051610893919061489a565b60405180910390f35b3480156108a857600080fd5b506108b1611b37565b6040516108be91906145b8565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613c8c565b611bc9565b6040516108fb919061459d565b60405180910390f35b34801561091057600080fd5b50610919611c5c565b604051610926919061459d565b60405180910390f35b61094960048036038101906109449190613f68565b611c6f565b005b34801561095757600080fd5b50610972600480360381019061096d9190613dcf565b611ff3565b005b34801561098057600080fd5b50610989612009565b60405161099691906145b8565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c19190613d4c565b612097565b005b3480156109d457600080fd5b506109dd6120f9565b6040516109ea919061489a565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a159190613e4f565b6120ff565b005b348015610a2857600080fd5b50610a436004803603810190610a3e9190613e98565b612210565b005b348015610a5157600080fd5b50610a6c6004803603810190610a679190613f68565b6122a9565b604051610a7991906145b8565b60405180910390f35b348015610a8e57600080fd5b50610a97612402565b604051610aa4919061489a565b60405180910390f35b348015610ab957600080fd5b50610ad46004803603810190610acf9190613f68565b612408565b005b348015610ae257600080fd5b50610afd6004803603810190610af89190613e98565b612536565b005b348015610b0b57600080fd5b50610b266004803603810190610b219190613f68565b6125cf565b005b348015610b3457600080fd5b50610b4f6004803603810190610b4a9190613cb9565b612655565b604051610b5c919061459d565b60405180910390f35b348015610b7157600080fd5b50610b8c6004803603810190610b879190613f95565b6126e9565b005b348015610b9a57600080fd5b50610bb56004803603810190610bb09190613f68565b6129d0565b005b348015610bc357600080fd5b50610bde6004803603810190610bd99190613c8c565b612aa9565b005b348015610bec57600080fd5b50610c076004803603810190610c029190613c8c565b612ba1565b604051610c14919061459d565b60405180910390f35b348015610c2957600080fd5b50610c32612bc1565b604051610c3f919061459d565b60405180910390f35b610c50612bd4565b73ffffffffffffffffffffffffffffffffffffffff16610c6e611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061479a565b60405180910390fd5b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610dfa5750610df982612bdc565b5b9050919050565b606060008054610e1090614bcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614bcf565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e82612c46565b610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed49061477a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f23826116e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b9061481a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb3612bd4565b73ffffffffffffffffffffffffffffffffffffffff161480610fe25750610fe181610fdc612bd4565b612655565b5b611021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611018906146fa565b60405180910390fd5b61102b8383612cb2565b505050565b611038612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611056611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061479a565b60405180910390fd5b80600990805190602001906110c2929190613a02565b5050565b6110ce612bd4565b73ffffffffffffffffffffffffffffffffffffffff166110ec611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111399061479a565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b600061116b6007612d6b565b905090565b60136020528060005260406000206000915090505481565b611199611193612bd4565b82612d79565b6111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf9061485a565b60405180910390fd5b6111e3838383612e57565b505050565b600b5481565b6111f6612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611214611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461126a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112619061479a565b60405180910390fd5b80601160036101000a81548160ff02191690831515021790555050565b6000611291611a7b565b73ffffffffffffffffffffffffffffffffffffffff16476040516112b4906144ff565b60006040518083038185875af1925050503d80600081146112f1576040519150601f19603f3d011682016040523d82523d6000602084013e6112f6565b606091505b505090508061130457600080fd5b50565b61132283838360405180602001604052806000815250612097565b505050565b60606000611334836118a5565b905060008167ffffffffffffffff81111561135257611351614d68565b5b6040519080825280602002602001820160405280156113805781602001602082028036833780820191505090505b50905060006001905060005b838110801561139d5750600d548211155b156114265760006113ad836116e1565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141257828483815181106113f7576113f6614d39565b5b602002602001018181525050818061140e90614c32565b9250505b828061141d90614c32565b9350505061138c565b82945050505050919050565b61143a612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611458611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a59061479a565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611511612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661152f611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c9061479a565b60405180910390fd5b80600a908051906020019061159b929190613a02565b5050565b601160029054906101000a900460ff1681565b600980546115bf90614bcf565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb90614bcf565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b6008805461166090614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461168c90614bcf565b80156116d95780601f106116ae576101008083540402835291602001916116d9565b820191906000526020600020905b8154815290600101906020018083116116bc57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117819061473a565b60405180910390fd5b80915050919050565b61179b612bd4565b73ffffffffffffffffffffffffffffffffffffffff166117b9611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461180f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118069061479a565b60405180910390fd5b80600c8190555050565b611821612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661183f611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188c9061479a565b60405180910390fd5b80600e8190555050565b600f5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d9061471a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611965612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611983611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d09061479a565b60405180910390fd5b6119e360006130be565b565b6119ed612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611a0b611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a589061479a565b60405180910390fd5b8060089080519060200190611a77929190613a02565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611aad612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611acb611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b189061479a565b60405180910390fd5b80600b8190555050565b600c5481565b60105481565b606060018054611b4690614bcf565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7290614bcf565b8015611bbf5780601f10611b9457610100808354040283529160200191611bbf565b820191906000526020600020905b815481529060010190602001808311611ba257829003601f168201915b5050505050905090565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c555750611c26611a7b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b601160039054906101000a900460ff1681565b8060011515601160019054906101000a900460ff1615151415611d8b5760011515601160039054906101000a900460ff1615151415611cf157611cb133611bc9565b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906146da565b60405180910390fd5b5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548282611d449190614a04565b1115611d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7c906147fa565b60405180910390fd5b50611e21565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e548282611dde9190614a04565b1115611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e16906147fa565b60405180910390fd5b505b600081118015611e3357506010548111155b611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e699061465a565b60405180910390fd5b600d5481611e806007612d6b565b611e8a9190614a04565b1115611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec29061483a565b60405180910390fd5b601160009054906101000a900460ff1615611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906147ba565b60405180910390fd5b60011515601160019054906101000a900460ff1615151415611f8c5781600b54611f459190614a8b565b341015611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e9061487a565b60405180910390fd5b611fdd565b81600c54611f9a9190614a8b565b341015611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd39061487a565b60405180910390fd5b5b611fe73383613184565b611fef611287565b5050565b612005611ffe612bd4565b8383613219565b5050565b600a805461201690614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461204290614bcf565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b505050505081565b6120a86120a2612bd4565b83612d79565b6120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de9061485a565b60405180910390fd5b6120f384848484613386565b50505050565b600e5481565b612107612bd4565b73ffffffffffffffffffffffffffffffffffffffff16612125611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461217b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121729061479a565b60405180910390fd5b60005b815181101561220c576001601260008484815181106121a05761219f614d39565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061220490614c32565b91505061217e565b5050565b612218612bd4565b73ffffffffffffffffffffffffffffffffffffffff16612236611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461228c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122839061479a565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b60606122b482612c46565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea906147da565b60405180910390fd5b60001515601160029054906101000a900460ff16151514156123a157600a805461231c90614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461234890614bcf565b80156123955780601f1061236a57610100808354040283529160200191612395565b820191906000526020600020905b81548152906001019060200180831161237857829003601f168201915b505050505090506123fd565b60006123ab6133e2565b905060008151116123cb57604051806020016040528060008152506123f9565b806123d584613474565b60096040516020016123e9939291906144ce565b6040516020818303038152906040525b9150505b919050565b600d5481565b612410612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661242e611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614612484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247b9061479a565b60405180910390fd5b601160009054906101000a900460ff16156124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cb906147ba565b60405180910390fd5b6124de33826135d5565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061252e90614c32565b919050555050565b61253e612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661255c611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a99061479a565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b6125d7612bd4565b73ffffffffffffffffffffffffffffffffffffffff166125f5611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461264b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126429061479a565b60405180910390fd5b80600f8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160011515601160019054906101000a900460ff16151514156128055760011515601160039054906101000a900460ff161515141561276b5761272b33611bc9565b61276a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612761906146da565b60405180910390fd5b5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5482826127be9190614a04565b11156127ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f6906147fa565b60405180910390fd5b5061289b565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e5482826128589190614a04565b1115612899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612890906147fa565b60405180910390fd5b505b6000811180156128ad57506010548111155b6128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e39061465a565b60405180910390fd5b600d54816128fa6007612d6b565b6129049190614a04565b1115612945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293c9061483a565b60405180910390fd5b61294d612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661296b611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b89061479a565b60405180910390fd5b6129cb8284613184565b505050565b6129d8612bd4565b73ffffffffffffffffffffffffffffffffffffffff166129f6611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a439061479a565b60405180910390fd5b601160009054906101000a900460ff1615612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a93906147ba565b60405180910390fd5b612aa63382613184565b50565b612ab1612bd4565b73ffffffffffffffffffffffffffffffffffffffff16612acf611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c9061479a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8c906145fa565b60405180910390fd5b612b9e816130be565b50565b60126020528060005260406000206000915054906101000a900460ff1681565b601160019054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d25836116e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612d8482612c46565b612dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dba906146ba565b60405180910390fd5b6000612dce836116e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e3d57508373ffffffffffffffffffffffffffffffffffffffff16612e2584610e93565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e4e5750612e4d8185612655565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e77826116e1565b73ffffffffffffffffffffffffffffffffffffffff1614612ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec49061461a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f349061467a565b60405180910390fd5b612f488383836135f3565b612f53600082612cb2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa39190614ae5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ffa9190614a04565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130b98383836135f8565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156132145761319960076135fd565b6131ac836131a76007612d6b565b6135d5565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906131fc90614c32565b9190505550808061320c90614c32565b915050613187565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327f9061469a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613379919061459d565b60405180910390a3505050565b613391848484612e57565b61339d84848484613613565b6133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d3906145da565b60405180910390fd5b50505050565b6060600880546133f190614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461341d90614bcf565b801561346a5780601f1061343f5761010080835404028352916020019161346a565b820191906000526020600020905b81548152906001019060200180831161344d57829003601f168201915b5050505050905090565b606060008214156134bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135d0565b600082905060005b600082146134ee5780806134d790614c32565b915050600a826134e79190614a5a565b91506134c4565b60008167ffffffffffffffff81111561350a57613509614d68565b5b6040519080825280601f01601f19166020018201604052801561353c5781602001600182028036833780820191505090505b5090505b600085146135c9576001826135559190614ae5565b9150600a856135649190614c7b565b60306135709190614a04565b60f81b81838151811061358657613585614d39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135c29190614a5a565b9450613540565b8093505050505b919050565b6135ef8282604051806020016040528060008152506137aa565b5050565b505050565b505050565b6001816000016000828254019250508190555050565b60006136348473ffffffffffffffffffffffffffffffffffffffff16613805565b1561379d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261365d612bd4565b8786866040518563ffffffff1660e01b815260040161367f949392919061452f565b602060405180830381600087803b15801561369957600080fd5b505af19250505080156136ca57506040513d601f19601f820116820180604052508101906136c79190613ef2565b60015b61374d573d80600081146136fa576040519150601f19603f3d011682016040523d82523d6000602084013e6136ff565b606091505b50600081511415613745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373c906145da565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137a2565b600190505b949350505050565b6137b48383613828565b6137c16000848484613613565b613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f7906145da565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388f9061475a565b60405180910390fd5b6138a181612c46565b156138e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d89061463a565b60405180910390fd5b6138ed600083836135f3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461393d9190614a04565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139fe600083836135f8565b5050565b828054613a0e90614bcf565b90600052602060002090601f016020900481019282613a305760008555613a77565b82601f10613a4957805160ff1916838001178555613a77565b82800160010185558215613a77579182015b82811115613a76578251825591602001919060010190613a5b565b5b509050613a849190613a88565b5090565b5b80821115613aa1576000816000905550600101613a89565b5090565b6000613ab8613ab3846148da565b6148b5565b90508083825260208201905082856020860282011115613adb57613ada614d9c565b5b60005b85811015613b0b5781613af18882613b99565b845260208401935060208301925050600181019050613ade565b5050509392505050565b6000613b28613b2384614906565b6148b5565b905082815260208101848484011115613b4457613b43614da1565b5b613b4f848285614b8d565b509392505050565b6000613b6a613b6584614937565b6148b5565b905082815260208101848484011115613b8657613b85614da1565b5b613b91848285614b8d565b509392505050565b600081359050613ba881615312565b92915050565b600082601f830112613bc357613bc2614d97565b5b8135613bd3848260208601613aa5565b91505092915050565b600081359050613beb81615329565b92915050565b600081359050613c0081615340565b92915050565b600081519050613c1581615340565b92915050565b600082601f830112613c3057613c2f614d97565b5b8135613c40848260208601613b15565b91505092915050565b600082601f830112613c5e57613c5d614d97565b5b8135613c6e848260208601613b57565b91505092915050565b600081359050613c8681615357565b92915050565b600060208284031215613ca257613ca1614dab565b5b6000613cb084828501613b99565b91505092915050565b60008060408385031215613cd057613ccf614dab565b5b6000613cde85828601613b99565b9250506020613cef85828601613b99565b9150509250929050565b600080600060608486031215613d1257613d11614dab565b5b6000613d2086828701613b99565b9350506020613d3186828701613b99565b9250506040613d4286828701613c77565b9150509250925092565b60008060008060808587031215613d6657613d65614dab565b5b6000613d7487828801613b99565b9450506020613d8587828801613b99565b9350506040613d9687828801613c77565b925050606085013567ffffffffffffffff811115613db757613db6614da6565b5b613dc387828801613c1b565b91505092959194509250565b60008060408385031215613de657613de5614dab565b5b6000613df485828601613b99565b9250506020613e0585828601613bdc565b9150509250929050565b60008060408385031215613e2657613e25614dab565b5b6000613e3485828601613b99565b9250506020613e4585828601613c77565b9150509250929050565b600060208284031215613e6557613e64614dab565b5b600082013567ffffffffffffffff811115613e8357613e82614da6565b5b613e8f84828501613bae565b91505092915050565b600060208284031215613eae57613ead614dab565b5b6000613ebc84828501613bdc565b91505092915050565b600060208284031215613edb57613eda614dab565b5b6000613ee984828501613bf1565b91505092915050565b600060208284031215613f0857613f07614dab565b5b6000613f1684828501613c06565b91505092915050565b600060208284031215613f3557613f34614dab565b5b600082013567ffffffffffffffff811115613f5357613f52614da6565b5b613f5f84828501613c49565b91505092915050565b600060208284031215613f7e57613f7d614dab565b5b6000613f8c84828501613c77565b91505092915050565b60008060408385031215613fac57613fab614dab565b5b6000613fba85828601613c77565b9250506020613fcb85828601613b99565b9150509250929050565b6000613fe183836144b0565b60208301905092915050565b613ff681614b19565b82525050565b60006140078261498d565b61401181856149bb565b935061401c83614968565b8060005b8381101561404d5781516140348882613fd5565b975061403f836149ae565b925050600181019050614020565b5085935050505092915050565b61406381614b2b565b82525050565b600061407482614998565b61407e81856149cc565b935061408e818560208601614b9c565b61409781614db0565b840191505092915050565b60006140ad826149a3565b6140b781856149e8565b93506140c7818560208601614b9c565b6140d081614db0565b840191505092915050565b60006140e6826149a3565b6140f081856149f9565b9350614100818560208601614b9c565b80840191505092915050565b6000815461411981614bcf565b61412381866149f9565b9450600182166000811461413e576001811461414f57614182565b60ff19831686528186019350614182565b61415885614978565b60005b8381101561417a5781548189015260018201915060208101905061415b565b838801955050505b50505092915050565b60006141986032836149e8565b91506141a382614dc1565b604082019050919050565b60006141bb6026836149e8565b91506141c682614e10565b604082019050919050565b60006141de6025836149e8565b91506141e982614e5f565b604082019050919050565b6000614201601c836149e8565b915061420c82614eae565b602082019050919050565b60006142246014836149e8565b915061422f82614ed7565b602082019050919050565b60006142476024836149e8565b915061425282614f00565b604082019050919050565b600061426a6019836149e8565b915061427582614f4f565b602082019050919050565b600061428d602c836149e8565b915061429882614f78565b604082019050919050565b60006142b06017836149e8565b91506142bb82614fc7565b602082019050919050565b60006142d36038836149e8565b91506142de82614ff0565b604082019050919050565b60006142f6602a836149e8565b91506143018261503f565b604082019050919050565b60006143196029836149e8565b91506143248261508e565b604082019050919050565b600061433c6020836149e8565b9150614347826150dd565b602082019050919050565b600061435f602c836149e8565b915061436a82615106565b604082019050919050565b60006143826020836149e8565b915061438d82615155565b602082019050919050565b60006143a56017836149e8565b91506143b08261517e565b602082019050919050565b60006143c8602f836149e8565b91506143d3826151a7565b604082019050919050565b60006143eb601c836149e8565b91506143f6826151f6565b602082019050919050565b600061440e6021836149e8565b91506144198261521f565b604082019050919050565b60006144316000836149dd565b915061443c8261526e565b600082019050919050565b60006144546014836149e8565b915061445f82615271565b602082019050919050565b60006144776031836149e8565b91506144828261529a565b604082019050919050565b600061449a6013836149e8565b91506144a5826152e9565b602082019050919050565b6144b981614b83565b82525050565b6144c881614b83565b82525050565b60006144da82866140db565b91506144e682856140db565b91506144f2828461410c565b9150819050949350505050565b600061450a82614424565b9150819050919050565b60006020820190506145296000830184613fed565b92915050565b60006080820190506145446000830187613fed565b6145516020830186613fed565b61455e60408301856144bf565b81810360608301526145708184614069565b905095945050505050565b600060208201905081810360008301526145958184613ffc565b905092915050565b60006020820190506145b2600083018461405a565b92915050565b600060208201905081810360008301526145d281846140a2565b905092915050565b600060208201905081810360008301526145f38161418b565b9050919050565b60006020820190508181036000830152614613816141ae565b9050919050565b60006020820190508181036000830152614633816141d1565b9050919050565b60006020820190508181036000830152614653816141f4565b9050919050565b6000602082019050818103600083015261467381614217565b9050919050565b600060208201905081810360008301526146938161423a565b9050919050565b600060208201905081810360008301526146b38161425d565b9050919050565b600060208201905081810360008301526146d381614280565b9050919050565b600060208201905081810360008301526146f3816142a3565b9050919050565b60006020820190508181036000830152614713816142c6565b9050919050565b60006020820190508181036000830152614733816142e9565b9050919050565b600060208201905081810360008301526147538161430c565b9050919050565b600060208201905081810360008301526147738161432f565b9050919050565b6000602082019050818103600083015261479381614352565b9050919050565b600060208201905081810360008301526147b381614375565b9050919050565b600060208201905081810360008301526147d381614398565b9050919050565b600060208201905081810360008301526147f3816143bb565b9050919050565b60006020820190508181036000830152614813816143de565b9050919050565b6000602082019050818103600083015261483381614401565b9050919050565b6000602082019050818103600083015261485381614447565b9050919050565b600060208201905081810360008301526148738161446a565b9050919050565b600060208201905081810360008301526148938161448d565b9050919050565b60006020820190506148af60008301846144bf565b92915050565b60006148bf6148d0565b90506148cb8282614c01565b919050565b6000604051905090565b600067ffffffffffffffff8211156148f5576148f4614d68565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561492157614920614d68565b5b61492a82614db0565b9050602081019050919050565b600067ffffffffffffffff82111561495257614951614d68565b5b61495b82614db0565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a0f82614b83565b9150614a1a83614b83565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a4f57614a4e614cac565b5b828201905092915050565b6000614a6582614b83565b9150614a7083614b83565b925082614a8057614a7f614cdb565b5b828204905092915050565b6000614a9682614b83565b9150614aa183614b83565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ada57614ad9614cac565b5b828202905092915050565b6000614af082614b83565b9150614afb83614b83565b925082821015614b0e57614b0d614cac565b5b828203905092915050565b6000614b2482614b63565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614bba578082015181840152602081019050614b9f565b83811115614bc9576000848401525b50505050565b60006002820490506001821680614be757607f821691505b60208210811415614bfb57614bfa614d0a565b5b50919050565b614c0a82614db0565b810181811067ffffffffffffffff82111715614c2957614c28614d68565b5b80604052505050565b6000614c3d82614b83565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7057614c6f614cac565b5b600182019050919050565b6000614c8682614b83565b9150614c9183614b83565b925082614ca157614ca0614cdb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61531b81614b19565b811461532657600080fd5b50565b61533281614b2b565b811461533d57600080fd5b50565b61534981614b37565b811461535457600080fd5b50565b61536081614b83565b811461536b57600080fd5b5056fea26469706673582212203e69d62848ee9ecac581a49da5bcc01f074d4fc08f6d729769a76347e22c98bb64736f6c63430008070033697066733a2f2f516d516866637139776f426144315377707a6938516b7a4d364d71336e544e334d6e46766378744d6634706654712f68747470733a2f2f626f7265646f74746572636c75622e636f6d2f706c616365686f6c6465722f6d657461646174612e6a736f6e
Deployed Bytecode
0x60806040526004361061031a5760003560e01c8063715018a6116101ab578063ba7d2c76116100f7578063e9058c3711610095578063f19e75d41161006f578063f19e75d414610b8e578063f2fde38b14610bb7578063fa65b59214610be0578063fdea8e0b14610c1d5761031a565b8063e9058c3714610aff578063e985e9c514610b28578063efbd73f414610b655761031a565b8063c87b56dd116100d1578063c87b56dd14610a45578063d5abeb0114610a82578063e08823c514610aad578063e0a8085314610ad65761031a565b8063ba7d2c76146109c8578063c243c6c1146109f3578063c54e73e314610a1c5761031a565b806395d89b4111610164578063a0712d681161013e578063a0712d681461092f578063a22cb4651461094b578063a45ba8e714610974578063b88d4fde1461099f5761031a565b806395d89b411461089c57806396bfc229146108c75780639c70b512146109045761031a565b8063715018a6146107b25780637ec4a659146107c95780638da5cb5b146107f25780638fdcf9421461081d57806392829d741461084657806394354fd0146108715761031a565b806342842e0e1161026a5780635c975abb116102235780636905b184116101fd5780636905b184146106f85780636d47bcab146107215780636f636e8b1461074a57806370a08231146107755761031a565b80635c975abb1461066557806362b99ad4146106905780636352211e146106bb5761031a565b806342842e0e14610557578063438b63001461058057806347ee0394146105bd5780634fdd43cb146105e6578063518302271461060f5780635503a0e81461063a5761031a565b806316c38b3c116102d757806323b872dd116102b157806323b872dd146104d05780632a23d07d146104f95780633c952764146105245780633ccfd60b1461054d5761031a565b806316c38b3c1461043f57806318160ddd1461046857806318cae269146104935761031a565b806301bf66481461031f57806301ffc9a71461034857806306fdde0314610385578063081812fc146103b0578063095ea7b3146103ed57806316ba10e014610416575b600080fd5b34801561032b57600080fd5b5061034660048036038101906103419190613c8c565b610c48565b005b34801561035457600080fd5b5061036f600480360381019061036a9190613ec5565b610d1f565b60405161037c919061459d565b60405180910390f35b34801561039157600080fd5b5061039a610e01565b6040516103a791906145b8565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d29190613f68565b610e93565b6040516103e49190614514565b60405180910390f35b3480156103f957600080fd5b50610414600480360381019061040f9190613e0f565b610f18565b005b34801561042257600080fd5b5061043d60048036038101906104389190613f1f565b611030565b005b34801561044b57600080fd5b5061046660048036038101906104619190613e98565b6110c6565b005b34801561047457600080fd5b5061047d61115f565b60405161048a919061489a565b60405180910390f35b34801561049f57600080fd5b506104ba60048036038101906104b59190613c8c565b611170565b6040516104c7919061489a565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613cf9565b611188565b005b34801561050557600080fd5b5061050e6111e8565b60405161051b919061489a565b60405180910390f35b34801561053057600080fd5b5061054b60048036038101906105469190613e98565b6111ee565b005b610555611287565b005b34801561056357600080fd5b5061057e60048036038101906105799190613cf9565b611307565b005b34801561058c57600080fd5b506105a760048036038101906105a29190613c8c565b611327565b6040516105b4919061457b565b60405180910390f35b3480156105c957600080fd5b506105e460048036038101906105df9190613c8c565b611432565b005b3480156105f257600080fd5b5061060d60048036038101906106089190613f1f565b611509565b005b34801561061b57600080fd5b5061062461159f565b604051610631919061459d565b60405180910390f35b34801561064657600080fd5b5061064f6115b2565b60405161065c91906145b8565b60405180910390f35b34801561067157600080fd5b5061067a611640565b604051610687919061459d565b60405180910390f35b34801561069c57600080fd5b506106a5611653565b6040516106b291906145b8565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd9190613f68565b6116e1565b6040516106ef9190614514565b60405180910390f35b34801561070457600080fd5b5061071f600480360381019061071a9190613f68565b611793565b005b34801561072d57600080fd5b5061074860048036038101906107439190613f68565b611819565b005b34801561075657600080fd5b5061075f61189f565b60405161076c919061489a565b60405180910390f35b34801561078157600080fd5b5061079c60048036038101906107979190613c8c565b6118a5565b6040516107a9919061489a565b60405180910390f35b3480156107be57600080fd5b506107c761195d565b005b3480156107d557600080fd5b506107f060048036038101906107eb9190613f1f565b6119e5565b005b3480156107fe57600080fd5b50610807611a7b565b6040516108149190614514565b60405180910390f35b34801561082957600080fd5b50610844600480360381019061083f9190613f68565b611aa5565b005b34801561085257600080fd5b5061085b611b2b565b604051610868919061489a565b60405180910390f35b34801561087d57600080fd5b50610886611b31565b604051610893919061489a565b60405180910390f35b3480156108a857600080fd5b506108b1611b37565b6040516108be91906145b8565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613c8c565b611bc9565b6040516108fb919061459d565b60405180910390f35b34801561091057600080fd5b50610919611c5c565b604051610926919061459d565b60405180910390f35b61094960048036038101906109449190613f68565b611c6f565b005b34801561095757600080fd5b50610972600480360381019061096d9190613dcf565b611ff3565b005b34801561098057600080fd5b50610989612009565b60405161099691906145b8565b60405180910390f35b3480156109ab57600080fd5b506109c660048036038101906109c19190613d4c565b612097565b005b3480156109d457600080fd5b506109dd6120f9565b6040516109ea919061489a565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a159190613e4f565b6120ff565b005b348015610a2857600080fd5b50610a436004803603810190610a3e9190613e98565b612210565b005b348015610a5157600080fd5b50610a6c6004803603810190610a679190613f68565b6122a9565b604051610a7991906145b8565b60405180910390f35b348015610a8e57600080fd5b50610a97612402565b604051610aa4919061489a565b60405180910390f35b348015610ab957600080fd5b50610ad46004803603810190610acf9190613f68565b612408565b005b348015610ae257600080fd5b50610afd6004803603810190610af89190613e98565b612536565b005b348015610b0b57600080fd5b50610b266004803603810190610b219190613f68565b6125cf565b005b348015610b3457600080fd5b50610b4f6004803603810190610b4a9190613cb9565b612655565b604051610b5c919061459d565b60405180910390f35b348015610b7157600080fd5b50610b8c6004803603810190610b879190613f95565b6126e9565b005b348015610b9a57600080fd5b50610bb56004803603810190610bb09190613f68565b6129d0565b005b348015610bc357600080fd5b50610bde6004803603810190610bd99190613c8c565b612aa9565b005b348015610bec57600080fd5b50610c076004803603810190610c029190613c8c565b612ba1565b604051610c14919061459d565b60405180910390f35b348015610c2957600080fd5b50610c32612bc1565b604051610c3f919061459d565b60405180910390f35b610c50612bd4565b73ffffffffffffffffffffffffffffffffffffffff16610c6e611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061479a565b60405180910390fd5b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610dea57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610dfa5750610df982612bdc565b5b9050919050565b606060008054610e1090614bcf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3c90614bcf565b8015610e895780601f10610e5e57610100808354040283529160200191610e89565b820191906000526020600020905b815481529060010190602001808311610e6c57829003601f168201915b5050505050905090565b6000610e9e82612c46565b610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed49061477a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f23826116e1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8b9061481a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fb3612bd4565b73ffffffffffffffffffffffffffffffffffffffff161480610fe25750610fe181610fdc612bd4565b612655565b5b611021576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611018906146fa565b60405180910390fd5b61102b8383612cb2565b505050565b611038612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611056611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146110ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a39061479a565b60405180910390fd5b80600990805190602001906110c2929190613a02565b5050565b6110ce612bd4565b73ffffffffffffffffffffffffffffffffffffffff166110ec611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111399061479a565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b600061116b6007612d6b565b905090565b60136020528060005260406000206000915090505481565b611199611193612bd4565b82612d79565b6111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf9061485a565b60405180910390fd5b6111e3838383612e57565b505050565b600b5481565b6111f6612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611214611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461126a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112619061479a565b60405180910390fd5b80601160036101000a81548160ff02191690831515021790555050565b6000611291611a7b565b73ffffffffffffffffffffffffffffffffffffffff16476040516112b4906144ff565b60006040518083038185875af1925050503d80600081146112f1576040519150601f19603f3d011682016040523d82523d6000602084013e6112f6565b606091505b505090508061130457600080fd5b50565b61132283838360405180602001604052806000815250612097565b505050565b60606000611334836118a5565b905060008167ffffffffffffffff81111561135257611351614d68565b5b6040519080825280602002602001820160405280156113805781602001602082028036833780820191505090505b50905060006001905060005b838110801561139d5750600d548211155b156114265760006113ad836116e1565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561141257828483815181106113f7576113f6614d39565b5b602002602001018181525050818061140e90614c32565b9250505b828061141d90614c32565b9350505061138c565b82945050505050919050565b61143a612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611458611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146114ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a59061479a565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611511612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661152f611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157c9061479a565b60405180910390fd5b80600a908051906020019061159b929190613a02565b5050565b601160029054906101000a900460ff1681565b600980546115bf90614bcf565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb90614bcf565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b6008805461166090614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461168c90614bcf565b80156116d95780601f106116ae576101008083540402835291602001916116d9565b820191906000526020600020905b8154815290600101906020018083116116bc57829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117819061473a565b60405180910390fd5b80915050919050565b61179b612bd4565b73ffffffffffffffffffffffffffffffffffffffff166117b9611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461180f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118069061479a565b60405180910390fd5b80600c8190555050565b611821612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661183f611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188c9061479a565b60405180910390fd5b80600e8190555050565b600f5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d9061471a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611965612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611983611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146119d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d09061479a565b60405180910390fd5b6119e360006130be565b565b6119ed612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611a0b611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a589061479a565b60405180910390fd5b8060089080519060200190611a77929190613a02565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611aad612bd4565b73ffffffffffffffffffffffffffffffffffffffff16611acb611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b189061479a565b60405180910390fd5b80600b8190555050565b600c5481565b60105481565b606060018054611b4690614bcf565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7290614bcf565b8015611bbf5780601f10611b9457610100808354040283529160200191611bbf565b820191906000526020600020905b815481529060010190602001808311611ba257829003601f168201915b5050505050905090565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611c555750611c26611a7b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b601160039054906101000a900460ff1681565b8060011515601160019054906101000a900460ff1615151415611d8b5760011515601160039054906101000a900460ff1615151415611cf157611cb133611bc9565b611cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce7906146da565b60405180910390fd5b5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f548282611d449190614a04565b1115611d85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7c906147fa565b60405180910390fd5b50611e21565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e548282611dde9190614a04565b1115611e1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e16906147fa565b60405180910390fd5b505b600081118015611e3357506010548111155b611e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e699061465a565b60405180910390fd5b600d5481611e806007612d6b565b611e8a9190614a04565b1115611ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec29061483a565b60405180910390fd5b601160009054906101000a900460ff1615611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906147ba565b60405180910390fd5b60011515601160019054906101000a900460ff1615151415611f8c5781600b54611f459190614a8b565b341015611f87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7e9061487a565b60405180910390fd5b611fdd565b81600c54611f9a9190614a8b565b341015611fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd39061487a565b60405180910390fd5b5b611fe73383613184565b611fef611287565b5050565b612005611ffe612bd4565b8383613219565b5050565b600a805461201690614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461204290614bcf565b801561208f5780601f106120645761010080835404028352916020019161208f565b820191906000526020600020905b81548152906001019060200180831161207257829003601f168201915b505050505081565b6120a86120a2612bd4565b83612d79565b6120e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120de9061485a565b60405180910390fd5b6120f384848484613386565b50505050565b600e5481565b612107612bd4565b73ffffffffffffffffffffffffffffffffffffffff16612125611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461217b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121729061479a565b60405180910390fd5b60005b815181101561220c576001601260008484815181106121a05761219f614d39565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061220490614c32565b91505061217e565b5050565b612218612bd4565b73ffffffffffffffffffffffffffffffffffffffff16612236611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461228c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122839061479a565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b60606122b482612c46565b6122f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ea906147da565b60405180910390fd5b60001515601160029054906101000a900460ff16151514156123a157600a805461231c90614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461234890614bcf565b80156123955780601f1061236a57610100808354040283529160200191612395565b820191906000526020600020905b81548152906001019060200180831161237857829003601f168201915b505050505090506123fd565b60006123ab6133e2565b905060008151116123cb57604051806020016040528060008152506123f9565b806123d584613474565b60096040516020016123e9939291906144ce565b6040516020818303038152906040525b9150505b919050565b600d5481565b612410612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661242e611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614612484576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247b9061479a565b60405180910390fd5b601160009054906101000a900460ff16156124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cb906147ba565b60405180910390fd5b6124de33826135d5565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061252e90614c32565b919050555050565b61253e612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661255c611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146125b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125a99061479a565b60405180910390fd5b80601160026101000a81548160ff02191690831515021790555050565b6125d7612bd4565b73ffffffffffffffffffffffffffffffffffffffff166125f5611a7b565b73ffffffffffffffffffffffffffffffffffffffff161461264b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126429061479a565b60405180910390fd5b80600f8190555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8160011515601160019054906101000a900460ff16151514156128055760011515601160039054906101000a900460ff161515141561276b5761272b33611bc9565b61276a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612761906146da565b60405180910390fd5b5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600f5482826127be9190614a04565b11156127ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f6906147fa565b60405180910390fd5b5061289b565b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e5482826128589190614a04565b1115612899576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612890906147fa565b60405180910390fd5b505b6000811180156128ad57506010548111155b6128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e39061465a565b60405180910390fd5b600d54816128fa6007612d6b565b6129049190614a04565b1115612945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293c9061483a565b60405180910390fd5b61294d612bd4565b73ffffffffffffffffffffffffffffffffffffffff1661296b611a7b565b73ffffffffffffffffffffffffffffffffffffffff16146129c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b89061479a565b60405180910390fd5b6129cb8284613184565b505050565b6129d8612bd4565b73ffffffffffffffffffffffffffffffffffffffff166129f6611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a439061479a565b60405180910390fd5b601160009054906101000a900460ff1615612a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a93906147ba565b60405180910390fd5b612aa63382613184565b50565b612ab1612bd4565b73ffffffffffffffffffffffffffffffffffffffff16612acf611a7b565b73ffffffffffffffffffffffffffffffffffffffff1614612b25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1c9061479a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b8c906145fa565b60405180910390fd5b612b9e816130be565b50565b60126020528060005260406000206000915054906101000a900460ff1681565b601160019054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d25836116e1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612d8482612c46565b612dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dba906146ba565b60405180910390fd5b6000612dce836116e1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e3d57508373ffffffffffffffffffffffffffffffffffffffff16612e2584610e93565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e4e5750612e4d8185612655565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e77826116e1565b73ffffffffffffffffffffffffffffffffffffffff1614612ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec49061461a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f349061467a565b60405180910390fd5b612f488383836135f3565b612f53600082612cb2565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fa39190614ae5565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ffa9190614a04565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130b98383836135f8565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60005b818110156132145761319960076135fd565b6131ac836131a76007612d6b565b6135d5565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906131fc90614c32565b9190505550808061320c90614c32565b915050613187565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613288576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161327f9061469a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613379919061459d565b60405180910390a3505050565b613391848484612e57565b61339d84848484613613565b6133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d3906145da565b60405180910390fd5b50505050565b6060600880546133f190614bcf565b80601f016020809104026020016040519081016040528092919081815260200182805461341d90614bcf565b801561346a5780601f1061343f5761010080835404028352916020019161346a565b820191906000526020600020905b81548152906001019060200180831161344d57829003601f168201915b5050505050905090565b606060008214156134bc576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506135d0565b600082905060005b600082146134ee5780806134d790614c32565b915050600a826134e79190614a5a565b91506134c4565b60008167ffffffffffffffff81111561350a57613509614d68565b5b6040519080825280601f01601f19166020018201604052801561353c5781602001600182028036833780820191505090505b5090505b600085146135c9576001826135559190614ae5565b9150600a856135649190614c7b565b60306135709190614a04565b60f81b81838151811061358657613585614d39565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856135c29190614a5a565b9450613540565b8093505050505b919050565b6135ef8282604051806020016040528060008152506137aa565b5050565b505050565b505050565b6001816000016000828254019250508190555050565b60006136348473ffffffffffffffffffffffffffffffffffffffff16613805565b1561379d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261365d612bd4565b8786866040518563ffffffff1660e01b815260040161367f949392919061452f565b602060405180830381600087803b15801561369957600080fd5b505af19250505080156136ca57506040513d601f19601f820116820180604052508101906136c79190613ef2565b60015b61374d573d80600081146136fa576040519150601f19603f3d011682016040523d82523d6000602084013e6136ff565b606091505b50600081511415613745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161373c906145da565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137a2565b600190505b949350505050565b6137b48383613828565b6137c16000848484613613565b613800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137f7906145da565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161388f9061475a565b60405180910390fd5b6138a181612c46565b156138e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138d89061463a565b60405180910390fd5b6138ed600083836135f3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461393d9190614a04565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46139fe600083836135f8565b5050565b828054613a0e90614bcf565b90600052602060002090601f016020900481019282613a305760008555613a77565b82601f10613a4957805160ff1916838001178555613a77565b82800160010185558215613a77579182015b82811115613a76578251825591602001919060010190613a5b565b5b509050613a849190613a88565b5090565b5b80821115613aa1576000816000905550600101613a89565b5090565b6000613ab8613ab3846148da565b6148b5565b90508083825260208201905082856020860282011115613adb57613ada614d9c565b5b60005b85811015613b0b5781613af18882613b99565b845260208401935060208301925050600181019050613ade565b5050509392505050565b6000613b28613b2384614906565b6148b5565b905082815260208101848484011115613b4457613b43614da1565b5b613b4f848285614b8d565b509392505050565b6000613b6a613b6584614937565b6148b5565b905082815260208101848484011115613b8657613b85614da1565b5b613b91848285614b8d565b509392505050565b600081359050613ba881615312565b92915050565b600082601f830112613bc357613bc2614d97565b5b8135613bd3848260208601613aa5565b91505092915050565b600081359050613beb81615329565b92915050565b600081359050613c0081615340565b92915050565b600081519050613c1581615340565b92915050565b600082601f830112613c3057613c2f614d97565b5b8135613c40848260208601613b15565b91505092915050565b600082601f830112613c5e57613c5d614d97565b5b8135613c6e848260208601613b57565b91505092915050565b600081359050613c8681615357565b92915050565b600060208284031215613ca257613ca1614dab565b5b6000613cb084828501613b99565b91505092915050565b60008060408385031215613cd057613ccf614dab565b5b6000613cde85828601613b99565b9250506020613cef85828601613b99565b9150509250929050565b600080600060608486031215613d1257613d11614dab565b5b6000613d2086828701613b99565b9350506020613d3186828701613b99565b9250506040613d4286828701613c77565b9150509250925092565b60008060008060808587031215613d6657613d65614dab565b5b6000613d7487828801613b99565b9450506020613d8587828801613b99565b9350506040613d9687828801613c77565b925050606085013567ffffffffffffffff811115613db757613db6614da6565b5b613dc387828801613c1b565b91505092959194509250565b60008060408385031215613de657613de5614dab565b5b6000613df485828601613b99565b9250506020613e0585828601613bdc565b9150509250929050565b60008060408385031215613e2657613e25614dab565b5b6000613e3485828601613b99565b9250506020613e4585828601613c77565b9150509250929050565b600060208284031215613e6557613e64614dab565b5b600082013567ffffffffffffffff811115613e8357613e82614da6565b5b613e8f84828501613bae565b91505092915050565b600060208284031215613eae57613ead614dab565b5b6000613ebc84828501613bdc565b91505092915050565b600060208284031215613edb57613eda614dab565b5b6000613ee984828501613bf1565b91505092915050565b600060208284031215613f0857613f07614dab565b5b6000613f1684828501613c06565b91505092915050565b600060208284031215613f3557613f34614dab565b5b600082013567ffffffffffffffff811115613f5357613f52614da6565b5b613f5f84828501613c49565b91505092915050565b600060208284031215613f7e57613f7d614dab565b5b6000613f8c84828501613c77565b91505092915050565b60008060408385031215613fac57613fab614dab565b5b6000613fba85828601613c77565b9250506020613fcb85828601613b99565b9150509250929050565b6000613fe183836144b0565b60208301905092915050565b613ff681614b19565b82525050565b60006140078261498d565b61401181856149bb565b935061401c83614968565b8060005b8381101561404d5781516140348882613fd5565b975061403f836149ae565b925050600181019050614020565b5085935050505092915050565b61406381614b2b565b82525050565b600061407482614998565b61407e81856149cc565b935061408e818560208601614b9c565b61409781614db0565b840191505092915050565b60006140ad826149a3565b6140b781856149e8565b93506140c7818560208601614b9c565b6140d081614db0565b840191505092915050565b60006140e6826149a3565b6140f081856149f9565b9350614100818560208601614b9c565b80840191505092915050565b6000815461411981614bcf565b61412381866149f9565b9450600182166000811461413e576001811461414f57614182565b60ff19831686528186019350614182565b61415885614978565b60005b8381101561417a5781548189015260018201915060208101905061415b565b838801955050505b50505092915050565b60006141986032836149e8565b91506141a382614dc1565b604082019050919050565b60006141bb6026836149e8565b91506141c682614e10565b604082019050919050565b60006141de6025836149e8565b91506141e982614e5f565b604082019050919050565b6000614201601c836149e8565b915061420c82614eae565b602082019050919050565b60006142246014836149e8565b915061422f82614ed7565b602082019050919050565b60006142476024836149e8565b915061425282614f00565b604082019050919050565b600061426a6019836149e8565b915061427582614f4f565b602082019050919050565b600061428d602c836149e8565b915061429882614f78565b604082019050919050565b60006142b06017836149e8565b91506142bb82614fc7565b602082019050919050565b60006142d36038836149e8565b91506142de82614ff0565b604082019050919050565b60006142f6602a836149e8565b91506143018261503f565b604082019050919050565b60006143196029836149e8565b91506143248261508e565b604082019050919050565b600061433c6020836149e8565b9150614347826150dd565b602082019050919050565b600061435f602c836149e8565b915061436a82615106565b604082019050919050565b60006143826020836149e8565b915061438d82615155565b602082019050919050565b60006143a56017836149e8565b91506143b08261517e565b602082019050919050565b60006143c8602f836149e8565b91506143d3826151a7565b604082019050919050565b60006143eb601c836149e8565b91506143f6826151f6565b602082019050919050565b600061440e6021836149e8565b91506144198261521f565b604082019050919050565b60006144316000836149dd565b915061443c8261526e565b600082019050919050565b60006144546014836149e8565b915061445f82615271565b602082019050919050565b60006144776031836149e8565b91506144828261529a565b604082019050919050565b600061449a6013836149e8565b91506144a5826152e9565b602082019050919050565b6144b981614b83565b82525050565b6144c881614b83565b82525050565b60006144da82866140db565b91506144e682856140db565b91506144f2828461410c565b9150819050949350505050565b600061450a82614424565b9150819050919050565b60006020820190506145296000830184613fed565b92915050565b60006080820190506145446000830187613fed565b6145516020830186613fed565b61455e60408301856144bf565b81810360608301526145708184614069565b905095945050505050565b600060208201905081810360008301526145958184613ffc565b905092915050565b60006020820190506145b2600083018461405a565b92915050565b600060208201905081810360008301526145d281846140a2565b905092915050565b600060208201905081810360008301526145f38161418b565b9050919050565b60006020820190508181036000830152614613816141ae565b9050919050565b60006020820190508181036000830152614633816141d1565b9050919050565b60006020820190508181036000830152614653816141f4565b9050919050565b6000602082019050818103600083015261467381614217565b9050919050565b600060208201905081810360008301526146938161423a565b9050919050565b600060208201905081810360008301526146b38161425d565b9050919050565b600060208201905081810360008301526146d381614280565b9050919050565b600060208201905081810360008301526146f3816142a3565b9050919050565b60006020820190508181036000830152614713816142c6565b9050919050565b60006020820190508181036000830152614733816142e9565b9050919050565b600060208201905081810360008301526147538161430c565b9050919050565b600060208201905081810360008301526147738161432f565b9050919050565b6000602082019050818103600083015261479381614352565b9050919050565b600060208201905081810360008301526147b381614375565b9050919050565b600060208201905081810360008301526147d381614398565b9050919050565b600060208201905081810360008301526147f3816143bb565b9050919050565b60006020820190508181036000830152614813816143de565b9050919050565b6000602082019050818103600083015261483381614401565b9050919050565b6000602082019050818103600083015261485381614447565b9050919050565b600060208201905081810360008301526148738161446a565b9050919050565b600060208201905081810360008301526148938161448d565b9050919050565b60006020820190506148af60008301846144bf565b92915050565b60006148bf6148d0565b90506148cb8282614c01565b919050565b6000604051905090565b600067ffffffffffffffff8211156148f5576148f4614d68565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561492157614920614d68565b5b61492a82614db0565b9050602081019050919050565b600067ffffffffffffffff82111561495257614951614d68565b5b61495b82614db0565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a0f82614b83565b9150614a1a83614b83565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a4f57614a4e614cac565b5b828201905092915050565b6000614a6582614b83565b9150614a7083614b83565b925082614a8057614a7f614cdb565b5b828204905092915050565b6000614a9682614b83565b9150614aa183614b83565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ada57614ad9614cac565b5b828202905092915050565b6000614af082614b83565b9150614afb83614b83565b925082821015614b0e57614b0d614cac565b5b828203905092915050565b6000614b2482614b63565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614bba578082015181840152602081019050614b9f565b83811115614bc9576000848401525b50505050565b60006002820490506001821680614be757607f821691505b60208210811415614bfb57614bfa614d0a565b5b50919050565b614c0a82614db0565b810181811067ffffffffffffffff82111715614c2957614c28614d68565b5b80604052505050565b6000614c3d82614b83565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7057614c6f614cac565b5b600182019050919050565b6000614c8682614b83565b9150614c9183614b83565b925082614ca157614ca0614cdb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f55736572206973206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d6178204e465420706572206164647265737320657863656564656400000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b61531b81614b19565b811461532657600080fd5b50565b61533281614b2b565b811461533d57600080fd5b50565b61534981614b37565b811461535457600080fd5b50565b61536081614b83565b811461536b57600080fd5b5056fea26469706673582212203e69d62848ee9ecac581a49da5bcc01f074d4fc08f6d729769a76347e22c98bb64736f6c63430008070033
Deployed Bytecode Sourcemap
38764:7027:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45518:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25574:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26519:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28078:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27601:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43781:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43914:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40678:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39589:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28828:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39103:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45051:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44429:145;;;:::i;:::-;;29238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41870:685;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45188:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44037:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39446:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39019:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39380:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38930:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26213:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43191:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43333:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39283:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25943:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;43644:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43065:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39149:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39334:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26688:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45645:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39481:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40794:453;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28371:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39059:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29494:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39239:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45309:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44203:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42581:455;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39199:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41429:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44317:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43491:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28597:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41677:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41255:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39524:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39413:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45518:119;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45624:5:::1;45590:24;:31;45615:5;45590:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;45518:119:::0;:::o;25574:305::-;25676:4;25728:25;25713:40;;;:11;:40;;;;:105;;;;25785:33;25770:48;;;:11;:48;;;;25713:105;:158;;;;25835:36;25859:11;25835:23;:36::i;:::-;25713:158;25693:178;;25574:305;;;:::o;26519:100::-;26573:13;26606:5;26599:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26519:100;:::o;28078:221::-;28154:7;28182:16;28190:7;28182;:16::i;:::-;28174:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28267:15;:24;28283:7;28267:24;;;;;;;;;;;;;;;;;;;;;28260:31;;28078:221;;;:::o;27601:411::-;27682:13;27698:23;27713:7;27698:14;:23::i;:::-;27682:39;;27746:5;27740:11;;:2;:11;;;;27732:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27840:5;27824:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27849:37;27866:5;27873:12;:10;:12::i;:::-;27849:16;:37::i;:::-;27824:62;27802:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27983:21;27992:2;27996:7;27983:8;:21::i;:::-;27671:341;27601:411;;:::o;43781:106::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43869:10:::1;43857:9;:22;;;;;;;;;;;;:::i;:::-;;43781:106:::0;:::o;43914:83::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43983:6:::1;43974;;:15;;;;;;;;;;;;;;;;;;43914:83:::0;:::o;40678:95::-;40722:7;40749:16;:6;:14;:16::i;:::-;40742:23;;40678:95;:::o;39589:55::-;;;;;;;;;;;;;;;;;:::o;28828:339::-;29023:41;29042:12;:10;:12::i;:::-;29056:7;29023:18;:41::i;:::-;29015:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29131:28;29141:4;29147:2;29151:7;29131:9;:28::i;:::-;28828:339;;;:::o;39103:39::-;;;;:::o;45051:101::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45138:6:::1;45120:15;;:24;;;;;;;;;;;;;;;;;;45051:101:::0;:::o;44429:145::-;44476:7;44497;:5;:7::i;:::-;44489:21;;44518;44489:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44475:69;;;44563:2;44555:11;;;;;;44464:110;44429:145::o;29238:185::-;29376:39;29393:4;29399:2;29403:7;29376:39;;;;;;;;;;;;:16;:39::i;:::-;29238:185;;;:::o;41870:685::-;41930:16;41959:23;41985:17;41995:6;41985:9;:17::i;:::-;41959:43;;42013:30;42060:15;42046:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42013:63;;42087:22;42112:1;42087:26;;42124:23;42164:351;42189:15;42171;:33;:64;;;;;42226:9;;42208:14;:27;;42171:64;42164:351;;;42252:25;42280:23;42288:14;42280:7;:23::i;:::-;42252:51;;42345:6;42324:27;;:17;:27;;;42320:151;;;42405:14;42372:13;42386:15;42372:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;42438:17;;;;;:::i;:::-;;;;42320:151;42487:16;;;;;:::i;:::-;;;;42237:278;42164:351;;;42534:13;42527:20;;;;;;41870:685;;;:::o;45188:113::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45289:4:::1;45255:24;:31;45280:5;45255:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;45188:113:::0;:::o;44037:138::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44149:18:::1;44129:17;:38;;;;;;;;;;;;:::i;:::-;;44037:138:::0;:::o;39446:28::-;;;;;;;;;;;;;:::o;39019:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39380:26::-;;;;;;;;;;;;;:::o;38930:82::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26213:239::-;26285:7;26305:13;26321:7;:16;26329:7;26321:16;;;;;;;;;;;;;;;;;;;;;26305:32;;26373:1;26356:19;;:5;:19;;;;26348:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26439:5;26432:12;;;26213:239;;;:::o;43191:100::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43278:5:::1;43261:14;:22;;;;43191:100:::0;:::o;43333:108::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43428:5:::1;43407:18;:26;;;;43333:108:::0;:::o;39283:44::-;;;;:::o;25943:208::-;26015:7;26060:1;26043:19;;:5;:19;;;;26035:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26127:9;:16;26137:5;26127:16;;;;;;;;;;;;;;;;26120:23;;25943:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;43644:106::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43732:10:::1;43720:9;:22;;;;;;;;;;;;:::i;:::-;;43644:106:::0;:::o;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;43065:94::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43146:5:::1;43132:11;:19;;;;43065:94:::0;:::o;39149:41::-;;;;:::o;39334:37::-;;;;:::o;26688:104::-;26744:13;26777:7;26770:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26688:104;:::o;45645:143::-;45704:4;45728:24;:31;45753:5;45728:31;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;45773:7;:5;:7::i;:::-;45764:16;;:5;:16;;;45728:52;45721:59;;45645:143;;;:::o;39481:34::-;;;;;;;;;;;;;:::o;40794:453::-;40859:11;39898:4;39887:15;;:7;;;;;;;;;;;:15;;;39884:561;;;39941:4;39922:23;;:15;;;;;;;;;;;:23;;;39919:124;;;39974:25;39988:10;39974:13;:25::i;:::-;39966:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39919:124;40059:24;40086:20;:32;40107:10;40086:32;;;;;;;;;;;;;;;;40059:59;;40175:25;;40160:11;40141:16;:30;;;;:::i;:::-;:59;;40133:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;39904:341;39884:561;;;40266:24;40293:20;:32;40314:10;40293:32;;;;;;;;;;;;;;;;40266:59;;40382:18;;40367:11;40348:16;:30;;;;:::i;:::-;:52;;40340:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;40251:194;39884:561;40479:1;40465:11;:15;:52;;;;;40499:18;;40484:11;:33;;40465:52;40457:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40595:9;;40580:11;40561:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;40553:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;40892:6:::1;;;;;;;;;;;40891:7;40883:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;40961:4;40950:15;;:7;;;;;;;;;;;:15;;;40947:223;;;41017:11;41003;;:25;;;;:::i;:::-;40990:9;:38;;40982:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;40947:223;;;41123:11;41106:14;;:28;;;;:::i;:::-;41093:9;:41;;41085:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;40947:223;41182:34;41192:10;41204:11;41182:9;:34::i;:::-;41229:10;:8;:10::i;:::-;40794:453:::0;;:::o;28371:155::-;28466:52;28485:12;:10;:12::i;:::-;28499:8;28509;28466:18;:52::i;:::-;28371:155;;:::o;39059:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29494:328::-;29669:41;29688:12;:10;:12::i;:::-;29702:7;29669:18;:41::i;:::-;29661:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29775:39;29789:4;29795:2;29799:7;29808:5;29775:13;:39::i;:::-;29494:328;;;;:::o;39239:37::-;;;;:::o;45309:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45396:9:::1;45391:112;45413:6;:13;45410:1;:16;45391:112;;;45486:4;45448:24;:35;45473:6;45480:1;45473:9;;;;;;;;:::i;:::-;;;;;;;;45448:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;45428:3;;;;;:::i;:::-;;;;45391:112;;;;45309:201:::0;:::o;44203:85::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44274:6:::1;44264:7;;:16;;;;;;;;;;;;;;;;;;44203:85:::0;:::o;42581:455::-;42655:13;42689:17;42697:8;42689:7;:17::i;:::-;42681:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;42787:5;42775:17;;:8;;;;;;;;;;;:17;;;42771:74;;;42816:17;42809:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42771:74;42857:28;42888:10;:8;:10::i;:::-;42857:41;;42947:1;42922:14;42916:28;:32;:112;;;;;;;;;;;;;;;;;42975:14;42991:19;:8;:17;:19::i;:::-;43012:9;42958:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42916:112;42909:119;;;42581:455;;;;:::o;39199:31::-;;;;:::o;41429:213::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41511:6:::1;;;;;;;;;;;41510:7;41502:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;41558:31;41568:10;41580:8;41558:9;:31::i;:::-;41600:20;:32;41621:10;41600:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;41429:213:::0;:::o;44317:87::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44390:6:::1;44379:8;;:17;;;;;;;;;;;;;;;;;;44317:87:::0;:::o;43491:122::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43600:5:::1;43572:25;:33;;;;43491:122:::0;:::o;28597:164::-;28694:4;28718:18;:25;28737:5;28718:25;;;;;;;;;;;;;;;:35;28744:8;28718:35;;;;;;;;;;;;;;;;;;;;;;;;;28711:42;;28597:164;;;;:::o;41677:161::-;41763:11;39898:4;39887:15;;:7;;;;;;;;;;;:15;;;39884:561;;;39941:4;39922:23;;:15;;;;;;;;;;;:23;;;39919:124;;;39974:25;39988:10;39974:13;:25::i;:::-;39966:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39919:124;40059:24;40086:20;:32;40107:10;40086:32;;;;;;;;;;;;;;;;40059:59;;40175:25;;40160:11;40141:16;:30;;;;:::i;:::-;:59;;40133:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;39904:341;39884:561;;;40266:24;40293:20;:32;40314:10;40293:32;;;;;;;;;;;;;;;;40266:59;;40382:18;;40367:11;40348:16;:30;;;;:::i;:::-;:52;;40340:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;40251:194;39884:561;40479:1;40465:11;:15;:52;;;;;40499:18;;40484:11;:33;;40465:52;40457:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40595:9;;40580:11;40561:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;40553:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5775:12:::1;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41797:33:::2;41807:9;41818:11;41797:9;:33::i;:::-;41677:161:::0;;;:::o;41255:166::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41332:6:::1;;;;;;;;;;;41331:7;41323:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;41379:34;41389:10;41401:11;41379:9;:34::i;:::-;41255:166:::0;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;39524:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;39413:26::-;;;;;;;;;;;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;18328:157::-;18413:4;18452:25;18437:40;;;:11;:40;;;;18430:47;;18328:157;;;:::o;31332:127::-;31397:4;31449:1;31421:30;;:7;:16;31429:7;31421:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31414:37;;31332:127;;;:::o;35478:174::-;35580:2;35553:15;:24;35569:7;35553:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35636:7;35632:2;35598:46;;35607:23;35622:7;35607:14;:23::i;:::-;35598:46;;;;;;;;;;;;35478:174;;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;31626:348::-;31719:4;31744:16;31752:7;31744;:16::i;:::-;31736:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31820:13;31836:23;31851:7;31836:14;:23::i;:::-;31820:39;;31889:5;31878:16;;:7;:16;;;:51;;;;31922:7;31898:31;;:20;31910:7;31898:11;:20::i;:::-;:31;;;31878:51;:87;;;;31933:32;31950:5;31957:7;31933:16;:32::i;:::-;31878:87;31870:96;;;31626:348;;;;:::o;34735:625::-;34894:4;34867:31;;:23;34882:7;34867:14;:23::i;:::-;:31;;;34859:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;34973:1;34959:16;;:2;:16;;;;34951:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;35029:39;35050:4;35056:2;35060:7;35029:20;:39::i;:::-;35133:29;35150:1;35154:7;35133:8;:29::i;:::-;35194:1;35175:9;:15;35185:4;35175:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35223:1;35206:9;:13;35216:2;35206:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35254:2;35235:7;:16;35243:7;35235:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35293:7;35289:2;35274:27;;35283:4;35274:27;;;;;;;;;;;;35314:38;35334:4;35340:2;35344:7;35314:19;:38::i;:::-;34735:625;;;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;44600:279::-;44684:9;44679:193;44703:11;44699:1;:15;44679:193;;;44736:18;:6;:16;:18::i;:::-;44771:38;44781:9;44792:16;:6;:14;:16::i;:::-;44771:9;:38::i;:::-;44826:20;:32;44847:10;44826:32;;;;;;;;;;;;;;;;:34;;;;;;;;;:::i;:::-;;;;;;44716:3;;;;;:::i;:::-;;;;44679:193;;;;44600:279;;:::o;35794:315::-;35949:8;35940:17;;:5;:17;;;;35932:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;36036:8;35998:18;:25;36017:5;35998:25;;;;;;;;;;;;;;;:35;36024:8;35998:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;36082:8;36060:41;;36075:5;36060:41;;;36092:8;36060:41;;;;;;:::i;:::-;;;;;;;;35794:315;;;:::o;30704:::-;30861:28;30871:4;30877:2;30881:7;30861:9;:28::i;:::-;30908:48;30931:4;30937:2;30941:7;30950:5;30908:22;:48::i;:::-;30900:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30704:315;;;;:::o;44904:110::-;44964:13;44997:9;44990:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44904:110;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;32316:110::-;32392:26;32402:2;32406:7;32392:26;;;;;;;;;;;;:9;:26::i;:::-;32316:110;;:::o;38045:126::-;;;;:::o;38556:125::-;;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;36674:799::-;36829:4;36850:15;:2;:13;;;:15::i;:::-;36846:620;;;36902:2;36886:36;;;36923:12;:10;:12::i;:::-;36937:4;36943:7;36952:5;36886:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36882:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37145:1;37128:6;:13;:18;37124:272;;;37171:60;;;;;;;;;;:::i;:::-;;;;;;;;37124:272;37346:6;37340:13;37331:6;37327:2;37323:15;37316:38;36882:529;37019:41;;;37009:51;;;:6;:51;;;;37002:58;;;;;36846:620;37450:4;37443:11;;36674:799;;;;;;;:::o;32653:321::-;32783:18;32789:2;32793:7;32783:5;:18::i;:::-;32834:54;32865:1;32869:2;32873:7;32882:5;32834:22;:54::i;:::-;32812:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32653:321;;;:::o;8245:326::-;8305:4;8562:1;8540:7;:19;;;:23;8533:30;;8245:326;;;:::o;33310:439::-;33404:1;33390:16;;:2;:16;;;;33382:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33463:16;33471:7;33463;:16::i;:::-;33462:17;33454:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33525:45;33554:1;33558:2;33562:7;33525:20;:45::i;:::-;33600:1;33583:9;:13;33593:2;33583:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33631:2;33612:7;:16;33620:7;33612:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33676:7;33672:2;33651:33;;33668:1;33651:33;;;;;;;;;;;;33697:44;33725:1;33729:2;33733:7;33697:19;:44::i;:::-;33310:439;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:323::-;7359:6;7408:2;7396:9;7387:7;7383:23;7379:32;7376:119;;;7414:79;;:::i;:::-;7376:119;7534:1;7559:50;7601:7;7592:6;7581:9;7577:22;7559:50;:::i;:::-;7549:60;;7505:114;7303:323;;;;:::o;7632:327::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:52;7934:7;7925:6;7914:9;7910:22;7890:52;:::i;:::-;7880:62;;7836:116;7632:327;;;;:::o;7965:349::-;8034:6;8083:2;8071:9;8062:7;8058:23;8054:32;8051:119;;;8089:79;;:::i;:::-;8051:119;8209:1;8234:63;8289:7;8280:6;8269:9;8265:22;8234:63;:::i;:::-;8224:73;;8180:127;7965:349;;;;:::o;8320:509::-;8389:6;8438:2;8426:9;8417:7;8413:23;8409:32;8406:119;;;8444:79;;:::i;:::-;8406:119;8592:1;8581:9;8577:17;8564:31;8622:18;8614:6;8611:30;8608:117;;;8644:79;;:::i;:::-;8608:117;8749:63;8804:7;8795:6;8784:9;8780:22;8749:63;:::i;:::-;8739:73;;8535:287;8320:509;;;;:::o;8835:329::-;8894:6;8943:2;8931:9;8922:7;8918:23;8914:32;8911:119;;;8949:79;;:::i;:::-;8911:119;9069:1;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9040:117;8835:329;;;;:::o;9170:474::-;9238:6;9246;9295:2;9283:9;9274:7;9270:23;9266:32;9263:119;;;9301:79;;:::i;:::-;9263:119;9421:1;9446:53;9491:7;9482:6;9471:9;9467:22;9446:53;:::i;:::-;9436:63;;9392:117;9548:2;9574:53;9619:7;9610:6;9599:9;9595:22;9574:53;:::i;:::-;9564:63;;9519:118;9170:474;;;;;:::o;9650:179::-;9719:10;9740:46;9782:3;9774:6;9740:46;:::i;:::-;9818:4;9813:3;9809:14;9795:28;;9650:179;;;;:::o;9835:118::-;9922:24;9940:5;9922:24;:::i;:::-;9917:3;9910:37;9835:118;;:::o;9989:732::-;10108:3;10137:54;10185:5;10137:54;:::i;:::-;10207:86;10286:6;10281:3;10207:86;:::i;:::-;10200:93;;10317:56;10367:5;10317:56;:::i;:::-;10396:7;10427:1;10412:284;10437:6;10434:1;10431:13;10412:284;;;10513:6;10507:13;10540:63;10599:3;10584:13;10540:63;:::i;:::-;10533:70;;10626:60;10679:6;10626:60;:::i;:::-;10616:70;;10472:224;10459:1;10456;10452:9;10447:14;;10412:284;;;10416:14;10712:3;10705:10;;10113:608;;;9989:732;;;;:::o;10727:109::-;10808:21;10823:5;10808:21;:::i;:::-;10803:3;10796:34;10727:109;;:::o;10842:360::-;10928:3;10956:38;10988:5;10956:38;:::i;:::-;11010:70;11073:6;11068:3;11010:70;:::i;:::-;11003:77;;11089:52;11134:6;11129:3;11122:4;11115:5;11111:16;11089:52;:::i;:::-;11166:29;11188:6;11166:29;:::i;:::-;11161:3;11157:39;11150:46;;10932:270;10842:360;;;;:::o;11208:364::-;11296:3;11324:39;11357:5;11324:39;:::i;:::-;11379:71;11443:6;11438:3;11379:71;:::i;:::-;11372:78;;11459:52;11504:6;11499:3;11492:4;11485:5;11481:16;11459:52;:::i;:::-;11536:29;11558:6;11536:29;:::i;:::-;11531:3;11527:39;11520:46;;11300:272;11208:364;;;;:::o;11578:377::-;11684:3;11712:39;11745:5;11712:39;:::i;:::-;11767:89;11849:6;11844:3;11767:89;:::i;:::-;11760:96;;11865:52;11910:6;11905:3;11898:4;11891:5;11887:16;11865:52;:::i;:::-;11942:6;11937:3;11933:16;11926:23;;11688:267;11578:377;;;;:::o;11985:845::-;12088:3;12125:5;12119:12;12154:36;12180:9;12154:36;:::i;:::-;12206:89;12288:6;12283:3;12206:89;:::i;:::-;12199:96;;12326:1;12315:9;12311:17;12342:1;12337:137;;;;12488:1;12483:341;;;;12304:520;;12337:137;12421:4;12417:9;12406;12402:25;12397:3;12390:38;12457:6;12452:3;12448:16;12441:23;;12337:137;;12483:341;12550:38;12582:5;12550:38;:::i;:::-;12610:1;12624:154;12638:6;12635:1;12632:13;12624:154;;;12712:7;12706:14;12702:1;12697:3;12693:11;12686:35;12762:1;12753:7;12749:15;12738:26;;12660:4;12657:1;12653:12;12648:17;;12624:154;;;12807:6;12802:3;12798:16;12791:23;;12490:334;;12304:520;;12092:738;;11985:845;;;;:::o;12836:366::-;12978:3;12999:67;13063:2;13058:3;12999:67;:::i;:::-;12992:74;;13075:93;13164:3;13075:93;:::i;:::-;13193:2;13188:3;13184:12;13177:19;;12836:366;;;:::o;13208:::-;13350:3;13371:67;13435:2;13430:3;13371:67;:::i;:::-;13364:74;;13447:93;13536:3;13447:93;:::i;:::-;13565:2;13560:3;13556:12;13549:19;;13208:366;;;:::o;13580:::-;13722:3;13743:67;13807:2;13802:3;13743:67;:::i;:::-;13736:74;;13819:93;13908:3;13819:93;:::i;:::-;13937:2;13932:3;13928:12;13921:19;;13580:366;;;:::o;13952:::-;14094:3;14115:67;14179:2;14174:3;14115:67;:::i;:::-;14108:74;;14191:93;14280:3;14191:93;:::i;:::-;14309:2;14304:3;14300:12;14293:19;;13952:366;;;:::o;14324:::-;14466:3;14487:67;14551:2;14546:3;14487:67;:::i;:::-;14480:74;;14563:93;14652:3;14563:93;:::i;:::-;14681:2;14676:3;14672:12;14665:19;;14324:366;;;:::o;14696:::-;14838:3;14859:67;14923:2;14918:3;14859:67;:::i;:::-;14852:74;;14935:93;15024:3;14935:93;:::i;:::-;15053:2;15048:3;15044:12;15037:19;;14696:366;;;:::o;15068:::-;15210:3;15231:67;15295:2;15290:3;15231:67;:::i;:::-;15224:74;;15307:93;15396:3;15307:93;:::i;:::-;15425:2;15420:3;15416:12;15409:19;;15068:366;;;:::o;15440:::-;15582:3;15603:67;15667:2;15662:3;15603:67;:::i;:::-;15596:74;;15679:93;15768:3;15679:93;:::i;:::-;15797:2;15792:3;15788:12;15781:19;;15440:366;;;:::o;15812:::-;15954:3;15975:67;16039:2;16034:3;15975:67;:::i;:::-;15968:74;;16051:93;16140:3;16051:93;:::i;:::-;16169:2;16164:3;16160:12;16153:19;;15812:366;;;:::o;16184:::-;16326:3;16347:67;16411:2;16406:3;16347:67;:::i;:::-;16340:74;;16423:93;16512:3;16423:93;:::i;:::-;16541:2;16536:3;16532:12;16525:19;;16184:366;;;:::o;16556:::-;16698:3;16719:67;16783:2;16778:3;16719:67;:::i;:::-;16712:74;;16795:93;16884:3;16795:93;:::i;:::-;16913:2;16908:3;16904:12;16897:19;;16556:366;;;:::o;16928:::-;17070:3;17091:67;17155:2;17150:3;17091:67;:::i;:::-;17084:74;;17167:93;17256:3;17167:93;:::i;:::-;17285:2;17280:3;17276:12;17269:19;;16928:366;;;:::o;17300:::-;17442:3;17463:67;17527:2;17522:3;17463:67;:::i;:::-;17456:74;;17539:93;17628:3;17539:93;:::i;:::-;17657:2;17652:3;17648:12;17641:19;;17300:366;;;:::o;17672:::-;17814:3;17835:67;17899:2;17894:3;17835:67;:::i;:::-;17828:74;;17911:93;18000:3;17911:93;:::i;:::-;18029:2;18024:3;18020:12;18013:19;;17672:366;;;:::o;18044:::-;18186:3;18207:67;18271:2;18266:3;18207:67;:::i;:::-;18200:74;;18283:93;18372:3;18283:93;:::i;:::-;18401:2;18396:3;18392:12;18385:19;;18044:366;;;:::o;18416:::-;18558:3;18579:67;18643:2;18638:3;18579:67;:::i;:::-;18572:74;;18655:93;18744:3;18655:93;:::i;:::-;18773:2;18768:3;18764:12;18757:19;;18416:366;;;:::o;18788:::-;18930:3;18951:67;19015:2;19010:3;18951:67;:::i;:::-;18944:74;;19027:93;19116:3;19027:93;:::i;:::-;19145:2;19140:3;19136:12;19129:19;;18788:366;;;:::o;19160:::-;19302:3;19323:67;19387:2;19382:3;19323:67;:::i;:::-;19316:74;;19399:93;19488:3;19399:93;:::i;:::-;19517:2;19512:3;19508:12;19501:19;;19160:366;;;:::o;19532:::-;19674:3;19695:67;19759:2;19754:3;19695:67;:::i;:::-;19688:74;;19771:93;19860:3;19771:93;:::i;:::-;19889:2;19884:3;19880:12;19873:19;;19532:366;;;:::o;19904:398::-;20063:3;20084:83;20165:1;20160:3;20084:83;:::i;:::-;20077:90;;20176:93;20265:3;20176:93;:::i;:::-;20294:1;20289:3;20285:11;20278:18;;19904:398;;;:::o;20308:366::-;20450:3;20471:67;20535:2;20530:3;20471:67;:::i;:::-;20464:74;;20547:93;20636:3;20547:93;:::i;:::-;20665:2;20660:3;20656:12;20649:19;;20308:366;;;:::o;20680:::-;20822:3;20843:67;20907:2;20902:3;20843:67;:::i;:::-;20836:74;;20919:93;21008:3;20919:93;:::i;:::-;21037:2;21032:3;21028:12;21021:19;;20680:366;;;:::o;21052:::-;21194:3;21215:67;21279:2;21274:3;21215:67;:::i;:::-;21208:74;;21291:93;21380:3;21291:93;:::i;:::-;21409:2;21404:3;21400:12;21393:19;;21052:366;;;:::o;21424:108::-;21501:24;21519:5;21501:24;:::i;:::-;21496:3;21489:37;21424:108;;:::o;21538:118::-;21625:24;21643:5;21625:24;:::i;:::-;21620:3;21613:37;21538:118;;:::o;21662:589::-;21887:3;21909:95;22000:3;21991:6;21909:95;:::i;:::-;21902:102;;22021:95;22112:3;22103:6;22021:95;:::i;:::-;22014:102;;22133:92;22221:3;22212:6;22133:92;:::i;:::-;22126:99;;22242:3;22235:10;;21662:589;;;;;;:::o;22257:379::-;22441:3;22463:147;22606:3;22463:147;:::i;:::-;22456:154;;22627:3;22620:10;;22257:379;;;:::o;22642:222::-;22735:4;22773:2;22762:9;22758:18;22750:26;;22786:71;22854:1;22843:9;22839:17;22830:6;22786:71;:::i;:::-;22642:222;;;;:::o;22870:640::-;23065:4;23103:3;23092:9;23088:19;23080:27;;23117:71;23185:1;23174:9;23170:17;23161:6;23117:71;:::i;:::-;23198:72;23266:2;23255:9;23251:18;23242:6;23198:72;:::i;:::-;23280;23348:2;23337:9;23333:18;23324:6;23280:72;:::i;:::-;23399:9;23393:4;23389:20;23384:2;23373:9;23369:18;23362:48;23427:76;23498:4;23489:6;23427:76;:::i;:::-;23419:84;;22870:640;;;;;;;:::o;23516:373::-;23659:4;23697:2;23686:9;23682:18;23674:26;;23746:9;23740:4;23736:20;23732:1;23721:9;23717:17;23710:47;23774:108;23877:4;23868:6;23774:108;:::i;:::-;23766:116;;23516:373;;;;:::o;23895:210::-;23982:4;24020:2;24009:9;24005:18;23997:26;;24033:65;24095:1;24084:9;24080:17;24071:6;24033:65;:::i;:::-;23895:210;;;;:::o;24111:313::-;24224:4;24262:2;24251:9;24247:18;24239:26;;24311:9;24305:4;24301:20;24297:1;24286:9;24282:17;24275:47;24339:78;24412:4;24403:6;24339:78;:::i;:::-;24331:86;;24111:313;;;;:::o;24430:419::-;24596:4;24634:2;24623:9;24619:18;24611:26;;24683:9;24677:4;24673:20;24669:1;24658:9;24654:17;24647:47;24711:131;24837:4;24711:131;:::i;:::-;24703:139;;24430:419;;;:::o;24855:::-;25021:4;25059:2;25048:9;25044:18;25036:26;;25108:9;25102:4;25098:20;25094:1;25083:9;25079:17;25072:47;25136:131;25262:4;25136:131;:::i;:::-;25128:139;;24855:419;;;:::o;25280:::-;25446:4;25484:2;25473:9;25469:18;25461:26;;25533:9;25527:4;25523:20;25519:1;25508:9;25504:17;25497:47;25561:131;25687:4;25561:131;:::i;:::-;25553:139;;25280:419;;;:::o;25705:::-;25871:4;25909:2;25898:9;25894:18;25886:26;;25958:9;25952:4;25948:20;25944:1;25933:9;25929:17;25922:47;25986:131;26112:4;25986:131;:::i;:::-;25978:139;;25705:419;;;:::o;26130:::-;26296:4;26334:2;26323:9;26319:18;26311:26;;26383:9;26377:4;26373:20;26369:1;26358:9;26354:17;26347:47;26411:131;26537:4;26411:131;:::i;:::-;26403:139;;26130:419;;;:::o;26555:::-;26721:4;26759:2;26748:9;26744:18;26736:26;;26808:9;26802:4;26798:20;26794:1;26783:9;26779:17;26772:47;26836:131;26962:4;26836:131;:::i;:::-;26828:139;;26555:419;;;:::o;26980:::-;27146:4;27184:2;27173:9;27169:18;27161:26;;27233:9;27227:4;27223:20;27219:1;27208:9;27204:17;27197:47;27261:131;27387:4;27261:131;:::i;:::-;27253:139;;26980:419;;;:::o;27405:::-;27571:4;27609:2;27598:9;27594:18;27586:26;;27658:9;27652:4;27648:20;27644:1;27633:9;27629:17;27622:47;27686:131;27812:4;27686:131;:::i;:::-;27678:139;;27405:419;;;:::o;27830:::-;27996:4;28034:2;28023:9;28019:18;28011:26;;28083:9;28077:4;28073:20;28069:1;28058:9;28054:17;28047:47;28111:131;28237:4;28111:131;:::i;:::-;28103:139;;27830:419;;;:::o;28255:::-;28421:4;28459:2;28448:9;28444:18;28436:26;;28508:9;28502:4;28498:20;28494:1;28483:9;28479:17;28472:47;28536:131;28662:4;28536:131;:::i;:::-;28528:139;;28255:419;;;:::o;28680:::-;28846:4;28884:2;28873:9;28869:18;28861:26;;28933:9;28927:4;28923:20;28919:1;28908:9;28904:17;28897:47;28961:131;29087:4;28961:131;:::i;:::-;28953:139;;28680:419;;;:::o;29105:::-;29271:4;29309:2;29298:9;29294:18;29286:26;;29358:9;29352:4;29348:20;29344:1;29333:9;29329:17;29322:47;29386:131;29512:4;29386:131;:::i;:::-;29378:139;;29105:419;;;:::o;29530:::-;29696:4;29734:2;29723:9;29719:18;29711:26;;29783:9;29777:4;29773:20;29769:1;29758:9;29754:17;29747:47;29811:131;29937:4;29811:131;:::i;:::-;29803:139;;29530:419;;;:::o;29955:::-;30121:4;30159:2;30148:9;30144:18;30136:26;;30208:9;30202:4;30198:20;30194:1;30183:9;30179:17;30172:47;30236:131;30362:4;30236:131;:::i;:::-;30228:139;;29955:419;;;:::o;30380:::-;30546:4;30584:2;30573:9;30569:18;30561:26;;30633:9;30627:4;30623:20;30619:1;30608:9;30604:17;30597:47;30661:131;30787:4;30661:131;:::i;:::-;30653:139;;30380:419;;;:::o;30805:::-;30971:4;31009:2;30998:9;30994:18;30986:26;;31058:9;31052:4;31048:20;31044:1;31033:9;31029:17;31022:47;31086:131;31212:4;31086:131;:::i;:::-;31078:139;;30805:419;;;:::o;31230:::-;31396:4;31434:2;31423:9;31419:18;31411:26;;31483:9;31477:4;31473:20;31469:1;31458:9;31454:17;31447:47;31511:131;31637:4;31511:131;:::i;:::-;31503:139;;31230:419;;;:::o;31655:::-;31821:4;31859:2;31848:9;31844:18;31836:26;;31908:9;31902:4;31898:20;31894:1;31883:9;31879:17;31872:47;31936:131;32062:4;31936:131;:::i;:::-;31928:139;;31655:419;;;:::o;32080:::-;32246:4;32284:2;32273:9;32269:18;32261:26;;32333:9;32327:4;32323:20;32319:1;32308:9;32304:17;32297:47;32361:131;32487:4;32361:131;:::i;:::-;32353:139;;32080:419;;;:::o;32505:::-;32671:4;32709:2;32698:9;32694:18;32686:26;;32758:9;32752:4;32748:20;32744:1;32733:9;32729:17;32722:47;32786:131;32912:4;32786:131;:::i;:::-;32778:139;;32505:419;;;:::o;32930:::-;33096:4;33134:2;33123:9;33119:18;33111:26;;33183:9;33177:4;33173:20;33169:1;33158:9;33154:17;33147:47;33211:131;33337:4;33211:131;:::i;:::-;33203:139;;32930:419;;;:::o;33355:::-;33521:4;33559:2;33548:9;33544:18;33536:26;;33608:9;33602:4;33598:20;33594:1;33583:9;33579:17;33572:47;33636:131;33762:4;33636:131;:::i;:::-;33628:139;;33355:419;;;:::o;33780:222::-;33873:4;33911:2;33900:9;33896:18;33888:26;;33924:71;33992:1;33981:9;33977:17;33968:6;33924:71;:::i;:::-;33780:222;;;;:::o;34008:129::-;34042:6;34069:20;;:::i;:::-;34059:30;;34098:33;34126:4;34118:6;34098:33;:::i;:::-;34008:129;;;:::o;34143:75::-;34176:6;34209:2;34203:9;34193:19;;34143:75;:::o;34224:311::-;34301:4;34391:18;34383:6;34380:30;34377:56;;;34413:18;;:::i;:::-;34377:56;34463:4;34455:6;34451:17;34443:25;;34523:4;34517;34513:15;34505:23;;34224:311;;;:::o;34541:307::-;34602:4;34692:18;34684:6;34681:30;34678:56;;;34714:18;;:::i;:::-;34678:56;34752:29;34774:6;34752:29;:::i;:::-;34744:37;;34836:4;34830;34826:15;34818:23;;34541:307;;;:::o;34854:308::-;34916:4;35006:18;34998:6;34995:30;34992:56;;;35028:18;;:::i;:::-;34992:56;35066:29;35088:6;35066:29;:::i;:::-;35058:37;;35150:4;35144;35140:15;35132:23;;34854:308;;;:::o;35168:132::-;35235:4;35258:3;35250:11;;35288:4;35283:3;35279:14;35271:22;;35168:132;;;:::o;35306:141::-;35355:4;35378:3;35370:11;;35401:3;35398:1;35391:14;35435:4;35432:1;35422:18;35414:26;;35306:141;;;:::o;35453:114::-;35520:6;35554:5;35548:12;35538:22;;35453:114;;;:::o;35573:98::-;35624:6;35658:5;35652:12;35642:22;;35573:98;;;:::o;35677:99::-;35729:6;35763:5;35757:12;35747:22;;35677:99;;;:::o;35782:113::-;35852:4;35884;35879:3;35875:14;35867:22;;35782:113;;;:::o;35901:184::-;36000:11;36034:6;36029:3;36022:19;36074:4;36069:3;36065:14;36050:29;;35901:184;;;;:::o;36091:168::-;36174:11;36208:6;36203:3;36196:19;36248:4;36243:3;36239:14;36224:29;;36091:168;;;;:::o;36265:147::-;36366:11;36403:3;36388:18;;36265:147;;;;:::o;36418:169::-;36502:11;36536:6;36531:3;36524:19;36576:4;36571:3;36567:14;36552:29;;36418:169;;;;:::o;36593:148::-;36695:11;36732:3;36717:18;;36593:148;;;;:::o;36747:305::-;36787:3;36806:20;36824:1;36806:20;:::i;:::-;36801:25;;36840:20;36858:1;36840:20;:::i;:::-;36835:25;;36994:1;36926:66;36922:74;36919:1;36916:81;36913:107;;;37000:18;;:::i;:::-;36913:107;37044:1;37041;37037:9;37030:16;;36747:305;;;;:::o;37058:185::-;37098:1;37115:20;37133:1;37115:20;:::i;:::-;37110:25;;37149:20;37167:1;37149:20;:::i;:::-;37144:25;;37188:1;37178:35;;37193:18;;:::i;:::-;37178:35;37235:1;37232;37228:9;37223:14;;37058:185;;;;:::o;37249:348::-;37289:7;37312:20;37330:1;37312:20;:::i;:::-;37307:25;;37346:20;37364:1;37346:20;:::i;:::-;37341:25;;37534:1;37466:66;37462:74;37459:1;37456:81;37451:1;37444:9;37437:17;37433:105;37430:131;;;37541:18;;:::i;:::-;37430:131;37589:1;37586;37582:9;37571:20;;37249:348;;;;:::o;37603:191::-;37643:4;37663:20;37681:1;37663:20;:::i;:::-;37658:25;;37697:20;37715:1;37697:20;:::i;:::-;37692:25;;37736:1;37733;37730:8;37727:34;;;37741:18;;:::i;:::-;37727:34;37786:1;37783;37779:9;37771:17;;37603:191;;;;:::o;37800:96::-;37837:7;37866:24;37884:5;37866:24;:::i;:::-;37855:35;;37800:96;;;:::o;37902:90::-;37936:7;37979:5;37972:13;37965:21;37954:32;;37902:90;;;:::o;37998:149::-;38034:7;38074:66;38067:5;38063:78;38052:89;;37998:149;;;:::o;38153:126::-;38190:7;38230:42;38223:5;38219:54;38208:65;;38153:126;;;:::o;38285:77::-;38322:7;38351:5;38340:16;;38285:77;;;:::o;38368:154::-;38452:6;38447:3;38442;38429:30;38514:1;38505:6;38500:3;38496:16;38489:27;38368:154;;;:::o;38528:307::-;38596:1;38606:113;38620:6;38617:1;38614:13;38606:113;;;38705:1;38700:3;38696:11;38690:18;38686:1;38681:3;38677:11;38670:39;38642:2;38639:1;38635:10;38630:15;;38606:113;;;38737:6;38734:1;38731:13;38728:101;;;38817:1;38808:6;38803:3;38799:16;38792:27;38728:101;38577:258;38528:307;;;:::o;38841:320::-;38885:6;38922:1;38916:4;38912:12;38902:22;;38969:1;38963:4;38959:12;38990:18;38980:81;;39046:4;39038:6;39034:17;39024:27;;38980:81;39108:2;39100:6;39097:14;39077:18;39074:38;39071:84;;;39127:18;;:::i;:::-;39071:84;38892:269;38841:320;;;:::o;39167:281::-;39250:27;39272:4;39250:27;:::i;:::-;39242:6;39238:40;39380:6;39368:10;39365:22;39344:18;39332:10;39329:34;39326:62;39323:88;;;39391:18;;:::i;:::-;39323:88;39431:10;39427:2;39420:22;39210:238;39167:281;;:::o;39454:233::-;39493:3;39516:24;39534:5;39516:24;:::i;:::-;39507:33;;39562:66;39555:5;39552:77;39549:103;;;39632:18;;:::i;:::-;39549:103;39679:1;39672:5;39668:13;39661:20;;39454:233;;;:::o;39693:176::-;39725:1;39742:20;39760:1;39742:20;:::i;:::-;39737:25;;39776:20;39794:1;39776:20;:::i;:::-;39771:25;;39815:1;39805:35;;39820:18;;:::i;:::-;39805:35;39861:1;39858;39854:9;39849:14;;39693:176;;;;:::o;39875:180::-;39923:77;39920:1;39913:88;40020:4;40017:1;40010:15;40044:4;40041:1;40034:15;40061:180;40109:77;40106:1;40099:88;40206:4;40203:1;40196:15;40230:4;40227:1;40220:15;40247:180;40295:77;40292:1;40285:88;40392:4;40389:1;40382:15;40416:4;40413:1;40406:15;40433:180;40481:77;40478:1;40471:88;40578:4;40575:1;40568:15;40602:4;40599:1;40592:15;40619:180;40667:77;40664:1;40657:88;40764:4;40761:1;40754:15;40788:4;40785:1;40778:15;40805:117;40914:1;40911;40904:12;40928:117;41037:1;41034;41027:12;41051:117;41160:1;41157;41150:12;41174:117;41283:1;41280;41273:12;41297:117;41406:1;41403;41396:12;41420:102;41461:6;41512:2;41508:7;41503:2;41496:5;41492:14;41488:28;41478:38;;41420:102;;;:::o;41528:237::-;41668:34;41664:1;41656:6;41652:14;41645:58;41737:20;41732:2;41724:6;41720:15;41713:45;41528:237;:::o;41771:225::-;41911:34;41907:1;41899:6;41895:14;41888:58;41980:8;41975:2;41967:6;41963:15;41956:33;41771:225;:::o;42002:224::-;42142:34;42138:1;42130:6;42126:14;42119:58;42211:7;42206:2;42198:6;42194:15;42187:32;42002:224;:::o;42232:178::-;42372:30;42368:1;42360:6;42356:14;42349:54;42232:178;:::o;42416:170::-;42556:22;42552:1;42544:6;42540:14;42533:46;42416:170;:::o;42592:223::-;42732:34;42728:1;42720:6;42716:14;42709:58;42801:6;42796:2;42788:6;42784:15;42777:31;42592:223;:::o;42821:175::-;42961:27;42957:1;42949:6;42945:14;42938:51;42821:175;:::o;43002:231::-;43142:34;43138:1;43130:6;43126:14;43119:58;43211:14;43206:2;43198:6;43194:15;43187:39;43002:231;:::o;43239:173::-;43379:25;43375:1;43367:6;43363:14;43356:49;43239:173;:::o;43418:243::-;43558:34;43554:1;43546:6;43542:14;43535:58;43627:26;43622:2;43614:6;43610:15;43603:51;43418:243;:::o;43667:229::-;43807:34;43803:1;43795:6;43791:14;43784:58;43876:12;43871:2;43863:6;43859:15;43852:37;43667:229;:::o;43902:228::-;44042:34;44038:1;44030:6;44026:14;44019:58;44111:11;44106:2;44098:6;44094:15;44087:36;43902:228;:::o;44136:182::-;44276:34;44272:1;44264:6;44260:14;44253:58;44136:182;:::o;44324:231::-;44464:34;44460:1;44452:6;44448:14;44441:58;44533:14;44528:2;44520:6;44516:15;44509:39;44324:231;:::o;44561:182::-;44701:34;44697:1;44689:6;44685:14;44678:58;44561:182;:::o;44749:173::-;44889:25;44885:1;44877:6;44873:14;44866:49;44749:173;:::o;44928:234::-;45068:34;45064:1;45056:6;45052:14;45045:58;45137:17;45132:2;45124:6;45120:15;45113:42;44928:234;:::o;45168:178::-;45308:30;45304:1;45296:6;45292:14;45285:54;45168:178;:::o;45352:220::-;45492:34;45488:1;45480:6;45476:14;45469:58;45561:3;45556:2;45548:6;45544:15;45537:28;45352:220;:::o;45578:114::-;;:::o;45698:170::-;45838:22;45834:1;45826:6;45822:14;45815:46;45698:170;:::o;45874:236::-;46014:34;46010:1;46002:6;45998:14;45991:58;46083:19;46078:2;46070:6;46066:15;46059:44;45874:236;:::o;46116:169::-;46256:21;46252:1;46244:6;46240:14;46233:45;46116:169;:::o;46291:122::-;46364:24;46382:5;46364:24;:::i;:::-;46357:5;46354:35;46344:63;;46403:1;46400;46393:12;46344:63;46291:122;:::o;46419:116::-;46489:21;46504:5;46489:21;:::i;:::-;46482:5;46479:32;46469:60;;46525:1;46522;46515:12;46469:60;46419:116;:::o;46541:120::-;46613:23;46630:5;46613:23;:::i;:::-;46606:5;46603:34;46593:62;;46651:1;46648;46641:12;46593:62;46541:120;:::o;46667:122::-;46740:24;46758:5;46740:24;:::i;:::-;46733:5;46730:35;46720:63;;46779:1;46776;46769:12;46720:63;46667:122;:::o
Swarm Source
ipfs://3e69d62848ee9ecac581a49da5bcc01f074d4fc08f6d729769a76347e22c98bb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.