Token Trappass
Overview CRC721
Total Supply:
111 TPASS
Holders:
19 addresses
Contract:
Balance
3 TPASS
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Trappass
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-12-18 */ /** *Submitted for verification at cronoscan.com on 2022-09-09 */ /** *Submitted for verification at cronoscan.com on 2022-08-30 */ /** *Submitted for verification at cronoscan.com on 2022-06-17 */ /** *Submitted for verification at Etherscan.io on 2021-12-08 */ /** *Submitted for verification at Etherscan.io on 2021-11-01 */ // SPDX-License-Identifier: GPL-3.0 // 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/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/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/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits ] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[ 0 ] = "0"; buffer[ 1 ] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i ] = _HEX_SYMBOLS[value & 0xf ]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/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/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner ]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId ]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId ]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender() ][operator ] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner ][operator ]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId ] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to ] += 1; _owners[tokenId ] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner ] -= 1; delete _owners[tokenId ]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from ] -= 1; _balances[to ] += 1; _owners[tokenId ] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId ] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner ][index ]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index ]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to ][length ] = tokenId; _ownedTokensIndex[tokenId ] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId ] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId ]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from ][lastTokenIndex ]; _ownedTokens[from ][tokenIndex ] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId ] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId ]; delete _ownedTokens[from ][lastTokenIndex ]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId ]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex ]; _allTokens[tokenIndex ] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId ] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId ]; _allTokens.pop(); } } // 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); } } pragma solidity ^0.8.0; contract Trappass is ERC721Enumerable, Ownable { using Strings for uint256; string public baseURI; string public baseExtension = ".json"; uint256 public cost = 1000 ether; uint256 public white_cost = 1000 ether; uint256 public maxSupply = 111; uint256 public maxMintAmount = 10; bool public paused = false; address[] whitelist; constructor() ERC721("Trappass", "TPASS") {} // internal function _baseURI() internal view virtual override returns (string memory) { return "ipfs://QmNY7cg7JWZGMhEVW675RgTR5ftmUzta1Fs711sEXM7ar7/"; } // public function mint(address _to, uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(!paused); require(_mintAmount > 0); require(_mintAmount <= maxMintAmount); require(supply + _mintAmount <= maxSupply); for (uint256 i = 1; i <= _mintAmount; i++) { _safeMint(_to, supply + i); } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i ] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } // only owner function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner() { maxMintAmount = _newmaxMintAmount; } function setBaseURI(string memory _newBaseURI) public onlyOwner() { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner() { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner() { paused = _state; } function withdraw() public payable onlyOwner() { require(payable(msg.sender).send(address(this).balance)); } // Adds an array/list of addresses to the WL function addWhiteList(address[] memory _addresses) public onlyOwner { uint len = _addresses.length; for(uint i = 0; i < len; i ++) { whitelist.push(_addresses[i ]); } } function changeCost(uint256 newCost) public onlyOwner { cost = newCost; } function whiteListChangeCost(uint256 newCost) public onlyOwner { white_cost = newCost; } function changeMaxMintAmount(uint256 amount) public onlyOwner { maxMintAmount = amount; } // Removes a specific address from the WL function removeWhiteList(address _address) public onlyOwner { uint len = whitelist.length; for(uint i = 0; i < len; i ++) { if (whitelist[i ] == _address) { delete whitelist[i ]; return; } } } function isWhiteList(address _address) public view returns (bool) { uint len = whitelist.length; for(uint i = 0; i < len; i ++) { if (whitelist[i ] == _address) { return true; } } return false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"changeMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"_address","type":"address"}],"name":"isWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"whiteListChangeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"white_cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000233565b50683635c9adc5dea00000600d55683635c9adc5dea00000600e55606f600f55600a6010556000601160006101000a81548160ff0219169083151502179055503480156200009e57600080fd5b506040518060400160405280600881526020017f54726170706173730000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f545041535300000000000000000000000000000000000000000000000000000081525081600090805190602001906200012392919062000233565b5080600190805190602001906200013c92919062000233565b5050506200015f620001536200016560201b60201c565b6200016d60201b60201c565b62000348565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024190620002e3565b90600052602060002090601f016020900481019282620002655760008555620002b1565b82601f106200028057805160ff1916838001178555620002b1565b82800160010185558215620002b1579182015b82811115620002b057825182559160200191906001019062000293565b5b509050620002c09190620002c4565b5090565b5b80821115620002df576000816000905550600101620002c5565b5090565b60006002820490506001821680620002fc57607f821691505b6020821081141562000313576200031262000319565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6146ac80620003586000396000f3fe6080604052600436106102305760003560e01c80635c975abb1161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461081d578063da3ef23f14610848578063e985e9c514610871578063f2fde38b146108ae578063f99031a7146108d757610230565b8063a22cb46514610738578063a773eab514610761578063b88d4fde1461078c578063c6682862146107b5578063c87b56dd146107e057610230565b806370a08231116100f257806370a0823114610665578063715018a6146106a25780637f00c7a6146106b95780638da5cb5b146106e257806395d89b411461070d57610230565b80635c975abb146105805780635cb85cd2146105ab5780635e1045ec146105d45780636352211e146105fd5780636c0360eb1461063a57610230565b8063239c70ae116101bc57806342842e0e1161018057806342842e0e1461048b578063438b6300146104b45780634f6ccce7146104f15780635356d4cd1461052e57806355f804b31461055757610230565b8063239c70ae146103d457806323b872dd146103ff5780632f745c59146104285780633ccfd60b1461046557806340c10f191461046f57610230565b8063095ea7b311610203578063095ea7b31461030357806313faede61461032c57806315363a641461035757806318160ddd146103805780632042e5c2146103ab57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613536565b610914565b6040516102699190613f14565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061350d565b61098e565b005b3480156102a757600080fd5b506102b0610a27565b6040516102bd9190613f2f565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906135c9565b610ab9565b6040516102fa9190613e8b565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613490565b610b3e565b005b34801561033857600080fd5b50610341610c56565b60405161034e9190614191565b60405180910390f35b34801561036357600080fd5b5061037e600480360381019061037991906135c9565b610c5c565b005b34801561038c57600080fd5b50610395610ce2565b6040516103a29190614191565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613325565b610cef565b005b3480156103e057600080fd5b506103e9610e9f565b6040516103f69190614191565b60405180910390f35b34801561040b57600080fd5b506104266004803603810190610421919061338a565b610ea5565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613490565b610f05565b60405161045c9190614191565b60405180910390f35b61046d610faa565b005b61048960048036038101906104849190613490565b611066565b005b34801561049757600080fd5b506104b260048036038101906104ad919061338a565b6110fe565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613325565b61111e565b6040516104e89190613ef2565b60405180910390f35b3480156104fd57600080fd5b50610518600480360381019061051391906135c9565b611218565b6040516105259190614191565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906135c9565b6112af565b005b34801561056357600080fd5b5061057e60048036038101906105799190613588565b611335565b005b34801561058c57600080fd5b506105956113cb565b6040516105a29190613f14565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906135c9565b6113de565b005b3480156105e057600080fd5b506105fb60048036038101906105f691906134cc565b611464565b005b34801561060957600080fd5b50610624600480360381019061061f91906135c9565b6115ac565b6040516106319190613e8b565b60405180910390f35b34801561064657600080fd5b5061064f61165e565b60405161065c9190613f2f565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613325565b6116ec565b6040516106999190614191565b60405180910390f35b3480156106ae57600080fd5b506106b76117a4565b005b3480156106c557600080fd5b506106e060048036038101906106db91906135c9565b61182c565b005b3480156106ee57600080fd5b506106f76118b2565b6040516107049190613e8b565b60405180910390f35b34801561071957600080fd5b506107226118dc565b60405161072f9190613f2f565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a9190613454565b61196e565b005b34801561076d57600080fd5b50610776611aef565b6040516107839190614191565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae91906133d9565b611af5565b005b3480156107c157600080fd5b506107ca611b57565b6040516107d79190613f2f565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906135c9565b611be5565b6040516108149190613f2f565b60405180910390f35b34801561082957600080fd5b50610832611c8f565b60405161083f9190614191565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613588565b611c95565b005b34801561087d57600080fd5b506108986004803603810190610893919061334e565b611d2b565b6040516108a59190613f14565b60405180910390f35b3480156108ba57600080fd5b506108d560048036038101906108d09190613325565b611dbf565b005b3480156108e357600080fd5b506108fe60048036038101906108f99190613325565b611eb7565b60405161090b9190613f14565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610987575061098682611f8f565b5b9050919050565b610996612071565b73ffffffffffffffffffffffffffffffffffffffff166109b46118b2565b73ffffffffffffffffffffffffffffffffffffffff1614610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a01906140d1565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b606060008054610a369061446b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a629061446b565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b5050505050905090565b6000610ac482612079565b610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa906140b1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b49826115ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190614131565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd9612071565b73ffffffffffffffffffffffffffffffffffffffff161480610c085750610c0781610c02612071565b611d2b565b5b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614031565b60405180910390fd5b610c5183836120e5565b505050565b600d5481565b610c64612071565b73ffffffffffffffffffffffffffffffffffffffff16610c826118b2565b73ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf906140d1565b60405180910390fd5b80600e8190555050565b6000600880549050905090565b610cf7612071565b73ffffffffffffffffffffffffffffffffffffffff16610d156118b2565b73ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906140d1565b60405180910390fd5b6000601280549050905060005b81811015610e99578273ffffffffffffffffffffffffffffffffffffffff1660128281548110610dd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e865760128181548110610e52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050610e9c565b8080610e919061449d565b915050610d78565b50505b50565b60105481565b610eb6610eb0612071565b8261219e565b610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90614151565b60405180910390fd5b610f0083838361227c565b505050565b6000610f10836116ec565b8210610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890613f51565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fb2612071565b73ffffffffffffffffffffffffffffffffffffffff16610fd06118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d906140d1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061106457600080fd5b565b6000611070610ce2565b9050601160009054906101000a900460ff161561108c57600080fd5b6000821161109957600080fd5b6010548211156110a857600080fd5b600f5482826110b791906142fa565b11156110c257600080fd5b6000600190505b8281116110f8576110e58482846110e091906142fa565b6124d8565b80806110f09061449d565b9150506110c9565b50505050565b61111983838360405180602001604052806000815250611af5565b505050565b6060600061112b836116ec565b905060008167ffffffffffffffff81111561116f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561119d5781602001602082028036833780820191505090505b50905060005b8281101561120d576111b58582610f05565b8282815181106111ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806112059061449d565b9150506111a3565b508092505050919050565b6000611222610ce2565b8210611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90614171565b60405180910390fd5b6008828154811061129d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112b7612071565b73ffffffffffffffffffffffffffffffffffffffff166112d56118b2565b73ffffffffffffffffffffffffffffffffffffffff161461132b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611322906140d1565b60405180910390fd5b8060108190555050565b61133d612071565b73ffffffffffffffffffffffffffffffffffffffff1661135b6118b2565b73ffffffffffffffffffffffffffffffffffffffff16146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906140d1565b60405180910390fd5b80600b90805190602001906113c79291906130b3565b5050565b601160009054906101000a900460ff1681565b6113e6612071565b73ffffffffffffffffffffffffffffffffffffffff166114046118b2565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906140d1565b60405180910390fd5b80600d8190555050565b61146c612071565b73ffffffffffffffffffffffffffffffffffffffff1661148a6118b2565b73ffffffffffffffffffffffffffffffffffffffff16146114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d7906140d1565b60405180910390fd5b60008151905060005b818110156115a757601283828151811061152c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061159f9061449d565b9150506114e9565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90614071565b60405180910390fd5b80915050919050565b600b805461166b9061446b565b80601f01602080910402602001604051908101604052809291908181526020018280546116979061446b565b80156116e45780601f106116b9576101008083540402835291602001916116e4565b820191906000526020600020905b8154815290600101906020018083116116c757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490614051565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ac612071565b73ffffffffffffffffffffffffffffffffffffffff166117ca6118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611817906140d1565b60405180910390fd5b61182a60006124f6565b565b611834612071565b73ffffffffffffffffffffffffffffffffffffffff166118526118b2565b73ffffffffffffffffffffffffffffffffffffffff16146118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f906140d1565b60405180910390fd5b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118eb9061446b565b80601f01602080910402602001604051908101604052809291908181526020018280546119179061446b565b80156119645780601f1061193957610100808354040283529160200191611964565b820191906000526020600020905b81548152906001019060200180831161194757829003601f168201915b5050505050905090565b611976612071565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90613ff1565b60405180910390fd5b80600560006119f1612071565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a9e612071565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ae39190613f14565b60405180910390a35050565b600e5481565b611b06611b00612071565b8361219e565b611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614151565b60405180910390fd5b611b51848484846125bc565b50505050565b600c8054611b649061446b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b909061446b565b8015611bdd5780601f10611bb257610100808354040283529160200191611bdd565b820191906000526020600020905b815481529060010190602001808311611bc057829003601f168201915b505050505081565b6060611bf082612079565b611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690614111565b60405180910390fd5b6000611c39612618565b90506000815111611c595760405180602001604052806000815250611c87565b80611c6384612638565b600c604051602001611c7793929190613e5a565b6040516020818303038152906040525b915050919050565b600f5481565b611c9d612071565b73ffffffffffffffffffffffffffffffffffffffff16611cbb6118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d08906140d1565b60405180910390fd5b80600c9080519060200190611d279291906130b3565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dc7612071565b73ffffffffffffffffffffffffffffffffffffffff16611de56118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e32906140d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290613f91565b60405180910390fd5b611eb4816124f6565b50565b600080601280549050905060005b81811015611f83578373ffffffffffffffffffffffffffffffffffffffff1660128281548110611f1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7057600192505050611f8a565b8080611f7b9061449d565b915050611ec5565b5060009150505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061205a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061206a5750612069826127e5565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612158836115ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121a982612079565b6121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614011565b60405180910390fd5b60006121f3836115ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061226257508373ffffffffffffffffffffffffffffffffffffffff1661224a84610ab9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061227357506122728185611d2b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661229c826115ac565b73ffffffffffffffffffffffffffffffffffffffff16146122f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e9906140f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235990613fd1565b60405180910390fd5b61236d83838361284f565b6123786000826120e5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123c89190614381565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461241f91906142fa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6124f2828260405180602001604052806000815250612963565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125c784848461227c565b6125d3848484846129be565b612612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260990613f71565b60405180910390fd5b50505050565b606060405180606001604052806036815260200161464160369139905090565b60606000821415612680576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e0565b600082905060005b600082146126b257808061269b9061449d565b915050600a826126ab9190614350565b9150612688565b60008167ffffffffffffffff8111156126f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127265781602001600182028036833780820191505090505b5090505b600085146127d95760018261273f9190614381565b9150600a8561274e91906144e6565b603061275a91906142fa565b60f81b818381518110612796577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d29190614350565b945061272a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61285a838383612b55565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561289d5761289881612b5a565b6128dc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128db576128da8382612ba3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561291f5761291a81612d10565b61295e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461295d5761295c8282612e53565b5b5b505050565b61296d8383612ed2565b61297a60008484846129be565b6129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b090613f71565b60405180910390fd5b505050565b60006129df8473ffffffffffffffffffffffffffffffffffffffff166130a0565b15612b48578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a08612071565b8786866040518563ffffffff1660e01b8152600401612a2a9493929190613ea6565b602060405180830381600087803b158015612a4457600080fd5b505af1925050508015612a7557506040513d601f19601f82011682018060405250810190612a72919061355f565b60015b612af8573d8060008114612aa5576040519150601f19603f3d011682016040523d82523d6000602084013e612aaa565b606091505b50600081511415612af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae790613f71565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b4d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612bb0846116ec565b612bba9190614381565b9050600060076000848152602001908152602001600020549050818114612c9f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d249190614381565b9050600060096000848152602001908152602001600020549050600060088381548110612d7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612dc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e5e836116ec565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3990614091565b60405180910390fd5b612f4b81612079565b15612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8290613fb1565b60405180910390fd5b612f976000838361284f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fe791906142fa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546130bf9061446b565b90600052602060002090601f0160209004810192826130e15760008555613128565b82601f106130fa57805160ff1916838001178555613128565b82800160010185558215613128579182015b8281111561312757825182559160200191906001019061310c565b5b5090506131359190613139565b5090565b5b8082111561315257600081600090555060010161313a565b5090565b6000613169613164846141dd565b6141ac565b9050808382526020820190508285602086028201111561318857600080fd5b60005b858110156131b8578161319e888261323e565b84526020840193506020830192505060018101905061318b565b5050509392505050565b60006131d56131d084614209565b6141ac565b9050828152602081018484840111156131ed57600080fd5b6131f8848285614429565b509392505050565b600061321361320e84614239565b6141ac565b90508281526020810184848401111561322b57600080fd5b613236848285614429565b509392505050565b60008135905061324d816145e4565b92915050565b600082601f83011261326457600080fd5b8135613274848260208601613156565b91505092915050565b60008135905061328c816145fb565b92915050565b6000813590506132a181614612565b92915050565b6000815190506132b681614612565b92915050565b600082601f8301126132cd57600080fd5b81356132dd8482602086016131c2565b91505092915050565b600082601f8301126132f757600080fd5b8135613307848260208601613200565b91505092915050565b60008135905061331f81614629565b92915050565b60006020828403121561333757600080fd5b60006133458482850161323e565b91505092915050565b6000806040838503121561336157600080fd5b600061336f8582860161323e565b92505060206133808582860161323e565b9150509250929050565b60008060006060848603121561339f57600080fd5b60006133ad8682870161323e565b93505060206133be8682870161323e565b92505060406133cf86828701613310565b9150509250925092565b600080600080608085870312156133ef57600080fd5b60006133fd8782880161323e565b945050602061340e8782880161323e565b935050604061341f87828801613310565b925050606085013567ffffffffffffffff81111561343c57600080fd5b613448878288016132bc565b91505092959194509250565b6000806040838503121561346757600080fd5b60006134758582860161323e565b92505060206134868582860161327d565b9150509250929050565b600080604083850312156134a357600080fd5b60006134b18582860161323e565b92505060206134c285828601613310565b9150509250929050565b6000602082840312156134de57600080fd5b600082013567ffffffffffffffff8111156134f857600080fd5b61350484828501613253565b91505092915050565b60006020828403121561351f57600080fd5b600061352d8482850161327d565b91505092915050565b60006020828403121561354857600080fd5b600061355684828501613292565b91505092915050565b60006020828403121561357157600080fd5b600061357f848285016132a7565b91505092915050565b60006020828403121561359a57600080fd5b600082013567ffffffffffffffff8111156135b457600080fd5b6135c0848285016132e6565b91505092915050565b6000602082840312156135db57600080fd5b60006135e984828501613310565b91505092915050565b60006135fe8383613e3c565b60208301905092915050565b613613816143b5565b82525050565b60006136248261428e565b61362e81856142bc565b935061363983614269565b8060005b8381101561366a57815161365188826135f2565b975061365c836142af565b92505060018101905061363d565b5085935050505092915050565b613680816143c7565b82525050565b600061369182614299565b61369b81856142cd565b93506136ab818560208601614438565b6136b4816145d3565b840191505092915050565b60006136ca826142a4565b6136d481856142de565b93506136e4818560208601614438565b6136ed816145d3565b840191505092915050565b6000613703826142a4565b61370d81856142ef565b935061371d818560208601614438565b80840191505092915050565b600081546137368161446b565b61374081866142ef565b9450600182166000811461375b576001811461376c5761379f565b60ff1983168652818601935061379f565b61377585614279565b60005b8381101561379757815481890152600182019150602081019050613778565b838801955050505b50505092915050565b60006137b5602b836142de565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061381b6032836142de565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006138816026836142de565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138e7601c836142de565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006139276024836142de565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061398d6019836142de565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139cd602c836142de565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a336038836142de565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613a99602a836142de565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613aff6029836142de565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b656020836142de565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613ba5602c836142de565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c0b6020836142de565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c4b6029836142de565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb1602f836142de565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d176021836142de565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d7d6031836142de565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613de3602c836142de565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613e458161441f565b82525050565b613e548161441f565b82525050565b6000613e6682866136f8565b9150613e7282856136f8565b9150613e7e8284613729565b9150819050949350505050565b6000602082019050613ea0600083018461360a565b92915050565b6000608082019050613ebb600083018761360a565b613ec8602083018661360a565b613ed56040830185613e4b565b8181036060830152613ee78184613686565b905095945050505050565b60006020820190508181036000830152613f0c8184613619565b905092915050565b6000602082019050613f296000830184613677565b92915050565b60006020820190508181036000830152613f4981846136bf565b905092915050565b60006020820190508181036000830152613f6a816137a8565b9050919050565b60006020820190508181036000830152613f8a8161380e565b9050919050565b60006020820190508181036000830152613faa81613874565b9050919050565b60006020820190508181036000830152613fca816138da565b9050919050565b60006020820190508181036000830152613fea8161391a565b9050919050565b6000602082019050818103600083015261400a81613980565b9050919050565b6000602082019050818103600083015261402a816139c0565b9050919050565b6000602082019050818103600083015261404a81613a26565b9050919050565b6000602082019050818103600083015261406a81613a8c565b9050919050565b6000602082019050818103600083015261408a81613af2565b9050919050565b600060208201905081810360008301526140aa81613b58565b9050919050565b600060208201905081810360008301526140ca81613b98565b9050919050565b600060208201905081810360008301526140ea81613bfe565b9050919050565b6000602082019050818103600083015261410a81613c3e565b9050919050565b6000602082019050818103600083015261412a81613ca4565b9050919050565b6000602082019050818103600083015261414a81613d0a565b9050919050565b6000602082019050818103600083015261416a81613d70565b9050919050565b6000602082019050818103600083015261418a81613dd6565b9050919050565b60006020820190506141a66000830184613e4b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156141d3576141d26145a4565b5b8060405250919050565b600067ffffffffffffffff8211156141f8576141f76145a4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614224576142236145a4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614254576142536145a4565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143058261441f565b91506143108361441f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561434557614344614517565b5b828201905092915050565b600061435b8261441f565b91506143668361441f565b92508261437657614375614546565b5b828204905092915050565b600061438c8261441f565b91506143978361441f565b9250828210156143aa576143a9614517565b5b828203905092915050565b60006143c0826143ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561445657808201518184015260208101905061443b565b83811115614465576000848401525b50505050565b6000600282049050600182168061448357607f821691505b6020821081141561449757614496614575565b5b50919050565b60006144a88261441f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144db576144da614517565b5b600182019050919050565b60006144f18261441f565b91506144fc8361441f565b92508261450c5761450b614546565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6145ed816143b5565b81146145f857600080fd5b50565b614604816143c7565b811461460f57600080fd5b50565b61461b816143d3565b811461462657600080fd5b50565b6146328161441f565b811461463d57600080fd5b5056fe697066733a2f2f516d4e59376367374a575a474d68455657363735526754523566746d557a74613146733731317345584d376172372fa26469706673582212202094b052638ac7ea3c04528dd078c1005f05e900b9b18b713fb53a31f1f43ba464736f6c63430008000033
Deployed Bytecode
0x6080604052600436106102305760003560e01c80635c975abb1161012e578063a22cb465116100ab578063d5abeb011161006f578063d5abeb011461081d578063da3ef23f14610848578063e985e9c514610871578063f2fde38b146108ae578063f99031a7146108d757610230565b8063a22cb46514610738578063a773eab514610761578063b88d4fde1461078c578063c6682862146107b5578063c87b56dd146107e057610230565b806370a08231116100f257806370a0823114610665578063715018a6146106a25780637f00c7a6146106b95780638da5cb5b146106e257806395d89b411461070d57610230565b80635c975abb146105805780635cb85cd2146105ab5780635e1045ec146105d45780636352211e146105fd5780636c0360eb1461063a57610230565b8063239c70ae116101bc57806342842e0e1161018057806342842e0e1461048b578063438b6300146104b45780634f6ccce7146104f15780635356d4cd1461052e57806355f804b31461055757610230565b8063239c70ae146103d457806323b872dd146103ff5780632f745c59146104285780633ccfd60b1461046557806340c10f191461046f57610230565b8063095ea7b311610203578063095ea7b31461030357806313faede61461032c57806315363a641461035757806318160ddd146103805780632042e5c2146103ab57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c60048036038101906102579190613536565b610914565b6040516102699190613f14565b60405180910390f35b34801561027e57600080fd5b506102996004803603810190610294919061350d565b61098e565b005b3480156102a757600080fd5b506102b0610a27565b6040516102bd9190613f2f565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906135c9565b610ab9565b6040516102fa9190613e8b565b60405180910390f35b34801561030f57600080fd5b5061032a60048036038101906103259190613490565b610b3e565b005b34801561033857600080fd5b50610341610c56565b60405161034e9190614191565b60405180910390f35b34801561036357600080fd5b5061037e600480360381019061037991906135c9565b610c5c565b005b34801561038c57600080fd5b50610395610ce2565b6040516103a29190614191565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613325565b610cef565b005b3480156103e057600080fd5b506103e9610e9f565b6040516103f69190614191565b60405180910390f35b34801561040b57600080fd5b506104266004803603810190610421919061338a565b610ea5565b005b34801561043457600080fd5b5061044f600480360381019061044a9190613490565b610f05565b60405161045c9190614191565b60405180910390f35b61046d610faa565b005b61048960048036038101906104849190613490565b611066565b005b34801561049757600080fd5b506104b260048036038101906104ad919061338a565b6110fe565b005b3480156104c057600080fd5b506104db60048036038101906104d69190613325565b61111e565b6040516104e89190613ef2565b60405180910390f35b3480156104fd57600080fd5b50610518600480360381019061051391906135c9565b611218565b6040516105259190614191565b60405180910390f35b34801561053a57600080fd5b50610555600480360381019061055091906135c9565b6112af565b005b34801561056357600080fd5b5061057e60048036038101906105799190613588565b611335565b005b34801561058c57600080fd5b506105956113cb565b6040516105a29190613f14565b60405180910390f35b3480156105b757600080fd5b506105d260048036038101906105cd91906135c9565b6113de565b005b3480156105e057600080fd5b506105fb60048036038101906105f691906134cc565b611464565b005b34801561060957600080fd5b50610624600480360381019061061f91906135c9565b6115ac565b6040516106319190613e8b565b60405180910390f35b34801561064657600080fd5b5061064f61165e565b60405161065c9190613f2f565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613325565b6116ec565b6040516106999190614191565b60405180910390f35b3480156106ae57600080fd5b506106b76117a4565b005b3480156106c557600080fd5b506106e060048036038101906106db91906135c9565b61182c565b005b3480156106ee57600080fd5b506106f76118b2565b6040516107049190613e8b565b60405180910390f35b34801561071957600080fd5b506107226118dc565b60405161072f9190613f2f565b60405180910390f35b34801561074457600080fd5b5061075f600480360381019061075a9190613454565b61196e565b005b34801561076d57600080fd5b50610776611aef565b6040516107839190614191565b60405180910390f35b34801561079857600080fd5b506107b360048036038101906107ae91906133d9565b611af5565b005b3480156107c157600080fd5b506107ca611b57565b6040516107d79190613f2f565b60405180910390f35b3480156107ec57600080fd5b50610807600480360381019061080291906135c9565b611be5565b6040516108149190613f2f565b60405180910390f35b34801561082957600080fd5b50610832611c8f565b60405161083f9190614191565b60405180910390f35b34801561085457600080fd5b5061086f600480360381019061086a9190613588565b611c95565b005b34801561087d57600080fd5b506108986004803603810190610893919061334e565b611d2b565b6040516108a59190613f14565b60405180910390f35b3480156108ba57600080fd5b506108d560048036038101906108d09190613325565b611dbf565b005b3480156108e357600080fd5b506108fe60048036038101906108f99190613325565b611eb7565b60405161090b9190613f14565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610987575061098682611f8f565b5b9050919050565b610996612071565b73ffffffffffffffffffffffffffffffffffffffff166109b46118b2565b73ffffffffffffffffffffffffffffffffffffffff1614610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a01906140d1565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b606060008054610a369061446b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a629061446b565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b5050505050905090565b6000610ac482612079565b610b03576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afa906140b1565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b49826115ac565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb190614131565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd9612071565b73ffffffffffffffffffffffffffffffffffffffff161480610c085750610c0781610c02612071565b611d2b565b5b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90614031565b60405180910390fd5b610c5183836120e5565b505050565b600d5481565b610c64612071565b73ffffffffffffffffffffffffffffffffffffffff16610c826118b2565b73ffffffffffffffffffffffffffffffffffffffff1614610cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccf906140d1565b60405180910390fd5b80600e8190555050565b6000600880549050905090565b610cf7612071565b73ffffffffffffffffffffffffffffffffffffffff16610d156118b2565b73ffffffffffffffffffffffffffffffffffffffff1614610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d62906140d1565b60405180910390fd5b6000601280549050905060005b81811015610e99578273ffffffffffffffffffffffffffffffffffffffff1660128281548110610dd1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e865760128181548110610e52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555050610e9c565b8080610e919061449d565b915050610d78565b50505b50565b60105481565b610eb6610eb0612071565b8261219e565b610ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eec90614151565b60405180910390fd5b610f0083838361227c565b505050565b6000610f10836116ec565b8210610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890613f51565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610fb2612071565b73ffffffffffffffffffffffffffffffffffffffff16610fd06118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d906140d1565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061106457600080fd5b565b6000611070610ce2565b9050601160009054906101000a900460ff161561108c57600080fd5b6000821161109957600080fd5b6010548211156110a857600080fd5b600f5482826110b791906142fa565b11156110c257600080fd5b6000600190505b8281116110f8576110e58482846110e091906142fa565b6124d8565b80806110f09061449d565b9150506110c9565b50505050565b61111983838360405180602001604052806000815250611af5565b505050565b6060600061112b836116ec565b905060008167ffffffffffffffff81111561116f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561119d5781602001602082028036833780820191505090505b50905060005b8281101561120d576111b58582610f05565b8282815181106111ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806112059061449d565b9150506111a3565b508092505050919050565b6000611222610ce2565b8210611263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125a90614171565b60405180910390fd5b6008828154811061129d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6112b7612071565b73ffffffffffffffffffffffffffffffffffffffff166112d56118b2565b73ffffffffffffffffffffffffffffffffffffffff161461132b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611322906140d1565b60405180910390fd5b8060108190555050565b61133d612071565b73ffffffffffffffffffffffffffffffffffffffff1661135b6118b2565b73ffffffffffffffffffffffffffffffffffffffff16146113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a8906140d1565b60405180910390fd5b80600b90805190602001906113c79291906130b3565b5050565b601160009054906101000a900460ff1681565b6113e6612071565b73ffffffffffffffffffffffffffffffffffffffff166114046118b2565b73ffffffffffffffffffffffffffffffffffffffff161461145a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611451906140d1565b60405180910390fd5b80600d8190555050565b61146c612071565b73ffffffffffffffffffffffffffffffffffffffff1661148a6118b2565b73ffffffffffffffffffffffffffffffffffffffff16146114e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114d7906140d1565b60405180910390fd5b60008151905060005b818110156115a757601283828151811061152c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061159f9061449d565b9150506114e9565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611655576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164c90614071565b60405180910390fd5b80915050919050565b600b805461166b9061446b565b80601f01602080910402602001604051908101604052809291908181526020018280546116979061446b565b80156116e45780601f106116b9576101008083540402835291602001916116e4565b820191906000526020600020905b8154815290600101906020018083116116c757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175490614051565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117ac612071565b73ffffffffffffffffffffffffffffffffffffffff166117ca6118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611820576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611817906140d1565b60405180910390fd5b61182a60006124f6565b565b611834612071565b73ffffffffffffffffffffffffffffffffffffffff166118526118b2565b73ffffffffffffffffffffffffffffffffffffffff16146118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f906140d1565b60405180910390fd5b8060108190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118eb9061446b565b80601f01602080910402602001604051908101604052809291908181526020018280546119179061446b565b80156119645780601f1061193957610100808354040283529160200191611964565b820191906000526020600020905b81548152906001019060200180831161194757829003601f168201915b5050505050905090565b611976612071565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90613ff1565b60405180910390fd5b80600560006119f1612071565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a9e612071565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ae39190613f14565b60405180910390a35050565b600e5481565b611b06611b00612071565b8361219e565b611b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3c90614151565b60405180910390fd5b611b51848484846125bc565b50505050565b600c8054611b649061446b565b80601f0160208091040260200160405190810160405280929190818152602001828054611b909061446b565b8015611bdd5780601f10611bb257610100808354040283529160200191611bdd565b820191906000526020600020905b815481529060010190602001808311611bc057829003601f168201915b505050505081565b6060611bf082612079565b611c2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2690614111565b60405180910390fd5b6000611c39612618565b90506000815111611c595760405180602001604052806000815250611c87565b80611c6384612638565b600c604051602001611c7793929190613e5a565b6040516020818303038152906040525b915050919050565b600f5481565b611c9d612071565b73ffffffffffffffffffffffffffffffffffffffff16611cbb6118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d08906140d1565b60405180910390fd5b80600c9080519060200190611d279291906130b3565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dc7612071565b73ffffffffffffffffffffffffffffffffffffffff16611de56118b2565b73ffffffffffffffffffffffffffffffffffffffff1614611e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e32906140d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290613f91565b60405180910390fd5b611eb4816124f6565b50565b600080601280549050905060005b81811015611f83578373ffffffffffffffffffffffffffffffffffffffff1660128281548110611f1e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f7057600192505050611f8a565b8080611f7b9061449d565b915050611ec5565b5060009150505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061205a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061206a5750612069826127e5565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612158836115ac565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006121a982612079565b6121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614011565b60405180910390fd5b60006121f3836115ac565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061226257508373ffffffffffffffffffffffffffffffffffffffff1661224a84610ab9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061227357506122728185611d2b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661229c826115ac565b73ffffffffffffffffffffffffffffffffffffffff16146122f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e9906140f1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235990613fd1565b60405180910390fd5b61236d83838361284f565b6123786000826120e5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123c89190614381565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461241f91906142fa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6124f2828260405180602001604052806000815250612963565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125c784848461227c565b6125d3848484846129be565b612612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260990613f71565b60405180910390fd5b50505050565b606060405180606001604052806036815260200161464160369139905090565b60606000821415612680576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e0565b600082905060005b600082146126b257808061269b9061449d565b915050600a826126ab9190614350565b9150612688565b60008167ffffffffffffffff8111156126f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127265781602001600182028036833780820191505090505b5090505b600085146127d95760018261273f9190614381565b9150600a8561274e91906144e6565b603061275a91906142fa565b60f81b818381518110612796577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d29190614350565b945061272a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61285a838383612b55565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561289d5761289881612b5a565b6128dc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128db576128da8382612ba3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561291f5761291a81612d10565b61295e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461295d5761295c8282612e53565b5b5b505050565b61296d8383612ed2565b61297a60008484846129be565b6129b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b090613f71565b60405180910390fd5b505050565b60006129df8473ffffffffffffffffffffffffffffffffffffffff166130a0565b15612b48578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a08612071565b8786866040518563ffffffff1660e01b8152600401612a2a9493929190613ea6565b602060405180830381600087803b158015612a4457600080fd5b505af1925050508015612a7557506040513d601f19601f82011682018060405250810190612a72919061355f565b60015b612af8573d8060008114612aa5576040519150601f19603f3d011682016040523d82523d6000602084013e612aaa565b606091505b50600081511415612af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae790613f71565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b4d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612bb0846116ec565b612bba9190614381565b9050600060076000848152602001908152602001600020549050818114612c9f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d249190614381565b9050600060096000848152602001908152602001600020549050600060088381548110612d7a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612dc2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e37577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612e5e836116ec565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3990614091565b60405180910390fd5b612f4b81612079565b15612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f8290613fb1565b60405180910390fd5b612f976000838361284f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fe791906142fa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546130bf9061446b565b90600052602060002090601f0160209004810192826130e15760008555613128565b82601f106130fa57805160ff1916838001178555613128565b82800160010185558215613128579182015b8281111561312757825182559160200191906001019061310c565b5b5090506131359190613139565b5090565b5b8082111561315257600081600090555060010161313a565b5090565b6000613169613164846141dd565b6141ac565b9050808382526020820190508285602086028201111561318857600080fd5b60005b858110156131b8578161319e888261323e565b84526020840193506020830192505060018101905061318b565b5050509392505050565b60006131d56131d084614209565b6141ac565b9050828152602081018484840111156131ed57600080fd5b6131f8848285614429565b509392505050565b600061321361320e84614239565b6141ac565b90508281526020810184848401111561322b57600080fd5b613236848285614429565b509392505050565b60008135905061324d816145e4565b92915050565b600082601f83011261326457600080fd5b8135613274848260208601613156565b91505092915050565b60008135905061328c816145fb565b92915050565b6000813590506132a181614612565b92915050565b6000815190506132b681614612565b92915050565b600082601f8301126132cd57600080fd5b81356132dd8482602086016131c2565b91505092915050565b600082601f8301126132f757600080fd5b8135613307848260208601613200565b91505092915050565b60008135905061331f81614629565b92915050565b60006020828403121561333757600080fd5b60006133458482850161323e565b91505092915050565b6000806040838503121561336157600080fd5b600061336f8582860161323e565b92505060206133808582860161323e565b9150509250929050565b60008060006060848603121561339f57600080fd5b60006133ad8682870161323e565b93505060206133be8682870161323e565b92505060406133cf86828701613310565b9150509250925092565b600080600080608085870312156133ef57600080fd5b60006133fd8782880161323e565b945050602061340e8782880161323e565b935050604061341f87828801613310565b925050606085013567ffffffffffffffff81111561343c57600080fd5b613448878288016132bc565b91505092959194509250565b6000806040838503121561346757600080fd5b60006134758582860161323e565b92505060206134868582860161327d565b9150509250929050565b600080604083850312156134a357600080fd5b60006134b18582860161323e565b92505060206134c285828601613310565b9150509250929050565b6000602082840312156134de57600080fd5b600082013567ffffffffffffffff8111156134f857600080fd5b61350484828501613253565b91505092915050565b60006020828403121561351f57600080fd5b600061352d8482850161327d565b91505092915050565b60006020828403121561354857600080fd5b600061355684828501613292565b91505092915050565b60006020828403121561357157600080fd5b600061357f848285016132a7565b91505092915050565b60006020828403121561359a57600080fd5b600082013567ffffffffffffffff8111156135b457600080fd5b6135c0848285016132e6565b91505092915050565b6000602082840312156135db57600080fd5b60006135e984828501613310565b91505092915050565b60006135fe8383613e3c565b60208301905092915050565b613613816143b5565b82525050565b60006136248261428e565b61362e81856142bc565b935061363983614269565b8060005b8381101561366a57815161365188826135f2565b975061365c836142af565b92505060018101905061363d565b5085935050505092915050565b613680816143c7565b82525050565b600061369182614299565b61369b81856142cd565b93506136ab818560208601614438565b6136b4816145d3565b840191505092915050565b60006136ca826142a4565b6136d481856142de565b93506136e4818560208601614438565b6136ed816145d3565b840191505092915050565b6000613703826142a4565b61370d81856142ef565b935061371d818560208601614438565b80840191505092915050565b600081546137368161446b565b61374081866142ef565b9450600182166000811461375b576001811461376c5761379f565b60ff1983168652818601935061379f565b61377585614279565b60005b8381101561379757815481890152600182019150602081019050613778565b838801955050505b50505092915050565b60006137b5602b836142de565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061381b6032836142de565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006138816026836142de565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006138e7601c836142de565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006139276024836142de565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061398d6019836142de565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006139cd602c836142de565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613a336038836142de565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613a99602a836142de565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000613aff6029836142de565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b656020836142de565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613ba5602c836142de565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000613c0b6020836142de565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613c4b6029836142de565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613cb1602f836142de565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000613d176021836142de565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613d7d6031836142de565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613de3602c836142de565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b613e458161441f565b82525050565b613e548161441f565b82525050565b6000613e6682866136f8565b9150613e7282856136f8565b9150613e7e8284613729565b9150819050949350505050565b6000602082019050613ea0600083018461360a565b92915050565b6000608082019050613ebb600083018761360a565b613ec8602083018661360a565b613ed56040830185613e4b565b8181036060830152613ee78184613686565b905095945050505050565b60006020820190508181036000830152613f0c8184613619565b905092915050565b6000602082019050613f296000830184613677565b92915050565b60006020820190508181036000830152613f4981846136bf565b905092915050565b60006020820190508181036000830152613f6a816137a8565b9050919050565b60006020820190508181036000830152613f8a8161380e565b9050919050565b60006020820190508181036000830152613faa81613874565b9050919050565b60006020820190508181036000830152613fca816138da565b9050919050565b60006020820190508181036000830152613fea8161391a565b9050919050565b6000602082019050818103600083015261400a81613980565b9050919050565b6000602082019050818103600083015261402a816139c0565b9050919050565b6000602082019050818103600083015261404a81613a26565b9050919050565b6000602082019050818103600083015261406a81613a8c565b9050919050565b6000602082019050818103600083015261408a81613af2565b9050919050565b600060208201905081810360008301526140aa81613b58565b9050919050565b600060208201905081810360008301526140ca81613b98565b9050919050565b600060208201905081810360008301526140ea81613bfe565b9050919050565b6000602082019050818103600083015261410a81613c3e565b9050919050565b6000602082019050818103600083015261412a81613ca4565b9050919050565b6000602082019050818103600083015261414a81613d0a565b9050919050565b6000602082019050818103600083015261416a81613d70565b9050919050565b6000602082019050818103600083015261418a81613dd6565b9050919050565b60006020820190506141a66000830184613e4b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156141d3576141d26145a4565b5b8060405250919050565b600067ffffffffffffffff8211156141f8576141f76145a4565b5b602082029050602081019050919050565b600067ffffffffffffffff821115614224576142236145a4565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115614254576142536145a4565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143058261441f565b91506143108361441f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561434557614344614517565b5b828201905092915050565b600061435b8261441f565b91506143668361441f565b92508261437657614375614546565b5b828204905092915050565b600061438c8261441f565b91506143978361441f565b9250828210156143aa576143a9614517565b5b828203905092915050565b60006143c0826143ff565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561445657808201518184015260208101905061443b565b83811115614465576000848401525b50505050565b6000600282049050600182168061448357607f821691505b6020821081141561449757614496614575565b5b50919050565b60006144a88261441f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144db576144da614517565b5b600182019050919050565b60006144f18261441f565b91506144fc8361441f565b92508261450c5761450b614546565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6145ed816143b5565b81146145f857600080fd5b50565b614604816143c7565b811461460f57600080fd5b50565b61461b816143d3565b811461462657600080fd5b50565b6146328161441f565b811461463d57600080fd5b5056fe697066733a2f2f516d4e59376367374a575a474d68455657363735526754523566746d557a74613146733731317345584d376172372fa26469706673582212202094b052638ac7ea3c04528dd078c1005f05e900b9b18b713fb53a31f1f43ba464736f6c63430008000033
Deployed ByteCode Sourcemap
43387:4002:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34908:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45892:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22842:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24373:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23905:406;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43545:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46502:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35553:111;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46772:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43666:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25285:338;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35210:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45995:124;;;:::i;:::-;;44016:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25690:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44445:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35737:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46612:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45612:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43706:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46411:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46177:226;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22531:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43473:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22256:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42736:92;;;;;;;;;;;;;:::i;:::-;;45466:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42092:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23005:102;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24671:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43584:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25945:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43501:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44887:542;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43629:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45740:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25048:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42979:195;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47092:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34908:222;35010:4;35049:35;35034:50;;;:11;:50;;;;:90;;;;35088:36;35112:11;35088:23;:36::i;:::-;35034:90;35027:97;;34908:222;;;:::o;45892:83::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45963:6:::1;45954;;:15;;;;;;;;;;;;;;;;;;45892:83:::0;:::o;22842:98::-;22896:13;22929:5;22922:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22842:98;:::o;24373:230::-;24449:7;24477:16;24485:7;24477;:16::i;:::-;24469:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;24567:15;:30;24583:7;24567:30;;;;;;;;;;;;;;;;;;;;;24560:37;;24373:230;;;:::o;23905:406::-;23986:13;24002:23;24017:7;24002:14;:23::i;:::-;23986:39;;24050:5;24044:11;;:2;:11;;;;24036:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24149:5;24133:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;24158:37;24175:5;24182:12;:10;:12::i;:::-;24158:16;:37::i;:::-;24133:62;24111:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;24284:21;24293:2;24297:7;24284:8;:21::i;:::-;23905:406;;;:::o;43545:32::-;;;;:::o;46502:102::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46589:7:::1;46576:10;:20;;;;46502:102:::0;:::o;35553:111::-;35614:7;35641:10;:17;;;;35634:24;;35553:111;:::o;46772:308::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46847:8:::1;46858:9;:16;;;;46847:27;;46893:6;46889:186;46909:3;46905:1;:7;46889:186;;;46967:8;46943:32;;:9;46953:1;46943:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;46939:129;;;47007:9;47017:1;47007:22;;;;;;;;;;;;;;;;;;;;;;;;47000:29;;;;;;;;;;;47052:7;;;;46939:129;46914:4;;;;;:::i;:::-;;;;46889:186;;;;42382:1;;46772:308:::0;:::o;43666:33::-;;;;:::o;25285:338::-;25476:41;25495:12;:10;:12::i;:::-;25509:7;25476:18;:41::i;:::-;25468:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;25589:28;25599:4;25605:2;25609:7;25589:9;:28::i;:::-;25285:338;;;:::o;35210:271::-;35307:7;35343:23;35360:5;35343:16;:23::i;:::-;35335:5;:31;35327:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;35437:12;:25;35450:5;35437:25;;;;;;;;;;;;;;;:38;35463:5;35437:38;;;;;;;;;;;;35430:45;;35210:271;;;;:::o;45995:124::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46073:10:::1;46065:24;;:47;46090:21;46065:47;;;;;;;;;;;;;;;;;;;;;;;46057:56;;;::::0;::::1;;45995:124::o:0;44016:417::-;44094:14;44111:13;:11;:13::i;:::-;44094:30;;44148:6;;;;;;;;;;;44147:7;44139:16;;;;;;44192:1;44178:11;:15;44170:24;;;;;;44232:13;;44217:11;:28;;44209:37;;;;;;44293:9;;44278:11;44269:6;:20;;;;:::i;:::-;:33;;44261:42;;;;;;44337:9;44349:1;44337:13;;44332:96;44357:11;44352:1;:16;44332:96;;44394:26;44404:3;44418:1;44409:6;:10;;;;:::i;:::-;44394:9;:26::i;:::-;44370:3;;;;;:::i;:::-;;;;44332:96;;;;44016:417;;;:::o;25690:188::-;25828:44;25845:4;25851:2;25855:7;25828:44;;;;;;;;;;;;:16;:44::i;:::-;25690:188;;;:::o;44445:416::-;44532:16;44574:23;44600:17;44610:6;44600:9;:17::i;:::-;44574:43;;44632:25;44674:15;44660:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44632:58;;44710:9;44705:121;44725:15;44721:1;:19;44705:121;;;44788:30;44808:6;44816:1;44788:19;:30::i;:::-;44766:8;44775:1;44766:19;;;;;;;;;;;;;;;;;;;;;:52;;;;;44742:3;;;;;:::i;:::-;;;;44705:121;;;;44847:8;44840:15;;;;44445:416;;;:::o;35737:242::-;35812:7;35848:30;:28;:30::i;:::-;35840:5;:38;35832:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;35950:10;35961:5;35950:23;;;;;;;;;;;;;;;;;;;;;;;;35943:30;;35737:242;;;:::o;46612:103::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46701:6:::1;46685:13;:22;;;;46612:103:::0;:::o;45612:108::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45703:11:::1;45693:7;:21;;;;;;;;;;;;:::i;:::-;;45612:108:::0;:::o;43706:26::-;;;;;;;;;;;;;:::o;46411:87::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46483:7:::1;46476:4;:14;;;;46411:87:::0;:::o;46177:226::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46260:8:::1;46271:10;:17;46260:28;;46307:6;46303:95;46323:3;46319:1;:7;46303:95;;;46353:9;46368:10;46379:1;46368:21;;;;;;;;;;;;;;;;;;;;;;46353:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46328:4;;;;;:::i;:::-;;;;46303:95;;;;42382:1;46177:226:::0;:::o;22531:248::-;22603:7;22623:13;22639:7;:22;22647:7;22639:22;;;;;;;;;;;;;;;;;;;;;22623:38;;22697:1;22680:19;;:5;:19;;;;22672:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;22768:5;22761:12;;;22531:248;;;:::o;43473:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22256:217::-;22328:7;22373:1;22356:19;;:5;:19;;;;22348:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;22445:9;:22;22455:5;22445:22;;;;;;;;;;;;;;;;22438:29;;22256:217;;;:::o;42736:92::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42801:21:::1;42819:1;42801:9;:21::i;:::-;42736:92::o:0;45466:126::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45569:17:::1;45553:13;:33;;;;45466:126:::0;:::o;42092:85::-;42138:7;42165:6;;;;;;;;;;;42158:13;;42092:85;:::o;23005:102::-;23061:13;23094:7;23087:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23005:102;:::o;24671:310::-;24786:12;:10;:12::i;:::-;24774:24;;:8;:24;;;;24766:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;24903:8;24846:18;:38;24865:12;:10;:12::i;:::-;24846:38;;;;;;;;;;;;;;;:54;24885:8;24846:54;;;;;;;;;;;;;;;;:65;;;;;;;;;;;;;;;;;;24956:8;24927:48;;24942:12;:10;:12::i;:::-;24927:48;;;24966:8;24927:48;;;;;;:::i;:::-;;;;;;;;24671:310;;:::o;43584:38::-;;;;:::o;25945:331::-;26120:41;26139:12;:10;:12::i;:::-;26153:7;26120:18;:41::i;:::-;26112:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;26231:39;26245:4;26251:2;26255:7;26264:5;26231:13;:39::i;:::-;25945:331;;;;:::o;43501:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44887:542::-;45005:13;45061:16;45069:7;45061;:16::i;:::-;45035:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;45189:28;45220:10;:8;:10::i;:::-;45189:41;;45304:1;45279:14;45273:28;:32;:150;;;;;;;;;;;;;;;;;45350:14;45366:18;:7;:16;:18::i;:::-;45386:13;45333:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45273:150;45249:174;;;44887:542;;;:::o;43629:30::-;;;;:::o;45740:132::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;45849:17:::1;45833:13;:33;;;;;;;;;;;;:::i;:::-;;45740:132:::0;:::o;25048:174::-;25145:4;25169:18;:31;25188:5;25169:31;;;;;;;;;;;;;;;:47;25201:8;25169:47;;;;;;;;;;;;;;;;;;;;;;;;;25162:54;;25048:174;;;;:::o;42979:195::-;42317:12;:10;:12::i;:::-;42306:23;;:7;:5;:7::i;:::-;:23;;;42298:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43088:1:::1;43068:22;;:8;:22;;;;43060:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;43149:19;43159:8;43149:9;:19::i;:::-;42979:195:::0;:::o;47092:294::-;47152:4;47173:8;47184:9;:16;;;;47173:27;;47219:6;47215:139;47235:3;47231:1;:7;47215:139;;;47293:8;47269:32;;:9;47279:1;47269:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;47265:82;;;47333:4;47326:11;;;;;;47265:82;47240:4;;;;;:::i;:::-;;;;47215:139;;;;47375:5;47368:12;;;47092:294;;;;:::o;21893:303::-;21995:4;22047:25;22032:40;;;:11;:40;;;;:105;;;;22104:33;22089:48;;;:11;:48;;;;22032:105;:158;;;;22154:36;22178:11;22154:23;:36::i;:::-;22032:158;22012:178;;21893:303;;;:::o;1006:96::-;1059:7;1086:10;1079:17;;1006:96;:::o;27781:131::-;27846:4;27904:1;27870:36;;:7;:22;27878:7;27870:22;;;;;;;;;;;;;;;;;;;;;:36;;;;27863:43;;27781:131;;;:::o;31791:178::-;31899:2;31866:15;:30;31882:7;31866:30;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;31955:7;31951:2;31917:46;;31926:23;31941:7;31926:14;:23::i;:::-;31917:46;;;;;;;;;;;;31791:178;;:::o;28075:351::-;28168:4;28193:16;28201:7;28193;:16::i;:::-;28185:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;28274:13;28290:23;28305:7;28290:14;:23::i;:::-;28274:39;;28343:5;28332:16;;:7;:16;;;:51;;;;28376:7;28352:31;;:20;28364:7;28352:11;:20::i;:::-;:31;;;28332:51;:87;;;;28387:32;28404:5;28411:7;28387:16;:32::i;:::-;28332:87;28324:96;;;28075:351;;;;:::o;31073:604::-;31232:4;31205:31;;:23;31220:7;31205:14;:23::i;:::-;:31;;;31197:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;31320:1;31306:16;;:2;:16;;;;31298:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;31381:39;31402:4;31408:2;31412:7;31381:20;:39::i;:::-;31485:29;31502:1;31506:7;31485:8;:29::i;:::-;31552:1;31527:9;:21;31537:4;31527:21;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;31587:1;31564:9;:19;31574:2;31564:19;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;31624:2;31599:7;:22;31607:7;31599:22;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;31663:7;31659:2;31644:27;;31653:4;31644:27;;;;;;;;;;;;31073:604;;;:::o;28764:113::-;28840:31;28850:2;28854:7;28840:31;;;;;;;;;;;;:9;:31::i;:::-;28764:113;;:::o;43182:171::-;43238:16;43257:6;;;;;;;;;;;43238:25;;43283:8;43274:6;;:17;;;;;;;;;;;;;;;;;;43338:8;43307:40;;43328:8;43307:40;;;;;;;;;;;;43182:171;;:::o;27154:318::-;27311:28;27321:4;27327:2;27331:7;27311:9;:28::i;:::-;27358:48;27381:4;27387:2;27391:7;27400:5;27358:22;:48::i;:::-;27350:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;27154:318;;;;:::o;43836:155::-;43896:13;43922:63;;;;;;;;;;;;;;;;;;;43836:155;:::o;9094:709::-;9150:13;9372:1;9363:5;:10;9359:49;;;9390:10;;;;;;;;;;;;;;;;;;;;;9359:49;9418:12;9433:5;9418:20;;9449:14;9474:74;9489:1;9481:4;:9;9474:74;;9507:8;;;;;:::i;:::-;;;;9538:2;9530:10;;;;;:::i;:::-;;;9474:74;;;9558:19;9590:6;9580:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9558:39;;9608:158;9624:1;9615:5;:10;9608:158;;9652:1;9642:11;;;;;:::i;:::-;;;9727:2;9719:5;:10;;;;:::i;:::-;9706:2;:24;;;;:::i;:::-;9693:39;;9668:6;9675;9668:22;;;;;;;;;;;;;;;;;;;:64;;;;;;;;;;;9756:2;9747:11;;;;;:::i;:::-;;;9608:158;;;9790:6;9776:21;;;;;9094:709;;;;:::o;8623:155::-;8708:4;8747:25;8732:40;;;:11;:40;;;;8725:47;;8623:155;;;:::o;36588:571::-;36732:45;36759:4;36765:2;36769:7;36732:26;:45::i;:::-;36810:1;36794:18;;:4;:18;;;36790:179;;;36829:40;36861:7;36829:31;:40::i;:::-;36790:179;;;36895:2;36887:10;;:4;:10;;;36883:86;;36914:47;36947:4;36953:7;36914:32;:47::i;:::-;36883:86;36790:179;36997:1;36983:16;;:2;:16;;;36979:175;;;37016:45;37053:7;37016:36;:45::i;:::-;36979:175;;;37085:4;37079:10;;:2;:10;;;37075:79;;37106:40;37134:2;37138:7;37106:27;:40::i;:::-;37075:79;36979:175;36588:571;;;:::o;29100:311::-;29230:18;29236:2;29240:7;29230:5;:18::i;:::-;29281:54;29312:1;29316:2;29320:7;29329:5;29281:22;:54::i;:::-;29259:146;;;;;;;;;;;;:::i;:::-;;;;;;;;;29100:311;;;:::o;32530:751::-;32685:4;32706:15;:2;:13;;;:15::i;:::-;32702:574;;;32758:2;32742:36;;;32779:12;:10;:12::i;:::-;32793:4;32799:7;32808:5;32742:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32738:491;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32995:1;32978:6;:13;:18;32974:246;;;33021:60;;;;;;;;;;:::i;:::-;;;;;;;;32974:246;33188:6;33182:13;33173:6;33169:2;33165:15;33158:38;32738:491;32875:41;;;32865:51;;;:6;:51;;;;32858:58;;;;;32702:574;33264:4;33257:11;;32530:751;;;;;;;:::o;33849:126::-;;;;:::o;37890:168::-;38000:10;:17;;;;37967:15;:30;37983:7;37967:30;;;;;;;;;;;:50;;;;38028:10;38044:7;38028:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37890:168;:::o;38681:1032::-;38939:22;38989:1;38964:22;38981:4;38964:16;:22::i;:::-;:26;;;;:::i;:::-;38939:51;;39001:18;39022:17;:32;39040:7;39022:32;;;;;;;;;;;;39001:53;;39175:14;39161:10;:28;39157:364;;39206:19;39228:12;:26;39241:4;39228:26;;;;;;;;;;;;;;;:50;39255:14;39228:50;;;;;;;;;;;;39206:72;;39344:11;39295:12;:26;39308:4;39295:26;;;;;;;;;;;;;;;:46;39322:10;39295:46;;;;;;;;;;;:60;;;;39469:10;39428:17;:38;39446:11;39428:38;;;;;;;;;;;:51;;;;39157:364;;39611:17;:32;39629:7;39611:32;;;;;;;;;;;39604:39;;;39661:12;:24;39674:4;39661:24;;;;;;;;;;;;;;;:46;39686:14;39661:46;;;;;;;;;;;39654:53;;;38681:1032;;;;:::o;40004:1091::-;40249:22;40294:1;40274:10;:17;;;;:21;;;;:::i;:::-;40249:46;;40306:18;40327:15;:30;40343:7;40327:30;;;;;;;;;;;;40306:51;;40676:19;40698:10;40709:14;40698:32;;;;;;;;;;;;;;;;;;;;;;;;40676:54;;40774:11;40743:10;40754;40743:28;;;;;;;;;;;;;;;;;;;;;;;:42;;;;40891:10;40854:15;:34;40870:11;40854:34;;;;;;;;;;;:47;;;;41032:15;:30;41048:7;41032:30;;;;;;;;;;;41025:37;;;41073:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40004:1091;;;;:::o;37456:237::-;37541:14;37558:20;37575:2;37558:16;:20::i;:::-;37541:37;;37628:7;37589:12;:22;37602:2;37589:22;;;;;;;;;;;;;;;:36;37612:6;37589:36;;;;;;;;;;;:46;;;;37681:6;37646:17;:32;37664:7;37646:32;;;;;;;;;;;:41;;;;37456:237;;;:::o;29743:402::-;29837:1;29823:16;;:2;:16;;;;29815:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;29901:16;29909:7;29901;:16::i;:::-;29900:17;29892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;29968:45;29997:1;30001:2;30005:7;29968:20;:45::i;:::-;30049:1;30026:9;:19;30036:2;30026:19;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;30086:2;30061:7;:22;30069:7;30061:22;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;30131:7;30127:2;30106:33;;30123:1;30106:33;;;;;;;;;;;;29743:402;;:::o;11626:369::-;11686:4;11882:12;11949:7;11937:20;11929:28;;11988:1;11981:4;:8;11974:15;;;11626:369;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1512:303::-;;1632:3;1625:4;1617:6;1613:17;1609:27;1599:2;;1650:1;1647;1640:12;1599:2;1690:6;1677:20;1715:94;1805:3;1797:6;1790:4;1782:6;1778:17;1715:94;:::i;:::-;1706:103;;1589:226;;;;;:::o;1821:133::-;;1902:6;1889:20;1880:29;;1918:30;1942:5;1918:30;:::i;:::-;1870:84;;;;:::o;1960:137::-;;2043:6;2030:20;2021:29;;2059:32;2085:5;2059:32;:::i;:::-;2011:86;;;;:::o;2103:141::-;;2190:6;2184:13;2175:22;;2206:32;2232:5;2206:32;:::i;:::-;2165:79;;;;:::o;2263:271::-;;2367:3;2360:4;2352:6;2348:17;2344:27;2334:2;;2385:1;2382;2375:12;2334:2;2425:6;2412:20;2450:78;2524:3;2516:6;2509:4;2501:6;2497:17;2450:78;:::i;:::-;2441:87;;2324:210;;;;;:::o;2554:273::-;;2659:3;2652:4;2644:6;2640:17;2636:27;2626:2;;2677:1;2674;2667:12;2626:2;2717:6;2704:20;2742:79;2817:3;2809:6;2802:4;2794:6;2790:17;2742:79;:::i;:::-;2733:88;;2616:211;;;;;:::o;2833:139::-;;2917:6;2904:20;2895:29;;2933:33;2960:5;2933:33;:::i;:::-;2885:87;;;;:::o;2978:262::-;;3086:2;3074:9;3065:7;3061:23;3057:32;3054:2;;;3102:1;3099;3092:12;3054:2;3145:1;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3116:117;3044:196;;;;:::o;3246:407::-;;;3371:2;3359:9;3350:7;3346:23;3342:32;3339:2;;;3387:1;3384;3377:12;3339:2;3430:1;3455:53;3500:7;3491:6;3480:9;3476:22;3455:53;:::i;:::-;3445:63;;3401:117;3557:2;3583:53;3628:7;3619:6;3608:9;3604:22;3583:53;:::i;:::-;3573:63;;3528:118;3329:324;;;;;:::o;3659:552::-;;;;3801:2;3789:9;3780:7;3776:23;3772:32;3769:2;;;3817:1;3814;3807:12;3769:2;3860:1;3885:53;3930:7;3921:6;3910:9;3906:22;3885:53;:::i;:::-;3875:63;;3831:117;3987:2;4013:53;4058:7;4049:6;4038:9;4034:22;4013:53;:::i;:::-;4003:63;;3958:118;4115:2;4141:53;4186:7;4177:6;4166:9;4162:22;4141:53;:::i;:::-;4131:63;;4086:118;3759:452;;;;;:::o;4217:809::-;;;;;4385:3;4373:9;4364:7;4360:23;4356:33;4353:2;;;4402:1;4399;4392:12;4353:2;4445:1;4470:53;4515:7;4506:6;4495:9;4491:22;4470:53;:::i;:::-;4460:63;;4416:117;4572:2;4598:53;4643:7;4634:6;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4543:118;4700:2;4726:53;4771:7;4762:6;4751:9;4747:22;4726:53;:::i;:::-;4716:63;;4671:118;4856:2;4845:9;4841:18;4828:32;4887:18;4879:6;4876:30;4873:2;;;4919:1;4916;4909:12;4873:2;4947:62;5001:7;4992:6;4981:9;4977:22;4947:62;:::i;:::-;4937:72;;4799:220;4343:683;;;;;;;:::o;5032:401::-;;;5154:2;5142:9;5133:7;5129:23;5125:32;5122:2;;;5170:1;5167;5160:12;5122:2;5213:1;5238:53;5283:7;5274:6;5263:9;5259:22;5238:53;:::i;:::-;5228:63;;5184:117;5340:2;5366:50;5408:7;5399:6;5388:9;5384:22;5366:50;:::i;:::-;5356:60;;5311:115;5112:321;;;;;:::o;5439:407::-;;;5564:2;5552:9;5543:7;5539:23;5535:32;5532:2;;;5580:1;5577;5570:12;5532:2;5623:1;5648:53;5693:7;5684:6;5673:9;5669:22;5648:53;:::i;:::-;5638:63;;5594:117;5750:2;5776:53;5821:7;5812:6;5801:9;5797:22;5776:53;:::i;:::-;5766:63;;5721:118;5522:324;;;;;:::o;5852:405::-;;5985:2;5973:9;5964:7;5960:23;5956:32;5953:2;;;6001:1;5998;5991:12;5953:2;6072:1;6061:9;6057:17;6044:31;6102:18;6094:6;6091:30;6088:2;;;6134:1;6131;6124:12;6088:2;6162:78;6232:7;6223:6;6212:9;6208:22;6162:78;:::i;:::-;6152:88;;6015:235;5943:314;;;;:::o;6263:256::-;;6368:2;6356:9;6347:7;6343:23;6339:32;6336:2;;;6384:1;6381;6374:12;6336:2;6427:1;6452:50;6494:7;6485:6;6474:9;6470:22;6452:50;:::i;:::-;6442:60;;6398:114;6326:193;;;;:::o;6525:260::-;;6632:2;6620:9;6611:7;6607:23;6603:32;6600:2;;;6648:1;6645;6638:12;6600:2;6691:1;6716:52;6760:7;6751:6;6740:9;6736:22;6716:52;:::i;:::-;6706:62;;6662:116;6590:195;;;;:::o;6791:282::-;;6909:2;6897:9;6888:7;6884:23;6880:32;6877:2;;;6925:1;6922;6915:12;6877:2;6968:1;6993:63;7048:7;7039:6;7028:9;7024:22;6993:63;:::i;:::-;6983:73;;6939:127;6867:206;;;;:::o;7079:375::-;;7197:2;7185:9;7176:7;7172:23;7168:32;7165:2;;;7213:1;7210;7203:12;7165:2;7284:1;7273:9;7269:17;7256:31;7314:18;7306:6;7303:30;7300:2;;;7346:1;7343;7336:12;7300:2;7374:63;7429:7;7420:6;7409:9;7405:22;7374:63;:::i;:::-;7364:73;;7227:220;7155:299;;;;:::o;7460:262::-;;7568:2;7556:9;7547:7;7543:23;7539:32;7536:2;;;7584:1;7581;7574:12;7536:2;7627:1;7652:53;7697:7;7688:6;7677:9;7673:22;7652:53;:::i;:::-;7642:63;;7598:117;7526:196;;;;:::o;7728:179::-;;7818:46;7860:3;7852:6;7818:46;:::i;:::-;7896:4;7891:3;7887:14;7873:28;;7808:99;;;;:::o;7913:118::-;8000:24;8018:5;8000:24;:::i;:::-;7995:3;7988:37;7978:53;;:::o;8067:732::-;;8215:54;8263:5;8215:54;:::i;:::-;8285:86;8364:6;8359:3;8285:86;:::i;:::-;8278:93;;8395:56;8445:5;8395:56;:::i;:::-;8474:7;8505:1;8490:284;8515:6;8512:1;8509:13;8490:284;;;8591:6;8585:13;8618:63;8677:3;8662:13;8618:63;:::i;:::-;8611:70;;8704:60;8757:6;8704:60;:::i;:::-;8694:70;;8550:224;8537:1;8534;8530:9;8525:14;;8490:284;;;8494:14;8790:3;8783:10;;8191:608;;;;;;;:::o;8805:109::-;8886:21;8901:5;8886:21;:::i;:::-;8881:3;8874:34;8864:50;;:::o;8920:360::-;;9034:38;9066:5;9034:38;:::i;:::-;9088:70;9151:6;9146:3;9088:70;:::i;:::-;9081:77;;9167:52;9212:6;9207:3;9200:4;9193:5;9189:16;9167:52;:::i;:::-;9244:29;9266:6;9244:29;:::i;:::-;9239:3;9235:39;9228:46;;9010:270;;;;;:::o;9286:364::-;;9402:39;9435:5;9402:39;:::i;:::-;9457:71;9521:6;9516:3;9457:71;:::i;:::-;9450:78;;9537:52;9582:6;9577:3;9570:4;9563:5;9559:16;9537:52;:::i;:::-;9614:29;9636:6;9614:29;:::i;:::-;9609:3;9605:39;9598:46;;9378:272;;;;;:::o;9656:377::-;;9790:39;9823:5;9790:39;:::i;:::-;9845:89;9927:6;9922:3;9845:89;:::i;:::-;9838:96;;9943:52;9988:6;9983:3;9976:4;9969:5;9965:16;9943:52;:::i;:::-;10020:6;10015:3;10011:16;10004:23;;9766:267;;;;;:::o;10063:845::-;;10203:5;10197:12;10232:36;10258:9;10232:36;:::i;:::-;10284:89;10366:6;10361:3;10284:89;:::i;:::-;10277:96;;10404:1;10393:9;10389:17;10420:1;10415:137;;;;10566:1;10561:341;;;;10382:520;;10415:137;10499:4;10495:9;10484;10480:25;10475:3;10468:38;10535:6;10530:3;10526:16;10519:23;;10415:137;;10561:341;10628:38;10660:5;10628:38;:::i;:::-;10688:1;10702:154;10716:6;10713:1;10710:13;10702:154;;;10790:7;10784:14;10780:1;10775:3;10771:11;10764:35;10840:1;10831:7;10827:15;10816:26;;10738:4;10735:1;10731:12;10726:17;;10702:154;;;10885:6;10880:3;10876:16;10869:23;;10568:334;;10382:520;;10170:738;;;;;;:::o;10914:375::-;;11077:67;11141:2;11136:3;11077:67;:::i;:::-;11070:74;;11174:34;11170:1;11165:3;11161:11;11154:55;11240:13;11235:2;11230:3;11226:12;11219:35;11280:2;11275:3;11271:12;11264:19;;11060:229;;;:::o;11295:382::-;;11458:67;11522:2;11517:3;11458:67;:::i;:::-;11451:74;;11555:34;11551:1;11546:3;11542:11;11535:55;11621:20;11616:2;11611:3;11607:12;11600:42;11668:2;11663:3;11659:12;11652:19;;11441:236;;;:::o;11683:370::-;;11846:67;11910:2;11905:3;11846:67;:::i;:::-;11839:74;;11943:34;11939:1;11934:3;11930:11;11923:55;12009:8;12004:2;11999:3;11995:12;11988:30;12044:2;12039:3;12035:12;12028:19;;11829:224;;;:::o;12059:326::-;;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12319:30;12315:1;12310:3;12306:11;12299:51;12376:2;12371:3;12367:12;12360:19;;12205:180;;;:::o;12391:368::-;;12554:67;12618:2;12613:3;12554:67;:::i;:::-;12547:74;;12651:34;12647:1;12642:3;12638:11;12631:55;12717:6;12712:2;12707:3;12703:12;12696:28;12750:2;12745:3;12741:12;12734:19;;12537:222;;;:::o;12765:323::-;;12928:67;12992:2;12987:3;12928:67;:::i;:::-;12921:74;;13025:27;13021:1;13016:3;13012:11;13005:48;13079:2;13074:3;13070:12;13063:19;;12911:177;;;:::o;13094:376::-;;13257:67;13321:2;13316:3;13257:67;:::i;:::-;13250:74;;13354:34;13350:1;13345:3;13341:11;13334:55;13420:14;13415:2;13410:3;13406:12;13399:36;13461:2;13456:3;13452:12;13445:19;;13240:230;;;:::o;13476:388::-;;13639:67;13703:2;13698:3;13639:67;:::i;:::-;13632:74;;13736:34;13732:1;13727:3;13723:11;13716:55;13802:26;13797:2;13792:3;13788:12;13781:48;13855:2;13850:3;13846:12;13839:19;;13622:242;;;:::o;13870:374::-;;14033:67;14097:2;14092:3;14033:67;:::i;:::-;14026:74;;14130:34;14126:1;14121:3;14117:11;14110:55;14196:12;14191:2;14186:3;14182:12;14175:34;14235:2;14230:3;14226:12;14219:19;;14016:228;;;:::o;14250:373::-;;14413:67;14477:2;14472:3;14413:67;:::i;:::-;14406:74;;14510:34;14506:1;14501:3;14497:11;14490:55;14576:11;14571:2;14566:3;14562:12;14555:33;14614:2;14609:3;14605:12;14598:19;;14396:227;;;:::o;14629:330::-;;14792:67;14856:2;14851:3;14792:67;:::i;:::-;14785:74;;14889:34;14885:1;14880:3;14876:11;14869:55;14950:2;14945:3;14941:12;14934:19;;14775:184;;;:::o;14965:376::-;;15128:67;15192:2;15187:3;15128:67;:::i;:::-;15121:74;;15225:34;15221:1;15216:3;15212:11;15205:55;15291:14;15286:2;15281:3;15277:12;15270:36;15332:2;15327:3;15323:12;15316:19;;15111:230;;;:::o;15347:330::-;;15510:67;15574:2;15569:3;15510:67;:::i;:::-;15503:74;;15607:34;15603:1;15598:3;15594:11;15587:55;15668:2;15663:3;15659:12;15652:19;;15493:184;;;:::o;15683:373::-;;15846:67;15910:2;15905:3;15846:67;:::i;:::-;15839:74;;15943:34;15939:1;15934:3;15930:11;15923:55;16009:11;16004:2;15999:3;15995:12;15988:33;16047:2;16042:3;16038:12;16031:19;;15829:227;;;:::o;16062:379::-;;16225:67;16289:2;16284:3;16225:67;:::i;:::-;16218:74;;16322:34;16318:1;16313:3;16309:11;16302:55;16388:17;16383:2;16378:3;16374:12;16367:39;16432:2;16427:3;16423:12;16416:19;;16208:233;;;:::o;16447:365::-;;16610:67;16674:2;16669:3;16610:67;:::i;:::-;16603:74;;16707:34;16703:1;16698:3;16694:11;16687:55;16773:3;16768:2;16763:3;16759:12;16752:25;16803:2;16798:3;16794:12;16787:19;;16593:219;;;:::o;16818:381::-;;16981:67;17045:2;17040:3;16981:67;:::i;:::-;16974:74;;17078:34;17074:1;17069:3;17065:11;17058:55;17144:19;17139:2;17134:3;17130:12;17123:41;17190:2;17185:3;17181:12;17174:19;;16964:235;;;:::o;17205:376::-;;17368:67;17432:2;17427:3;17368:67;:::i;:::-;17361:74;;17465:34;17461:1;17456:3;17452:11;17445:55;17531:14;17526:2;17521:3;17517:12;17510:36;17572:2;17567:3;17563:12;17556:19;;17351:230;;;:::o;17587:108::-;17664:24;17682:5;17664:24;:::i;:::-;17659:3;17652:37;17642:53;;:::o;17701:118::-;17788:24;17806:5;17788:24;:::i;:::-;17783:3;17776:37;17766:53;;:::o;17825:589::-;;18072:95;18163:3;18154:6;18072:95;:::i;:::-;18065:102;;18184:95;18275:3;18266:6;18184:95;:::i;:::-;18177:102;;18296:92;18384:3;18375:6;18296:92;:::i;:::-;18289:99;;18405:3;18398:10;;18054:360;;;;;;:::o;18420:222::-;;18551:2;18540:9;18536:18;18528:26;;18564:71;18632:1;18621:9;18617:17;18608:6;18564:71;:::i;:::-;18518:124;;;;:::o;18648:640::-;;18881:3;18870:9;18866:19;18858:27;;18895:71;18963:1;18952:9;18948:17;18939:6;18895:71;:::i;:::-;18976:72;19044:2;19033:9;19029:18;19020:6;18976:72;:::i;:::-;19058;19126:2;19115:9;19111:18;19102:6;19058:72;:::i;:::-;19177:9;19171:4;19167:20;19162:2;19151:9;19147:18;19140:48;19205:76;19276:4;19267:6;19205:76;:::i;:::-;19197:84;;18848:440;;;;;;;:::o;19294:373::-;;19475:2;19464:9;19460:18;19452:26;;19524:9;19518:4;19514:20;19510:1;19499:9;19495:17;19488:47;19552:108;19655:4;19646:6;19552:108;:::i;:::-;19544:116;;19442:225;;;;:::o;19673:210::-;;19798:2;19787:9;19783:18;19775:26;;19811:65;19873:1;19862:9;19858:17;19849:6;19811:65;:::i;:::-;19765:118;;;;:::o;19889:313::-;;20040:2;20029:9;20025:18;20017:26;;20089:9;20083:4;20079:20;20075:1;20064:9;20060:17;20053:47;20117:78;20190:4;20181:6;20117:78;:::i;:::-;20109:86;;20007:195;;;;:::o;20208:419::-;;20412:2;20401:9;20397:18;20389:26;;20461:9;20455:4;20451:20;20447:1;20436:9;20432:17;20425:47;20489:131;20615:4;20489:131;:::i;:::-;20481:139;;20379:248;;;:::o;20633:419::-;;20837:2;20826:9;20822:18;20814:26;;20886:9;20880:4;20876:20;20872:1;20861:9;20857:17;20850:47;20914:131;21040:4;20914:131;:::i;:::-;20906:139;;20804:248;;;:::o;21058:419::-;;21262:2;21251:9;21247:18;21239:26;;21311:9;21305:4;21301:20;21297:1;21286:9;21282:17;21275:47;21339:131;21465:4;21339:131;:::i;:::-;21331:139;;21229:248;;;:::o;21483:419::-;;21687:2;21676:9;21672:18;21664:26;;21736:9;21730:4;21726:20;21722:1;21711:9;21707:17;21700:47;21764:131;21890:4;21764:131;:::i;:::-;21756:139;;21654:248;;;:::o;21908:419::-;;22112:2;22101:9;22097:18;22089:26;;22161:9;22155:4;22151:20;22147:1;22136:9;22132:17;22125:47;22189:131;22315:4;22189:131;:::i;:::-;22181:139;;22079:248;;;:::o;22333:419::-;;22537:2;22526:9;22522:18;22514:26;;22586:9;22580:4;22576:20;22572:1;22561:9;22557:17;22550:47;22614:131;22740:4;22614:131;:::i;:::-;22606:139;;22504:248;;;:::o;22758:419::-;;22962:2;22951:9;22947:18;22939:26;;23011:9;23005:4;23001:20;22997:1;22986:9;22982:17;22975:47;23039:131;23165:4;23039:131;:::i;:::-;23031:139;;22929:248;;;:::o;23183:419::-;;23387:2;23376:9;23372:18;23364:26;;23436:9;23430:4;23426:20;23422:1;23411:9;23407:17;23400:47;23464:131;23590:4;23464:131;:::i;:::-;23456:139;;23354:248;;;:::o;23608:419::-;;23812:2;23801:9;23797:18;23789:26;;23861:9;23855:4;23851:20;23847:1;23836:9;23832:17;23825:47;23889:131;24015:4;23889:131;:::i;:::-;23881:139;;23779:248;;;:::o;24033:419::-;;24237:2;24226:9;24222:18;24214:26;;24286:9;24280:4;24276:20;24272:1;24261:9;24257:17;24250:47;24314:131;24440:4;24314:131;:::i;:::-;24306:139;;24204:248;;;:::o;24458:419::-;;24662:2;24651:9;24647:18;24639:26;;24711:9;24705:4;24701:20;24697:1;24686:9;24682:17;24675:47;24739:131;24865:4;24739:131;:::i;:::-;24731:139;;24629:248;;;:::o;24883:419::-;;25087:2;25076:9;25072:18;25064:26;;25136:9;25130:4;25126:20;25122:1;25111:9;25107:17;25100:47;25164:131;25290:4;25164:131;:::i;:::-;25156:139;;25054:248;;;:::o;25308:419::-;;25512:2;25501:9;25497:18;25489:26;;25561:9;25555:4;25551:20;25547:1;25536:9;25532:17;25525:47;25589:131;25715:4;25589:131;:::i;:::-;25581:139;;25479:248;;;:::o;25733:419::-;;25937:2;25926:9;25922:18;25914:26;;25986:9;25980:4;25976:20;25972:1;25961:9;25957:17;25950:47;26014:131;26140:4;26014:131;:::i;:::-;26006:139;;25904:248;;;:::o;26158:419::-;;26362:2;26351:9;26347:18;26339:26;;26411:9;26405:4;26401:20;26397:1;26386:9;26382:17;26375:47;26439:131;26565:4;26439:131;:::i;:::-;26431:139;;26329:248;;;:::o;26583:419::-;;26787:2;26776:9;26772:18;26764:26;;26836:9;26830:4;26826:20;26822:1;26811:9;26807:17;26800:47;26864:131;26990:4;26864:131;:::i;:::-;26856:139;;26754:248;;;:::o;27008:419::-;;27212:2;27201:9;27197:18;27189:26;;27261:9;27255:4;27251:20;27247:1;27236:9;27232:17;27225:47;27289:131;27415:4;27289:131;:::i;:::-;27281:139;;27179:248;;;:::o;27433:419::-;;27637:2;27626:9;27622:18;27614:26;;27686:9;27680:4;27676:20;27672:1;27661:9;27657:17;27650:47;27714:131;27840:4;27714:131;:::i;:::-;27706:139;;27604:248;;;:::o;27858:222::-;;27989:2;27978:9;27974:18;27966:26;;28002:71;28070:1;28059:9;28055:17;28046:6;28002:71;:::i;:::-;27956:124;;;;:::o;28086:283::-;;28152:2;28146:9;28136:19;;28194:4;28186:6;28182:17;28301:6;28289:10;28286:22;28265:18;28253:10;28250:34;28247:62;28244:2;;;28312:18;;:::i;:::-;28244:2;28352:10;28348:2;28341:22;28126:243;;;;:::o;28375:311::-;;28542:18;28534:6;28531:30;28528:2;;;28564:18;;:::i;:::-;28528:2;28614:4;28606:6;28602:17;28594:25;;28674:4;28668;28664:15;28656:23;;28457:229;;;:::o;28692:331::-;;28843:18;28835:6;28832:30;28829:2;;;28865:18;;:::i;:::-;28829:2;28950:4;28946:9;28939:4;28931:6;28927:17;28923:33;28915:41;;29011:4;29005;29001:15;28993:23;;28758:265;;;:::o;29029:332::-;;29181:18;29173:6;29170:30;29167:2;;;29203:18;;:::i;:::-;29167:2;29288:4;29284:9;29277:4;29269:6;29265:17;29261:33;29253:41;;29349:4;29343;29339:15;29331:23;;29096:265;;;:::o;29367:132::-;;29457:3;29449:11;;29487:4;29482:3;29478:14;29470:22;;29439:60;;;:::o;29505:141::-;;29577:3;29569:11;;29600:3;29597:1;29590:14;29634:4;29631:1;29621:18;29613:26;;29559:87;;;:::o;29652:114::-;;29753:5;29747:12;29737:22;;29726:40;;;:::o;29772:98::-;;29857:5;29851:12;29841:22;;29830:40;;;:::o;29876:99::-;;29962:5;29956:12;29946:22;;29935:40;;;:::o;29981:113::-;;30083:4;30078:3;30074:14;30066:22;;30056:38;;;:::o;30100:184::-;;30233:6;30228:3;30221:19;30273:4;30268:3;30264:14;30249:29;;30211:73;;;;:::o;30290:168::-;;30407:6;30402:3;30395:19;30447:4;30442:3;30438:14;30423:29;;30385:73;;;;:::o;30464:169::-;;30582:6;30577:3;30570:19;30622:4;30617:3;30613:14;30598:29;;30560:73;;;;:::o;30639:148::-;;30778:3;30763:18;;30753:34;;;;:::o;30793:305::-;;30852:20;30870:1;30852:20;:::i;:::-;30847:25;;30886:20;30904:1;30886:20;:::i;:::-;30881:25;;31040:1;30972:66;30968:74;30965:1;30962:81;30959:2;;;31046:18;;:::i;:::-;30959:2;31090:1;31087;31083:9;31076:16;;30837:261;;;;:::o;31104:185::-;;31161:20;31179:1;31161:20;:::i;:::-;31156:25;;31195:20;31213:1;31195:20;:::i;:::-;31190:25;;31234:1;31224:2;;31239:18;;:::i;:::-;31224:2;31281:1;31278;31274:9;31269:14;;31146:143;;;;:::o;31295:191::-;;31355:20;31373:1;31355:20;:::i;:::-;31350:25;;31389:20;31407:1;31389:20;:::i;:::-;31384:25;;31428:1;31425;31422:8;31419:2;;;31433:18;;:::i;:::-;31419:2;31478:1;31475;31471:9;31463:17;;31340:146;;;;:::o;31492:96::-;;31558:24;31576:5;31558:24;:::i;:::-;31547:35;;31537:51;;;:::o;31594:90::-;;31671:5;31664:13;31657:21;31646:32;;31636:48;;;:::o;31690:149::-;;31766:66;31759:5;31755:78;31744:89;;31734:105;;;:::o;31845:126::-;;31922:42;31915:5;31911:54;31900:65;;31890:81;;;:::o;31977:77::-;;32043:5;32032:16;;32022:32;;;:::o;32060:154::-;32144:6;32139:3;32134;32121:30;32206:1;32197:6;32192:3;32188:16;32181:27;32111:103;;;:::o;32220:307::-;32288:1;32298:113;32312:6;32309:1;32306:13;32298:113;;;32397:1;32392:3;32388:11;32382:18;32378:1;32373:3;32369:11;32362:39;32334:2;32331:1;32327:10;32322:15;;32298:113;;;32429:6;32426:1;32423:13;32420:2;;;32509:1;32500:6;32495:3;32491:16;32484:27;32420:2;32269:258;;;;:::o;32533:320::-;;32614:1;32608:4;32604:12;32594:22;;32661:1;32655:4;32651:12;32682:18;32672:2;;32738:4;32730:6;32726:17;32716:27;;32672:2;32800;32792:6;32789:14;32769:18;32766:38;32763:2;;;32819:18;;:::i;:::-;32763:2;32584:269;;;;:::o;32859:233::-;;32921:24;32939:5;32921:24;:::i;:::-;32912:33;;32967:66;32960:5;32957:77;32954:2;;;33037:18;;:::i;:::-;32954:2;33084:1;33077:5;33073:13;33066:20;;32902:190;;;:::o;33098:176::-;;33147:20;33165:1;33147:20;:::i;:::-;33142:25;;33181:20;33199:1;33181:20;:::i;:::-;33176:25;;33220:1;33210:2;;33225:18;;:::i;:::-;33210:2;33266:1;33263;33259:9;33254:14;;33132:142;;;;:::o;33280:180::-;33328:77;33325:1;33318:88;33425:4;33422:1;33415:15;33449:4;33446:1;33439:15;33466:180;33514:77;33511:1;33504:88;33611:4;33608:1;33601:15;33635:4;33632:1;33625:15;33652:180;33700:77;33697:1;33690:88;33797:4;33794:1;33787:15;33821:4;33818:1;33811:15;33838:180;33886:77;33883:1;33876:88;33983:4;33980:1;33973:15;34007:4;34004:1;33997:15;34024:102;;34116:2;34112:7;34107:2;34100:5;34096:14;34092:28;34082:38;;34072:54;;;:::o;34132:122::-;34205:24;34223:5;34205:24;:::i;:::-;34198:5;34195:35;34185:2;;34244:1;34241;34234:12;34185:2;34175:79;:::o;34260:116::-;34330:21;34345:5;34330:21;:::i;:::-;34323:5;34320:32;34310:2;;34366:1;34363;34356:12;34310:2;34300:76;:::o;34382:120::-;34454:23;34471:5;34454:23;:::i;:::-;34447:5;34444:34;34434:2;;34492:1;34489;34482:12;34434:2;34424:78;:::o;34508:122::-;34581:24;34599:5;34581:24;:::i;:::-;34574:5;34571:35;34561:2;;34620:1;34617;34610:12;34561:2;34551:79;:::o
Swarm Source
ipfs://2094b052638ac7ea3c04528dd078c1005f05e900b9b18b713fb53a31f1f43ba4