ERC-721
Overview
Max Total Supply
48 Alignments
Holders
13
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 AlignmentsLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Alignments
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-06 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @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; } /** * @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); } } /* * @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; } } /** * @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); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @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); } /** * @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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @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); } /** * @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(); } } contract Alignments is ERC721Enumerable, ReentrancyGuard, Ownable { string[] private bend = [ "Lawful", "Pure", "Chaotic", "???", "Probably" ]; string[] private alignment = [ "Good", "Neutral", "Evil", "???" ]; string[] private suffixes = [ "" ]; string[] private namePrefixes = [ "" ]; string[] private nameSuffixes = [ "" ]; function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function getBend(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "BEND", bend); } function getAlignment(uint256 tokenId) public view returns (string memory) { return pluck(tokenId, "ALIGNMENT", alignment); } function pluck(uint256 tokenId, string memory keyPrefix, string[] memory sourceArray) internal view returns (string memory) { uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId)))); string memory output = sourceArray[rand % sourceArray.length]; uint256 greatness = rand % 21; if (greatness > 14) { output = string(abi.encodePacked(output, " ", suffixes[rand % suffixes.length])); } if (greatness >= 19) { string[2] memory name; name[0] = namePrefixes[rand % namePrefixes.length]; name[1] = nameSuffixes[rand % nameSuffixes.length]; if (greatness == 19) { output = string(abi.encodePacked('"', name[0], ' ', name[1], '" ', output)); } else { output = string(abi.encodePacked('"', name[0], ' ', name[1], '" ', output, " +1")); } } return output; } function tokenURI(uint256 tokenId) override public view returns (string memory) { string[6] memory parts; parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">'; parts[1] = getBend(tokenId); parts[2] = '</text><text x="10" y="40" class="base">'; parts[3] = getAlignment(tokenId); parts[4] = '</text><text x="10" y="60" class="base">'; parts[5] = '</text></svg>'; string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2])); output = string(abi.encodePacked(output, parts[3], parts[4], parts[5])); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Alignment #', toString(tokenId), '", "description": "Alignments for adventurers. Are you good, evil or something else", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); return output; } function claim(uint256 tokenId) public nonReentrant { require(tokenId > 0 && tokenId < 778, "Token ID invalid"); _safeMint(_msgSender(), tokenId); } function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner { require(tokenId > 777 && tokenId < 801, "Token ID invalid"); _safeMint(owner(), tokenId); } function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // 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); } constructor() ERC721("Alignments (for Adventurers)", "Alignments") Ownable() {} } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAlignment","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"tokenId","type":"uint256"}],"name":"getBend","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"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"}]
Contract Creation Code
60806040526040518060a001604052806040518060400160405280600681526020017f4c617766756c000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f507572650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4368616f7469630000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3f3f3f000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f50726f6261626c79000000000000000000000000000000000000000000000000815250815250600c906005620001469291906200048c565b5060405180608001604052806040518060400160405280600481526020017f476f6f640000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4e65757472616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4576696c0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f3f3f3f0000000000000000000000000000000000000000000000000000000000815250815250600d9060046200024e929190620004f3565b50604051806020016040528060405180602001604052806000815250815250600e9060016200027f9291906200055a565b50604051806020016040528060405180602001604052806000815250815250600f906001620002b09291906200055a565b506040518060200160405280604051806020016040528060008152508152506010906001620002e19291906200055a565b50348015620002ef57600080fd5b506040518060400160405280601c81526020017f416c69676e6d656e74732028666f7220416476656e74757265727329000000008152506040518060400160405280600a81526020017f416c69676e6d656e747300000000000000000000000000000000000000000000815250816000908051906020019062000374929190620005c1565b5080600190805190602001906200038d929190620005c1565b5050506001600a81905550620003b8620003ac620003be60201b60201c565b620003c660201b60201c565b62000744565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054828255906000526020600020908101928215620004e0579160200282015b82811115620004df578251829080519060200190620004ce929190620005c1565b5091602001919060010190620004ad565b5b509050620004ef919062000652565b5090565b82805482825590600052602060002090810192821562000547579160200282015b828111156200054657825182908051906020019062000535929190620005c1565b509160200191906001019062000514565b5b50905062000556919062000652565b5090565b828054828255906000526020600020908101928215620005ae579160200282015b82811115620005ad5782518290805190602001906200059c929190620005c1565b50916020019190600101906200057b565b5b509050620005bd919062000652565b5090565b828054620005cf90620006df565b90600052602060002090601f016020900481019282620005f357600085556200063f565b82601f106200060e57805160ff19168380011785556200063f565b828001600101855582156200063f579182015b828111156200063e57825182559160200191906001019062000621565b5b5090506200064e91906200067a565b5090565b5b808211156200067657600081816200066c919062000699565b5060010162000653565b5090565b5b80821115620006955760008160009055506001016200067b565b5090565b508054620006a790620006df565b6000825580601f10620006bb5750620006dc565b601f016020900490600052602060002090810190620006db91906200067a565b5b50565b60006002820490506001821680620006f857607f821691505b602082108114156200070f576200070e62000715565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6145f680620007546000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80634f6ccce7116100c3578063a22cb4651161007c578063a22cb465146103b0578063b88d4fde146103cc578063c87b56dd146103e8578063e985e9c514610418578063f0aeab1414610448578063f2fde38b146104785761014d565b80634f6ccce7146102da5780636352211e1461030a57806370a082311461033a578063715018a61461036a5780638da5cb5b1461037457806395d89b41146103925761014d565b806323b872dd1161011557806323b872dd1461020a57806327257c75146102265780632f745c5914610256578063379607f51461028657806342842e0e146102a2578063434f48c4146102be5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190612dfa565b610494565b60405161017991906135d7565b60405180910390f35b61018a61050e565b60405161019791906135f2565b60405180910390f35b6101ba60048036038101906101b59190612e54565b6105a0565b6040516101c79190613570565b60405180910390f35b6101ea60048036038101906101e59190612dba565b610625565b005b6101f461073d565b6040516102019190613874565b60405180910390f35b610224600480360381019061021f9190612ca4565b61074a565b005b610240600480360381019061023b9190612e54565b6107aa565b60405161024d91906135f2565b60405180910390f35b610270600480360381019061026b9190612dba565b6108c4565b60405161027d9190613874565b60405180910390f35b6102a0600480360381019061029b9190612e54565b610969565b005b6102bc60048036038101906102b79190612ca4565b610a23565b005b6102d860048036038101906102d39190612e54565b610a43565b005b6102f460048036038101906102ef9190612e54565b610b7a565b6040516103019190613874565b60405180910390f35b610324600480360381019061031f9190612e54565b610beb565b6040516103319190613570565b60405180910390f35b610354600480360381019061034f9190612c37565b610c9d565b6040516103619190613874565b60405180910390f35b610372610d55565b005b61037c610ddd565b6040516103899190613570565b60405180910390f35b61039a610e07565b6040516103a791906135f2565b60405180910390f35b6103ca60048036038101906103c59190612d7a565b610e99565b005b6103e660048036038101906103e19190612cf7565b61101a565b005b61040260048036038101906103fd9190612e54565b61107c565b60405161040f91906135f2565b60405180910390f35b610432600480360381019061042d9190612c64565b61130d565b60405161043f91906135d7565b60405180910390f35b610462600480360381019061045d9190612e54565b6113a1565b60405161046f91906135f2565b60405180910390f35b610492600480360381019061048d9190612c37565b6114bb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105075750610506826115b3565b5b9050919050565b60606000805461051d90613b08565b80601f016020809104026020016040519081016040528092919081815260200182805461054990613b08565b80156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b5050505050905090565b60006105ab82611695565b6105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190613774565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063082610beb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610698906137f4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c0611701565b73ffffffffffffffffffffffffffffffffffffffff1614806106ef57506106ee816106e9611701565b61130d565b5b61072e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610725906136f4565b60405180910390fd5b6107388383611709565b505050565b6000600880549050905090565b61075b610755611701565b826117c2565b61079a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079190613814565b60405180910390fd5b6107a58383836118a0565b505050565b60606108bd826040518060400160405280600981526020017f414c49474e4d454e540000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b828210156108b457838290600052602060002001805461082790613b08565b80601f016020809104026020016040519081016040528092919081815260200182805461085390613b08565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b505050505081526020019060010190610808565b50505050611afc565b9050919050565b60006108cf83610c9d565b8210610910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090790613614565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613854565b60405180910390fd5b6002600a819055506000811180156109c8575061030a81105b610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906137b4565b60405180910390fd5b610a18610a12611701565b82611e48565b6001600a8190555050565b610a3e8383836040518060200160405280600081525061101a565b505050565b6002600a541415610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613854565b60405180910390fd5b6002600a81905550610a99611701565b73ffffffffffffffffffffffffffffffffffffffff16610ab7610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490613794565b60405180910390fd5b61030981118015610b1f575061032181105b610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b55906137b4565b60405180910390fd5b610b6f610b69610ddd565b82611e48565b6001600a8190555050565b6000610b8461073d565b8210610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90613834565b60405180910390fd5b60088281548110610bd957610bd8613ca1565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90613734565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0590613714565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d5d611701565b73ffffffffffffffffffffffffffffffffffffffff16610d7b610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890613794565b60405180910390fd5b610ddb6000611e66565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e1690613b08565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4290613b08565b8015610e8f5780601f10610e6457610100808354040283529160200191610e8f565b820191906000526020600020905b815481529060010190602001808311610e7257829003601f168201915b5050505050905090565b610ea1611701565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906136b4565b60405180910390fd5b8060056000610f1c611701565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc9611701565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161100e91906135d7565b60405180910390a35050565b61102b611025611701565b836117c2565b61106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190613814565b60405180910390fd5b61107684848484611f2c565b50505050565b6060611086612b10565b60405180610120016040528060fd815260200161445c60fd9139816000600681106110b4576110b3613ca1565b5b60200201819052506110c5836113a1565b816001600681106110d9576110d8613ca1565b5b6020020181905250604051806060016040528060288152602001614599602891398160026006811061110e5761110d613ca1565b5b602002018190525061111f836107aa565b8160036006811061113357611132613ca1565b5b6020020181905250604051806060016040528060288152602001614434602891398160046006811061116857611167613ca1565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816005600681106111ba576111b9613ca1565b5b60200201819052506000816000600681106111d8576111d7613ca1565b5b6020020151826001600681106111f1576111f0613ca1565b5b60200201518360026006811061120a57611209613ca1565b5b6020020151604051602001611221939291906133bc565b6040516020818303038152906040529050808260036006811061124757611246613ca1565b5b6020020151836004600681106112605761125f613ca1565b5b60200201518460056006811061127957611278613ca1565b5b602002015160405160200161129194939291906133ed565b604051602081830303815290604052905060006112de6112b086611f88565b6112b9846120e9565b6040516020016112ca929190613509565b6040516020818303038152906040526120e9565b9050806040516020016112f1919061354e565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606114b4826040518060400160405280600481526020017f42454e4400000000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156114ab57838290600052602060002001805461141e90613b08565b80601f016020809104026020016040519081016040528092919081815260200182805461144a90613b08565b80156114975780601f1061146c57610100808354040283529160200191611497565b820191906000526020600020905b81548152906001019060200180831161147a57829003601f168201915b5050505050815260200190600101906113ff565b50505050611afc565b9050919050565b6114c3611701565b73ffffffffffffffffffffffffffffffffffffffff166114e1610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90613794565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90613654565b60405180910390fd5b6115b081611e66565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061167e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061168e575061168d82612281565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661177c83610beb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117cd82611695565b61180c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611803906136d4565b60405180910390fd5b600061181783610beb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061188657508373ffffffffffffffffffffffffffffffffffffffff1661186e846105a0565b73ffffffffffffffffffffffffffffffffffffffff16145b806118975750611896818561130d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118c082610beb565b73ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d906137d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90613694565b60405180910390fd5b6119918383836122eb565b61199c600082611709565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ec9190613a1e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a43919061393d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000611b3284611b0d87611f88565b604051602001611b1e929190613398565b6040516020818303038152906040526123ff565b9050600083845183611b449190613bb4565b81518110611b5557611b54613ca1565b5b602002602001015190506000601583611b6e9190613bb4565b9050600e811115611bca5781600e808054905085611b8c9190613bb4565b81548110611b9d57611b9c613ca1565b5b90600052602060002001604051602001611bb892919061342b565b60405160208183030381529060405291505b60138110611e3b57611bda612b37565b600f808054905085611bec9190613bb4565b81548110611bfd57611bfc613ca1565b5b906000526020600020018054611c1290613b08565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3e90613b08565b8015611c8b5780601f10611c6057610100808354040283529160200191611c8b565b820191906000526020600020905b815481529060010190602001808311611c6e57829003601f168201915b505050505081600060028110611ca457611ca3613ca1565b5b60200201819052506010808054905085611cbe9190613bb4565b81548110611ccf57611cce613ca1565b5b906000526020600020018054611ce490613b08565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613b08565b8015611d5d5780601f10611d3257610100808354040283529160200191611d5d565b820191906000526020600020905b815481529060010190602001808311611d4057829003601f168201915b505050505081600160028110611d7657611d75613ca1565b5b60200201819052506013821415611de25780600060028110611d9b57611d9a613ca1565b5b602002015181600160028110611db457611db3613ca1565b5b602002015184604051602001611dcc9392919061345a565b6040516020818303038152906040529250611e39565b80600060028110611df657611df5613ca1565b5b602002015181600160028110611e0f57611e0e613ca1565b5b602002015184604051602001611e27939291906134ac565b60405160208183030381529060405292505b505b8193505050509392505050565b611e62828260405180602001604052806000815250612432565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f378484846118a0565b611f438484848461248d565b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613634565b60405180910390fd5b50505050565b60606000821415611fd0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120e4565b600082905060005b60008214612002578080611feb90613b6b565b915050600a82611ffb9190613993565b9150611fd8565b60008167ffffffffffffffff81111561201e5761201d613cd0565b5b6040519080825280601f01601f1916602001820160405280156120505781602001600182028036833780820191505090505b5090505b600085146120dd576001826120699190613a1e565b9150600a856120789190613bb4565b6030612084919061393d565b60f81b81838151811061209a57612099613ca1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120d69190613993565b9450612054565b8093505050505b919050565b60606000825190506000811415612112576040518060200160405280600081525091505061227c565b60006003600283612123919061393d565b61212d9190613993565b600461213991906139c4565b9050600060208261214a919061393d565b67ffffffffffffffff81111561216357612162613cd0565b5b6040519080825280601f01601f1916602001820160405280156121955781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614559604091399050600181016020830160005b868110156122395760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506121c0565b50600386066001811461225357600281146122635761226e565b613d3d60f01b600283035261226e565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122f6838383612624565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123395761233481612629565b612378565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612377576123768382612672565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123bb576123b6816127df565b6123fa565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123f9576123f882826128b0565b5b5b505050565b6000816040516020016124129190613381565b6040516020818303038152906040528051906020012060001c9050919050565b61243c838361292f565b612449600084848461248d565b612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f90613634565b60405180910390fd5b505050565b60006124ae8473ffffffffffffffffffffffffffffffffffffffff16612afd565b15612617578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124d7611701565b8786866040518563ffffffff1660e01b81526004016124f9949392919061358b565b602060405180830381600087803b15801561251357600080fd5b505af192505050801561254457506040513d601f19601f820116820180604052508101906125419190612e27565b60015b6125c7573d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b506000815114156125bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b690613634565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061261c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161267f84610c9d565b6126899190613a1e565b905060006007600084815260200190815260200160002054905081811461276e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127f39190613a1e565b905060006009600084815260200190815260200160002054905060006008838154811061282357612822613ca1565b5b90600052602060002001549050806008838154811061284557612844613ca1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061289457612893613c72565b5b6001900381819060005260206000200160009055905550505050565b60006128bb83610c9d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299690613754565b60405180910390fd5b6129a881611695565b156129e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129df90613674565b60405180910390fd5b6129f4600083836122eb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a44919061393d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060c001604052806006905b6060815260200190600190039081612b1f5790505090565b60405180604001604052806002905b6060815260200190600190039081612b465790505090565b6000612b71612b6c846138b4565b61388f565b905082815260208101848484011115612b8d57612b8c613d04565b5b612b98848285613ac6565b509392505050565b600081359050612baf816143d7565b92915050565b600081359050612bc4816143ee565b92915050565b600081359050612bd981614405565b92915050565b600081519050612bee81614405565b92915050565b600082601f830112612c0957612c08613cff565b5b8135612c19848260208601612b5e565b91505092915050565b600081359050612c318161441c565b92915050565b600060208284031215612c4d57612c4c613d0e565b5b6000612c5b84828501612ba0565b91505092915050565b60008060408385031215612c7b57612c7a613d0e565b5b6000612c8985828601612ba0565b9250506020612c9a85828601612ba0565b9150509250929050565b600080600060608486031215612cbd57612cbc613d0e565b5b6000612ccb86828701612ba0565b9350506020612cdc86828701612ba0565b9250506040612ced86828701612c22565b9150509250925092565b60008060008060808587031215612d1157612d10613d0e565b5b6000612d1f87828801612ba0565b9450506020612d3087828801612ba0565b9350506040612d4187828801612c22565b925050606085013567ffffffffffffffff811115612d6257612d61613d09565b5b612d6e87828801612bf4565b91505092959194509250565b60008060408385031215612d9157612d90613d0e565b5b6000612d9f85828601612ba0565b9250506020612db085828601612bb5565b9150509250929050565b60008060408385031215612dd157612dd0613d0e565b5b6000612ddf85828601612ba0565b9250506020612df085828601612c22565b9150509250929050565b600060208284031215612e1057612e0f613d0e565b5b6000612e1e84828501612bca565b91505092915050565b600060208284031215612e3d57612e3c613d0e565b5b6000612e4b84828501612bdf565b91505092915050565b600060208284031215612e6a57612e69613d0e565b5b6000612e7884828501612c22565b91505092915050565b612e8a81613a52565b82525050565b612e9981613a64565b82525050565b6000612eaa826138fa565b612eb48185613910565b9350612ec4818560208601613ad5565b612ecd81613d13565b840191505092915050565b6000612ee382613905565b612eed8185613921565b9350612efd818560208601613ad5565b612f0681613d13565b840191505092915050565b6000612f1c82613905565b612f268185613932565b9350612f36818560208601613ad5565b80840191505092915050565b60008154612f4f81613b08565b612f598186613932565b94506001821660008114612f745760018114612f8557612fb8565b60ff19831686528186019350612fb8565b612f8e856138e5565b60005b83811015612fb057815481890152600182019150602081019050612f91565b838801955050505b50505092915050565b6000612fce602b83613921565b9150612fd982613d24565b604082019050919050565b6000612ff1603283613921565b9150612ffc82613d73565b604082019050919050565b6000613014602683613921565b915061301f82613dc2565b604082019050919050565b6000613037601c83613921565b915061304282613e11565b602082019050919050565b600061305a602483613921565b915061306582613e3a565b604082019050919050565b600061307d601983613921565b915061308882613e89565b602082019050919050565b60006130a0600283613932565b91506130ab82613eb2565b600282019050919050565b60006130c3602c83613921565b91506130ce82613edb565b604082019050919050565b60006130e6607a83613932565b91506130f182613f2a565b607a82019050919050565b6000613109600183613932565b915061311482613fc5565b600182019050919050565b600061312c603883613921565b915061313782613fee565b604082019050919050565b600061314f600183613932565b915061315a8261403d565b600182019050919050565b6000613172602a83613921565b915061317d82614066565b604082019050919050565b6000613195602983613921565b91506131a0826140b5565b604082019050919050565b60006131b8600283613932565b91506131c382614104565b600282019050919050565b60006131db602083613921565b91506131e68261412d565b602082019050919050565b60006131fe601583613932565b915061320982614156565b601582019050919050565b6000613221602c83613921565b915061322c8261417f565b604082019050919050565b6000613244602083613921565b915061324f826141ce565b602082019050919050565b6000613267601083613921565b9150613272826141f7565b602082019050919050565b600061328a602983613921565b915061329582614220565b604082019050919050565b60006132ad602183613921565b91506132b88261426f565b604082019050919050565b60006132d0601d83613932565b91506132db826142be565b601d82019050919050565b60006132f3600383613932565b91506132fe826142e7565b600382019050919050565b6000613316603183613921565b915061332182614310565b604082019050919050565b6000613339602c83613921565b91506133448261435f565b604082019050919050565b600061335c601f83613921565b9150613367826143ae565b602082019050919050565b61337b81613abc565b82525050565b600061338d8284612f11565b915081905092915050565b60006133a48285612f11565b91506133b08284612f11565b91508190509392505050565b60006133c88286612f11565b91506133d48285612f11565b91506133e08284612f11565b9150819050949350505050565b60006133f98287612f11565b91506134058286612f11565b91506134118285612f11565b915061341d8284612f11565b915081905095945050505050565b60006134378285612f11565b9150613442826130fc565b915061344e8284612f42565b91508190509392505050565b600061346582613142565b91506134718286612f11565b915061347c826130fc565b91506134888285612f11565b915061349382613093565b915061349f8284612f11565b9150819050949350505050565b60006134b782613142565b91506134c38286612f11565b91506134ce826130fc565b91506134da8285612f11565b91506134e582613093565b91506134f18284612f11565b91506134fc826132e6565b9150819050949350505050565b6000613514826131f1565b91506135208285612f11565b915061352b826130d9565b91506135378284612f11565b9150613542826131ab565b91508190509392505050565b6000613559826132c3565b91506135658284612f11565b915081905092915050565b60006020820190506135856000830184612e81565b92915050565b60006080820190506135a06000830187612e81565b6135ad6020830186612e81565b6135ba6040830185613372565b81810360608301526135cc8184612e9f565b905095945050505050565b60006020820190506135ec6000830184612e90565b92915050565b6000602082019050818103600083015261360c8184612ed8565b905092915050565b6000602082019050818103600083015261362d81612fc1565b9050919050565b6000602082019050818103600083015261364d81612fe4565b9050919050565b6000602082019050818103600083015261366d81613007565b9050919050565b6000602082019050818103600083015261368d8161302a565b9050919050565b600060208201905081810360008301526136ad8161304d565b9050919050565b600060208201905081810360008301526136cd81613070565b9050919050565b600060208201905081810360008301526136ed816130b6565b9050919050565b6000602082019050818103600083015261370d8161311f565b9050919050565b6000602082019050818103600083015261372d81613165565b9050919050565b6000602082019050818103600083015261374d81613188565b9050919050565b6000602082019050818103600083015261376d816131ce565b9050919050565b6000602082019050818103600083015261378d81613214565b9050919050565b600060208201905081810360008301526137ad81613237565b9050919050565b600060208201905081810360008301526137cd8161325a565b9050919050565b600060208201905081810360008301526137ed8161327d565b9050919050565b6000602082019050818103600083015261380d816132a0565b9050919050565b6000602082019050818103600083015261382d81613309565b9050919050565b6000602082019050818103600083015261384d8161332c565b9050919050565b6000602082019050818103600083015261386d8161334f565b9050919050565b60006020820190506138896000830184613372565b92915050565b60006138996138aa565b90506138a58282613b3a565b919050565b6000604051905090565b600067ffffffffffffffff8211156138cf576138ce613cd0565b5b6138d882613d13565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061394882613abc565b915061395383613abc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561398857613987613be5565b5b828201905092915050565b600061399e82613abc565b91506139a983613abc565b9250826139b9576139b8613c14565b5b828204905092915050565b60006139cf82613abc565b91506139da83613abc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1357613a12613be5565b5b828202905092915050565b6000613a2982613abc565b9150613a3483613abc565b925082821015613a4757613a46613be5565b5b828203905092915050565b6000613a5d82613a9c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613af3578082015181840152602081019050613ad8565b83811115613b02576000848401525b50505050565b60006002820490506001821680613b2057607f821691505b60208210811415613b3457613b33613c43565b5b50919050565b613b4382613d13565b810181811067ffffffffffffffff82111715613b6257613b61613cd0565b5b80604052505050565b6000613b7682613abc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ba957613ba8613be5565b5b600182019050919050565b6000613bbf82613abc565b9150613bca83613abc565b925082613bda57613bd9613c14565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f2220000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022416c69676e6d656e747320666f60008201527f7220616476656e7475726572732e2041726520796f7520676f6f642c2065766960208201527f6c206f7220736f6d657468696e6720656c7365222c2022696d616765223a202260408201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000606082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7b226e616d65223a2022416c69676e6d656e7420230000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f202b310000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6143e081613a52565b81146143eb57600080fd5b50565b6143f781613a64565b811461440257600080fd5b50565b61440e81613a70565b811461441957600080fd5b50565b61442581613abc565b811461443057600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212203bb57d9ca49efb782af17025b23a540ed9dc32d77193c1c3b2d6bb531959034964736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80634f6ccce7116100c3578063a22cb4651161007c578063a22cb465146103b0578063b88d4fde146103cc578063c87b56dd146103e8578063e985e9c514610418578063f0aeab1414610448578063f2fde38b146104785761014d565b80634f6ccce7146102da5780636352211e1461030a57806370a082311461033a578063715018a61461036a5780638da5cb5b1461037457806395d89b41146103925761014d565b806323b872dd1161011557806323b872dd1461020a57806327257c75146102265780632f745c5914610256578063379607f51461028657806342842e0e146102a2578063434f48c4146102be5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806318160ddd146101ec575b600080fd5b61016c60048036038101906101679190612dfa565b610494565b60405161017991906135d7565b60405180910390f35b61018a61050e565b60405161019791906135f2565b60405180910390f35b6101ba60048036038101906101b59190612e54565b6105a0565b6040516101c79190613570565b60405180910390f35b6101ea60048036038101906101e59190612dba565b610625565b005b6101f461073d565b6040516102019190613874565b60405180910390f35b610224600480360381019061021f9190612ca4565b61074a565b005b610240600480360381019061023b9190612e54565b6107aa565b60405161024d91906135f2565b60405180910390f35b610270600480360381019061026b9190612dba565b6108c4565b60405161027d9190613874565b60405180910390f35b6102a0600480360381019061029b9190612e54565b610969565b005b6102bc60048036038101906102b79190612ca4565b610a23565b005b6102d860048036038101906102d39190612e54565b610a43565b005b6102f460048036038101906102ef9190612e54565b610b7a565b6040516103019190613874565b60405180910390f35b610324600480360381019061031f9190612e54565b610beb565b6040516103319190613570565b60405180910390f35b610354600480360381019061034f9190612c37565b610c9d565b6040516103619190613874565b60405180910390f35b610372610d55565b005b61037c610ddd565b6040516103899190613570565b60405180910390f35b61039a610e07565b6040516103a791906135f2565b60405180910390f35b6103ca60048036038101906103c59190612d7a565b610e99565b005b6103e660048036038101906103e19190612cf7565b61101a565b005b61040260048036038101906103fd9190612e54565b61107c565b60405161040f91906135f2565b60405180910390f35b610432600480360381019061042d9190612c64565b61130d565b60405161043f91906135d7565b60405180910390f35b610462600480360381019061045d9190612e54565b6113a1565b60405161046f91906135f2565b60405180910390f35b610492600480360381019061048d9190612c37565b6114bb565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105075750610506826115b3565b5b9050919050565b60606000805461051d90613b08565b80601f016020809104026020016040519081016040528092919081815260200182805461054990613b08565b80156105965780601f1061056b57610100808354040283529160200191610596565b820191906000526020600020905b81548152906001019060200180831161057957829003601f168201915b5050505050905090565b60006105ab82611695565b6105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190613774565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061063082610beb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610698906137f4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166106c0611701565b73ffffffffffffffffffffffffffffffffffffffff1614806106ef57506106ee816106e9611701565b61130d565b5b61072e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610725906136f4565b60405180910390fd5b6107388383611709565b505050565b6000600880549050905090565b61075b610755611701565b826117c2565b61079a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079190613814565b60405180910390fd5b6107a58383836118a0565b505050565b60606108bd826040518060400160405280600981526020017f414c49474e4d454e540000000000000000000000000000000000000000000000815250600d805480602002602001604051908101604052809291908181526020016000905b828210156108b457838290600052602060002001805461082790613b08565b80601f016020809104026020016040519081016040528092919081815260200182805461085390613b08565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b505050505081526020019060010190610808565b50505050611afc565b9050919050565b60006108cf83610c9d565b8210610910576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090790613614565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6002600a5414156109af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a690613854565b60405180910390fd5b6002600a819055506000811180156109c8575061030a81105b610a07576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fe906137b4565b60405180910390fd5b610a18610a12611701565b82611e48565b6001600a8190555050565b610a3e8383836040518060200160405280600081525061101a565b505050565b6002600a541415610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613854565b60405180910390fd5b6002600a81905550610a99611701565b73ffffffffffffffffffffffffffffffffffffffff16610ab7610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0490613794565b60405180910390fd5b61030981118015610b1f575061032181105b610b5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b55906137b4565b60405180910390fd5b610b6f610b69610ddd565b82611e48565b6001600a8190555050565b6000610b8461073d565b8210610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90613834565b60405180910390fd5b60088281548110610bd957610bd8613ca1565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90613734565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0590613714565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d5d611701565b73ffffffffffffffffffffffffffffffffffffffff16610d7b610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890613794565b60405180910390fd5b610ddb6000611e66565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610e1690613b08565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4290613b08565b8015610e8f5780601f10610e6457610100808354040283529160200191610e8f565b820191906000526020600020905b815481529060010190602001808311610e7257829003601f168201915b5050505050905090565b610ea1611701565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f06906136b4565b60405180910390fd5b8060056000610f1c611701565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610fc9611701565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161100e91906135d7565b60405180910390a35050565b61102b611025611701565b836117c2565b61106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106190613814565b60405180910390fd5b61107684848484611f2c565b50505050565b6060611086612b10565b60405180610120016040528060fd815260200161445c60fd9139816000600681106110b4576110b3613ca1565b5b60200201819052506110c5836113a1565b816001600681106110d9576110d8613ca1565b5b6020020181905250604051806060016040528060288152602001614599602891398160026006811061110e5761110d613ca1565b5b602002018190525061111f836107aa565b8160036006811061113357611132613ca1565b5b6020020181905250604051806060016040528060288152602001614434602891398160046006811061116857611167613ca1565b5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000815250816005600681106111ba576111b9613ca1565b5b60200201819052506000816000600681106111d8576111d7613ca1565b5b6020020151826001600681106111f1576111f0613ca1565b5b60200201518360026006811061120a57611209613ca1565b5b6020020151604051602001611221939291906133bc565b6040516020818303038152906040529050808260036006811061124757611246613ca1565b5b6020020151836004600681106112605761125f613ca1565b5b60200201518460056006811061127957611278613ca1565b5b602002015160405160200161129194939291906133ed565b604051602081830303815290604052905060006112de6112b086611f88565b6112b9846120e9565b6040516020016112ca929190613509565b6040516020818303038152906040526120e9565b9050806040516020016112f1919061354e565b6040516020818303038152906040529150819350505050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606114b4826040518060400160405280600481526020017f42454e4400000000000000000000000000000000000000000000000000000000815250600c805480602002602001604051908101604052809291908181526020016000905b828210156114ab57838290600052602060002001805461141e90613b08565b80601f016020809104026020016040519081016040528092919081815260200182805461144a90613b08565b80156114975780601f1061146c57610100808354040283529160200191611497565b820191906000526020600020905b81548152906001019060200180831161147a57829003601f168201915b5050505050815260200190600101906113ff565b50505050611afc565b9050919050565b6114c3611701565b73ffffffffffffffffffffffffffffffffffffffff166114e1610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614611537576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152e90613794565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90613654565b60405180910390fd5b6115b081611e66565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061167e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061168e575061168d82612281565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661177c83610beb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117cd82611695565b61180c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611803906136d4565b60405180910390fd5b600061181783610beb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061188657508373ffffffffffffffffffffffffffffffffffffffff1661186e846105a0565b73ffffffffffffffffffffffffffffffffffffffff16145b806118975750611896818561130d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118c082610beb565b73ffffffffffffffffffffffffffffffffffffffff1614611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d906137d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197d90613694565b60405180910390fd5b6119918383836122eb565b61199c600082611709565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ec9190613a1e565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a43919061393d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000611b3284611b0d87611f88565b604051602001611b1e929190613398565b6040516020818303038152906040526123ff565b9050600083845183611b449190613bb4565b81518110611b5557611b54613ca1565b5b602002602001015190506000601583611b6e9190613bb4565b9050600e811115611bca5781600e808054905085611b8c9190613bb4565b81548110611b9d57611b9c613ca1565b5b90600052602060002001604051602001611bb892919061342b565b60405160208183030381529060405291505b60138110611e3b57611bda612b37565b600f808054905085611bec9190613bb4565b81548110611bfd57611bfc613ca1565b5b906000526020600020018054611c1290613b08565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3e90613b08565b8015611c8b5780601f10611c6057610100808354040283529160200191611c8b565b820191906000526020600020905b815481529060010190602001808311611c6e57829003601f168201915b505050505081600060028110611ca457611ca3613ca1565b5b60200201819052506010808054905085611cbe9190613bb4565b81548110611ccf57611cce613ca1565b5b906000526020600020018054611ce490613b08565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1090613b08565b8015611d5d5780601f10611d3257610100808354040283529160200191611d5d565b820191906000526020600020905b815481529060010190602001808311611d4057829003601f168201915b505050505081600160028110611d7657611d75613ca1565b5b60200201819052506013821415611de25780600060028110611d9b57611d9a613ca1565b5b602002015181600160028110611db457611db3613ca1565b5b602002015184604051602001611dcc9392919061345a565b6040516020818303038152906040529250611e39565b80600060028110611df657611df5613ca1565b5b602002015181600160028110611e0f57611e0e613ca1565b5b602002015184604051602001611e27939291906134ac565b60405160208183030381529060405292505b505b8193505050509392505050565b611e62828260405180602001604052806000815250612432565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f378484846118a0565b611f438484848461248d565b611f82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7990613634565b60405180910390fd5b50505050565b60606000821415611fd0576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506120e4565b600082905060005b60008214612002578080611feb90613b6b565b915050600a82611ffb9190613993565b9150611fd8565b60008167ffffffffffffffff81111561201e5761201d613cd0565b5b6040519080825280601f01601f1916602001820160405280156120505781602001600182028036833780820191505090505b5090505b600085146120dd576001826120699190613a1e565b9150600a856120789190613bb4565b6030612084919061393d565b60f81b81838151811061209a57612099613ca1565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856120d69190613993565b9450612054565b8093505050505b919050565b60606000825190506000811415612112576040518060200160405280600081525091505061227c565b60006003600283612123919061393d565b61212d9190613993565b600461213991906139c4565b9050600060208261214a919061393d565b67ffffffffffffffff81111561216357612162613cd0565b5b6040519080825280601f01601f1916602001820160405280156121955781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614559604091399050600181016020830160005b868110156122395760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506121c0565b50600386066001811461225357600281146122635761226e565b613d3d60f01b600283035261226e565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122f6838383612624565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123395761233481612629565b612378565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612377576123768382612672565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123bb576123b6816127df565b6123fa565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146123f9576123f882826128b0565b5b5b505050565b6000816040516020016124129190613381565b6040516020818303038152906040528051906020012060001c9050919050565b61243c838361292f565b612449600084848461248d565b612488576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247f90613634565b60405180910390fd5b505050565b60006124ae8473ffffffffffffffffffffffffffffffffffffffff16612afd565b15612617578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124d7611701565b8786866040518563ffffffff1660e01b81526004016124f9949392919061358b565b602060405180830381600087803b15801561251357600080fd5b505af192505050801561254457506040513d601f19601f820116820180604052508101906125419190612e27565b60015b6125c7573d8060008114612574576040519150601f19603f3d011682016040523d82523d6000602084013e612579565b606091505b506000815114156125bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b690613634565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061261c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161267f84610c9d565b6126899190613a1e565b905060006007600084815260200190815260200160002054905081811461276e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127f39190613a1e565b905060006009600084815260200190815260200160002054905060006008838154811061282357612822613ca1565b5b90600052602060002001549050806008838154811061284557612844613ca1565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061289457612893613c72565b5b6001900381819060005260206000200160009055905550505050565b60006128bb83610c9d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561299f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299690613754565b60405180910390fd5b6129a881611695565b156129e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129df90613674565b60405180910390fd5b6129f4600083836122eb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a44919061393d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6040518060c001604052806006905b6060815260200190600190039081612b1f5790505090565b60405180604001604052806002905b6060815260200190600190039081612b465790505090565b6000612b71612b6c846138b4565b61388f565b905082815260208101848484011115612b8d57612b8c613d04565b5b612b98848285613ac6565b509392505050565b600081359050612baf816143d7565b92915050565b600081359050612bc4816143ee565b92915050565b600081359050612bd981614405565b92915050565b600081519050612bee81614405565b92915050565b600082601f830112612c0957612c08613cff565b5b8135612c19848260208601612b5e565b91505092915050565b600081359050612c318161441c565b92915050565b600060208284031215612c4d57612c4c613d0e565b5b6000612c5b84828501612ba0565b91505092915050565b60008060408385031215612c7b57612c7a613d0e565b5b6000612c8985828601612ba0565b9250506020612c9a85828601612ba0565b9150509250929050565b600080600060608486031215612cbd57612cbc613d0e565b5b6000612ccb86828701612ba0565b9350506020612cdc86828701612ba0565b9250506040612ced86828701612c22565b9150509250925092565b60008060008060808587031215612d1157612d10613d0e565b5b6000612d1f87828801612ba0565b9450506020612d3087828801612ba0565b9350506040612d4187828801612c22565b925050606085013567ffffffffffffffff811115612d6257612d61613d09565b5b612d6e87828801612bf4565b91505092959194509250565b60008060408385031215612d9157612d90613d0e565b5b6000612d9f85828601612ba0565b9250506020612db085828601612bb5565b9150509250929050565b60008060408385031215612dd157612dd0613d0e565b5b6000612ddf85828601612ba0565b9250506020612df085828601612c22565b9150509250929050565b600060208284031215612e1057612e0f613d0e565b5b6000612e1e84828501612bca565b91505092915050565b600060208284031215612e3d57612e3c613d0e565b5b6000612e4b84828501612bdf565b91505092915050565b600060208284031215612e6a57612e69613d0e565b5b6000612e7884828501612c22565b91505092915050565b612e8a81613a52565b82525050565b612e9981613a64565b82525050565b6000612eaa826138fa565b612eb48185613910565b9350612ec4818560208601613ad5565b612ecd81613d13565b840191505092915050565b6000612ee382613905565b612eed8185613921565b9350612efd818560208601613ad5565b612f0681613d13565b840191505092915050565b6000612f1c82613905565b612f268185613932565b9350612f36818560208601613ad5565b80840191505092915050565b60008154612f4f81613b08565b612f598186613932565b94506001821660008114612f745760018114612f8557612fb8565b60ff19831686528186019350612fb8565b612f8e856138e5565b60005b83811015612fb057815481890152600182019150602081019050612f91565b838801955050505b50505092915050565b6000612fce602b83613921565b9150612fd982613d24565b604082019050919050565b6000612ff1603283613921565b9150612ffc82613d73565b604082019050919050565b6000613014602683613921565b915061301f82613dc2565b604082019050919050565b6000613037601c83613921565b915061304282613e11565b602082019050919050565b600061305a602483613921565b915061306582613e3a565b604082019050919050565b600061307d601983613921565b915061308882613e89565b602082019050919050565b60006130a0600283613932565b91506130ab82613eb2565b600282019050919050565b60006130c3602c83613921565b91506130ce82613edb565b604082019050919050565b60006130e6607a83613932565b91506130f182613f2a565b607a82019050919050565b6000613109600183613932565b915061311482613fc5565b600182019050919050565b600061312c603883613921565b915061313782613fee565b604082019050919050565b600061314f600183613932565b915061315a8261403d565b600182019050919050565b6000613172602a83613921565b915061317d82614066565b604082019050919050565b6000613195602983613921565b91506131a0826140b5565b604082019050919050565b60006131b8600283613932565b91506131c382614104565b600282019050919050565b60006131db602083613921565b91506131e68261412d565b602082019050919050565b60006131fe601583613932565b915061320982614156565b601582019050919050565b6000613221602c83613921565b915061322c8261417f565b604082019050919050565b6000613244602083613921565b915061324f826141ce565b602082019050919050565b6000613267601083613921565b9150613272826141f7565b602082019050919050565b600061328a602983613921565b915061329582614220565b604082019050919050565b60006132ad602183613921565b91506132b88261426f565b604082019050919050565b60006132d0601d83613932565b91506132db826142be565b601d82019050919050565b60006132f3600383613932565b91506132fe826142e7565b600382019050919050565b6000613316603183613921565b915061332182614310565b604082019050919050565b6000613339602c83613921565b91506133448261435f565b604082019050919050565b600061335c601f83613921565b9150613367826143ae565b602082019050919050565b61337b81613abc565b82525050565b600061338d8284612f11565b915081905092915050565b60006133a48285612f11565b91506133b08284612f11565b91508190509392505050565b60006133c88286612f11565b91506133d48285612f11565b91506133e08284612f11565b9150819050949350505050565b60006133f98287612f11565b91506134058286612f11565b91506134118285612f11565b915061341d8284612f11565b915081905095945050505050565b60006134378285612f11565b9150613442826130fc565b915061344e8284612f42565b91508190509392505050565b600061346582613142565b91506134718286612f11565b915061347c826130fc565b91506134888285612f11565b915061349382613093565b915061349f8284612f11565b9150819050949350505050565b60006134b782613142565b91506134c38286612f11565b91506134ce826130fc565b91506134da8285612f11565b91506134e582613093565b91506134f18284612f11565b91506134fc826132e6565b9150819050949350505050565b6000613514826131f1565b91506135208285612f11565b915061352b826130d9565b91506135378284612f11565b9150613542826131ab565b91508190509392505050565b6000613559826132c3565b91506135658284612f11565b915081905092915050565b60006020820190506135856000830184612e81565b92915050565b60006080820190506135a06000830187612e81565b6135ad6020830186612e81565b6135ba6040830185613372565b81810360608301526135cc8184612e9f565b905095945050505050565b60006020820190506135ec6000830184612e90565b92915050565b6000602082019050818103600083015261360c8184612ed8565b905092915050565b6000602082019050818103600083015261362d81612fc1565b9050919050565b6000602082019050818103600083015261364d81612fe4565b9050919050565b6000602082019050818103600083015261366d81613007565b9050919050565b6000602082019050818103600083015261368d8161302a565b9050919050565b600060208201905081810360008301526136ad8161304d565b9050919050565b600060208201905081810360008301526136cd81613070565b9050919050565b600060208201905081810360008301526136ed816130b6565b9050919050565b6000602082019050818103600083015261370d8161311f565b9050919050565b6000602082019050818103600083015261372d81613165565b9050919050565b6000602082019050818103600083015261374d81613188565b9050919050565b6000602082019050818103600083015261376d816131ce565b9050919050565b6000602082019050818103600083015261378d81613214565b9050919050565b600060208201905081810360008301526137ad81613237565b9050919050565b600060208201905081810360008301526137cd8161325a565b9050919050565b600060208201905081810360008301526137ed8161327d565b9050919050565b6000602082019050818103600083015261380d816132a0565b9050919050565b6000602082019050818103600083015261382d81613309565b9050919050565b6000602082019050818103600083015261384d8161332c565b9050919050565b6000602082019050818103600083015261386d8161334f565b9050919050565b60006020820190506138896000830184613372565b92915050565b60006138996138aa565b90506138a58282613b3a565b919050565b6000604051905090565b600067ffffffffffffffff8211156138cf576138ce613cd0565b5b6138d882613d13565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061394882613abc565b915061395383613abc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561398857613987613be5565b5b828201905092915050565b600061399e82613abc565b91506139a983613abc565b9250826139b9576139b8613c14565b5b828204905092915050565b60006139cf82613abc565b91506139da83613abc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a1357613a12613be5565b5b828202905092915050565b6000613a2982613abc565b9150613a3483613abc565b925082821015613a4757613a46613be5565b5b828203905092915050565b6000613a5d82613a9c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613af3578082015181840152602081019050613ad8565b83811115613b02576000848401525b50505050565b60006002820490506001821680613b2057607f821691505b60208210811415613b3457613b33613c43565b5b50919050565b613b4382613d13565b810181811067ffffffffffffffff82111715613b6257613b61613cd0565b5b80604052505050565b6000613b7682613abc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613ba957613ba8613be5565b5b600182019050919050565b6000613bbf82613abc565b9150613bca83613abc565b925082613bda57613bd9613c14565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f2220000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a2022416c69676e6d656e747320666f60008201527f7220616476656e7475726572732e2041726520796f7520676f6f642c2065766960208201527f6c206f7220736f6d657468696e6720656c7365222c2022696d616765223a202260408201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000606082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f2200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f7b226e616d65223a2022416c69676e6d656e7420230000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f202b310000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6143e081613a52565b81146143eb57600080fd5b50565b6143f781613a64565b811461440257600080fd5b50565b61440e81613a70565b811461441957600080fd5b50565b61442581613abc565b811461443057600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212203bb57d9ca49efb782af17025b23a540ed9dc32d77193c1c3b2d6bb531959034964736f6c63430008070033
Deployed Bytecode Sourcemap
44500:4367:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38350:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25464:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27023:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26546:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38990:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27913:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45314:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38658:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47680:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28323:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47863:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39180:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25158:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24888:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9856:94;;;:::i;:::-;;9205:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25633:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27316:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28579:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46443:1229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27682:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45178:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10105:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38350:224;38452:4;38491:35;38476:50;;;:11;:50;;;;:90;;;;38530:36;38554:11;38530:23;:36::i;:::-;38476:90;38469:97;;38350:224;;;:::o;25464:100::-;25518:13;25551:5;25544:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25464:100;:::o;27023:221::-;27099:7;27127:16;27135:7;27127;:16::i;:::-;27119:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27212:15;:24;27228:7;27212:24;;;;;;;;;;;;;;;;;;;;;27205:31;;27023:221;;;:::o;26546:411::-;26627:13;26643:23;26658:7;26643:14;:23::i;:::-;26627:39;;26691:5;26685:11;;:2;:11;;;;26677:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26785:5;26769:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26794:37;26811:5;26818:12;:10;:12::i;:::-;26794:16;:37::i;:::-;26769:62;26747:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26928:21;26937:2;26941:7;26928:8;:21::i;:::-;26616:341;26546:411;;:::o;38990:113::-;39051:7;39078:10;:17;;;;39071:24;;38990:113;:::o;27913:339::-;28108:41;28127:12;:10;:12::i;:::-;28141:7;28108:18;:41::i;:::-;28100:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28216:28;28226:4;28232:2;28236:7;28216:9;:28::i;:::-;27913:339;;;:::o;45314:139::-;45374:13;45407:38;45413:7;45407:38;;;;;;;;;;;;;;;;;45435:9;45407:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:38::i;:::-;45400:45;;45314:139;;;:::o;38658:256::-;38755:7;38791:23;38808:5;38791:16;:23::i;:::-;38783:5;:31;38775:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38880:12;:19;38893:5;38880:19;;;;;;;;;;;;;;;:26;38900:5;38880:26;;;;;;;;;;;;38873:33;;38658:256;;;;:::o;47680:171::-;12144:1;12740:7;;:19;;12732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12144:1;12873:7;:18;;;;47761:1:::1;47751:7;:11;:28;;;;;47776:3;47766:7;:13;47751:28;47743:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47811:32;47821:12;:10;:12::i;:::-;47835:7;47811:9;:32::i;:::-;12100:1:::0;13052:7;:22;;;;47680:171;:::o;28323:185::-;28461:39;28478:4;28484:2;28488:7;28461:39;;;;;;;;;;;;:16;:39::i;:::-;28323:185;;;:::o;47863:183::-;12144:1;12740:7;;:19;;12732:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12144:1;12873:7;:18;;;;9436:12:::1;:10;:12::i;:::-;9425:23;;:7;:5;:7::i;:::-;:23;;;9417:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47959:3:::2;47949:7;:13;:30;;;;;47976:3;47966:7;:13;47949:30;47941:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;48011:27;48021:7;:5;:7::i;:::-;48030;48011:9;:27::i;:::-;12100:1:::0;13052:7;:22;;;;47863:183;:::o;39180:233::-;39255:7;39291:30;:28;:30::i;:::-;39283:5;:38;39275:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39388:10;39399:5;39388:17;;;;;;;;:::i;:::-;;;;;;;;;;39381:24;;39180:233;;;:::o;25158:239::-;25230:7;25250:13;25266:7;:16;25274:7;25266:16;;;;;;;;;;;;;;;;;;;;;25250:32;;25318:1;25301:19;;:5;:19;;;;25293:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25384:5;25377:12;;;25158:239;;;:::o;24888:208::-;24960:7;25005:1;24988:19;;:5;:19;;;;24980:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25072:9;:16;25082:5;25072:16;;;;;;;;;;;;;;;;25065:23;;24888:208;;;:::o;9856:94::-;9436:12;:10;:12::i;:::-;9425:23;;:7;:5;:7::i;:::-;:23;;;9417:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9921:21:::1;9939:1;9921:9;:21::i;:::-;9856:94::o:0;9205:87::-;9251:7;9278:6;;;;;;;;;;;9271:13;;9205:87;:::o;25633:104::-;25689:13;25722:7;25715:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25633:104;:::o;27316:295::-;27431:12;:10;:12::i;:::-;27419:24;;:8;:24;;;;27411:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27531:8;27486:18;:32;27505:12;:10;:12::i;:::-;27486:32;;;;;;;;;;;;;;;:42;27519:8;27486:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27584:8;27555:48;;27570:12;:10;:12::i;:::-;27555:48;;;27594:8;27555:48;;;;;;:::i;:::-;;;;;;;;27316:295;;:::o;28579:328::-;28754:41;28773:12;:10;:12::i;:::-;28787:7;28754:18;:41::i;:::-;28746:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28860:39;28874:4;28880:2;28884:7;28893:5;28860:13;:39::i;:::-;28579:328;;;;:::o;46443:1229::-;46508:13;46534:22;;:::i;:::-;46567:266;;;;;;;;;;;;;;;;;:5;46573:1;46567:8;;;;;;;:::i;:::-;;;;;:266;;;;46857:16;46865:7;46857;:16::i;:::-;46846:5;46852:1;46846:8;;;;;;;:::i;:::-;;;;;:27;;;;46886:53;;;;;;;;;;;;;;;;;:5;46892:1;46886:8;;;;;;;:::i;:::-;;;;;:53;;;;46963:21;46976:7;46963:12;:21::i;:::-;46952:5;46958:1;46952:8;;;;;;;:::i;:::-;;;;;:32;;;;46997:53;;;;;;;;;;;;;;;;;:5;47003:1;46997:8;;;;;;;:::i;:::-;;;;;:53;;;;47063:26;;;;;;;;;;;;;;;;;:5;47069:1;47063:8;;;;;;;:::i;:::-;;;;;:26;;;;47102:20;47149:5;47155:1;47149:8;;;;;;;:::i;:::-;;;;;;47159:5;47165:1;47159:8;;;;;;;:::i;:::-;;;;;;47169:5;47175:1;47169:8;;;;;;;:::i;:::-;;;;;;47132:46;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47102:77;;47223:6;47231:5;47237:1;47231:8;;;;;;;:::i;:::-;;;;;;47241:5;47247:1;47241:8;;;;;;;:::i;:::-;;;;;;47251:5;47257:1;47251:8;;;;;;;:::i;:::-;;;;;;47206:54;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47190:71;;47282:18;47303:252;47372:17;47381:7;47372:8;:17::i;:::-;47517:28;47537:6;47517:13;:28::i;:::-;47330:222;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47303:13;:252::i;:::-;47282:273;;47632:4;47582:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;47566:72;;47658:6;47651:13;;;;;46443:1229;;;:::o;27682:164::-;27779:4;27803:18;:25;27822:5;27803:25;;;;;;;;;;;;;;;:35;27829:8;27803:35;;;;;;;;;;;;;;;;;;;;;;;;;27796:42;;27682:164;;;;:::o;45178:124::-;45233:13;45266:28;45272:7;45266:28;;;;;;;;;;;;;;;;;45289:4;45266:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:28::i;:::-;45259:35;;45178:124;;;:::o;10105:192::-;9436:12;:10;:12::i;:::-;9425:23;;:7;:5;:7::i;:::-;:23;;;9417:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10214:1:::1;10194:22;;:8;:22;;;;10186:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10270:19;10280:8;10270:9;:19::i;:::-;10105:192:::0;:::o;24519:305::-;24621:4;24673:25;24658:40;;;:11;:40;;;;:105;;;;24730:33;24715:48;;;:11;:48;;;;24658:105;:158;;;;24780:36;24804:11;24780:23;:36::i;:::-;24658:158;24638:178;;24519:305;;;:::o;30417:127::-;30482:4;30534:1;30506:30;;:7;:16;30514:7;30506:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30499:37;;30417:127;;;:::o;8065:98::-;8118:7;8145:10;8138:17;;8065:98;:::o;34399:174::-;34501:2;34474:15;:24;34490:7;34474:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34557:7;34553:2;34519:46;;34528:23;34543:7;34528:14;:23::i;:::-;34519:46;;;;;;;;;;;;34399:174;;:::o;30711:348::-;30804:4;30829:16;30837:7;30829;:16::i;:::-;30821:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30905:13;30921:23;30936:7;30921:14;:23::i;:::-;30905:39;;30974:5;30963:16;;:7;:16;;;:51;;;;31007:7;30983:31;;:20;30995:7;30983:11;:20::i;:::-;:31;;;30963:51;:87;;;;31018:32;31035:5;31042:7;31018:16;:32::i;:::-;30963:87;30955:96;;;30711:348;;;;:::o;33703:578::-;33862:4;33835:31;;:23;33850:7;33835:14;:23::i;:::-;:31;;;33827:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33945:1;33931:16;;:2;:16;;;;33923:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34001:39;34022:4;34028:2;34032:7;34001:20;:39::i;:::-;34105:29;34122:1;34126:7;34105:8;:29::i;:::-;34166:1;34147:9;:15;34157:4;34147:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34195:1;34178:9;:13;34188:2;34178:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34226:2;34207:7;:16;34215:7;34207:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34265:7;34261:2;34246:27;;34255:4;34246:27;;;;;;;;;;;;33703:578;;;:::o;45465:970::-;45574:13;45600:12;45615:62;45646:9;45657:17;45666:7;45657:8;:17::i;:::-;45629:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45615:6;:62::i;:::-;45600:77;;45688:20;45711:11;45730;:18;45723:4;:25;;;;:::i;:::-;45711:38;;;;;;;;:::i;:::-;;;;;;;;45688:61;;45760:17;45787:2;45780:4;:9;;;;:::i;:::-;45760:29;;45816:2;45804:9;:14;45800:127;;;45868:6;45881:8;45897;:15;;;;45890:4;:22;;;;:::i;:::-;45881:32;;;;;;;;:::i;:::-;;;;;;;;;45851:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45835:80;;45800:127;45954:2;45941:9;:15;45937:467;;45973:21;;:::i;:::-;46019:12;46039;:19;;;;46032:4;:26;;;;:::i;:::-;46019:40;;;;;;;;:::i;:::-;;;;;;;;;46009:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;46014:1;46009:7;;;;;;;:::i;:::-;;;;;:50;;;;46084:12;46104;:19;;;;46097:4;:26;;;;:::i;:::-;46084:40;;;;;;;;:::i;:::-;;;;;;;;;46074:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;46079:1;46074:7;;;;;;;:::i;:::-;;;;;:50;;;;46156:2;46143:9;:15;46139:254;;;46217:4;46222:1;46217:7;;;;;;;:::i;:::-;;;;;;46231:4;46236:1;46231:7;;;;;;;:::i;:::-;;;;;;46246:6;46195:58;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46179:75;;46139:254;;;46333:4;46338:1;46333:7;;;;;;;:::i;:::-;;;;;;46347:4;46352:1;46347:7;;;;;;;:::i;:::-;;;;;;46362:6;46311:65;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46295:82;;46139:254;45958:446;45937:467;46421:6;46414:13;;;;;45465:970;;;;;:::o;31401:110::-;31477:26;31487:2;31491:7;31477:26;;;;;;;;;;;;:9;:26::i;:::-;31401:110;;:::o;10305:173::-;10361:16;10380:6;;;;;;;;;;;10361:25;;10406:8;10397:6;;:17;;;;;;;;;;;;;;;;;;10461:8;10430:40;;10451:8;10430:40;;;;;;;;;;;;10350:128;10305:173;:::o;29789:315::-;29946:28;29956:4;29962:2;29966:7;29946:9;:28::i;:::-;29993:48;30016:4;30022:2;30026:7;30035:5;29993:22;:48::i;:::-;29985:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29789:315;;;;:::o;48058:715::-;48114:13;48336:1;48327:5;:10;48323:53;;;48354:10;;;;;;;;;;;;;;;;;;;;;48323:53;48386:12;48401:5;48386:20;;48417:14;48442:78;48457:1;48449:4;:9;48442:78;;48475:8;;;;;:::i;:::-;;;;48506:2;48498:10;;;;;:::i;:::-;;;48442:78;;;48530:19;48562:6;48552:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48530:39;;48580:154;48596:1;48587:5;:10;48580:154;;48624:1;48614:11;;;;;:::i;:::-;;;48691:2;48683:5;:10;;;;:::i;:::-;48670:2;:24;;;;:::i;:::-;48657:39;;48640:6;48647;48640:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;48720:2;48711:11;;;;;:::i;:::-;;;48580:154;;;48758:6;48744:21;;;;;48058:715;;;;:::o;49218:1607::-;49276:13;49302:11;49316:4;:11;49302:25;;49349:1;49342:3;:8;49338:23;;;49352:9;;;;;;;;;;;;;;;;;49338:23;49413:18;49451:1;49446;49440:3;:7;;;;:::i;:::-;49439:13;;;;:::i;:::-;49434:1;:19;;;;:::i;:::-;49413:40;;49511:19;49556:2;49543:10;:15;;;;:::i;:::-;49533:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49511:48;;49572:18;49593:5;;;;;;;;;;;;;;;;;49572:26;;49662:1;49655:5;49651:13;49707:2;49699:6;49695:15;49758:1;49726:777;49781:3;49778:1;49775:10;49726:777;;;49836:1;49833;49829:9;49824:14;;49894:8;49889:1;49883:4;49879:12;49873:19;49869:34;49974:4;49966:5;49962:2;49958:14;49954:25;49944:8;49940:40;49934:47;50013:3;50010:1;50006:11;49999:18;;50104:4;50095;50087:5;50083:2;50079:14;50075:25;50065:8;50061:40;50055:47;50051:58;50046:3;50042:68;50035:75;;50142:3;50139:1;50135:11;50128:18;;50232:4;50223;50215:5;50212:1;50208:13;50204:24;50194:8;50190:39;50184:46;50180:57;50175:3;50171:67;50164:74;;50270:3;50267:1;50263:11;50256:18;;50352:4;50343;50336:5;50332:16;50322:8;50318:31;50312:38;50308:49;50303:3;50299:59;50292:66;;50392:3;50387;50383:13;50376:20;;50434:3;50423:9;50416:22;50486:1;50475:9;50471:17;50458:30;;49805:698;;49726:777;;;49730:44;50535:1;50530:3;50526:11;50556:1;50551:84;;;;50654:1;50649:82;;;;50519:212;;50551:84;50612:6;50607:3;50603:16;50599:1;50588:9;50584:17;50577:43;50551:84;;50649:82;50710:4;50705:3;50701:14;50697:1;50686:9;50682:17;50675:41;50519:212;;50762:10;50754:6;50747:26;49620:1164;;50810:6;50796:21;;;;;;49218:1607;;;;:::o;23126:157::-;23211:4;23250:25;23235:40;;;:11;:40;;;;23228:47;;23126:157;;;:::o;40026:589::-;40170:45;40197:4;40203:2;40207:7;40170:26;:45::i;:::-;40248:1;40232:18;;:4;:18;;;40228:187;;;40267:40;40299:7;40267:31;:40::i;:::-;40228:187;;;40337:2;40329:10;;:4;:10;;;40325:90;;40356:47;40389:4;40395:7;40356:32;:47::i;:::-;40325:90;40228:187;40443:1;40429:16;;:2;:16;;;40425:183;;;40462:45;40499:7;40462:36;:45::i;:::-;40425:183;;;40535:4;40529:10;;:2;:10;;;40525:83;;40556:40;40584:2;40588:7;40556:27;:40::i;:::-;40525:83;40425:183;40026:589;;;:::o;45028:138::-;45088:7;45150:5;45133:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;45123:34;;;;;;45115:43;;45108:50;;45028:138;;;:::o;31738:321::-;31868:18;31874:2;31878:7;31868:5;:18::i;:::-;31919:54;31950:1;31954:2;31958:7;31967:5;31919:22;:54::i;:::-;31897:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31738:321;;;:::o;35138:803::-;35293:4;35314:15;:2;:13;;;:15::i;:::-;35310:624;;;35366:2;35350:36;;;35387:12;:10;:12::i;:::-;35401:4;35407:7;35416:5;35350:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35346:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35613:1;35596:6;:13;:18;35592:272;;;35639:60;;;;;;;;;;:::i;:::-;;;;;;;;35592:272;35814:6;35808:13;35799:6;35795:2;35791:15;35784:38;35346:533;35483:45;;;35473:55;;;:6;:55;;;;35466:62;;;;;35310:624;35918:4;35911:11;;35138:803;;;;;;;:::o;36513:126::-;;;;:::o;41338:164::-;41442:10;:17;;;;41415:15;:24;41431:7;41415:24;;;;;;;;;;;:44;;;;41470:10;41486:7;41470:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41338:164;:::o;42129:988::-;42395:22;42445:1;42420:22;42437:4;42420:16;:22::i;:::-;:26;;;;:::i;:::-;42395:51;;42457:18;42478:17;:26;42496:7;42478:26;;;;;;;;;;;;42457:47;;42625:14;42611:10;:28;42607:328;;42656:19;42678:12;:18;42691:4;42678:18;;;;;;;;;;;;;;;:34;42697:14;42678:34;;;;;;;;;;;;42656:56;;42762:11;42729:12;:18;42742:4;42729:18;;;;;;;;;;;;;;;:30;42748:10;42729:30;;;;;;;;;;;:44;;;;42879:10;42846:17;:30;42864:11;42846:30;;;;;;;;;;;:43;;;;42641:294;42607:328;43031:17;:26;43049:7;43031:26;;;;;;;;;;;43024:33;;;43075:12;:18;43088:4;43075:18;;;;;;;;;;;;;;;:34;43094:14;43075:34;;;;;;;;;;;43068:41;;;42210:907;;42129:988;;:::o;43412:1079::-;43665:22;43710:1;43690:10;:17;;;;:21;;;;:::i;:::-;43665:46;;43722:18;43743:15;:24;43759:7;43743:24;;;;;;;;;;;;43722:45;;44094:19;44116:10;44127:14;44116:26;;;;;;;;:::i;:::-;;;;;;;;;;44094:48;;44180:11;44155:10;44166;44155:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;44291:10;44260:15;:28;44276:11;44260:28;;;;;;;;;;;:41;;;;44432:15;:24;44448:7;44432:24;;;;;;;;;;;44425:31;;;44467:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;43483:1008;;;43412:1079;:::o;40916:221::-;41001:14;41018:20;41035:2;41018:16;:20::i;:::-;41001:37;;41076:7;41049:12;:16;41062:2;41049:16;;;;;;;;;;;;;;;:24;41066:6;41049:24;;;;;;;;;;;:34;;;;41123:6;41094:17;:26;41112:7;41094:26;;;;;;;;;;;:35;;;;40990:147;40916:221;;:::o;32395:382::-;32489:1;32475:16;;:2;:16;;;;32467:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32548:16;32556:7;32548;:16::i;:::-;32547:17;32539:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32610:45;32639:1;32643:2;32647:7;32610:20;:45::i;:::-;32685:1;32668:9;:13;32678:2;32668:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32716:2;32697:7;:16;32705:7;32697:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32761:7;32757:2;32736:33;;32753:1;32736:33;;;;;;;;;;;;32395:382;;:::o;15298:387::-;15358:4;15566:12;15633:7;15621:20;15613:28;;15676:1;15669:4;:8;15662:15;;;15298:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7247:845::-;7350:3;7387:5;7381:12;7416:36;7442:9;7416:36;:::i;:::-;7468:89;7550:6;7545:3;7468:89;:::i;:::-;7461:96;;7588:1;7577:9;7573:17;7604:1;7599:137;;;;7750:1;7745:341;;;;7566:520;;7599:137;7683:4;7679:9;7668;7664:25;7659:3;7652:38;7719:6;7714:3;7710:16;7703:23;;7599:137;;7745:341;7812:38;7844:5;7812:38;:::i;:::-;7872:1;7886:154;7900:6;7897:1;7894:13;7886:154;;;7974:7;7968:14;7964:1;7959:3;7955:11;7948:35;8024:1;8015:7;8011:15;8000:26;;7922:4;7919:1;7915:12;7910:17;;7886:154;;;8069:6;8064:3;8060:16;8053:23;;7752:334;;7566:520;;7354:738;;7247:845;;;;:::o;8098:366::-;8240:3;8261:67;8325:2;8320:3;8261:67;:::i;:::-;8254:74;;8337:93;8426:3;8337:93;:::i;:::-;8455:2;8450:3;8446:12;8439:19;;8098:366;;;:::o;8470:::-;8612:3;8633:67;8697:2;8692:3;8633:67;:::i;:::-;8626:74;;8709:93;8798:3;8709:93;:::i;:::-;8827:2;8822:3;8818:12;8811:19;;8470:366;;;:::o;8842:::-;8984:3;9005:67;9069:2;9064:3;9005:67;:::i;:::-;8998:74;;9081:93;9170:3;9081:93;:::i;:::-;9199:2;9194:3;9190:12;9183:19;;8842:366;;;:::o;9214:::-;9356:3;9377:67;9441:2;9436:3;9377:67;:::i;:::-;9370:74;;9453:93;9542:3;9453:93;:::i;:::-;9571:2;9566:3;9562:12;9555:19;;9214:366;;;:::o;9586:::-;9728:3;9749:67;9813:2;9808:3;9749:67;:::i;:::-;9742:74;;9825:93;9914:3;9825:93;:::i;:::-;9943:2;9938:3;9934:12;9927:19;;9586:366;;;:::o;9958:::-;10100:3;10121:67;10185:2;10180:3;10121:67;:::i;:::-;10114:74;;10197:93;10286:3;10197:93;:::i;:::-;10315:2;10310:3;10306:12;10299:19;;9958:366;;;:::o;10330:400::-;10490:3;10511:84;10593:1;10588:3;10511:84;:::i;:::-;10504:91;;10604:93;10693:3;10604:93;:::i;:::-;10722:1;10717:3;10713:11;10706:18;;10330:400;;;:::o;10736:366::-;10878:3;10899:67;10963:2;10958:3;10899:67;:::i;:::-;10892:74;;10975:93;11064:3;10975:93;:::i;:::-;11093:2;11088:3;11084:12;11077:19;;10736:366;;;:::o;11108:404::-;11268:3;11289:86;11371:3;11366;11289:86;:::i;:::-;11282:93;;11384;11473:3;11384:93;:::i;:::-;11502:3;11497;11493:13;11486:20;;11108:404;;;:::o;11518:400::-;11678:3;11699:84;11781:1;11776:3;11699:84;:::i;:::-;11692:91;;11792:93;11881:3;11792:93;:::i;:::-;11910:1;11905:3;11901:11;11894:18;;11518:400;;;:::o;11924:366::-;12066:3;12087:67;12151:2;12146:3;12087:67;:::i;:::-;12080:74;;12163:93;12252:3;12163:93;:::i;:::-;12281:2;12276:3;12272:12;12265:19;;11924:366;;;:::o;12296:400::-;12456:3;12477:84;12559:1;12554:3;12477:84;:::i;:::-;12470:91;;12570:93;12659:3;12570:93;:::i;:::-;12688:1;12683:3;12679:11;12672:18;;12296:400;;;:::o;12702:366::-;12844:3;12865:67;12929:2;12924:3;12865:67;:::i;:::-;12858:74;;12941:93;13030:3;12941:93;:::i;:::-;13059:2;13054:3;13050:12;13043:19;;12702:366;;;:::o;13074:::-;13216:3;13237:67;13301:2;13296:3;13237:67;:::i;:::-;13230:74;;13313:93;13402:3;13313:93;:::i;:::-;13431:2;13426:3;13422:12;13415:19;;13074:366;;;:::o;13446:400::-;13606:3;13627:84;13709:1;13704:3;13627:84;:::i;:::-;13620:91;;13720:93;13809:3;13720:93;:::i;:::-;13838:1;13833:3;13829:11;13822:18;;13446:400;;;:::o;13852:366::-;13994:3;14015:67;14079:2;14074:3;14015:67;:::i;:::-;14008:74;;14091:93;14180:3;14091:93;:::i;:::-;14209:2;14204:3;14200:12;14193:19;;13852:366;;;:::o;14224:402::-;14384:3;14405:85;14487:2;14482:3;14405:85;:::i;:::-;14398:92;;14499:93;14588:3;14499:93;:::i;:::-;14617:2;14612:3;14608:12;14601:19;;14224:402;;;:::o;14632:366::-;14774:3;14795:67;14859:2;14854:3;14795:67;:::i;:::-;14788:74;;14871:93;14960:3;14871:93;:::i;:::-;14989:2;14984:3;14980:12;14973:19;;14632:366;;;:::o;15004:::-;15146:3;15167:67;15231:2;15226:3;15167:67;:::i;:::-;15160:74;;15243:93;15332:3;15243:93;:::i;:::-;15361:2;15356:3;15352:12;15345:19;;15004:366;;;:::o;15376:::-;15518:3;15539:67;15603:2;15598:3;15539:67;:::i;:::-;15532:74;;15615:93;15704:3;15615:93;:::i;:::-;15733:2;15728:3;15724:12;15717:19;;15376:366;;;:::o;15748:::-;15890:3;15911:67;15975:2;15970:3;15911:67;:::i;:::-;15904:74;;15987:93;16076:3;15987:93;:::i;:::-;16105:2;16100:3;16096:12;16089:19;;15748:366;;;:::o;16120:::-;16262:3;16283:67;16347:2;16342:3;16283:67;:::i;:::-;16276:74;;16359:93;16448:3;16359:93;:::i;:::-;16477:2;16472:3;16468:12;16461:19;;16120:366;;;:::o;16492:402::-;16652:3;16673:85;16755:2;16750:3;16673:85;:::i;:::-;16666:92;;16767:93;16856:3;16767:93;:::i;:::-;16885:2;16880:3;16876:12;16869:19;;16492:402;;;:::o;16900:400::-;17060:3;17081:84;17163:1;17158:3;17081:84;:::i;:::-;17074:91;;17174:93;17263:3;17174:93;:::i;:::-;17292:1;17287:3;17283:11;17276:18;;16900:400;;;:::o;17306:366::-;17448:3;17469:67;17533:2;17528:3;17469:67;:::i;:::-;17462:74;;17545:93;17634:3;17545:93;:::i;:::-;17663:2;17658:3;17654:12;17647:19;;17306:366;;;:::o;17678:::-;17820:3;17841:67;17905:2;17900:3;17841:67;:::i;:::-;17834:74;;17917:93;18006:3;17917:93;:::i;:::-;18035:2;18030:3;18026:12;18019:19;;17678:366;;;:::o;18050:::-;18192:3;18213:67;18277:2;18272:3;18213:67;:::i;:::-;18206:74;;18289:93;18378:3;18289:93;:::i;:::-;18407:2;18402:3;18398:12;18391:19;;18050:366;;;:::o;18422:118::-;18509:24;18527:5;18509:24;:::i;:::-;18504:3;18497:37;18422:118;;:::o;18546:275::-;18678:3;18700:95;18791:3;18782:6;18700:95;:::i;:::-;18693:102;;18812:3;18805:10;;18546:275;;;;:::o;18827:435::-;19007:3;19029:95;19120:3;19111:6;19029:95;:::i;:::-;19022:102;;19141:95;19232:3;19223:6;19141:95;:::i;:::-;19134:102;;19253:3;19246:10;;18827:435;;;;;:::o;19268:595::-;19496:3;19518:95;19609:3;19600:6;19518:95;:::i;:::-;19511:102;;19630:95;19721:3;19712:6;19630:95;:::i;:::-;19623:102;;19742:95;19833:3;19824:6;19742:95;:::i;:::-;19735:102;;19854:3;19847:10;;19268:595;;;;;;:::o;19869:755::-;20145:3;20167:95;20258:3;20249:6;20167:95;:::i;:::-;20160:102;;20279:95;20370:3;20361:6;20279:95;:::i;:::-;20272:102;;20391:95;20482:3;20473:6;20391:95;:::i;:::-;20384:102;;20503:95;20594:3;20585:6;20503:95;:::i;:::-;20496:102;;20615:3;20608:10;;19869:755;;;;;;;:::o;20630:695::-;20908:3;20930:95;21021:3;21012:6;20930:95;:::i;:::-;20923:102;;21042:148;21186:3;21042:148;:::i;:::-;21035:155;;21207:92;21295:3;21286:6;21207:92;:::i;:::-;21200:99;;21316:3;21309:10;;20630:695;;;;;:::o;21331:1393::-;21862:3;21884:148;22028:3;21884:148;:::i;:::-;21877:155;;22049:95;22140:3;22131:6;22049:95;:::i;:::-;22042:102;;22161:148;22305:3;22161:148;:::i;:::-;22154:155;;22326:95;22417:3;22408:6;22326:95;:::i;:::-;22319:102;;22438:148;22582:3;22438:148;:::i;:::-;22431:155;;22603:95;22694:3;22685:6;22603:95;:::i;:::-;22596:102;;22715:3;22708:10;;21331:1393;;;;;;:::o;22730:1659::-;23362:3;23384:148;23528:3;23384:148;:::i;:::-;23377:155;;23549:95;23640:3;23631:6;23549:95;:::i;:::-;23542:102;;23661:148;23805:3;23661:148;:::i;:::-;23654:155;;23826:95;23917:3;23908:6;23826:95;:::i;:::-;23819:102;;23938:148;24082:3;23938:148;:::i;:::-;23931:155;;24103:95;24194:3;24185:6;24103:95;:::i;:::-;24096:102;;24215:148;24359:3;24215:148;:::i;:::-;24208:155;;24380:3;24373:10;;22730:1659;;;;;;:::o;24395:1233::-;24878:3;24900:148;25044:3;24900:148;:::i;:::-;24893:155;;25065:95;25156:3;25147:6;25065:95;:::i;:::-;25058:102;;25177:148;25321:3;25177:148;:::i;:::-;25170:155;;25342:95;25433:3;25424:6;25342:95;:::i;:::-;25335:102;;25454:148;25598:3;25454:148;:::i;:::-;25447:155;;25619:3;25612:10;;24395:1233;;;;;:::o;25634:541::-;25867:3;25889:148;26033:3;25889:148;:::i;:::-;25882:155;;26054:95;26145:3;26136:6;26054:95;:::i;:::-;26047:102;;26166:3;26159:10;;25634:541;;;;:::o;26181:222::-;26274:4;26312:2;26301:9;26297:18;26289:26;;26325:71;26393:1;26382:9;26378:17;26369:6;26325:71;:::i;:::-;26181:222;;;;:::o;26409:640::-;26604:4;26642:3;26631:9;26627:19;26619:27;;26656:71;26724:1;26713:9;26709:17;26700:6;26656:71;:::i;:::-;26737:72;26805:2;26794:9;26790:18;26781:6;26737:72;:::i;:::-;26819;26887:2;26876:9;26872:18;26863:6;26819:72;:::i;:::-;26938:9;26932:4;26928:20;26923:2;26912:9;26908:18;26901:48;26966:76;27037:4;27028:6;26966:76;:::i;:::-;26958:84;;26409:640;;;;;;;:::o;27055:210::-;27142:4;27180:2;27169:9;27165:18;27157:26;;27193:65;27255:1;27244:9;27240:17;27231:6;27193:65;:::i;:::-;27055:210;;;;:::o;27271:313::-;27384:4;27422:2;27411:9;27407:18;27399:26;;27471:9;27465:4;27461:20;27457:1;27446:9;27442:17;27435:47;27499:78;27572:4;27563:6;27499:78;:::i;:::-;27491:86;;27271:313;;;;:::o;27590:419::-;27756:4;27794:2;27783:9;27779:18;27771:26;;27843:9;27837:4;27833:20;27829:1;27818:9;27814:17;27807:47;27871:131;27997:4;27871:131;:::i;:::-;27863:139;;27590:419;;;:::o;28015:::-;28181:4;28219:2;28208:9;28204:18;28196:26;;28268:9;28262:4;28258:20;28254:1;28243:9;28239:17;28232:47;28296:131;28422:4;28296:131;:::i;:::-;28288:139;;28015:419;;;:::o;28440:::-;28606:4;28644:2;28633:9;28629:18;28621:26;;28693:9;28687:4;28683:20;28679:1;28668:9;28664:17;28657:47;28721:131;28847:4;28721:131;:::i;:::-;28713:139;;28440:419;;;:::o;28865:::-;29031:4;29069:2;29058:9;29054:18;29046:26;;29118:9;29112:4;29108:20;29104:1;29093:9;29089:17;29082:47;29146:131;29272:4;29146:131;:::i;:::-;29138:139;;28865:419;;;:::o;29290:::-;29456:4;29494:2;29483:9;29479:18;29471:26;;29543:9;29537:4;29533:20;29529:1;29518:9;29514:17;29507:47;29571:131;29697:4;29571:131;:::i;:::-;29563:139;;29290:419;;;:::o;29715:::-;29881:4;29919:2;29908:9;29904:18;29896:26;;29968:9;29962:4;29958:20;29954:1;29943:9;29939:17;29932:47;29996:131;30122:4;29996:131;:::i;:::-;29988:139;;29715:419;;;:::o;30140:::-;30306:4;30344:2;30333:9;30329:18;30321:26;;30393:9;30387:4;30383:20;30379:1;30368:9;30364:17;30357:47;30421:131;30547:4;30421:131;:::i;:::-;30413:139;;30140:419;;;:::o;30565:::-;30731:4;30769:2;30758:9;30754:18;30746:26;;30818:9;30812:4;30808:20;30804:1;30793:9;30789:17;30782:47;30846:131;30972:4;30846:131;:::i;:::-;30838:139;;30565:419;;;:::o;30990:::-;31156:4;31194:2;31183:9;31179:18;31171:26;;31243:9;31237:4;31233:20;31229:1;31218:9;31214:17;31207:47;31271:131;31397:4;31271:131;:::i;:::-;31263:139;;30990:419;;;:::o;31415:::-;31581:4;31619:2;31608:9;31604:18;31596:26;;31668:9;31662:4;31658:20;31654:1;31643:9;31639:17;31632:47;31696:131;31822:4;31696:131;:::i;:::-;31688:139;;31415:419;;;:::o;31840:::-;32006:4;32044:2;32033:9;32029:18;32021:26;;32093:9;32087:4;32083:20;32079:1;32068:9;32064:17;32057:47;32121:131;32247:4;32121:131;:::i;:::-;32113:139;;31840:419;;;:::o;32265:::-;32431:4;32469:2;32458:9;32454:18;32446:26;;32518:9;32512:4;32508:20;32504:1;32493:9;32489:17;32482:47;32546:131;32672:4;32546:131;:::i;:::-;32538:139;;32265:419;;;:::o;32690:::-;32856:4;32894:2;32883:9;32879:18;32871:26;;32943:9;32937:4;32933:20;32929:1;32918:9;32914:17;32907:47;32971:131;33097:4;32971:131;:::i;:::-;32963:139;;32690:419;;;:::o;33115:::-;33281:4;33319:2;33308:9;33304:18;33296:26;;33368:9;33362:4;33358:20;33354:1;33343:9;33339:17;33332:47;33396:131;33522:4;33396:131;:::i;:::-;33388:139;;33115:419;;;:::o;33540:::-;33706:4;33744:2;33733:9;33729:18;33721:26;;33793:9;33787:4;33783:20;33779:1;33768:9;33764:17;33757:47;33821:131;33947:4;33821:131;:::i;:::-;33813:139;;33540:419;;;:::o;33965:::-;34131:4;34169:2;34158:9;34154:18;34146:26;;34218:9;34212:4;34208:20;34204:1;34193:9;34189:17;34182:47;34246:131;34372:4;34246:131;:::i;:::-;34238:139;;33965:419;;;:::o;34390:::-;34556:4;34594:2;34583:9;34579:18;34571:26;;34643:9;34637:4;34633:20;34629:1;34618:9;34614:17;34607:47;34671:131;34797:4;34671:131;:::i;:::-;34663:139;;34390:419;;;:::o;34815:::-;34981:4;35019:2;35008:9;35004:18;34996:26;;35068:9;35062:4;35058:20;35054:1;35043:9;35039:17;35032:47;35096:131;35222:4;35096:131;:::i;:::-;35088:139;;34815:419;;;:::o;35240:::-;35406:4;35444:2;35433:9;35429:18;35421:26;;35493:9;35487:4;35483:20;35479:1;35468:9;35464:17;35457:47;35521:131;35647:4;35521:131;:::i;:::-;35513:139;;35240:419;;;:::o;35665:222::-;35758:4;35796:2;35785:9;35781:18;35773:26;;35809:71;35877:1;35866:9;35862:17;35853:6;35809:71;:::i;:::-;35665:222;;;;:::o;35893:129::-;35927:6;35954:20;;:::i;:::-;35944:30;;35983:33;36011:4;36003:6;35983:33;:::i;:::-;35893:129;;;:::o;36028:75::-;36061:6;36094:2;36088:9;36078:19;;36028:75;:::o;36109:307::-;36170:4;36260:18;36252:6;36249:30;36246:56;;;36282:18;;:::i;:::-;36246:56;36320:29;36342:6;36320:29;:::i;:::-;36312:37;;36404:4;36398;36394:15;36386:23;;36109:307;;;:::o;36422:141::-;36471:4;36494:3;36486:11;;36517:3;36514:1;36507:14;36551:4;36548:1;36538:18;36530:26;;36422:141;;;:::o;36569:98::-;36620:6;36654:5;36648:12;36638:22;;36569:98;;;:::o;36673:99::-;36725:6;36759:5;36753:12;36743:22;;36673:99;;;:::o;36778:168::-;36861:11;36895:6;36890:3;36883:19;36935:4;36930:3;36926:14;36911:29;;36778:168;;;;:::o;36952:169::-;37036:11;37070:6;37065:3;37058:19;37110:4;37105:3;37101:14;37086:29;;36952:169;;;;:::o;37127:148::-;37229:11;37266:3;37251:18;;37127:148;;;;:::o;37281:305::-;37321:3;37340:20;37358:1;37340:20;:::i;:::-;37335:25;;37374:20;37392:1;37374:20;:::i;:::-;37369:25;;37528:1;37460:66;37456:74;37453:1;37450:81;37447:107;;;37534:18;;:::i;:::-;37447:107;37578:1;37575;37571:9;37564:16;;37281:305;;;;:::o;37592:185::-;37632:1;37649:20;37667:1;37649:20;:::i;:::-;37644:25;;37683:20;37701:1;37683:20;:::i;:::-;37678:25;;37722:1;37712:35;;37727:18;;:::i;:::-;37712:35;37769:1;37766;37762:9;37757:14;;37592:185;;;;:::o;37783:348::-;37823:7;37846:20;37864:1;37846:20;:::i;:::-;37841:25;;37880:20;37898:1;37880:20;:::i;:::-;37875:25;;38068:1;38000:66;37996:74;37993:1;37990:81;37985:1;37978:9;37971:17;37967:105;37964:131;;;38075:18;;:::i;:::-;37964:131;38123:1;38120;38116:9;38105:20;;37783:348;;;;:::o;38137:191::-;38177:4;38197:20;38215:1;38197:20;:::i;:::-;38192:25;;38231:20;38249:1;38231:20;:::i;:::-;38226:25;;38270:1;38267;38264:8;38261:34;;;38275:18;;:::i;:::-;38261:34;38320:1;38317;38313:9;38305:17;;38137:191;;;;:::o;38334:96::-;38371:7;38400:24;38418:5;38400:24;:::i;:::-;38389:35;;38334:96;;;:::o;38436:90::-;38470:7;38513:5;38506:13;38499:21;38488:32;;38436:90;;;:::o;38532:149::-;38568:7;38608:66;38601:5;38597:78;38586:89;;38532:149;;;:::o;38687:126::-;38724:7;38764:42;38757:5;38753:54;38742:65;;38687:126;;;:::o;38819:77::-;38856:7;38885:5;38874:16;;38819:77;;;:::o;38902:154::-;38986:6;38981:3;38976;38963:30;39048:1;39039:6;39034:3;39030:16;39023:27;38902:154;;;:::o;39062:307::-;39130:1;39140:113;39154:6;39151:1;39148:13;39140:113;;;39239:1;39234:3;39230:11;39224:18;39220:1;39215:3;39211:11;39204:39;39176:2;39173:1;39169:10;39164:15;;39140:113;;;39271:6;39268:1;39265:13;39262:101;;;39351:1;39342:6;39337:3;39333:16;39326:27;39262:101;39111:258;39062:307;;;:::o;39375:320::-;39419:6;39456:1;39450:4;39446:12;39436:22;;39503:1;39497:4;39493:12;39524:18;39514:81;;39580:4;39572:6;39568:17;39558:27;;39514:81;39642:2;39634:6;39631:14;39611:18;39608:38;39605:84;;;39661:18;;:::i;:::-;39605:84;39426:269;39375:320;;;:::o;39701:281::-;39784:27;39806:4;39784:27;:::i;:::-;39776:6;39772:40;39914:6;39902:10;39899:22;39878:18;39866:10;39863:34;39860:62;39857:88;;;39925:18;;:::i;:::-;39857:88;39965:10;39961:2;39954:22;39744:238;39701:281;;:::o;39988:233::-;40027:3;40050:24;40068:5;40050:24;:::i;:::-;40041:33;;40096:66;40089:5;40086:77;40083:103;;;40166:18;;:::i;:::-;40083:103;40213:1;40206:5;40202:13;40195:20;;39988:233;;;:::o;40227:176::-;40259:1;40276:20;40294:1;40276:20;:::i;:::-;40271:25;;40310:20;40328:1;40310:20;:::i;:::-;40305:25;;40349:1;40339:35;;40354:18;;:::i;:::-;40339:35;40395:1;40392;40388:9;40383:14;;40227:176;;;;:::o;40409:180::-;40457:77;40454:1;40447:88;40554:4;40551:1;40544:15;40578:4;40575:1;40568:15;40595:180;40643:77;40640:1;40633:88;40740:4;40737:1;40730:15;40764:4;40761:1;40754:15;40781:180;40829:77;40826:1;40819:88;40926:4;40923:1;40916:15;40950:4;40947:1;40940:15;40967:180;41015:77;41012:1;41005:88;41112:4;41109:1;41102:15;41136:4;41133:1;41126:15;41153:180;41201:77;41198:1;41191:88;41298:4;41295:1;41288:15;41322:4;41319:1;41312:15;41339:180;41387:77;41384:1;41377:88;41484:4;41481:1;41474:15;41508:4;41505:1;41498:15;41525:117;41634:1;41631;41624:12;41648:117;41757:1;41754;41747:12;41771:117;41880:1;41877;41870:12;41894:117;42003:1;42000;41993:12;42017:102;42058:6;42109:2;42105:7;42100:2;42093:5;42089:14;42085:28;42075:38;;42017:102;;;:::o;42125:230::-;42265:34;42261:1;42253:6;42249:14;42242:58;42334:13;42329:2;42321:6;42317:15;42310:38;42125:230;:::o;42361:237::-;42501:34;42497:1;42489:6;42485:14;42478:58;42570:20;42565:2;42557:6;42553:15;42546:45;42361:237;:::o;42604:225::-;42744:34;42740:1;42732:6;42728:14;42721:58;42813:8;42808:2;42800:6;42796:15;42789:33;42604:225;:::o;42835:178::-;42975:30;42971:1;42963:6;42959:14;42952:54;42835:178;:::o;43019:223::-;43159:34;43155:1;43147:6;43143:14;43136:58;43228:6;43223:2;43215:6;43211:15;43204:31;43019:223;:::o;43248:175::-;43388:27;43384:1;43376:6;43372:14;43365:51;43248:175;:::o;43429:214::-;43569:66;43565:1;43557:6;43553:14;43546:90;43429:214;:::o;43649:231::-;43789:34;43785:1;43777:6;43773:14;43766:58;43858:14;43853:2;43845:6;43841:15;43834:39;43649:231;:::o;43886:447::-;44026:66;44022:1;44014:6;44010:14;44003:90;44127:34;44122:2;44114:6;44110:15;44103:59;44196:66;44191:2;44183:6;44179:15;44172:91;44297:28;44292:2;44284:6;44280:15;44273:53;43886:447;:::o;44339:151::-;44479:3;44475:1;44467:6;44463:14;44456:27;44339:151;:::o;44496:243::-;44636:34;44632:1;44624:6;44620:14;44613:58;44705:26;44700:2;44692:6;44688:15;44681:51;44496:243;:::o;44745:214::-;44885:66;44881:1;44873:6;44869:14;44862:90;44745:214;:::o;44965:229::-;45105:34;45101:1;45093:6;45089:14;45082:58;45174:12;45169:2;45161:6;45157:15;45150:37;44965:229;:::o;45200:228::-;45340:34;45336:1;45328:6;45324:14;45317:58;45409:11;45404:2;45396:6;45392:15;45385:36;45200:228;:::o;45434:214::-;45574:66;45570:1;45562:6;45558:14;45551:90;45434:214;:::o;45654:182::-;45794:34;45790:1;45782:6;45778:14;45771:58;45654:182;:::o;45842:214::-;45982:66;45978:1;45970:6;45966:14;45959:90;45842:214;:::o;46062:231::-;46202:34;46198:1;46190:6;46186:14;46179:58;46271:14;46266:2;46258:6;46254:15;46247:39;46062:231;:::o;46299:182::-;46439:34;46435:1;46427:6;46423:14;46416:58;46299:182;:::o;46487:166::-;46627:18;46623:1;46615:6;46611:14;46604:42;46487:166;:::o;46659:228::-;46799:34;46795:1;46787:6;46783:14;46776:58;46868:11;46863:2;46855:6;46851:15;46844:36;46659:228;:::o;46893:220::-;47033:34;47029:1;47021:6;47017:14;47010:58;47102:3;47097:2;47089:6;47085:15;47078:28;46893:220;:::o;47119:179::-;47259:31;47255:1;47247:6;47243:14;47236:55;47119:179;:::o;47304:153::-;47444:5;47440:1;47432:6;47428:14;47421:29;47304:153;:::o;47463:236::-;47603:34;47599:1;47591:6;47587:14;47580:58;47672:19;47667:2;47659:6;47655:15;47648:44;47463:236;:::o;47705:231::-;47845:34;47841:1;47833:6;47829:14;47822:58;47914:14;47909:2;47901:6;47897:15;47890:39;47705:231;:::o;47942:181::-;48082:33;48078:1;48070:6;48066:14;48059:57;47942:181;:::o;48129:122::-;48202:24;48220:5;48202:24;:::i;:::-;48195:5;48192:35;48182:63;;48241:1;48238;48231:12;48182:63;48129:122;:::o;48257:116::-;48327:21;48342:5;48327:21;:::i;:::-;48320:5;48317:32;48307:60;;48363:1;48360;48353:12;48307:60;48257:116;:::o;48379:120::-;48451:23;48468:5;48451:23;:::i;:::-;48444:5;48441:34;48431:62;;48489:1;48486;48479:12;48431:62;48379:120;:::o;48505:122::-;48578:24;48596:5;48578:24;:::i;:::-;48571:5;48568:35;48558:63;;48617:1;48614;48607:12;48558:63;48505:122;:::o
Swarm Source
ipfs://3bb57d9ca49efb782af17025b23a540ed9dc32d77193c1c3b2d6bb5319590349
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.