ERC-721
Overview
Max Total Supply
34 B
Holders
21
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 BLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
nft
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-03-20 */ // SPDX-License-Identifier: GPL-3.0 // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol 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 pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @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 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 pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using Address for address; using Strings for uint256; struct TokenOwnership { address addr; uint64 startTimestamp; } struct AddressData { uint128 balance; uint128 numberMinted; } uint256 private currentIndex = 0; uint256 internal immutable collectionSize; uint256 internal immutable maxBatchSize; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) private _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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 * `maxBatchSize` refers to how much a minter can mint at a time. * `collectionSize_` refers to how many tokens are in the collection. */ constructor( string memory name_, string memory symbol_, uint256 maxBatchSize_, uint256 collectionSize_ ) { require( collectionSize_ > 0, "ERC721A: collection must have a nonzero supply" ); require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero"); _name = name_; _symbol = symbol_; maxBatchSize = maxBatchSize_; collectionSize = collectionSize_; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return currentIndex; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view override returns (uint256) { require(index < totalSupply(), "ERC721A: global index out of bounds"); return index; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first. * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) { require(index < balanceOf(owner), "ERC721A: owner index out of bounds"); uint256 numMintedSoFar = totalSupply(); uint256 tokenIdsIdx = 0; address currOwnershipAddr = address(0); for (uint256 i = 0; i < numMintedSoFar; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { if (tokenIdsIdx == index) { return i; } tokenIdsIdx++; } } revert("ERC721A: unable to get token of owner by index"); } /** * @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 || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require(owner != address(0), "ERC721A: balance query for the zero address"); return uint256(_addressData[owner].balance); } function _numberMinted(address owner) internal view returns (uint256) { require( owner != address(0), "ERC721A: number minted query for the zero address" ); return uint256(_addressData[owner].numberMinted); } function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { require(_exists(tokenId), "ERC721A: owner query for nonexistent token"); uint256 lowestTokenToCheck; if (tokenId >= maxBatchSize) { lowestTokenToCheck = tokenId - maxBatchSize + 1; } for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) { TokenOwnership memory ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } revert("ERC721A: unable to determine the owner of token"); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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 override { address owner = ERC721A.ownerOf(tokenId); require(to != owner, "ERC721A: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721A: approve caller is not owner nor approved for all" ); _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require(_exists(tokenId), "ERC721A: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721A: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public override { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721A: 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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId < currentIndex; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - there must be `quantity` tokens remaining unminted in the total collection. * - `to` cannot be the zero address. * - `quantity` cannot be larger than the max batch size. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = currentIndex; require(to != address(0), "ERC721A: mint to the zero address"); // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering. require(!_exists(startTokenId), "ERC721A: token already minted"); require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high"); _beforeTokenTransfers(address(0), to, startTokenId, quantity); AddressData memory addressData = _addressData[to]; _addressData[to] = AddressData( addressData.balance + uint128(quantity), addressData.numberMinted + uint128(quantity) ); _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp)); uint256 updatedIndex = startTokenId; for (uint256 i = 0; i < quantity; i++) { emit Transfer(address(0), to, updatedIndex); require( _checkOnERC721Received(address(0), to, updatedIndex, _data), "ERC721A: transfer to non ERC721Receiver implementer" ); updatedIndex++; } currentIndex = updatedIndex; _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || getApproved(tokenId) == _msgSender() || isApprovedForAll(prevOwnership.addr, _msgSender())); require( isApprovedOrOwner, "ERC721A: transfer caller is not owner nor approved" ); require( prevOwnership.addr == from, "ERC721A: transfer from incorrect owner" ); require(to != address(0), "ERC721A: transfer to the zero address"); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp)); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { if (_exists(nextTokenId)) { _ownerships[nextTokenId] = TokenOwnership( prevOwnership.addr, prevOwnership.startTimestamp ); } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } uint256 public nextOwnerToExplicitlySet = 0; /** * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf(). */ function _setOwnersExplicit(uint256 quantity) internal { uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet; require(quantity > 0, "quantity must be nonzero"); uint256 endIndex = oldNextOwnerToSet + quantity - 1; if (endIndex > collectionSize - 1) { endIndex = collectionSize - 1; } // We know if the last one in the group exists, all in the group exist, due to serial ordering. require(_exists(endIndex), "not enough minted yet for this cleanup"); for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) { if (_ownerships[i].addr == address(0)) { TokenOwnership memory ownership = ownershipOf(i); _ownerships[i] = TokenOwnership( ownership.addr, ownership.startTimestamp ); } } nextOwnerToExplicitlySet = endIndex + 1; } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721A: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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`. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } contract nft is ERC721A, Ownable { using Strings for uint256; //initial part of the URI for the metadata string private _currentBaseURI; //cost of mints depending on state of sale uint private mintCost_ = 0.08 ether; //the amount of reserved mints that have currently been executed by creator and by marketing wallet uint private _reservedMints = 0; //the maximum amount of reserved mints allowed for creator and marketing wallet uint private maxReservedMints = 100; //dummy address that we use to sign the mint transaction to make sure it is valid address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c; //developers wallet address address private dev = 0x318cBF186eB13C74533943b054959867eE44eFFE; //amount of mints that each address has executed mapping(address => uint256) public mintsPerAddress; //current state os sale enum State {NoSale, Presale, PublicSale} //defines the uri for when the NFTs have not been yet revealed string public unrevealedURI; //marks the timestamp of when the respective sales open uint256 public presaleLaunchTime; uint256 public publicSaleLaunchTime; uint256 public revealTime; //declaring initial values for variables constructor() ERC721A("Bluttles", "B", 3, 10000){ unrevealedURI = "ipfs://.../"; } //in case somebody accidentaly sends funds or transaction to contract receive() payable external {} fallback() payable external { revert(); } //visualize baseURI function _baseURI() internal view virtual override returns (string memory) { return _currentBaseURI; } //change baseURI in case needed for IPFS function changeBaseURI(string memory baseURI_) public onlyOwner { _currentBaseURI = baseURI_; } function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner { unrevealedURI = unrevealedURI_; } modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) { require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' ); _; } /* * @dev Verifies if message was signed by owner to give access to _add for this contract. * Assumes Geth signature prefix. * @param _add Address of agent with access * @param _v ECDSA signature parameter v. * @param _r ECDSA signature parameters r. * @param _s ECDSA signature parameters s. * @return Validity of access message for a given address. */ function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) { bytes32 hash = keccak256(abi.encodePacked(address(this), _add)); return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s); } //mint a @param number of NFTs in presale function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v, _r, _s) public payable { State saleState_ = saleState(); require(saleState_ != State.NoSale, "Sale in not open yet!"); require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!"); require(totalSupply() + number <= collectionSize - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxBatchSize, "Maximum 3 Mints per Address allowed!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.08 ether each NFT)"); _safeMint(msg.sender, number); mintsPerAddress[msg.sender] += number; } //mint a @param number of NFTs in public sale function publicSaleMint(uint256 number) public payable { State saleState_ = saleState(); require(saleState_ == State.PublicSale, "Public Sale in not open yet!"); require(totalSupply() + number <= collectionSize - (maxReservedMints - _reservedMints), "Not enough NFTs left to mint.."); require(mintsPerAddress[msg.sender] + number <= maxBatchSize, "Maximum 3 Mints per Address allowed!"); require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.08 ether for each NFT)"); _safeMint(msg.sender, number); mintsPerAddress[msg.sender] += number; } //reserved NFTs for creator function reservedMints(uint256 number, address recipient) public onlyOwner { require(_reservedMints + number <= maxReservedMints, "Not enough Reserved NFTs for Creator left to mint.."); _safeMint(recipient, number); mintsPerAddress[recipient] += number; } function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) { require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token"); //check to see that 24 hours have passed since beginning of publicsale launch if (revealTime == 0) { return unrevealedURI; } else { string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : ""; } } //begins the minting of the NFTs function switchToPresale() public onlyOwner{ State saleState_ = saleState(); require(saleState_ == State.NoSale, "Presale has already opened!"); presaleLaunchTime = block.timestamp; } //begins the public sale function switchToPublicSale() public onlyOwner { State saleState_ = saleState(); require(saleState_ != State.PublicSale, "Public Sale is already live!"); require(saleState_ != State.NoSale, "Cannot change to Public Sale if there has not been a Presale!"); publicSaleLaunchTime = block.timestamp; } //se the current account balance function accountBalance() public onlyOwner view returns(uint) { return address(this).balance; } //change the dummy account used for signing transactions function changeDummy(address _dummy) public onlyOwner { dummy = _dummy; } //see the total amount of reserved mints that are left creator function reservedMintsLeft() public onlyOwner view returns(uint) { return maxReservedMints - _reservedMints; } //get the funds from the minting of the NFTs function retrieveFunds() public onlyOwner { uint256 balance = accountBalance(); require(balance > 0, "No funds to retrieve!"); _withdraw(payable(dev), (balance * 5) / 1000); _withdraw(payable(owner()), accountBalance()); //to avoid dust eth } function _withdraw(address payable account, uint256 amount) internal { (bool sent, ) = account.call{value: amount}(""); require(sent, "Failed to send Ether"); } //see the current state of the sale function saleState() public view returns(State){ if (presaleLaunchTime == 0) { return State.NoSale; } else if (publicSaleLaunchTime == 0) { return State.Presale; } else { return State.PublicSale; } } //get the current price to mint function mintCost() public view returns(uint256) { return mintCost_; } //reveal the NFTs function reveal() public onlyOwner { revealTime = block.timestamp; } }
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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"accountBalance","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":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintsLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"retrieveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTime","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"enum nft.State","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405260008055600060075567011c37937e080000600a556000600b556064600c557380e4929c869102140e69550bbecc20bed61b080c600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073318cbf186eb13c74533943b054959867ee44effe600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000da57600080fd5b506040518060400160405280600881526020017f426c7574746c65730000000000000000000000000000000000000000000000008152506040518060400160405280600181526020017f420000000000000000000000000000000000000000000000000000000000000081525060036127106000811162000192576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001899062000480565b60405180910390fd5b60008211620001d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001cf906200045e565b60405180910390fd5b8360019080519060200190620001f092919062000360565b5082600290805190602001906200020992919062000360565b508160a081815250508060808181525050505050506200023e620002326200029260201b60201c565b6200029a60201b60201c565b6040518060400160405280600b81526020017f697066733a2f2f2e2e2e2f000000000000000000000000000000000000000000815250601090805190602001906200028b92919062000360565b50620005b6565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200036e90620004b3565b90600052602060002090601f016020900481019282620003925760008555620003de565b82601f10620003ad57805160ff1916838001178555620003de565b82800160010185558215620003de579182015b82811115620003dd578251825591602001919060010190620003c0565b5b509050620003ed9190620003f1565b5090565b5b808211156200040c576000816000905550600101620003f2565b5090565b60006200041f602783620004a2565b91506200042c8262000518565b604082019050919050565b600062000446602e83620004a2565b9150620004538262000567565b604082019050919050565b60006020820190508181036000830152620004798162000410565b9050919050565b600060208201905081810360008301526200049b8162000437565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004cc57607f821691505b60208210811415620004e357620004e2620004e9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a051615b45620005ff600039600081816119e40152818161208701528181612dc601528181612def01526134b001526000818161196501526120080152615b456000f3fe60806040526004361061023f5760003560e01c8063715018a61161012e578063bdb4b848116100ab578063dcd4e7321161006f578063dcd4e73214610871578063e985e9c51461088d578063eab41782146108ca578063f2fde38b146108e1578063ff9849941461090a57610246565b8063bdb4b8481461078a578063c4d8b9df146107b5578063c87b56dd146107de578063cd5fe7251461081b578063d7224ba01461084657610246565b8063b0a1c1c4116100f2578063b0a1c1c4146106c6578063b3ab66b0146106f1578063b620e9751461070d578063b88d4fde14610736578063ba829d711461075f57610246565b8063715018a6146106195780638da5cb5b1461063057806395d89b411461065b578063a22cb46514610686578063a475b5dd146106af57610246565b806332624114116101bc578063603f4d5211610180578063603f4d521461053257806361b20d8c1461055d5780636352211e146105745780637035bf18146105b157806370a08231146105dc57610246565b8063326241141461043b57806339a0c6f91461047857806342842e0e146104a15780634520e916146104ca5780634f6ccce7146104f557610246565b806318160ddd1161020357806318160ddd146103425780631a17fe5e1461036d57806323b872dd146103985780632f745c59146103c15780633023eba6146103fe57610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613b31565b610921565b005b34801561028057600080fd5b5061029b60048036038101906102969190613d5b565b6109e1565b6040516102a89190614609565b60405180910390f35b3480156102bd57600080fd5b506102c6610b2b565b6040516102d39190614684565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613dfe565b610bbd565b60405161031091906145a2565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613cb4565b610c42565b005b34801561034e57600080fd5b50610357610d5b565b6040516103649190614ae6565b60405180910390f35b34801561037957600080fd5b50610382610d64565b60405161038f9190614ae6565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613b9e565b610d6a565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613cb4565b610d7a565b6040516103f59190614ae6565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613b31565b610f78565b6040516104329190614ae6565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613cf4565b610f90565b60405161046f9190614609565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613db5565b61108e565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190613b9e565b611124565b005b3480156104d657600080fd5b506104df611144565b6040516104ec9190614ae6565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613dfe565b6111d7565b6040516105299190614ae6565b60405180910390f35b34801561053e57600080fd5b5061054761122a565b6040516105549190614669565b60405180910390f35b34801561056957600080fd5b5061057261125b565b005b34801561058057600080fd5b5061059b60048036038101906105969190613dfe565b611386565b6040516105a891906145a2565b60405180910390f35b3480156105bd57600080fd5b506105c661139c565b6040516105d39190614684565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613b31565b61142a565b6040516106109190614ae6565b60405180910390f35b34801561062557600080fd5b5061062e611513565b005b34801561063c57600080fd5b5061064561159b565b60405161065291906145a2565b60405180910390f35b34801561066757600080fd5b506106706115c5565b60405161067d9190614684565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613c74565b611657565b005b3480156106bb57600080fd5b506106c46117d8565b005b3480156106d257600080fd5b506106db61185d565b6040516106e89190614ae6565b60405180910390f35b61070b60048036038101906107069190613dfe565b6118e1565b005b34801561071957600080fd5b50610734600480360381019061072f9190613e2b565b611b48565b005b34801561074257600080fd5b5061075d60048036038101906107589190613bf1565b611c7a565b005b34801561076b57600080fd5b50610774611cd6565b6040516107819190614ae6565b60405180910390f35b34801561079657600080fd5b5061079f611cdc565b6040516107ac9190614ae6565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613db5565b611ce6565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613dfe565b611d7c565b6040516108129190614684565b60405180910390f35b34801561082757600080fd5b50610830611ec1565b60405161083d9190614ae6565b60405180910390f35b34801561085257600080fd5b5061085b611ec7565b6040516108689190614ae6565b60405180910390f35b61088b60048036038101906108869190613e6b565b611ecd565b005b34801561089957600080fd5b506108b460048036038101906108af9190613b5e565b6121f1565b6040516108c19190614609565b60405180910390f35b3480156108d657600080fd5b506108df612285565b005b3480156108ed57600080fd5b5061090860048036038101906109039190613b31565b61237e565b005b34801561091657600080fd5b5061091f612476565b005b6109296125d7565b73ffffffffffffffffffffffffffffffffffffffff1661094761159b565b73ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906148c6565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b245750610b23826125df565b5b9050919050565b606060018054610b3a90614e9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6690614e9d565b8015610bb35780601f10610b8857610100808354040283529160200191610bb3565b820191906000526020600020905b815481529060010190602001808311610b9657829003601f168201915b5050505050905090565b6000610bc882612649565b610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90614aa6565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4d82611386565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590614986565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdd6125d7565b73ffffffffffffffffffffffffffffffffffffffff161480610d0c5750610d0b81610d066125d7565b6121f1565b5b610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290614826565b60405180910390fd5b610d56838383612656565b505050565b60008054905090565b60125481565b610d75838383612708565b505050565b6000610d858361142a565b8210610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd906146a6565b60405180910390fd5b6000610dd0610d5b565b905060008060005b83811015610f36576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610eca57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f225786841415610f13578195505050505050610f72565b8380610f1e90614f00565b9450505b508080610f2e90614f00565b915050610dd8565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6990614a46565b60405180910390fd5b92915050565b600f6020528060005260406000206000915090505481565b6000803086604051602001610fa692919061450c565b604051602081830303815290604052805190602001209050600181604051602001610fd19190614567565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516110079493929190614624565b6020604051602081039080840390855afa158015611029573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6110966125d7565b73ffffffffffffffffffffffffffffffffffffffff166110b461159b565b73ffffffffffffffffffffffffffffffffffffffff161461110a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611101906148c6565b60405180910390fd5b80600990805190602001906111209291906138e1565b5050565b61113f83838360405180602001604052806000815250611c7a565b505050565b600061114e6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661116c61159b565b73ffffffffffffffffffffffffffffffffffffffff16146111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b9906148c6565b60405180910390fd5b600b54600c546111d29190614d31565b905090565b60006111e1610d5b565b8210611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121990614786565b60405180910390fd5b819050919050565b600080601154141561123f5760009050611258565b600060125414156112535760019050611258565b600290505b90565b6112636125d7565b73ffffffffffffffffffffffffffffffffffffffff1661128161159b565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce906148c6565b60405180910390fd5b60006112e161185d565b905060008111611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906146c6565b60405180910390fd5b61136b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860058461135c9190614ca3565b6113669190614c72565b612cc1565b61138361137661159b565b61137e61185d565b612cc1565b50565b600061139182612d72565b600001519050919050565b601080546113a990614e9d565b80601f01602080910402602001604051908101604052809291908181526020018280546113d590614e9d565b80156114225780601f106113f757610100808354040283529160200191611422565b820191906000526020600020905b81548152906001019060200180831161140557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614866565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61151b6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661153961159b565b73ffffffffffffffffffffffffffffffffffffffff161461158f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611586906148c6565b60405180910390fd5b6115996000612f75565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115d490614e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461160090614e9d565b801561164d5780601f106116225761010080835404028352916020019161164d565b820191906000526020600020905b81548152906001019060200180831161163057829003601f168201915b5050505050905090565b61165f6125d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490614926565b60405180910390fd5b80600660006116da6125d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117876125d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117cc9190614609565b60405180910390a35050565b6117e06125d7565b73ffffffffffffffffffffffffffffffffffffffff166117fe61159b565b73ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b906148c6565b60405180910390fd5b42601381905550565b60006118676125d7565b73ffffffffffffffffffffffffffffffffffffffff1661188561159b565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d2906148c6565b60405180910390fd5b47905090565b60006118eb61122a565b9050600280811115611900576118ff615006565b5b81600281111561191357611912615006565b5b14611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194a90614846565b60405180910390fd5b600b54600c546119639190614d31565b7f000000000000000000000000000000000000000000000000000000000000000061198e9190614d31565b82611997610d5b565b6119a19190614c1c565b11156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d9906147e6565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000082600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a4e9190614c1c565b1115611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a86906148e6565b60405180910390fd5b81611a98611cdc565b611aa29190614ca3565b341015611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90614746565b60405180910390fd5b611aee338361303b565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3d9190614c1c565b925050819055505050565b611b506125d7565b73ffffffffffffffffffffffffffffffffffffffff16611b6e61159b565b73ffffffffffffffffffffffffffffffffffffffff1614611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906148c6565b60405180910390fd5b600c5482600b54611bd59190614c1c565b1115611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90614766565b60405180910390fd5b611c20818361303b565b81600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c6f9190614c1c565b925050819055505050565b611c85848484612708565b611c9184848484613059565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc7906149c6565b60405180910390fd5b50505050565b60135481565b6000600a54905090565b611cee6125d7565b73ffffffffffffffffffffffffffffffffffffffff16611d0c61159b565b73ffffffffffffffffffffffffffffffffffffffff1614611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d59906148c6565b60405180910390fd5b8060109080519060200190611d789291906138e1565b5050565b6060611d8782612649565b611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90614906565b60405180910390fd5b60006013541415611e635760108054611dde90614e9d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e0a90614e9d565b8015611e575780601f10611e2c57610100808354040283529160200191611e57565b820191906000526020600020905b815481529060010190602001808311611e3a57829003601f168201915b50505050509050611ebc565b6000611e6d6131f0565b90506000815111611e8d5760405180602001604052806000815250611eb8565b80611e9784613282565b604051602001611ea8929190614538565b6040516020818303038152906040525b9150505b919050565b60115481565b60075481565b828282611edc33848484610f90565b611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906148a6565b60405180910390fd5b6000611f2561122a565b905060006002811115611f3b57611f3a615006565b5b816002811115611f4e57611f4d615006565b5b1415611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690614a26565b60405180910390fd5b600280811115611fa257611fa1615006565b5b816002811115611fb557611fb4615006565b5b1415611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614806565b60405180910390fd5b600b54600c546120069190614d31565b7f00000000000000000000000000000000000000000000000000000000000000006120319190614d31565b8861203a610d5b565b6120449190614c1c565b1115612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c906147e6565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000088600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f19190614c1c565b1115612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906148e6565b60405180910390fd5b8761213b611cdc565b6121459190614ca3565b341015612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614a86565b60405180910390fd5b612191338961303b565b87600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e09190614c1c565b925050819055505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61228d6125d7565b73ffffffffffffffffffffffffffffffffffffffff166122ab61159b565b73ffffffffffffffffffffffffffffffffffffffff1614612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f8906148c6565b60405180910390fd5b600061230b61122a565b90506000600281111561232157612320615006565b5b81600281111561233457612333615006565b5b14612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b906149a6565b60405180910390fd5b4260118190555050565b6123866125d7565b73ffffffffffffffffffffffffffffffffffffffff166123a461159b565b73ffffffffffffffffffffffffffffffffffffffff16146123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f1906148c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246190614706565b60405180910390fd5b61247381612f75565b50565b61247e6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661249c61159b565b73ffffffffffffffffffffffffffffffffffffffff16146124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e9906148c6565b60405180910390fd5b60006124fc61122a565b905060028081111561251157612510615006565b5b81600281111561252457612523615006565b5b1415612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c906146e6565b60405180910390fd5b6000600281111561257957612578615006565b5b81600281111561258c5761258b615006565b5b14156125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614966565b60405180910390fd5b4260128190555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061271382612d72565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661273a6125d7565b73ffffffffffffffffffffffffffffffffffffffff161480612796575061275f6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661277e84610bbd565b73ffffffffffffffffffffffffffffffffffffffff16145b806127b257506127b182600001516127ac6125d7565b6121f1565b5b9050806127f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127eb90614946565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614886565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cd906147c6565b60405180910390fd5b6128e385858560016133e3565b6128f36000848460000151612656565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129619190614cfd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a059190614bd6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b0b9190614c1c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5157612b8181612649565b15612c50576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cb986868660016133e9565b505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612ce79061458d565b60006040518083038185875af1925050503d8060008114612d24576040519150601f19603f3d011682016040523d82523d6000602084013e612d29565b606091505b5050905080612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d64906147a6565b60405180910390fd5b505050565b612d7a613967565b612d8382612649565b612dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db990614726565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000008310612e265760017f000000000000000000000000000000000000000000000000000000000000000084612e199190614d31565b612e239190614c1c565b90505b60008390505b818110612f34576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f2057809350505050612f70565b508080612f2c90614e73565b915050612e2c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6790614a66565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130558282604051806020016040528060008152506133ef565b5050565b600061307a8473ffffffffffffffffffffffffffffffffffffffff166138ce565b156131e3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130a36125d7565b8786866040518563ffffffff1660e01b81526004016130c594939291906145bd565b602060405180830381600087803b1580156130df57600080fd5b505af192505050801561311057506040513d601f19601f8201168201806040525081019061310d9190613d88565b60015b613193573d8060008114613140576040519150601f19603f3d011682016040523d82523d6000602084013e613145565b606091505b5060008151141561318b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613182906149c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131e8565b600190505b949350505050565b6060600980546131ff90614e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461322b90614e9d565b80156132785780601f1061324d57610100808354040283529160200191613278565b820191906000526020600020905b81548152906001019060200180831161325b57829003601f168201915b5050505050905090565b606060008214156132ca576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133de565b600082905060005b600082146132fc5780806132e590614f00565b915050600a826132f59190614c72565b91506132d2565b60008167ffffffffffffffff81111561331857613317615093565b5b6040519080825280601f01601f19166020018201604052801561334a5781602001600182028036833780820191505090505b5090505b600085146133d7576001826133639190614d31565b9150600a856133729190614f77565b603061337e9190614c1c565b60f81b81838151811061339457613393615064565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d09190614c72565b945061334e565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345c90614a06565b60405180910390fd5b61346e81612649565b156134ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a5906149e6565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115613511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350890614ac6565b60405180910390fd5b61351e60008583866133e3565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161361b9190614bd6565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136429190614bd6565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156138b157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138516000888488613059565b613890576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613887906149c6565b60405180910390fd5b818061389b90614f00565b92505080806138a990614f00565b9150506137e0565b50806000819055506138c660008785886133e9565b505050505050565b600080823b905060008111915050919050565b8280546138ed90614e9d565b90600052602060002090601f01602090048101928261390f5760008555613956565b82601f1061392857805160ff1916838001178555613956565b82800160010185558215613956579182015b8281111561395557825182559160200191906001019061393a565b5b50905061396391906139a1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139ba5760008160009055506001016139a2565b5090565b60006139d16139cc84614b26565b614b01565b9050828152602081018484840111156139ed576139ec6150c7565b5b6139f8848285614e31565b509392505050565b6000613a13613a0e84614b57565b614b01565b905082815260208101848484011115613a2f57613a2e6150c7565b5b613a3a848285614e31565b509392505050565b600081359050613a5181615a85565b92915050565b600081359050613a6681615a9c565b92915050565b600081359050613a7b81615ab3565b92915050565b600081359050613a9081615aca565b92915050565b600081519050613aa581615aca565b92915050565b600082601f830112613ac057613abf6150c2565b5b8135613ad08482602086016139be565b91505092915050565b600082601f830112613aee57613aed6150c2565b5b8135613afe848260208601613a00565b91505092915050565b600081359050613b1681615ae1565b92915050565b600081359050613b2b81615af8565b92915050565b600060208284031215613b4757613b466150d1565b5b6000613b5584828501613a42565b91505092915050565b60008060408385031215613b7557613b746150d1565b5b6000613b8385828601613a42565b9250506020613b9485828601613a42565b9150509250929050565b600080600060608486031215613bb757613bb66150d1565b5b6000613bc586828701613a42565b9350506020613bd686828701613a42565b9250506040613be786828701613b07565b9150509250925092565b60008060008060808587031215613c0b57613c0a6150d1565b5b6000613c1987828801613a42565b9450506020613c2a87828801613a42565b9350506040613c3b87828801613b07565b925050606085013567ffffffffffffffff811115613c5c57613c5b6150cc565b5b613c6887828801613aab565b91505092959194509250565b60008060408385031215613c8b57613c8a6150d1565b5b6000613c9985828601613a42565b9250506020613caa85828601613a57565b9150509250929050565b60008060408385031215613ccb57613cca6150d1565b5b6000613cd985828601613a42565b9250506020613cea85828601613b07565b9150509250929050565b60008060008060808587031215613d0e57613d0d6150d1565b5b6000613d1c87828801613a42565b9450506020613d2d87828801613b1c565b9350506040613d3e87828801613a6c565b9250506060613d4f87828801613a6c565b91505092959194509250565b600060208284031215613d7157613d706150d1565b5b6000613d7f84828501613a81565b91505092915050565b600060208284031215613d9e57613d9d6150d1565b5b6000613dac84828501613a96565b91505092915050565b600060208284031215613dcb57613dca6150d1565b5b600082013567ffffffffffffffff811115613de957613de86150cc565b5b613df584828501613ad9565b91505092915050565b600060208284031215613e1457613e136150d1565b5b6000613e2284828501613b07565b91505092915050565b60008060408385031215613e4257613e416150d1565b5b6000613e5085828601613b07565b9250506020613e6185828601613a42565b9150509250929050565b60008060008060808587031215613e8557613e846150d1565b5b6000613e9387828801613b07565b9450506020613ea487828801613b1c565b9350506040613eb587828801613a6c565b9250506060613ec687828801613a6c565b91505092959194509250565b613edb81614d65565b82525050565b613ef2613eed82614d65565b614f49565b82525050565b613f0181614d77565b82525050565b613f1081614d83565b82525050565b613f27613f2282614d83565b614f5b565b82525050565b6000613f3882614b88565b613f428185614b9e565b9350613f52818560208601614e40565b613f5b816150d6565b840191505092915050565b613f6f81614e1f565b82525050565b6000613f8082614b93565b613f8a8185614bba565b9350613f9a818560208601614e40565b613fa3816150d6565b840191505092915050565b6000613fb982614b93565b613fc38185614bcb565b9350613fd3818560208601614e40565b80840191505092915050565b6000613fec602283614bba565b9150613ff7826150f4565b604082019050919050565b600061400f601583614bba565b915061401a82615143565b602082019050919050565b6000614032601c83614bcb565b915061403d8261516c565b601c82019050919050565b6000614055601c83614bba565b915061406082615195565b602082019050919050565b6000614078602683614bba565b9150614083826151be565b604082019050919050565b600061409b602a83614bba565b91506140a68261520d565b604082019050919050565b60006140be605183614bba565b91506140c98261525c565b606082019050919050565b60006140e1603383614bba565b91506140ec826152d1565b604082019050919050565b6000614104602383614bba565b915061410f82615320565b604082019050919050565b6000614127601483614bba565b91506141328261536f565b602082019050919050565b600061414a602583614bba565b915061415582615398565b604082019050919050565b600061416d601e83614bba565b9150614178826153e7565b602082019050919050565b6000614190602a83614bba565b915061419b82615410565b604082019050919050565b60006141b3603983614bba565b91506141be8261545f565b604082019050919050565b60006141d6601c83614bba565b91506141e1826154ae565b602082019050919050565b60006141f9602b83614bba565b9150614204826154d7565b604082019050919050565b600061421c602683614bba565b915061422782615526565b604082019050919050565b600061423f600583614bcb565b915061424a82615575565b600582019050919050565b6000614262601183614bba565b915061426d8261559e565b602082019050919050565b6000614285602083614bba565b9150614290826155c7565b602082019050919050565b60006142a8602483614bba565b91506142b3826155f0565b604082019050919050565b60006142cb602f83614bba565b91506142d68261563f565b604082019050919050565b60006142ee601a83614bba565b91506142f98261568e565b602082019050919050565b6000614311603283614bba565b915061431c826156b7565b604082019050919050565b6000614334603d83614bba565b915061433f82615706565b604082019050919050565b6000614357602283614bba565b915061436282615755565b604082019050919050565b600061437a601b83614bba565b9150614385826157a4565b602082019050919050565b600061439d600083614baf565b91506143a8826157cd565b600082019050919050565b60006143c0603383614bba565b91506143cb826157d0565b604082019050919050565b60006143e3601d83614bba565b91506143ee8261581f565b602082019050919050565b6000614406602183614bba565b915061441182615848565b604082019050919050565b6000614429601583614bba565b915061443482615897565b602082019050919050565b600061444c602e83614bba565b9150614457826158c0565b604082019050919050565b600061446f602f83614bba565b915061447a8261590f565b604082019050919050565b6000614492604d83614bba565b915061449d8261595e565b606082019050919050565b60006144b5602d83614bba565b91506144c0826159d3565b604082019050919050565b60006144d8602283614bba565b91506144e382615a22565b604082019050919050565b6144f781614e08565b82525050565b61450681614e12565b82525050565b60006145188285613ee1565b6014820191506145288284613ee1565b6014820191508190509392505050565b60006145448285613fae565b91506145508284613fae565b915061455b82614232565b91508190509392505050565b600061457282614025565b915061457e8284613f16565b60208201915081905092915050565b600061459882614390565b9150819050919050565b60006020820190506145b76000830184613ed2565b92915050565b60006080820190506145d26000830187613ed2565b6145df6020830186613ed2565b6145ec60408301856144ee565b81810360608301526145fe8184613f2d565b905095945050505050565b600060208201905061461e6000830184613ef8565b92915050565b60006080820190506146396000830187613f07565b61464660208301866144fd565b6146536040830185613f07565b6146606060830184613f07565b95945050505050565b600060208201905061467e6000830184613f66565b92915050565b6000602082019050818103600083015261469e8184613f75565b905092915050565b600060208201905081810360008301526146bf81613fdf565b9050919050565b600060208201905081810360008301526146df81614002565b9050919050565b600060208201905081810360008301526146ff81614048565b9050919050565b6000602082019050818103600083015261471f8161406b565b9050919050565b6000602082019050818103600083015261473f8161408e565b9050919050565b6000602082019050818103600083015261475f816140b1565b9050919050565b6000602082019050818103600083015261477f816140d4565b9050919050565b6000602082019050818103600083015261479f816140f7565b9050919050565b600060208201905081810360008301526147bf8161411a565b9050919050565b600060208201905081810360008301526147df8161413d565b9050919050565b600060208201905081810360008301526147ff81614160565b9050919050565b6000602082019050818103600083015261481f81614183565b9050919050565b6000602082019050818103600083015261483f816141a6565b9050919050565b6000602082019050818103600083015261485f816141c9565b9050919050565b6000602082019050818103600083015261487f816141ec565b9050919050565b6000602082019050818103600083015261489f8161420f565b9050919050565b600060208201905081810360008301526148bf81614255565b9050919050565b600060208201905081810360008301526148df81614278565b9050919050565b600060208201905081810360008301526148ff8161429b565b9050919050565b6000602082019050818103600083015261491f816142be565b9050919050565b6000602082019050818103600083015261493f816142e1565b9050919050565b6000602082019050818103600083015261495f81614304565b9050919050565b6000602082019050818103600083015261497f81614327565b9050919050565b6000602082019050818103600083015261499f8161434a565b9050919050565b600060208201905081810360008301526149bf8161436d565b9050919050565b600060208201905081810360008301526149df816143b3565b9050919050565b600060208201905081810360008301526149ff816143d6565b9050919050565b60006020820190508181036000830152614a1f816143f9565b9050919050565b60006020820190508181036000830152614a3f8161441c565b9050919050565b60006020820190508181036000830152614a5f8161443f565b9050919050565b60006020820190508181036000830152614a7f81614462565b9050919050565b60006020820190508181036000830152614a9f81614485565b9050919050565b60006020820190508181036000830152614abf816144a8565b9050919050565b60006020820190508181036000830152614adf816144cb565b9050919050565b6000602082019050614afb60008301846144ee565b92915050565b6000614b0b614b1c565b9050614b178282614ecf565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4157614b40615093565b5b614b4a826150d6565b9050602081019050919050565b600067ffffffffffffffff821115614b7257614b71615093565b5b614b7b826150d6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614be182614dcc565b9150614bec83614dcc565b9250826fffffffffffffffffffffffffffffffff03821115614c1157614c10614fa8565b5b828201905092915050565b6000614c2782614e08565b9150614c3283614e08565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c6757614c66614fa8565b5b828201905092915050565b6000614c7d82614e08565b9150614c8883614e08565b925082614c9857614c97614fd7565b5b828204905092915050565b6000614cae82614e08565b9150614cb983614e08565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cf257614cf1614fa8565b5b828202905092915050565b6000614d0882614dcc565b9150614d1383614dcc565b925082821015614d2657614d25614fa8565b5b828203905092915050565b6000614d3c82614e08565b9150614d4783614e08565b925082821015614d5a57614d59614fa8565b5b828203905092915050565b6000614d7082614de8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614dc782615a71565b919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614e2a82614db9565b9050919050565b82818337600083830152505050565b60005b83811015614e5e578082015181840152602081019050614e43565b83811115614e6d576000848401525b50505050565b6000614e7e82614e08565b91506000821415614e9257614e91614fa8565b5b600182039050919050565b60006002820490506001821680614eb557607f821691505b60208210811415614ec957614ec8615035565b5b50919050565b614ed8826150d6565b810181811067ffffffffffffffff82111715614ef757614ef6615093565b5b80604052505050565b6000614f0b82614e08565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f3e57614f3d614fa8565b5b600182019050919050565b6000614f5482614f65565b9050919050565b6000819050919050565b6000614f70826150e7565b9050919050565b6000614f8282614e08565b9150614f8d83614e08565b925082614f9d57614f9c614fd7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303820657460208201527f68657220666f722065616368204e465429000000000000000000000000000000604082015250565b7f4e6f7420656e6f756768205265736572766564204e46547320666f722043726560008201527f61746f72206c65667420746f206d696e742e2e00000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178696d756d2033204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303820657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60038110615a8257615a81615006565b5b50565b615a8e81614d65565b8114615a9957600080fd5b50565b615aa581614d77565b8114615ab057600080fd5b50565b615abc81614d83565b8114615ac757600080fd5b50565b615ad381614d8d565b8114615ade57600080fd5b50565b615aea81614e08565b8114615af557600080fd5b50565b615b0181614e12565b8114615b0c57600080fd5b5056fea264697066735822122045276bc95527a5332b0f3f4bfd273f5961a189764cefd1fb418b353b6f044b4e64736f6c63430008070033
Deployed Bytecode
0x60806040526004361061023f5760003560e01c8063715018a61161012e578063bdb4b848116100ab578063dcd4e7321161006f578063dcd4e73214610871578063e985e9c51461088d578063eab41782146108ca578063f2fde38b146108e1578063ff9849941461090a57610246565b8063bdb4b8481461078a578063c4d8b9df146107b5578063c87b56dd146107de578063cd5fe7251461081b578063d7224ba01461084657610246565b8063b0a1c1c4116100f2578063b0a1c1c4146106c6578063b3ab66b0146106f1578063b620e9751461070d578063b88d4fde14610736578063ba829d711461075f57610246565b8063715018a6146106195780638da5cb5b1461063057806395d89b411461065b578063a22cb46514610686578063a475b5dd146106af57610246565b806332624114116101bc578063603f4d5211610180578063603f4d521461053257806361b20d8c1461055d5780636352211e146105745780637035bf18146105b157806370a08231146105dc57610246565b8063326241141461043b57806339a0c6f91461047857806342842e0e146104a15780634520e916146104ca5780634f6ccce7146104f557610246565b806318160ddd1161020357806318160ddd146103425780631a17fe5e1461036d57806323b872dd146103985780632f745c59146103c15780633023eba6146103fe57610246565b80630191a6571461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b31461031957610246565b3661024657005b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613b31565b610921565b005b34801561028057600080fd5b5061029b60048036038101906102969190613d5b565b6109e1565b6040516102a89190614609565b60405180910390f35b3480156102bd57600080fd5b506102c6610b2b565b6040516102d39190614684565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe9190613dfe565b610bbd565b60405161031091906145a2565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b9190613cb4565b610c42565b005b34801561034e57600080fd5b50610357610d5b565b6040516103649190614ae6565b60405180910390f35b34801561037957600080fd5b50610382610d64565b60405161038f9190614ae6565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613b9e565b610d6a565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613cb4565b610d7a565b6040516103f59190614ae6565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613b31565b610f78565b6040516104329190614ae6565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613cf4565b610f90565b60405161046f9190614609565b60405180910390f35b34801561048457600080fd5b5061049f600480360381019061049a9190613db5565b61108e565b005b3480156104ad57600080fd5b506104c860048036038101906104c39190613b9e565b611124565b005b3480156104d657600080fd5b506104df611144565b6040516104ec9190614ae6565b60405180910390f35b34801561050157600080fd5b5061051c60048036038101906105179190613dfe565b6111d7565b6040516105299190614ae6565b60405180910390f35b34801561053e57600080fd5b5061054761122a565b6040516105549190614669565b60405180910390f35b34801561056957600080fd5b5061057261125b565b005b34801561058057600080fd5b5061059b60048036038101906105969190613dfe565b611386565b6040516105a891906145a2565b60405180910390f35b3480156105bd57600080fd5b506105c661139c565b6040516105d39190614684565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190613b31565b61142a565b6040516106109190614ae6565b60405180910390f35b34801561062557600080fd5b5061062e611513565b005b34801561063c57600080fd5b5061064561159b565b60405161065291906145a2565b60405180910390f35b34801561066757600080fd5b506106706115c5565b60405161067d9190614684565b60405180910390f35b34801561069257600080fd5b506106ad60048036038101906106a89190613c74565b611657565b005b3480156106bb57600080fd5b506106c46117d8565b005b3480156106d257600080fd5b506106db61185d565b6040516106e89190614ae6565b60405180910390f35b61070b60048036038101906107069190613dfe565b6118e1565b005b34801561071957600080fd5b50610734600480360381019061072f9190613e2b565b611b48565b005b34801561074257600080fd5b5061075d60048036038101906107589190613bf1565b611c7a565b005b34801561076b57600080fd5b50610774611cd6565b6040516107819190614ae6565b60405180910390f35b34801561079657600080fd5b5061079f611cdc565b6040516107ac9190614ae6565b60405180910390f35b3480156107c157600080fd5b506107dc60048036038101906107d79190613db5565b611ce6565b005b3480156107ea57600080fd5b5061080560048036038101906108009190613dfe565b611d7c565b6040516108129190614684565b60405180910390f35b34801561082757600080fd5b50610830611ec1565b60405161083d9190614ae6565b60405180910390f35b34801561085257600080fd5b5061085b611ec7565b6040516108689190614ae6565b60405180910390f35b61088b60048036038101906108869190613e6b565b611ecd565b005b34801561089957600080fd5b506108b460048036038101906108af9190613b5e565b6121f1565b6040516108c19190614609565b60405180910390f35b3480156108d657600080fd5b506108df612285565b005b3480156108ed57600080fd5b5061090860048036038101906109039190613b31565b61237e565b005b34801561091657600080fd5b5061091f612476565b005b6109296125d7565b73ffffffffffffffffffffffffffffffffffffffff1661094761159b565b73ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906148c6565b60405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610aac57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b1457507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b245750610b23826125df565b5b9050919050565b606060018054610b3a90614e9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b6690614e9d565b8015610bb35780601f10610b8857610100808354040283529160200191610bb3565b820191906000526020600020905b815481529060010190602001808311610b9657829003601f168201915b5050505050905090565b6000610bc882612649565b610c07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfe90614aa6565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c4d82611386565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590614986565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdd6125d7565b73ffffffffffffffffffffffffffffffffffffffff161480610d0c5750610d0b81610d066125d7565b6121f1565b5b610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290614826565b60405180910390fd5b610d56838383612656565b505050565b60008054905090565b60125481565b610d75838383612708565b505050565b6000610d858361142a565b8210610dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbd906146a6565b60405180910390fd5b6000610dd0610d5b565b905060008060005b83811015610f36576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610eca57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f225786841415610f13578195505050505050610f72565b8380610f1e90614f00565b9450505b508080610f2e90614f00565b915050610dd8565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6990614a46565b60405180910390fd5b92915050565b600f6020528060005260406000206000915090505481565b6000803086604051602001610fa692919061450c565b604051602081830303815290604052805190602001209050600181604051602001610fd19190614567565b60405160208183030381529060405280519060200120868686604051600081526020016040526040516110079493929190614624565b6020604051602081039080840390855afa158015611029573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6110966125d7565b73ffffffffffffffffffffffffffffffffffffffff166110b461159b565b73ffffffffffffffffffffffffffffffffffffffff161461110a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611101906148c6565b60405180910390fd5b80600990805190602001906111209291906138e1565b5050565b61113f83838360405180602001604052806000815250611c7a565b505050565b600061114e6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661116c61159b565b73ffffffffffffffffffffffffffffffffffffffff16146111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b9906148c6565b60405180910390fd5b600b54600c546111d29190614d31565b905090565b60006111e1610d5b565b8210611222576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121990614786565b60405180910390fd5b819050919050565b600080601154141561123f5760009050611258565b600060125414156112535760019050611258565b600290505b90565b6112636125d7565b73ffffffffffffffffffffffffffffffffffffffff1661128161159b565b73ffffffffffffffffffffffffffffffffffffffff16146112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce906148c6565b60405180910390fd5b60006112e161185d565b905060008111611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906146c6565b60405180910390fd5b61136b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e860058461135c9190614ca3565b6113669190614c72565b612cc1565b61138361137661159b565b61137e61185d565b612cc1565b50565b600061139182612d72565b600001519050919050565b601080546113a990614e9d565b80601f01602080910402602001604051908101604052809291908181526020018280546113d590614e9d565b80156114225780601f106113f757610100808354040283529160200191611422565b820191906000526020600020905b81548152906001019060200180831161140557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561149b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149290614866565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61151b6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661153961159b565b73ffffffffffffffffffffffffffffffffffffffff161461158f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611586906148c6565b60405180910390fd5b6115996000612f75565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546115d490614e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461160090614e9d565b801561164d5780601f106116225761010080835404028352916020019161164d565b820191906000526020600020905b81548152906001019060200180831161163057829003601f168201915b5050505050905090565b61165f6125d7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c490614926565b60405180910390fd5b80600660006116da6125d7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117876125d7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117cc9190614609565b60405180910390a35050565b6117e06125d7565b73ffffffffffffffffffffffffffffffffffffffff166117fe61159b565b73ffffffffffffffffffffffffffffffffffffffff1614611854576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184b906148c6565b60405180910390fd5b42601381905550565b60006118676125d7565b73ffffffffffffffffffffffffffffffffffffffff1661188561159b565b73ffffffffffffffffffffffffffffffffffffffff16146118db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d2906148c6565b60405180910390fd5b47905090565b60006118eb61122a565b9050600280811115611900576118ff615006565b5b81600281111561191357611912615006565b5b14611953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194a90614846565b60405180910390fd5b600b54600c546119639190614d31565b7f000000000000000000000000000000000000000000000000000000000000271061198e9190614d31565b82611997610d5b565b6119a19190614c1c565b11156119e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d9906147e6565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000382600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a4e9190614c1c565b1115611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a86906148e6565b60405180910390fd5b81611a98611cdc565b611aa29190614ca3565b341015611ae4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611adb90614746565b60405180910390fd5b611aee338361303b565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b3d9190614c1c565b925050819055505050565b611b506125d7565b73ffffffffffffffffffffffffffffffffffffffff16611b6e61159b565b73ffffffffffffffffffffffffffffffffffffffff1614611bc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbb906148c6565b60405180910390fd5b600c5482600b54611bd59190614c1c565b1115611c16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0d90614766565b60405180910390fd5b611c20818361303b565b81600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c6f9190614c1c565b925050819055505050565b611c85848484612708565b611c9184848484613059565b611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc7906149c6565b60405180910390fd5b50505050565b60135481565b6000600a54905090565b611cee6125d7565b73ffffffffffffffffffffffffffffffffffffffff16611d0c61159b565b73ffffffffffffffffffffffffffffffffffffffff1614611d62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d59906148c6565b60405180910390fd5b8060109080519060200190611d789291906138e1565b5050565b6060611d8782612649565b611dc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbd90614906565b60405180910390fd5b60006013541415611e635760108054611dde90614e9d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e0a90614e9d565b8015611e575780601f10611e2c57610100808354040283529160200191611e57565b820191906000526020600020905b815481529060010190602001808311611e3a57829003601f168201915b50505050509050611ebc565b6000611e6d6131f0565b90506000815111611e8d5760405180602001604052806000815250611eb8565b80611e9784613282565b604051602001611ea8929190614538565b6040516020818303038152906040525b9150505b919050565b60115481565b60075481565b828282611edc33848484610f90565b611f1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f12906148a6565b60405180910390fd5b6000611f2561122a565b905060006002811115611f3b57611f3a615006565b5b816002811115611f4e57611f4d615006565b5b1415611f8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8690614a26565b60405180910390fd5b600280811115611fa257611fa1615006565b5b816002811115611fb557611fb4615006565b5b1415611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614806565b60405180910390fd5b600b54600c546120069190614d31565b7f00000000000000000000000000000000000000000000000000000000000027106120319190614d31565b8861203a610d5b565b6120449190614c1c565b1115612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c906147e6565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000388600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120f19190614c1c565b1115612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906148e6565b60405180910390fd5b8761213b611cdc565b6121459190614ca3565b341015612187576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217e90614a86565b60405180910390fd5b612191338961303b565b87600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121e09190614c1c565b925050819055505050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61228d6125d7565b73ffffffffffffffffffffffffffffffffffffffff166122ab61159b565b73ffffffffffffffffffffffffffffffffffffffff1614612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f8906148c6565b60405180910390fd5b600061230b61122a565b90506000600281111561232157612320615006565b5b81600281111561233457612333615006565b5b14612374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b906149a6565b60405180910390fd5b4260118190555050565b6123866125d7565b73ffffffffffffffffffffffffffffffffffffffff166123a461159b565b73ffffffffffffffffffffffffffffffffffffffff16146123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f1906148c6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246190614706565b60405180910390fd5b61247381612f75565b50565b61247e6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661249c61159b565b73ffffffffffffffffffffffffffffffffffffffff16146124f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e9906148c6565b60405180910390fd5b60006124fc61122a565b905060028081111561251157612510615006565b5b81600281111561252457612523615006565b5b1415612565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255c906146e6565b60405180910390fd5b6000600281111561257957612578615006565b5b81600281111561258c5761258b615006565b5b14156125cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125c490614966565b60405180910390fd5b4260128190555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061271382612d72565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661273a6125d7565b73ffffffffffffffffffffffffffffffffffffffff161480612796575061275f6125d7565b73ffffffffffffffffffffffffffffffffffffffff1661277e84610bbd565b73ffffffffffffffffffffffffffffffffffffffff16145b806127b257506127b182600001516127ac6125d7565b6121f1565b5b9050806127f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127eb90614946565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285d90614886565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156128d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cd906147c6565b60405180910390fd5b6128e385858560016133e3565b6128f36000848460000151612656565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166129619190614cfd565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16612a059190614bd6565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050506000600184612b0b9190614c1c565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c5157612b8181612649565b15612c50576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cb986868660016133e9565b505050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612ce79061458d565b60006040518083038185875af1925050503d8060008114612d24576040519150601f19603f3d011682016040523d82523d6000602084013e612d29565b606091505b5050905080612d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d64906147a6565b60405180910390fd5b505050565b612d7a613967565b612d8382612649565b612dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db990614726565b60405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000038310612e265760017f000000000000000000000000000000000000000000000000000000000000000384612e199190614d31565b612e239190614c1c565b90505b60008390505b818110612f34576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f2057809350505050612f70565b508080612f2c90614e73565b915050612e2c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f6790614a66565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130558282604051806020016040528060008152506133ef565b5050565b600061307a8473ffffffffffffffffffffffffffffffffffffffff166138ce565b156131e3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130a36125d7565b8786866040518563ffffffff1660e01b81526004016130c594939291906145bd565b602060405180830381600087803b1580156130df57600080fd5b505af192505050801561311057506040513d601f19601f8201168201806040525081019061310d9190613d88565b60015b613193573d8060008114613140576040519150601f19603f3d011682016040523d82523d6000602084013e613145565b606091505b5060008151141561318b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613182906149c6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506131e8565b600190505b949350505050565b6060600980546131ff90614e9d565b80601f016020809104026020016040519081016040528092919081815260200182805461322b90614e9d565b80156132785780601f1061324d57610100808354040283529160200191613278565b820191906000526020600020905b81548152906001019060200180831161325b57829003601f168201915b5050505050905090565b606060008214156132ca576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506133de565b600082905060005b600082146132fc5780806132e590614f00565b915050600a826132f59190614c72565b91506132d2565b60008167ffffffffffffffff81111561331857613317615093565b5b6040519080825280601f01601f19166020018201604052801561334a5781602001600182028036833780820191505090505b5090505b600085146133d7576001826133639190614d31565b9150600a856133729190614f77565b603061337e9190614c1c565b60f81b81838151811061339457613393615064565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856133d09190614c72565b945061334e565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161345c90614a06565b60405180910390fd5b61346e81612649565b156134ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a5906149e6565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000003831115613511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350890614ac6565b60405180910390fd5b61351e60008583866133e3565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16815250509050604051806040016040528085836000015161361b9190614bd6565b6fffffffffffffffffffffffffffffffff1681526020018583602001516136429190614bd6565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b858110156138b157818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46138516000888488613059565b613890576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613887906149c6565b60405180910390fd5b818061389b90614f00565b92505080806138a990614f00565b9150506137e0565b50806000819055506138c660008785886133e9565b505050505050565b600080823b905060008111915050919050565b8280546138ed90614e9d565b90600052602060002090601f01602090048101928261390f5760008555613956565b82601f1061392857805160ff1916838001178555613956565b82800160010185558215613956579182015b8281111561395557825182559160200191906001019061393a565b5b50905061396391906139a1565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156139ba5760008160009055506001016139a2565b5090565b60006139d16139cc84614b26565b614b01565b9050828152602081018484840111156139ed576139ec6150c7565b5b6139f8848285614e31565b509392505050565b6000613a13613a0e84614b57565b614b01565b905082815260208101848484011115613a2f57613a2e6150c7565b5b613a3a848285614e31565b509392505050565b600081359050613a5181615a85565b92915050565b600081359050613a6681615a9c565b92915050565b600081359050613a7b81615ab3565b92915050565b600081359050613a9081615aca565b92915050565b600081519050613aa581615aca565b92915050565b600082601f830112613ac057613abf6150c2565b5b8135613ad08482602086016139be565b91505092915050565b600082601f830112613aee57613aed6150c2565b5b8135613afe848260208601613a00565b91505092915050565b600081359050613b1681615ae1565b92915050565b600081359050613b2b81615af8565b92915050565b600060208284031215613b4757613b466150d1565b5b6000613b5584828501613a42565b91505092915050565b60008060408385031215613b7557613b746150d1565b5b6000613b8385828601613a42565b9250506020613b9485828601613a42565b9150509250929050565b600080600060608486031215613bb757613bb66150d1565b5b6000613bc586828701613a42565b9350506020613bd686828701613a42565b9250506040613be786828701613b07565b9150509250925092565b60008060008060808587031215613c0b57613c0a6150d1565b5b6000613c1987828801613a42565b9450506020613c2a87828801613a42565b9350506040613c3b87828801613b07565b925050606085013567ffffffffffffffff811115613c5c57613c5b6150cc565b5b613c6887828801613aab565b91505092959194509250565b60008060408385031215613c8b57613c8a6150d1565b5b6000613c9985828601613a42565b9250506020613caa85828601613a57565b9150509250929050565b60008060408385031215613ccb57613cca6150d1565b5b6000613cd985828601613a42565b9250506020613cea85828601613b07565b9150509250929050565b60008060008060808587031215613d0e57613d0d6150d1565b5b6000613d1c87828801613a42565b9450506020613d2d87828801613b1c565b9350506040613d3e87828801613a6c565b9250506060613d4f87828801613a6c565b91505092959194509250565b600060208284031215613d7157613d706150d1565b5b6000613d7f84828501613a81565b91505092915050565b600060208284031215613d9e57613d9d6150d1565b5b6000613dac84828501613a96565b91505092915050565b600060208284031215613dcb57613dca6150d1565b5b600082013567ffffffffffffffff811115613de957613de86150cc565b5b613df584828501613ad9565b91505092915050565b600060208284031215613e1457613e136150d1565b5b6000613e2284828501613b07565b91505092915050565b60008060408385031215613e4257613e416150d1565b5b6000613e5085828601613b07565b9250506020613e6185828601613a42565b9150509250929050565b60008060008060808587031215613e8557613e846150d1565b5b6000613e9387828801613b07565b9450506020613ea487828801613b1c565b9350506040613eb587828801613a6c565b9250506060613ec687828801613a6c565b91505092959194509250565b613edb81614d65565b82525050565b613ef2613eed82614d65565b614f49565b82525050565b613f0181614d77565b82525050565b613f1081614d83565b82525050565b613f27613f2282614d83565b614f5b565b82525050565b6000613f3882614b88565b613f428185614b9e565b9350613f52818560208601614e40565b613f5b816150d6565b840191505092915050565b613f6f81614e1f565b82525050565b6000613f8082614b93565b613f8a8185614bba565b9350613f9a818560208601614e40565b613fa3816150d6565b840191505092915050565b6000613fb982614b93565b613fc38185614bcb565b9350613fd3818560208601614e40565b80840191505092915050565b6000613fec602283614bba565b9150613ff7826150f4565b604082019050919050565b600061400f601583614bba565b915061401a82615143565b602082019050919050565b6000614032601c83614bcb565b915061403d8261516c565b601c82019050919050565b6000614055601c83614bba565b915061406082615195565b602082019050919050565b6000614078602683614bba565b9150614083826151be565b604082019050919050565b600061409b602a83614bba565b91506140a68261520d565b604082019050919050565b60006140be605183614bba565b91506140c98261525c565b606082019050919050565b60006140e1603383614bba565b91506140ec826152d1565b604082019050919050565b6000614104602383614bba565b915061410f82615320565b604082019050919050565b6000614127601483614bba565b91506141328261536f565b602082019050919050565b600061414a602583614bba565b915061415582615398565b604082019050919050565b600061416d601e83614bba565b9150614178826153e7565b602082019050919050565b6000614190602a83614bba565b915061419b82615410565b604082019050919050565b60006141b3603983614bba565b91506141be8261545f565b604082019050919050565b60006141d6601c83614bba565b91506141e1826154ae565b602082019050919050565b60006141f9602b83614bba565b9150614204826154d7565b604082019050919050565b600061421c602683614bba565b915061422782615526565b604082019050919050565b600061423f600583614bcb565b915061424a82615575565b600582019050919050565b6000614262601183614bba565b915061426d8261559e565b602082019050919050565b6000614285602083614bba565b9150614290826155c7565b602082019050919050565b60006142a8602483614bba565b91506142b3826155f0565b604082019050919050565b60006142cb602f83614bba565b91506142d68261563f565b604082019050919050565b60006142ee601a83614bba565b91506142f98261568e565b602082019050919050565b6000614311603283614bba565b915061431c826156b7565b604082019050919050565b6000614334603d83614bba565b915061433f82615706565b604082019050919050565b6000614357602283614bba565b915061436282615755565b604082019050919050565b600061437a601b83614bba565b9150614385826157a4565b602082019050919050565b600061439d600083614baf565b91506143a8826157cd565b600082019050919050565b60006143c0603383614bba565b91506143cb826157d0565b604082019050919050565b60006143e3601d83614bba565b91506143ee8261581f565b602082019050919050565b6000614406602183614bba565b915061441182615848565b604082019050919050565b6000614429601583614bba565b915061443482615897565b602082019050919050565b600061444c602e83614bba565b9150614457826158c0565b604082019050919050565b600061446f602f83614bba565b915061447a8261590f565b604082019050919050565b6000614492604d83614bba565b915061449d8261595e565b606082019050919050565b60006144b5602d83614bba565b91506144c0826159d3565b604082019050919050565b60006144d8602283614bba565b91506144e382615a22565b604082019050919050565b6144f781614e08565b82525050565b61450681614e12565b82525050565b60006145188285613ee1565b6014820191506145288284613ee1565b6014820191508190509392505050565b60006145448285613fae565b91506145508284613fae565b915061455b82614232565b91508190509392505050565b600061457282614025565b915061457e8284613f16565b60208201915081905092915050565b600061459882614390565b9150819050919050565b60006020820190506145b76000830184613ed2565b92915050565b60006080820190506145d26000830187613ed2565b6145df6020830186613ed2565b6145ec60408301856144ee565b81810360608301526145fe8184613f2d565b905095945050505050565b600060208201905061461e6000830184613ef8565b92915050565b60006080820190506146396000830187613f07565b61464660208301866144fd565b6146536040830185613f07565b6146606060830184613f07565b95945050505050565b600060208201905061467e6000830184613f66565b92915050565b6000602082019050818103600083015261469e8184613f75565b905092915050565b600060208201905081810360008301526146bf81613fdf565b9050919050565b600060208201905081810360008301526146df81614002565b9050919050565b600060208201905081810360008301526146ff81614048565b9050919050565b6000602082019050818103600083015261471f8161406b565b9050919050565b6000602082019050818103600083015261473f8161408e565b9050919050565b6000602082019050818103600083015261475f816140b1565b9050919050565b6000602082019050818103600083015261477f816140d4565b9050919050565b6000602082019050818103600083015261479f816140f7565b9050919050565b600060208201905081810360008301526147bf8161411a565b9050919050565b600060208201905081810360008301526147df8161413d565b9050919050565b600060208201905081810360008301526147ff81614160565b9050919050565b6000602082019050818103600083015261481f81614183565b9050919050565b6000602082019050818103600083015261483f816141a6565b9050919050565b6000602082019050818103600083015261485f816141c9565b9050919050565b6000602082019050818103600083015261487f816141ec565b9050919050565b6000602082019050818103600083015261489f8161420f565b9050919050565b600060208201905081810360008301526148bf81614255565b9050919050565b600060208201905081810360008301526148df81614278565b9050919050565b600060208201905081810360008301526148ff8161429b565b9050919050565b6000602082019050818103600083015261491f816142be565b9050919050565b6000602082019050818103600083015261493f816142e1565b9050919050565b6000602082019050818103600083015261495f81614304565b9050919050565b6000602082019050818103600083015261497f81614327565b9050919050565b6000602082019050818103600083015261499f8161434a565b9050919050565b600060208201905081810360008301526149bf8161436d565b9050919050565b600060208201905081810360008301526149df816143b3565b9050919050565b600060208201905081810360008301526149ff816143d6565b9050919050565b60006020820190508181036000830152614a1f816143f9565b9050919050565b60006020820190508181036000830152614a3f8161441c565b9050919050565b60006020820190508181036000830152614a5f8161443f565b9050919050565b60006020820190508181036000830152614a7f81614462565b9050919050565b60006020820190508181036000830152614a9f81614485565b9050919050565b60006020820190508181036000830152614abf816144a8565b9050919050565b60006020820190508181036000830152614adf816144cb565b9050919050565b6000602082019050614afb60008301846144ee565b92915050565b6000614b0b614b1c565b9050614b178282614ecf565b919050565b6000604051905090565b600067ffffffffffffffff821115614b4157614b40615093565b5b614b4a826150d6565b9050602081019050919050565b600067ffffffffffffffff821115614b7257614b71615093565b5b614b7b826150d6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614be182614dcc565b9150614bec83614dcc565b9250826fffffffffffffffffffffffffffffffff03821115614c1157614c10614fa8565b5b828201905092915050565b6000614c2782614e08565b9150614c3283614e08565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614c6757614c66614fa8565b5b828201905092915050565b6000614c7d82614e08565b9150614c8883614e08565b925082614c9857614c97614fd7565b5b828204905092915050565b6000614cae82614e08565b9150614cb983614e08565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614cf257614cf1614fa8565b5b828202905092915050565b6000614d0882614dcc565b9150614d1383614dcc565b925082821015614d2657614d25614fa8565b5b828203905092915050565b6000614d3c82614e08565b9150614d4783614e08565b925082821015614d5a57614d59614fa8565b5b828203905092915050565b6000614d7082614de8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050614dc782615a71565b919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000614e2a82614db9565b9050919050565b82818337600083830152505050565b60005b83811015614e5e578082015181840152602081019050614e43565b83811115614e6d576000848401525b50505050565b6000614e7e82614e08565b91506000821415614e9257614e91614fa8565b5b600182039050919050565b60006002820490506001821680614eb557607f821691505b60208210811415614ec957614ec8615035565b5b50919050565b614ed8826150d6565b810181811067ffffffffffffffff82111715614ef757614ef6615093565b5b80604052505050565b6000614f0b82614e08565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614f3e57614f3d614fa8565b5b600182019050919050565b6000614f5482614f65565b9050919050565b6000819050919050565b6000614f70826150e7565b9050919050565b6000614f8282614e08565b9150614f8d83614e08565b925082614f9d57614f9c614fd7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303820657460208201527f68657220666f722065616368204e465429000000000000000000000000000000604082015250565b7f4e6f7420656e6f756768205265736572766564204e46547320666f722043726560008201527f61746f72206c65667420746f206d696e742e2e00000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178696d756d2033204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e303820657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b60038110615a8257615a81615006565b5b50565b615a8e81614d65565b8114615a9957600080fd5b50565b615aa581614d77565b8114615ab057600080fd5b50565b615abc81614d83565b8114615ac757600080fd5b50565b615ad381614d8d565b8114615ade57600080fd5b50565b615aea81614e08565b8114615af557600080fd5b50565b615b0181614e12565b8114615b0c57600080fd5b5056fea264697066735822122045276bc95527a5332b0f3f4bfd273f5961a189764cefd1fb418b353b6f044b4e64736f6c63430008070033
Deployed Bytecode Sourcemap
38025:7792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39635:8;;;44385:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25721:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27447:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28972:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28535:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24282:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39250:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29822:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24913:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38902:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40697:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39862:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30027:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44552:124;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24445:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45273:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44738:295;;;;;;;;;;;;;:::i;:::-;;27270:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39110:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26147:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27602:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29240:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45730:82;;;;;;;;;;;;;:::i;:::-;;44202:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41930:659;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42634:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30247:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39292:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45615:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39983:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42929:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39211:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34662:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41062:809;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29577:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43547:215;;;;;;;;;;;;;:::i;:::-;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43804:348;;;;;;;;;;;;;:::i;:::-;;44385:87;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44458:6:::1;44450:5;;:14;;;;;;;;;;;;;;;;;;44385:87:::0;:::o;25721:370::-;25848:4;25893:25;25878:40;;;:11;:40;;;;:99;;;;25944:33;25929:48;;;:11;:48;;;;25878:99;:160;;;;26003:35;25988:50;;;:11;:50;;;;25878:160;:207;;;;26049:36;26073:11;26049:23;:36::i;:::-;25878:207;25864:221;;25721:370;;;:::o;27447:94::-;27501:13;27530:5;27523:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27447:94;:::o;28972:204::-;29040:7;29064:16;29072:7;29064;:16::i;:::-;29056:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;29146:15;:24;29162:7;29146:24;;;;;;;;;;;;;;;;;;;;;29139:31;;28972:204;;;:::o;28535:379::-;28604:13;28620:24;28636:7;28620:15;:24::i;:::-;28604:40;;28665:5;28659:11;;:2;:11;;;;28651:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28750:5;28734:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28759:37;28776:5;28783:12;:10;:12::i;:::-;28759:16;:37::i;:::-;28734:62;28718:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;28880:28;28889:2;28893:7;28902:5;28880:8;:28::i;:::-;28597:317;28535:379;;:::o;24282:94::-;24335:7;24358:12;;24351:19;;24282:94;:::o;39250:35::-;;;;:::o;29822:142::-;29930:28;29940:4;29946:2;29950:7;29930:9;:28::i;:::-;29822:142;;;:::o;24913:744::-;25022:7;25057:16;25067:5;25057:9;:16::i;:::-;25049:5;:24;25041:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;25119:22;25144:13;:11;:13::i;:::-;25119:38;;25164:19;25194:25;25244:9;25239:350;25263:14;25259:1;:18;25239:350;;;25293:31;25327:11;:14;25339:1;25327:14;;;;;;;;;;;25293:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25380:1;25354:28;;:9;:14;;;:28;;;25350:89;;25415:9;:14;;;25395:34;;25350:89;25472:5;25451:26;;:17;:26;;;25447:135;;;25509:5;25494:11;:20;25490:59;;;25536:1;25529:8;;;;;;;;;25490:59;25559:13;;;;;:::i;:::-;;;;25447:135;25284:305;25279:3;;;;;:::i;:::-;;;;25239:350;;;;25595:56;;;;;;;;;;:::i;:::-;;;;;;;;24913:744;;;;;:::o;38902:50::-;;;;;;;;;;;;;;;;;:::o;40697:306::-;40796:4;40813:12;40863:4;40870;40838:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40828:48;;;;;;40813:63;;40903:92;40976:4;40923:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;40913:69;;;;;;40984:2;40988;40992;40903:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40894:101;;:5;;;;;;;;;;;:101;;;40887:108;;;40697:306;;;;;;:::o;39862:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39955:8:::1;39937:15;:26;;;;;;;;;;;;:::i;:::-;;39862:109:::0;:::o;30027:157::-;30139:39;30156:4;30162:2;30166:7;30139:39;;;;;;;;;;;;:16;:39::i;:::-;30027:157;;;:::o;44552:124::-;44611:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44654:14:::1;;44635:16;;:33;;;;:::i;:::-;44628:40;;44552:124:::0;:::o;24445:177::-;24512:7;24544:13;:11;:13::i;:::-;24536:5;:21;24528:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;24611:5;24604:12;;24445:177;;;:::o;45273:297::-;45314:5;45356:1;45335:17;;:22;45331:232;;;45381:12;45374:19;;;;45331:232;45448:1;45424:20;;:25;45420:143;;;45473:13;45466:20;;;;45420:143;45535:16;45528:23;;45273:297;;:::o;44738:295::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44791:15:::1;44809:16;:14;:16::i;:::-;44791:34;;44854:1;44844:7;:11;44836:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;44894;44912:3;;;;;;;;;;;44934:4;44929:1;44919:7;:11;;;;:::i;:::-;44918:20;;;;:::i;:::-;44894:9;:45::i;:::-;44950;44968:7;:5;:7::i;:::-;44978:16;:14;:16::i;:::-;44950:9;:45::i;:::-;44780:253;44738:295::o:0;27270:118::-;27334:7;27357:20;27369:7;27357:11;:20::i;:::-;:25;;;27350:32;;27270:118;;;:::o;39110:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26147:211::-;26211:7;26252:1;26235:19;;:5;:19;;;;26227:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;26324:12;:19;26337:5;26324:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;26316:36;;26309:43;;26147:211;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;27602:98::-;27658:13;27687:7;27680:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27602:98;:::o;29240:274::-;29343:12;:10;:12::i;:::-;29331:24;;:8;:24;;;;29323:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29440:8;29395:18;:32;29414:12;:10;:12::i;:::-;29395:32;;;;;;;;;;;;;;;:42;29428:8;29395:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29489:8;29460:48;;29475:12;:10;:12::i;:::-;29460:48;;;29499:8;29460:48;;;;;;:::i;:::-;;;;;;;;29240:274;;:::o;45730:82::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45789:15:::1;45776:10;:28;;;;45730:82::o:0;44202:109::-;44258:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44282:21:::1;44275:28;;44202:109:::0;:::o;41930:659::-;41996:16;42015:11;:9;:11::i;:::-;41996:30;;42059:16;42045:30;;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;42037:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;42190:14;;42171:16;;:33;;;;:::i;:::-;42153:14;:52;;;;:::i;:::-;42143:6;42127:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:78;;42119:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;42299:12;42289:6;42259:15;:27;42275:10;42259:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:52;;42251:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;42397:6;42384:10;:8;:10::i;:::-;:19;;;;:::i;:::-;42371:9;:32;;42363:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;42504:29;42514:10;42526:6;42504:9;:29::i;:::-;42575:6;42544:15;:27;42560:10;42544:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;41985:604;41930:659;:::o;42634:287::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42755:16:::1;;42745:6;42728:14;;:23;;;;:::i;:::-;:43;;42720:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;42838:28;42848:9;42859:6;42838:9;:28::i;:::-;42907:6;42877:15;:26;42893:9;42877:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;42634:287:::0;;:::o;30247:311::-;30384:28;30394:4;30400:2;30404:7;30384:9;:28::i;:::-;30435:48;30458:4;30464:2;30468:7;30477:5;30435:22;:48::i;:::-;30419:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;30247:311;;;;:::o;39292:25::-;;;;:::o;45615:84::-;45655:7;45682:9;;45675:16;;45615:84;:::o;39983:125::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40086:14:::1;40070:13;:30;;;;;;;;;;;;:::i;:::-;;39983:125:::0;:::o;42929:568::-;43003:13;43037:17;43045:8;43037:7;:17::i;:::-;43029:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43232:1;43218:10;;:15;43214:272;;;43257:13;43250:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43214:272;43322:21;43346:10;:8;:10::i;:::-;43322:34;;43402:1;43384:7;43378:21;:25;:96;;;;;;;;;;;;;;;;;43430:7;43439:19;:8;:17;:19::i;:::-;43413:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43378:96;43371:103;;;42929:568;;;;:::o;39211:32::-;;;;:::o;34662:43::-;;;;:::o;41062:809::-;41149:2;41154;41158;40199:41;40220:10;40231:2;40234;40237;40199:20;:41::i;:::-;40190:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41188:16:::1;41207:11;:9;:11::i;:::-;41188:30;;41251:12;41237:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;41229:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;41322:16;41308:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;41300:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41468:14;;41448:16;;:34;;;;:::i;:::-;41430:14;:53;;;;:::i;:::-;41420:6;41404:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:79;;41396:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;41577:12;41567:6;41537:15;:27;41553:10;41537:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:52;;41529:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;41675:6;41662:10;:8;:10::i;:::-;:19;;;;:::i;:::-;41649:9;:32;;41641:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;41784:29;41794:10;41806:6;41784:9;:29::i;:::-;41855:6;41824:15;:27;41840:10;41824:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;41177:694;41062:809:::0;;;;;;;:::o;29577:186::-;29699:4;29722:18;:25;29741:5;29722:25;;;;;;;;;;;;;;;:35;29748:8;29722:35;;;;;;;;;;;;;;;;;;;;;;;;;29715:42;;29577:186;;;;:::o;43547:215::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43601:16:::1;43620:11;:9;:11::i;:::-;43601:30;;43664:12;43650:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;43642:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43739:15;43719:17;:35;;;;43590:172;43547:215::o:0;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;43804:348::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43862:16:::1;43881:11;:9;:11::i;:::-;43862:30;;43925:16;43911:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;43903:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44007:12;43993:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;43985:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;44129:15;44106:20;:38;;;;43851:301;43804:348::o:0;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15926:157::-;16011:4;16050:25;16035:40;;;:11;:40;;;;16028:47;;15926:157;;;:::o;30797:105::-;30854:4;30884:12;;30874:7;:22;30867:29;;30797:105;;;:::o;34484:172::-;34608:2;34581:15;:24;34597:7;34581:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34642:7;34638:2;34622:28;;34631:5;34622:28;;;;;;;;;;;;34484:172;;;:::o;32849:1529::-;32946:35;32984:20;32996:7;32984:11;:20::i;:::-;32946:58;;33013:22;33055:13;:18;;;33039:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;33108:12;:10;:12::i;:::-;33084:36;;:20;33096:7;33084:11;:20::i;:::-;:36;;;33039:81;:142;;;;33131:50;33148:13;:18;;;33168:12;:10;:12::i;:::-;33131:16;:50::i;:::-;33039:142;33013:169;;33207:17;33191:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;33339:4;33317:26;;:13;:18;;;:26;;;33301:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;33428:1;33414:16;;:2;:16;;;;33406:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;33481:43;33503:4;33509:2;33513:7;33522:1;33481:21;:43::i;:::-;33581:49;33598:1;33602:7;33611:13;:18;;;33581:8;:49::i;:::-;33669:1;33639:12;:18;33652:4;33639:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33705:1;33677:12;:16;33690:2;33677:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33736:43;;;;;;;;33751:2;33736:43;;;;;;33762:15;33736:43;;;;;33713:11;:20;33725:7;33713:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34007:19;34039:1;34029:7;:11;;;;:::i;:::-;34007:33;;34092:1;34051:43;;:11;:24;34063:11;34051:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;34047:236;;;34109:20;34117:11;34109:7;:20::i;:::-;34105:171;;;34169:97;;;;;;;;34196:13;:18;;;34169:97;;;;;;34227:13;:28;;;34169:97;;;;;34142:11;:24;34154:11;34142:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34105:171;34047:236;34315:7;34311:2;34296:27;;34305:4;34296:27;;;;;;;;;;;;34330:42;34351:4;34357:2;34361:7;34370:1;34330:20;:42::i;:::-;32939:1439;;;32849:1529;;;:::o;45041:183::-;45122:9;45137:7;:12;;45157:6;45137:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45121:47;;;45187:4;45179:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;45110:114;45041:183;;:::o;26610:606::-;26686:21;;:::i;:::-;26727:16;26735:7;26727;:16::i;:::-;26719:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26799:26;26847:12;26836:7;:23;26832:93;;26916:1;26901:12;26891:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;26870:47;;26832:93;26938:12;26953:7;26938:22;;26933:212;26970:18;26962:4;:26;26933:212;;27007:31;27041:11;:17;27053:4;27041:17;;;;;;;;;;;27007:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27097:1;27071:28;;:9;:14;;;:28;;;27067:71;;27119:9;27112:16;;;;;;;27067:71;26998:147;26990:6;;;;;:::i;:::-;;;;26933:212;;;;27153:57;;;;;;;;;;:::i;:::-;;;;;;;;26610:606;;;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;30908:98::-;30973:27;30983:2;30987:8;30973:27;;;;;;;;;;;;:9;:27::i;:::-;30908:98;;:::o;36199:690::-;36336:4;36353:15;:2;:13;;;:15::i;:::-;36349:535;;;36408:2;36392:36;;;36429:12;:10;:12::i;:::-;36443:4;36449:7;36458:5;36392:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36379:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36640:1;36623:6;:13;:18;36619:215;;;36656:61;;;;;;;;;;:::i;:::-;;;;;;;;36619:215;36802:6;36796:13;36787:6;36783:2;36779:15;36772:38;36379:464;36524:45;;;36514:55;;;:6;:55;;;;36507:62;;;;;36349:535;36872:4;36865:11;;36199:690;;;;;;;:::o;39688:116::-;39748:13;39781:15;39774:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39688:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;37351:141::-;;;;;:::o;37878:140::-;;;;;:::o;31345:1272::-;31450:20;31473:12;;31450:35;;31514:1;31500:16;;:2;:16;;;;31492:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;31691:21;31699:12;31691:7;:21::i;:::-;31690:22;31682:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;31773:12;31761:8;:24;;31753:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31833:61;31863:1;31867:2;31871:12;31885:8;31833:21;:61::i;:::-;31903:30;31936:12;:16;31949:2;31936:16;;;;;;;;;;;;;;;31903:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31978:119;;;;;;;;32028:8;31998:11;:19;;;:39;;;;:::i;:::-;31978:119;;;;;;32081:8;32046:11;:24;;;:44;;;;:::i;:::-;31978:119;;;;;31959:12;:16;31972:2;31959:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32132:43;;;;;;;;32147:2;32132:43;;;;;;32158:15;32132:43;;;;;32104:11;:25;32116:12;32104:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32184:20;32207:12;32184:35;;32233:9;32228:281;32252:8;32248:1;:12;32228:281;;;32306:12;32302:2;32281:38;;32298:1;32281:38;;;;;;;;;;;;32346:59;32377:1;32381:2;32385:12;32399:5;32346:22;:59::i;:::-;32328:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;32487:14;;;;;:::i;:::-;;;;32262:3;;;;;:::i;:::-;;;;32228:281;;;;32532:12;32517;:27;;;;32551:60;32580:1;32584:2;32588:12;32602:8;32551:20;:60::i;:::-;31443:1174;;;31345:1272;;;:::o;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:135::-;2466:5;2504:6;2491:20;2482:29;;2520:31;2545:5;2520:31;:::i;:::-;2422:135;;;;:::o;2563:329::-;2622:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:119;;;2677:79;;:::i;:::-;2639:119;2797:1;2822:53;2867:7;2858:6;2847:9;2843:22;2822:53;:::i;:::-;2812:63;;2768:117;2563:329;;;;:::o;2898:474::-;2966:6;2974;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:53;3219:7;3210:6;3199:9;3195:22;3174:53;:::i;:::-;3164:63;;3120:117;3276:2;3302:53;3347:7;3338:6;3327:9;3323:22;3302:53;:::i;:::-;3292:63;;3247:118;2898:474;;;;;:::o;3378:619::-;3455:6;3463;3471;3520:2;3508:9;3499:7;3495:23;3491:32;3488:119;;;3526:79;;:::i;:::-;3488:119;3646:1;3671:53;3716:7;3707:6;3696:9;3692:22;3671:53;:::i;:::-;3661:63;;3617:117;3773:2;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3744:118;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;3378:619;;;;;:::o;4003:943::-;4098:6;4106;4114;4122;4171:3;4159:9;4150:7;4146:23;4142:33;4139:120;;;4178:79;;:::i;:::-;4139:120;4298:1;4323:53;4368:7;4359:6;4348:9;4344:22;4323:53;:::i;:::-;4313:63;;4269:117;4425:2;4451:53;4496:7;4487:6;4476:9;4472:22;4451:53;:::i;:::-;4441:63;;4396:118;4553:2;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4524:118;4709:2;4698:9;4694:18;4681:32;4740:18;4732:6;4729:30;4726:117;;;4762:79;;:::i;:::-;4726:117;4867:62;4921:7;4912:6;4901:9;4897:22;4867:62;:::i;:::-;4857:72;;4652:287;4003:943;;;;;;;:::o;4952:468::-;5017:6;5025;5074:2;5062:9;5053:7;5049:23;5045:32;5042:119;;;5080:79;;:::i;:::-;5042:119;5200:1;5225:53;5270:7;5261:6;5250:9;5246:22;5225:53;:::i;:::-;5215:63;;5171:117;5327:2;5353:50;5395:7;5386:6;5375:9;5371:22;5353:50;:::i;:::-;5343:60;;5298:115;4952:468;;;;;:::o;5426:474::-;5494:6;5502;5551:2;5539:9;5530:7;5526:23;5522:32;5519:119;;;5557:79;;:::i;:::-;5519:119;5677:1;5702:53;5747:7;5738:6;5727:9;5723:22;5702:53;:::i;:::-;5692:63;;5648:117;5804:2;5830:53;5875:7;5866:6;5855:9;5851:22;5830:53;:::i;:::-;5820:63;;5775:118;5426:474;;;;;:::o;5906:761::-;5990:6;5998;6006;6014;6063:3;6051:9;6042:7;6038:23;6034:33;6031:120;;;6070:79;;:::i;:::-;6031:120;6190:1;6215:53;6260:7;6251:6;6240:9;6236:22;6215:53;:::i;:::-;6205:63;;6161:117;6317:2;6343:51;6386:7;6377:6;6366:9;6362:22;6343:51;:::i;:::-;6333:61;;6288:116;6443:2;6469:53;6514:7;6505:6;6494:9;6490:22;6469:53;:::i;:::-;6459:63;;6414:118;6571:2;6597:53;6642:7;6633:6;6622:9;6618:22;6597:53;:::i;:::-;6587:63;;6542:118;5906:761;;;;;;;:::o;6673:327::-;6731:6;6780:2;6768:9;6759:7;6755:23;6751:32;6748:119;;;6786:79;;:::i;:::-;6748:119;6906:1;6931:52;6975:7;6966:6;6955:9;6951:22;6931:52;:::i;:::-;6921:62;;6877:116;6673:327;;;;:::o;7006:349::-;7075:6;7124:2;7112:9;7103:7;7099:23;7095:32;7092:119;;;7130:79;;:::i;:::-;7092:119;7250:1;7275:63;7330:7;7321:6;7310:9;7306:22;7275:63;:::i;:::-;7265:73;;7221:127;7006:349;;;;:::o;7361:509::-;7430:6;7479:2;7467:9;7458:7;7454:23;7450:32;7447:119;;;7485:79;;:::i;:::-;7447:119;7633:1;7622:9;7618:17;7605:31;7663:18;7655:6;7652:30;7649:117;;;7685:79;;:::i;:::-;7649:117;7790:63;7845:7;7836:6;7825:9;7821:22;7790:63;:::i;:::-;7780:73;;7576:287;7361:509;;;;:::o;7876:329::-;7935:6;7984:2;7972:9;7963:7;7959:23;7955:32;7952:119;;;7990:79;;:::i;:::-;7952:119;8110:1;8135:53;8180:7;8171:6;8160:9;8156:22;8135:53;:::i;:::-;8125:63;;8081:117;7876:329;;;;:::o;8211:474::-;8279:6;8287;8336:2;8324:9;8315:7;8311:23;8307:32;8304:119;;;8342:79;;:::i;:::-;8304:119;8462:1;8487:53;8532:7;8523:6;8512:9;8508:22;8487:53;:::i;:::-;8477:63;;8433:117;8589:2;8615:53;8660:7;8651:6;8640:9;8636:22;8615:53;:::i;:::-;8605:63;;8560:118;8211:474;;;;;:::o;8691:761::-;8775:6;8783;8791;8799;8848:3;8836:9;8827:7;8823:23;8819:33;8816:120;;;8855:79;;:::i;:::-;8816:120;8975:1;9000:53;9045:7;9036:6;9025:9;9021:22;9000:53;:::i;:::-;8990:63;;8946:117;9102:2;9128:51;9171:7;9162:6;9151:9;9147:22;9128:51;:::i;:::-;9118:61;;9073:116;9228:2;9254:53;9299:7;9290:6;9279:9;9275:22;9254:53;:::i;:::-;9244:63;;9199:118;9356:2;9382:53;9427:7;9418:6;9407:9;9403:22;9382:53;:::i;:::-;9372:63;;9327:118;8691:761;;;;;;;:::o;9458:118::-;9545:24;9563:5;9545:24;:::i;:::-;9540:3;9533:37;9458:118;;:::o;9582:157::-;9687:45;9707:24;9725:5;9707:24;:::i;:::-;9687:45;:::i;:::-;9682:3;9675:58;9582:157;;:::o;9745:109::-;9826:21;9841:5;9826:21;:::i;:::-;9821:3;9814:34;9745:109;;:::o;9860:118::-;9947:24;9965:5;9947:24;:::i;:::-;9942:3;9935:37;9860:118;;:::o;9984:157::-;10089:45;10109:24;10127:5;10109:24;:::i;:::-;10089:45;:::i;:::-;10084:3;10077:58;9984:157;;:::o;10147:360::-;10233:3;10261:38;10293:5;10261:38;:::i;:::-;10315:70;10378:6;10373:3;10315:70;:::i;:::-;10308:77;;10394:52;10439:6;10434:3;10427:4;10420:5;10416:16;10394:52;:::i;:::-;10471:29;10493:6;10471:29;:::i;:::-;10466:3;10462:39;10455:46;;10237:270;10147:360;;;;:::o;10513:147::-;10608:45;10647:5;10608:45;:::i;:::-;10603:3;10596:58;10513:147;;:::o;10666:364::-;10754:3;10782:39;10815:5;10782:39;:::i;:::-;10837:71;10901:6;10896:3;10837:71;:::i;:::-;10830:78;;10917:52;10962:6;10957:3;10950:4;10943:5;10939:16;10917:52;:::i;:::-;10994:29;11016:6;10994:29;:::i;:::-;10989:3;10985:39;10978:46;;10758:272;10666:364;;;;:::o;11036:377::-;11142:3;11170:39;11203:5;11170:39;:::i;:::-;11225:89;11307:6;11302:3;11225:89;:::i;:::-;11218:96;;11323:52;11368:6;11363:3;11356:4;11349:5;11345:16;11323:52;:::i;:::-;11400:6;11395:3;11391:16;11384:23;;11146:267;11036:377;;;;:::o;11419:366::-;11561:3;11582:67;11646:2;11641:3;11582:67;:::i;:::-;11575:74;;11658:93;11747:3;11658:93;:::i;:::-;11776:2;11771:3;11767:12;11760:19;;11419:366;;;:::o;11791:::-;11933:3;11954:67;12018:2;12013:3;11954:67;:::i;:::-;11947:74;;12030:93;12119:3;12030:93;:::i;:::-;12148:2;12143:3;12139:12;12132:19;;11791:366;;;:::o;12163:402::-;12323:3;12344:85;12426:2;12421:3;12344:85;:::i;:::-;12337:92;;12438:93;12527:3;12438:93;:::i;:::-;12556:2;12551:3;12547:12;12540:19;;12163:402;;;:::o;12571:366::-;12713:3;12734:67;12798:2;12793:3;12734:67;:::i;:::-;12727:74;;12810:93;12899:3;12810:93;:::i;:::-;12928:2;12923:3;12919:12;12912:19;;12571:366;;;:::o;12943:::-;13085:3;13106:67;13170:2;13165:3;13106:67;:::i;:::-;13099:74;;13182:93;13271:3;13182:93;:::i;:::-;13300:2;13295:3;13291:12;13284:19;;12943:366;;;:::o;13315:::-;13457:3;13478:67;13542:2;13537:3;13478:67;:::i;:::-;13471:74;;13554:93;13643:3;13554:93;:::i;:::-;13672:2;13667:3;13663:12;13656:19;;13315:366;;;:::o;13687:::-;13829:3;13850:67;13914:2;13909:3;13850:67;:::i;:::-;13843:74;;13926:93;14015:3;13926:93;:::i;:::-;14044:2;14039:3;14035:12;14028:19;;13687:366;;;:::o;14059:::-;14201:3;14222:67;14286:2;14281:3;14222:67;:::i;:::-;14215:74;;14298:93;14387:3;14298:93;:::i;:::-;14416:2;14411:3;14407:12;14400:19;;14059:366;;;:::o;14431:::-;14573:3;14594:67;14658:2;14653:3;14594:67;:::i;:::-;14587:74;;14670:93;14759:3;14670:93;:::i;:::-;14788:2;14783:3;14779:12;14772:19;;14431:366;;;:::o;14803:::-;14945:3;14966:67;15030:2;15025:3;14966:67;:::i;:::-;14959:74;;15042:93;15131:3;15042:93;:::i;:::-;15160:2;15155:3;15151:12;15144:19;;14803:366;;;:::o;15175:::-;15317:3;15338:67;15402:2;15397:3;15338:67;:::i;:::-;15331:74;;15414:93;15503:3;15414:93;:::i;:::-;15532:2;15527:3;15523:12;15516:19;;15175:366;;;:::o;15547:::-;15689:3;15710:67;15774:2;15769:3;15710:67;:::i;:::-;15703:74;;15786:93;15875:3;15786:93;:::i;:::-;15904:2;15899:3;15895:12;15888:19;;15547:366;;;:::o;15919:::-;16061:3;16082:67;16146:2;16141:3;16082:67;:::i;:::-;16075:74;;16158:93;16247:3;16158:93;:::i;:::-;16276:2;16271:3;16267:12;16260:19;;15919:366;;;:::o;16291:::-;16433:3;16454:67;16518:2;16513:3;16454:67;:::i;:::-;16447:74;;16530:93;16619:3;16530:93;:::i;:::-;16648:2;16643:3;16639:12;16632:19;;16291:366;;;:::o;16663:::-;16805:3;16826:67;16890:2;16885:3;16826:67;:::i;:::-;16819:74;;16902:93;16991:3;16902:93;:::i;:::-;17020:2;17015:3;17011:12;17004:19;;16663:366;;;:::o;17035:::-;17177:3;17198:67;17262:2;17257:3;17198:67;:::i;:::-;17191:74;;17274:93;17363:3;17274:93;:::i;:::-;17392:2;17387:3;17383:12;17376:19;;17035:366;;;:::o;17407:::-;17549:3;17570:67;17634:2;17629:3;17570:67;:::i;:::-;17563:74;;17646:93;17735:3;17646:93;:::i;:::-;17764:2;17759:3;17755:12;17748:19;;17407:366;;;:::o;17779:400::-;17939:3;17960:84;18042:1;18037:3;17960:84;:::i;:::-;17953:91;;18053:93;18142:3;18053:93;:::i;:::-;18171:1;18166:3;18162:11;18155:18;;17779:400;;;:::o;18185:366::-;18327:3;18348:67;18412:2;18407:3;18348:67;:::i;:::-;18341:74;;18424:93;18513:3;18424:93;:::i;:::-;18542:2;18537:3;18533:12;18526:19;;18185:366;;;:::o;18557:::-;18699:3;18720:67;18784:2;18779:3;18720:67;:::i;:::-;18713:74;;18796:93;18885:3;18796:93;:::i;:::-;18914:2;18909:3;18905:12;18898:19;;18557:366;;;:::o;18929:::-;19071:3;19092:67;19156:2;19151:3;19092:67;:::i;:::-;19085:74;;19168:93;19257:3;19168:93;:::i;:::-;19286:2;19281:3;19277:12;19270:19;;18929:366;;;:::o;19301:::-;19443:3;19464:67;19528:2;19523:3;19464:67;:::i;:::-;19457:74;;19540:93;19629:3;19540:93;:::i;:::-;19658:2;19653:3;19649:12;19642:19;;19301:366;;;:::o;19673:::-;19815:3;19836:67;19900:2;19895:3;19836:67;:::i;:::-;19829:74;;19912:93;20001:3;19912:93;:::i;:::-;20030:2;20025:3;20021:12;20014:19;;19673:366;;;:::o;20045:::-;20187:3;20208:67;20272:2;20267:3;20208:67;:::i;:::-;20201:74;;20284:93;20373:3;20284:93;:::i;:::-;20402:2;20397:3;20393:12;20386:19;;20045:366;;;:::o;20417:::-;20559:3;20580:67;20644:2;20639:3;20580:67;:::i;:::-;20573:74;;20656:93;20745:3;20656:93;:::i;:::-;20774:2;20769:3;20765:12;20758:19;;20417:366;;;:::o;20789:::-;20931:3;20952:67;21016:2;21011:3;20952:67;:::i;:::-;20945:74;;21028:93;21117:3;21028:93;:::i;:::-;21146:2;21141:3;21137:12;21130:19;;20789:366;;;:::o;21161:::-;21303:3;21324:67;21388:2;21383:3;21324:67;:::i;:::-;21317:74;;21400:93;21489:3;21400:93;:::i;:::-;21518:2;21513:3;21509:12;21502:19;;21161:366;;;:::o;21533:398::-;21692:3;21713:83;21794:1;21789:3;21713:83;:::i;:::-;21706:90;;21805:93;21894:3;21805:93;:::i;:::-;21923:1;21918:3;21914:11;21907:18;;21533:398;;;:::o;21937:366::-;22079:3;22100:67;22164:2;22159:3;22100:67;:::i;:::-;22093:74;;22176:93;22265:3;22176:93;:::i;:::-;22294:2;22289:3;22285:12;22278:19;;21937:366;;;:::o;22309:::-;22451:3;22472:67;22536:2;22531:3;22472:67;:::i;:::-;22465:74;;22548:93;22637:3;22548:93;:::i;:::-;22666:2;22661:3;22657:12;22650:19;;22309:366;;;:::o;22681:::-;22823:3;22844:67;22908:2;22903:3;22844:67;:::i;:::-;22837:74;;22920:93;23009:3;22920:93;:::i;:::-;23038:2;23033:3;23029:12;23022:19;;22681:366;;;:::o;23053:::-;23195:3;23216:67;23280:2;23275:3;23216:67;:::i;:::-;23209:74;;23292:93;23381:3;23292:93;:::i;:::-;23410:2;23405:3;23401:12;23394:19;;23053:366;;;:::o;23425:::-;23567:3;23588:67;23652:2;23647:3;23588:67;:::i;:::-;23581:74;;23664:93;23753:3;23664:93;:::i;:::-;23782:2;23777:3;23773:12;23766:19;;23425:366;;;:::o;23797:::-;23939:3;23960:67;24024:2;24019:3;23960:67;:::i;:::-;23953:74;;24036:93;24125:3;24036:93;:::i;:::-;24154:2;24149:3;24145:12;24138:19;;23797:366;;;:::o;24169:::-;24311:3;24332:67;24396:2;24391:3;24332:67;:::i;:::-;24325:74;;24408:93;24497:3;24408:93;:::i;:::-;24526:2;24521:3;24517:12;24510:19;;24169:366;;;:::o;24541:::-;24683:3;24704:67;24768:2;24763:3;24704:67;:::i;:::-;24697:74;;24780:93;24869:3;24780:93;:::i;:::-;24898:2;24893:3;24889:12;24882:19;;24541:366;;;:::o;24913:::-;25055:3;25076:67;25140:2;25135:3;25076:67;:::i;:::-;25069:74;;25152:93;25241:3;25152:93;:::i;:::-;25270:2;25265:3;25261:12;25254:19;;24913:366;;;:::o;25285:118::-;25372:24;25390:5;25372:24;:::i;:::-;25367:3;25360:37;25285:118;;:::o;25409:112::-;25492:22;25508:5;25492:22;:::i;:::-;25487:3;25480:35;25409:112;;:::o;25527:397::-;25667:3;25682:75;25753:3;25744:6;25682:75;:::i;:::-;25782:2;25777:3;25773:12;25766:19;;25795:75;25866:3;25857:6;25795:75;:::i;:::-;25895:2;25890:3;25886:12;25879:19;;25915:3;25908:10;;25527:397;;;;;:::o;25930:701::-;26211:3;26233:95;26324:3;26315:6;26233:95;:::i;:::-;26226:102;;26345:95;26436:3;26427:6;26345:95;:::i;:::-;26338:102;;26457:148;26601:3;26457:148;:::i;:::-;26450:155;;26622:3;26615:10;;25930:701;;;;;:::o;26637:522::-;26850:3;26872:148;27016:3;26872:148;:::i;:::-;26865:155;;27030:75;27101:3;27092:6;27030:75;:::i;:::-;27130:2;27125:3;27121:12;27114:19;;27150:3;27143:10;;26637:522;;;;:::o;27165:379::-;27349:3;27371:147;27514:3;27371:147;:::i;:::-;27364:154;;27535:3;27528:10;;27165:379;;;:::o;27550:222::-;27643:4;27681:2;27670:9;27666:18;27658:26;;27694:71;27762:1;27751:9;27747:17;27738:6;27694:71;:::i;:::-;27550:222;;;;:::o;27778:640::-;27973:4;28011:3;28000:9;27996:19;27988:27;;28025:71;28093:1;28082:9;28078:17;28069:6;28025:71;:::i;:::-;28106:72;28174:2;28163:9;28159:18;28150:6;28106:72;:::i;:::-;28188;28256:2;28245:9;28241:18;28232:6;28188:72;:::i;:::-;28307:9;28301:4;28297:20;28292:2;28281:9;28277:18;28270:48;28335:76;28406:4;28397:6;28335:76;:::i;:::-;28327:84;;27778:640;;;;;;;:::o;28424:210::-;28511:4;28549:2;28538:9;28534:18;28526:26;;28562:65;28624:1;28613:9;28609:17;28600:6;28562:65;:::i;:::-;28424:210;;;;:::o;28640:545::-;28813:4;28851:3;28840:9;28836:19;28828:27;;28865:71;28933:1;28922:9;28918:17;28909:6;28865:71;:::i;:::-;28946:68;29010:2;28999:9;28995:18;28986:6;28946:68;:::i;:::-;29024:72;29092:2;29081:9;29077:18;29068:6;29024:72;:::i;:::-;29106;29174:2;29163:9;29159:18;29150:6;29106:72;:::i;:::-;28640:545;;;;;;;:::o;29191:238::-;29292:4;29330:2;29319:9;29315:18;29307:26;;29343:79;29419:1;29408:9;29404:17;29395:6;29343:79;:::i;:::-;29191:238;;;;:::o;29435:313::-;29548:4;29586:2;29575:9;29571:18;29563:26;;29635:9;29629:4;29625:20;29621:1;29610:9;29606:17;29599:47;29663:78;29736:4;29727:6;29663:78;:::i;:::-;29655:86;;29435:313;;;;:::o;29754:419::-;29920:4;29958:2;29947:9;29943:18;29935:26;;30007:9;30001:4;29997:20;29993:1;29982:9;29978:17;29971:47;30035:131;30161:4;30035:131;:::i;:::-;30027:139;;29754:419;;;:::o;30179:::-;30345:4;30383:2;30372:9;30368:18;30360:26;;30432:9;30426:4;30422:20;30418:1;30407:9;30403:17;30396:47;30460:131;30586:4;30460:131;:::i;:::-;30452:139;;30179:419;;;:::o;30604:::-;30770:4;30808:2;30797:9;30793:18;30785:26;;30857:9;30851:4;30847:20;30843:1;30832:9;30828:17;30821:47;30885:131;31011:4;30885:131;:::i;:::-;30877:139;;30604:419;;;:::o;31029:::-;31195:4;31233:2;31222:9;31218:18;31210:26;;31282:9;31276:4;31272:20;31268:1;31257:9;31253:17;31246:47;31310:131;31436:4;31310:131;:::i;:::-;31302:139;;31029:419;;;:::o;31454:::-;31620:4;31658:2;31647:9;31643:18;31635:26;;31707:9;31701:4;31697:20;31693:1;31682:9;31678:17;31671:47;31735:131;31861:4;31735:131;:::i;:::-;31727:139;;31454:419;;;:::o;31879:::-;32045:4;32083:2;32072:9;32068:18;32060:26;;32132:9;32126:4;32122:20;32118:1;32107:9;32103:17;32096:47;32160:131;32286:4;32160:131;:::i;:::-;32152:139;;31879:419;;;:::o;32304:::-;32470:4;32508:2;32497:9;32493:18;32485:26;;32557:9;32551:4;32547:20;32543:1;32532:9;32528:17;32521:47;32585:131;32711:4;32585:131;:::i;:::-;32577:139;;32304:419;;;:::o;32729:::-;32895:4;32933:2;32922:9;32918:18;32910:26;;32982:9;32976:4;32972:20;32968:1;32957:9;32953:17;32946:47;33010:131;33136:4;33010:131;:::i;:::-;33002:139;;32729:419;;;:::o;33154:::-;33320:4;33358:2;33347:9;33343:18;33335:26;;33407:9;33401:4;33397:20;33393:1;33382:9;33378:17;33371:47;33435:131;33561:4;33435:131;:::i;:::-;33427:139;;33154:419;;;:::o;33579:::-;33745:4;33783:2;33772:9;33768:18;33760:26;;33832:9;33826:4;33822:20;33818:1;33807:9;33803:17;33796:47;33860:131;33986:4;33860:131;:::i;:::-;33852:139;;33579:419;;;:::o;34004:::-;34170:4;34208:2;34197:9;34193:18;34185:26;;34257:9;34251:4;34247:20;34243:1;34232:9;34228:17;34221:47;34285:131;34411:4;34285:131;:::i;:::-;34277:139;;34004:419;;;:::o;34429:::-;34595:4;34633:2;34622:9;34618:18;34610:26;;34682:9;34676:4;34672:20;34668:1;34657:9;34653:17;34646:47;34710:131;34836:4;34710:131;:::i;:::-;34702:139;;34429:419;;;:::o;34854:::-;35020:4;35058:2;35047:9;35043:18;35035:26;;35107:9;35101:4;35097:20;35093:1;35082:9;35078:17;35071:47;35135:131;35261:4;35135:131;:::i;:::-;35127:139;;34854:419;;;:::o;35279:::-;35445:4;35483:2;35472:9;35468:18;35460:26;;35532:9;35526:4;35522:20;35518:1;35507:9;35503:17;35496:47;35560:131;35686:4;35560:131;:::i;:::-;35552:139;;35279:419;;;:::o;35704:::-;35870:4;35908:2;35897:9;35893:18;35885:26;;35957:9;35951:4;35947:20;35943:1;35932:9;35928:17;35921:47;35985:131;36111:4;35985:131;:::i;:::-;35977:139;;35704:419;;;:::o;36129:::-;36295:4;36333:2;36322:9;36318:18;36310:26;;36382:9;36376:4;36372:20;36368:1;36357:9;36353:17;36346:47;36410:131;36536:4;36410:131;:::i;:::-;36402:139;;36129:419;;;:::o;36554:::-;36720:4;36758:2;36747:9;36743:18;36735:26;;36807:9;36801:4;36797:20;36793:1;36782:9;36778:17;36771:47;36835:131;36961:4;36835:131;:::i;:::-;36827:139;;36554:419;;;:::o;36979:::-;37145:4;37183:2;37172:9;37168:18;37160:26;;37232:9;37226:4;37222:20;37218:1;37207:9;37203:17;37196:47;37260:131;37386:4;37260:131;:::i;:::-;37252:139;;36979:419;;;:::o;37404:::-;37570:4;37608:2;37597:9;37593:18;37585:26;;37657:9;37651:4;37647:20;37643:1;37632:9;37628:17;37621:47;37685:131;37811:4;37685:131;:::i;:::-;37677:139;;37404:419;;;:::o;37829:::-;37995:4;38033:2;38022:9;38018:18;38010:26;;38082:9;38076:4;38072:20;38068:1;38057:9;38053:17;38046:47;38110:131;38236:4;38110:131;:::i;:::-;38102:139;;37829:419;;;:::o;38254:::-;38420:4;38458:2;38447:9;38443:18;38435:26;;38507:9;38501:4;38497:20;38493:1;38482:9;38478:17;38471:47;38535:131;38661:4;38535:131;:::i;:::-;38527:139;;38254:419;;;:::o;38679:::-;38845:4;38883:2;38872:9;38868:18;38860:26;;38932:9;38926:4;38922:20;38918:1;38907:9;38903:17;38896:47;38960:131;39086:4;38960:131;:::i;:::-;38952:139;;38679:419;;;:::o;39104:::-;39270:4;39308:2;39297:9;39293:18;39285:26;;39357:9;39351:4;39347:20;39343:1;39332:9;39328:17;39321:47;39385:131;39511:4;39385:131;:::i;:::-;39377:139;;39104:419;;;:::o;39529:::-;39695:4;39733:2;39722:9;39718:18;39710:26;;39782:9;39776:4;39772:20;39768:1;39757:9;39753:17;39746:47;39810:131;39936:4;39810:131;:::i;:::-;39802:139;;39529:419;;;:::o;39954:::-;40120:4;40158:2;40147:9;40143:18;40135:26;;40207:9;40201:4;40197:20;40193:1;40182:9;40178:17;40171:47;40235:131;40361:4;40235:131;:::i;:::-;40227:139;;39954:419;;;:::o;40379:::-;40545:4;40583:2;40572:9;40568:18;40560:26;;40632:9;40626:4;40622:20;40618:1;40607:9;40603:17;40596:47;40660:131;40786:4;40660:131;:::i;:::-;40652:139;;40379:419;;;:::o;40804:::-;40970:4;41008:2;40997:9;40993:18;40985:26;;41057:9;41051:4;41047:20;41043:1;41032:9;41028:17;41021:47;41085:131;41211:4;41085:131;:::i;:::-;41077:139;;40804:419;;;:::o;41229:::-;41395:4;41433:2;41422:9;41418:18;41410:26;;41482:9;41476:4;41472:20;41468:1;41457:9;41453:17;41446:47;41510:131;41636:4;41510:131;:::i;:::-;41502:139;;41229:419;;;:::o;41654:::-;41820:4;41858:2;41847:9;41843:18;41835:26;;41907:9;41901:4;41897:20;41893:1;41882:9;41878:17;41871:47;41935:131;42061:4;41935:131;:::i;:::-;41927:139;;41654:419;;;:::o;42079:::-;42245:4;42283:2;42272:9;42268:18;42260:26;;42332:9;42326:4;42322:20;42318:1;42307:9;42303:17;42296:47;42360:131;42486:4;42360:131;:::i;:::-;42352:139;;42079:419;;;:::o;42504:::-;42670:4;42708:2;42697:9;42693:18;42685:26;;42757:9;42751:4;42747:20;42743:1;42732:9;42728:17;42721:47;42785:131;42911:4;42785:131;:::i;:::-;42777:139;;42504:419;;;:::o;42929:::-;43095:4;43133:2;43122:9;43118:18;43110:26;;43182:9;43176:4;43172:20;43168:1;43157:9;43153:17;43146:47;43210:131;43336:4;43210:131;:::i;:::-;43202:139;;42929:419;;;:::o;43354:::-;43520:4;43558:2;43547:9;43543:18;43535:26;;43607:9;43601:4;43597:20;43593:1;43582:9;43578:17;43571:47;43635:131;43761:4;43635:131;:::i;:::-;43627:139;;43354:419;;;:::o;43779:::-;43945:4;43983:2;43972:9;43968:18;43960:26;;44032:9;44026:4;44022:20;44018:1;44007:9;44003:17;43996:47;44060:131;44186:4;44060:131;:::i;:::-;44052:139;;43779:419;;;:::o;44204:222::-;44297:4;44335:2;44324:9;44320:18;44312:26;;44348:71;44416:1;44405:9;44401:17;44392:6;44348:71;:::i;:::-;44204:222;;;;:::o;44432:129::-;44466:6;44493:20;;:::i;:::-;44483:30;;44522:33;44550:4;44542:6;44522:33;:::i;:::-;44432:129;;;:::o;44567:75::-;44600:6;44633:2;44627:9;44617:19;;44567:75;:::o;44648:307::-;44709:4;44799:18;44791:6;44788:30;44785:56;;;44821:18;;:::i;:::-;44785:56;44859:29;44881:6;44859:29;:::i;:::-;44851:37;;44943:4;44937;44933:15;44925:23;;44648:307;;;:::o;44961:308::-;45023:4;45113:18;45105:6;45102:30;45099:56;;;45135:18;;:::i;:::-;45099:56;45173:29;45195:6;45173:29;:::i;:::-;45165:37;;45257:4;45251;45247:15;45239:23;;44961:308;;;:::o;45275:98::-;45326:6;45360:5;45354:12;45344:22;;45275:98;;;:::o;45379:99::-;45431:6;45465:5;45459:12;45449:22;;45379:99;;;:::o;45484:168::-;45567:11;45601:6;45596:3;45589:19;45641:4;45636:3;45632:14;45617:29;;45484:168;;;;:::o;45658:147::-;45759:11;45796:3;45781:18;;45658:147;;;;:::o;45811:169::-;45895:11;45929:6;45924:3;45917:19;45969:4;45964:3;45960:14;45945:29;;45811:169;;;;:::o;45986:148::-;46088:11;46125:3;46110:18;;45986:148;;;;:::o;46140:273::-;46180:3;46199:20;46217:1;46199:20;:::i;:::-;46194:25;;46233:20;46251:1;46233:20;:::i;:::-;46228:25;;46355:1;46319:34;46315:42;46312:1;46309:49;46306:75;;;46361:18;;:::i;:::-;46306:75;46405:1;46402;46398:9;46391:16;;46140:273;;;;:::o;46419:305::-;46459:3;46478:20;46496:1;46478:20;:::i;:::-;46473:25;;46512:20;46530:1;46512:20;:::i;:::-;46507:25;;46666:1;46598:66;46594:74;46591:1;46588:81;46585:107;;;46672:18;;:::i;:::-;46585:107;46716:1;46713;46709:9;46702:16;;46419:305;;;;:::o;46730:185::-;46770:1;46787:20;46805:1;46787:20;:::i;:::-;46782:25;;46821:20;46839:1;46821:20;:::i;:::-;46816:25;;46860:1;46850:35;;46865:18;;:::i;:::-;46850:35;46907:1;46904;46900:9;46895:14;;46730:185;;;;:::o;46921:348::-;46961:7;46984:20;47002:1;46984:20;:::i;:::-;46979:25;;47018:20;47036:1;47018:20;:::i;:::-;47013:25;;47206:1;47138:66;47134:74;47131:1;47128:81;47123:1;47116:9;47109:17;47105:105;47102:131;;;47213:18;;:::i;:::-;47102:131;47261:1;47258;47254:9;47243:20;;46921:348;;;;:::o;47275:191::-;47315:4;47335:20;47353:1;47335:20;:::i;:::-;47330:25;;47369:20;47387:1;47369:20;:::i;:::-;47364:25;;47408:1;47405;47402:8;47399:34;;;47413:18;;:::i;:::-;47399:34;47458:1;47455;47451:9;47443:17;;47275:191;;;;:::o;47472:::-;47512:4;47532:20;47550:1;47532:20;:::i;:::-;47527:25;;47566:20;47584:1;47566:20;:::i;:::-;47561:25;;47605:1;47602;47599:8;47596:34;;;47610:18;;:::i;:::-;47596:34;47655:1;47652;47648:9;47640:17;;47472:191;;;;:::o;47669:96::-;47706:7;47735:24;47753:5;47735:24;:::i;:::-;47724:35;;47669:96;;;:::o;47771:90::-;47805:7;47848:5;47841:13;47834:21;47823:32;;47771:90;;;:::o;47867:77::-;47904:7;47933:5;47922:16;;47867:77;;;:::o;47950:149::-;47986:7;48026:66;48019:5;48015:78;48004:89;;47950:149;;;:::o;48105:131::-;48152:7;48181:5;48170:16;;48187:43;48224:5;48187:43;:::i;:::-;48105:131;;;:::o;48242:118::-;48279:7;48319:34;48312:5;48308:46;48297:57;;48242:118;;;:::o;48366:126::-;48403:7;48443:42;48436:5;48432:54;48421:65;;48366:126;;;:::o;48498:77::-;48535:7;48564:5;48553:16;;48498:77;;;:::o;48581:86::-;48616:7;48656:4;48649:5;48645:16;48634:27;;48581:86;;;:::o;48673:131::-;48731:9;48764:34;48792:5;48764:34;:::i;:::-;48751:47;;48673:131;;;:::o;48810:154::-;48894:6;48889:3;48884;48871:30;48956:1;48947:6;48942:3;48938:16;48931:27;48810:154;;;:::o;48970:307::-;49038:1;49048:113;49062:6;49059:1;49056:13;49048:113;;;49147:1;49142:3;49138:11;49132:18;49128:1;49123:3;49119:11;49112:39;49084:2;49081:1;49077:10;49072:15;;49048:113;;;49179:6;49176:1;49173:13;49170:101;;;49259:1;49250:6;49245:3;49241:16;49234:27;49170:101;49019:258;48970:307;;;:::o;49283:171::-;49322:3;49345:24;49363:5;49345:24;:::i;:::-;49336:33;;49391:4;49384:5;49381:15;49378:41;;;49399:18;;:::i;:::-;49378:41;49446:1;49439:5;49435:13;49428:20;;49283:171;;;:::o;49460:320::-;49504:6;49541:1;49535:4;49531:12;49521:22;;49588:1;49582:4;49578:12;49609:18;49599:81;;49665:4;49657:6;49653:17;49643:27;;49599:81;49727:2;49719:6;49716:14;49696:18;49693:38;49690:84;;;49746:18;;:::i;:::-;49690:84;49511:269;49460:320;;;:::o;49786:281::-;49869:27;49891:4;49869:27;:::i;:::-;49861:6;49857:40;49999:6;49987:10;49984:22;49963:18;49951:10;49948:34;49945:62;49942:88;;;50010:18;;:::i;:::-;49942:88;50050:10;50046:2;50039:22;49829:238;49786:281;;:::o;50073:233::-;50112:3;50135:24;50153:5;50135:24;:::i;:::-;50126:33;;50181:66;50174:5;50171:77;50168:103;;;50251:18;;:::i;:::-;50168:103;50298:1;50291:5;50287:13;50280:20;;50073:233;;;:::o;50312:100::-;50351:7;50380:26;50400:5;50380:26;:::i;:::-;50369:37;;50312:100;;;:::o;50418:79::-;50457:7;50486:5;50475:16;;50418:79;;;:::o;50503:94::-;50542:7;50571:20;50585:5;50571:20;:::i;:::-;50560:31;;50503:94;;;:::o;50603:176::-;50635:1;50652:20;50670:1;50652:20;:::i;:::-;50647:25;;50686:20;50704:1;50686:20;:::i;:::-;50681:25;;50725:1;50715:35;;50730:18;;:::i;:::-;50715:35;50771:1;50768;50764:9;50759:14;;50603:176;;;;:::o;50785:180::-;50833:77;50830:1;50823:88;50930:4;50927:1;50920:15;50954:4;50951:1;50944:15;50971:180;51019:77;51016:1;51009:88;51116:4;51113:1;51106:15;51140:4;51137:1;51130:15;51157:180;51205:77;51202:1;51195:88;51302:4;51299:1;51292:15;51326:4;51323:1;51316:15;51343:180;51391:77;51388:1;51381:88;51488:4;51485:1;51478:15;51512:4;51509:1;51502:15;51529:180;51577:77;51574:1;51567:88;51674:4;51671:1;51664:15;51698:4;51695:1;51688:15;51715:180;51763:77;51760:1;51753:88;51860:4;51857:1;51850:15;51884:4;51881:1;51874:15;51901:117;52010:1;52007;52000:12;52024:117;52133:1;52130;52123:12;52147:117;52256:1;52253;52246:12;52270:117;52379:1;52376;52369:12;52393:102;52434:6;52485:2;52481:7;52476:2;52469:5;52465:14;52461:28;52451:38;;52393:102;;;:::o;52501:94::-;52534:8;52582:5;52578:2;52574:14;52553:35;;52501:94;;;:::o;52601:221::-;52741:34;52737:1;52729:6;52725:14;52718:58;52810:4;52805:2;52797:6;52793:15;52786:29;52601:221;:::o;52828:171::-;52968:23;52964:1;52956:6;52952:14;52945:47;52828:171;:::o;53005:214::-;53145:66;53141:1;53133:6;53129:14;53122:90;53005:214;:::o;53225:178::-;53365:30;53361:1;53353:6;53349:14;53342:54;53225:178;:::o;53409:225::-;53549:34;53545:1;53537:6;53533:14;53526:58;53618:8;53613:2;53605:6;53601:15;53594:33;53409:225;:::o;53640:229::-;53780:34;53776:1;53768:6;53764:14;53757:58;53849:12;53844:2;53836:6;53832:15;53825:37;53640:229;:::o;53875:305::-;54015:34;54011:1;54003:6;53999:14;53992:58;54084:34;54079:2;54071:6;54067:15;54060:59;54153:19;54148:2;54140:6;54136:15;54129:44;53875:305;:::o;54186:238::-;54326:34;54322:1;54314:6;54310:14;54303:58;54395:21;54390:2;54382:6;54378:15;54371:46;54186:238;:::o;54430:222::-;54570:34;54566:1;54558:6;54554:14;54547:58;54639:5;54634:2;54626:6;54622:15;54615:30;54430:222;:::o;54658:170::-;54798:22;54794:1;54786:6;54782:14;54775:46;54658:170;:::o;54834:224::-;54974:34;54970:1;54962:6;54958:14;54951:58;55043:7;55038:2;55030:6;55026:15;55019:32;54834:224;:::o;55064:180::-;55204:32;55200:1;55192:6;55188:14;55181:56;55064:180;:::o;55250:229::-;55390:34;55386:1;55378:6;55374:14;55367:58;55459:12;55454:2;55446:6;55442:15;55435:37;55250:229;:::o;55485:244::-;55625:34;55621:1;55613:6;55609:14;55602:58;55694:27;55689:2;55681:6;55677:15;55670:52;55485:244;:::o;55735:178::-;55875:30;55871:1;55863:6;55859:14;55852:54;55735:178;:::o;55919:230::-;56059:34;56055:1;56047:6;56043:14;56036:58;56128:13;56123:2;56115:6;56111:15;56104:38;55919:230;:::o;56155:225::-;56295:34;56291:1;56283:6;56279:14;56272:58;56364:8;56359:2;56351:6;56347:15;56340:33;56155:225;:::o;56386:155::-;56526:7;56522:1;56514:6;56510:14;56503:31;56386:155;:::o;56547:167::-;56687:19;56683:1;56675:6;56671:14;56664:43;56547:167;:::o;56720:182::-;56860:34;56856:1;56848:6;56844:14;56837:58;56720:182;:::o;56908:223::-;57048:34;57044:1;57036:6;57032:14;57025:58;57117:6;57112:2;57104:6;57100:15;57093:31;56908:223;:::o;57137:234::-;57277:34;57273:1;57265:6;57261:14;57254:58;57346:17;57341:2;57333:6;57329:15;57322:42;57137:234;:::o;57377:176::-;57517:28;57513:1;57505:6;57501:14;57494:52;57377:176;:::o;57559:237::-;57699:34;57695:1;57687:6;57683:14;57676:58;57768:20;57763:2;57755:6;57751:15;57744:45;57559:237;:::o;57802:248::-;57942:34;57938:1;57930:6;57926:14;57919:58;58011:31;58006:2;57998:6;57994:15;57987:56;57802:248;:::o;58056:221::-;58196:34;58192:1;58184:6;58180:14;58173:58;58265:4;58260:2;58252:6;58248:15;58241:29;58056:221;:::o;58283:177::-;58423:29;58419:1;58411:6;58407:14;58400:53;58283:177;:::o;58466:114::-;;:::o;58586:238::-;58726:34;58722:1;58714:6;58710:14;58703:58;58795:21;58790:2;58782:6;58778:15;58771:46;58586:238;:::o;58830:179::-;58970:31;58966:1;58958:6;58954:14;58947:55;58830:179;:::o;59015:220::-;59155:34;59151:1;59143:6;59139:14;59132:58;59224:3;59219:2;59211:6;59207:15;59200:28;59015:220;:::o;59241:171::-;59381:23;59377:1;59369:6;59365:14;59358:47;59241:171;:::o;59418:233::-;59558:34;59554:1;59546:6;59542:14;59535:58;59627:16;59622:2;59614:6;59610:15;59603:41;59418:233;:::o;59657:234::-;59797:34;59793:1;59785:6;59781:14;59774:58;59866:17;59861:2;59853:6;59849:15;59842:42;59657:234;:::o;59897:301::-;60037:34;60033:1;60025:6;60021:14;60014:58;60106:34;60101:2;60093:6;60089:15;60082:59;60175:15;60170:2;60162:6;60158:15;60151:40;59897:301;:::o;60204:232::-;60344:34;60340:1;60332:6;60328:14;60321:58;60413:15;60408:2;60400:6;60396:15;60389:40;60204:232;:::o;60442:221::-;60582:34;60578:1;60570:6;60566:14;60559:58;60651:4;60646:2;60638:6;60634:15;60627:29;60442:221;:::o;60669:115::-;60752:1;60745:5;60742:12;60732:46;;60758:18;;:::i;:::-;60732:46;60669:115;:::o;60790:122::-;60863:24;60881:5;60863:24;:::i;:::-;60856:5;60853:35;60843:63;;60902:1;60899;60892:12;60843:63;60790:122;:::o;60918:116::-;60988:21;61003:5;60988:21;:::i;:::-;60981:5;60978:32;60968:60;;61024:1;61021;61014:12;60968:60;60918:116;:::o;61040:122::-;61113:24;61131:5;61113:24;:::i;:::-;61106:5;61103:35;61093:63;;61152:1;61149;61142:12;61093:63;61040:122;:::o;61168:120::-;61240:23;61257:5;61240:23;:::i;:::-;61233:5;61230:34;61220:62;;61278:1;61275;61268:12;61220:62;61168:120;:::o;61294:122::-;61367:24;61385:5;61367:24;:::i;:::-;61360:5;61357:35;61347:63;;61406:1;61403;61396:12;61347:63;61294:122;:::o;61422:118::-;61493:22;61509:5;61493:22;:::i;:::-;61486:5;61483:33;61473:61;;61530:1;61527;61520:12;61473:61;61422:118;:::o
Swarm Source
ipfs://45276bc95527a5332b0f3f4bfd273f5961a189764cefd1fb418b353b6f044b4e
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.