ETH Price: $3,100.06 (+0.90%)
Gas: 5 Gwei

Token

Trashcans (Trash)
 

Overview

Max Total Supply

997 Trash

Holders

196

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 Trash
0x5381b1c11cf1792c07df81df80427d8c0223572f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Trashcans

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 14 of 15: Trashcans.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import './ERC721Enumerable.sol';
import './Ownable.sol';
import './Strings.sol';
import './TrashFunctions.sol';
import './Metadata.sol';

contract Trashcans is ERC721Enumerable, Ownable, TrashFunctions, Metadata {
  
    using Strings for uint256;

  uint256 public constant RESERVE = 5; 
  uint256 public constant FREE_DROP = 1000;  
  uint256 public constant MAIN_DROP = 9000;
  uint256 public constant BURN_1 = 10000;  
  uint256 public constant BURN_2 = 10000;    
  uint256 public constant BURN_3 = 10000;    

  uint256 public constant NFT_MAX = FREE_DROP + MAIN_DROP + BURN_1 + BURN_2 + BURN_3;
  uint256 public constant PURCHASE_LIMIT = 30;
  
  uint256 public constant MAIN_PRICE = 0.01 ether;
  uint256 public constant FREE_PRICE = 0 ether;

  bool public isBurnActive = false;
  bool public isMasterActive = false;

  /// @dev We will use these to be able to calculate remaining correctly.
  uint256 public totalFreeSupply;
  uint256 public totalMainSupply;
  uint256 public totalBurn1Supply;
  uint256 public totalBurn2Supply;  
  uint256 public totalBurn3Supply;  

  string private _contractURI = '';
  string private _tokenBaseURI = '';
  string private _tokenRevealedBaseURI = '';
  
  event Burn1(
      uint256 oneTokenId1, 
      uint256 twoTokenId1,
      uint256 threeTokenId1,
      uint256 fourTokenId1,
      uint256 fiveTokenId1,
      uint256 sixTokenId1,
      uint256 sevenTokenId1,
      uint256 eightTokenId1,
      uint256 nineTokenId1,
      uint256 tenTokenId1,
            uint256 newTokenId1);
            
  event Burn2(
          uint256 oneTokenId2, 
      uint256 twoTokenId2,
      uint256 threeTokenId2,
      uint256 fourTokenId2,
      uint256 fiveTokenId2,
      uint256 sixTokenId2,
      uint256 sevenTokenId2,
      uint256 eightTokenId2,
      uint256 nineTokenId2,
      uint256 tenTokenId2,
            uint256 newTokenId2);
  
  event Burn3(
        uint256 matchBurn1,
        uint256 matchBurn2,
            uint256 newTokenId3);



    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
}
  
  
  constructor(string memory name, string memory symbol) ERC721(name, symbol) {

  }
  
  function mintTrash(uint256 numberOfTokens) external override payable {

    if (totalSupply() < FREE_DROP) {  
      
    require(isMasterActive, 'Contract is not active');
    
    require(totalSupply() < NFT_MAX, 'All tokens have been minted');
    require(numberOfTokens <= PURCHASE_LIMIT, 'Cannot purchase this many tokens');
    require(totalFreeSupply + numberOfTokens <= FREE_DROP, 'Purchase would exceed max supply');
    
    require(FREE_PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient');

    for (uint256 i = 0; i < numberOfTokens; i++) {

      uint256 tokenId =  totalFreeSupply + 1;

      totalFreeSupply += 1;
      _safeMint(msg.sender, tokenId);
    }
    
    }
    
     if (totalSupply() >= FREE_DROP) {  
      
    require(isMasterActive, 'Contract is not active');
    
    require(totalSupply() < NFT_MAX, 'All tokens have been minted');
    require(numberOfTokens <= PURCHASE_LIMIT, 'Cannot purchase this many tokens');
    require(totalFreeSupply + totalMainSupply + numberOfTokens <= FREE_DROP + MAIN_DROP, 'Purchase would exceed max supply');
    
    require(MAIN_PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient');

    for (uint256 i = 0; i < numberOfTokens; i++) {

      uint256 tokenId =  totalFreeSupply + totalMainSupply + 1;

      totalMainSupply += 1;
      _safeMint(msg.sender, tokenId);
    }
    
    }

  }
  
  function mintTrashReserve(uint256 numberOfTokens) external override payable onlyOwner {
    
    require(totalSupply() < RESERVE, 'All tokens have been minted for reserves');
    require(numberOfTokens <= PURCHASE_LIMIT, 'Cannot purchase this many tokens');
    require(totalFreeSupply + numberOfTokens <= FREE_DROP, 'Purchase would exceed max supply');
    
    require(FREE_PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient');

    for (uint256 i = 0; i < numberOfTokens; i++) {

      uint256 tokenId =  totalFreeSupply + 1;

      totalFreeSupply += 1;
      _safeMint(msg.sender, tokenId); // Only 5.
    }
    
    }

      
  

  function MasterActive(bool _isMasterActive) external override onlyOwner {
    isMasterActive = _isMasterActive;
  }
  
    function BurnActive(bool _isBurnActive) external override onlyOwner {
    isBurnActive = _isBurnActive;
  }
 
  
  function withdraw() external override onlyOwner {
    uint256 balance = address(this).balance;
    payable(msg.sender).transfer(balance);
  }

  function setContractURI(string calldata URI) external override onlyOwner {
    _contractURI = URI;
  }

  function setBaseURI(string calldata URI) external override onlyOwner {
    _tokenBaseURI = URI;
  }

  function setRevealedBaseURI(string calldata revealedBaseURI) external override onlyOwner {
    _tokenRevealedBaseURI = revealedBaseURI;
  }

  function contractURI() public view override returns (string memory) {
    return _contractURI;
  }

  function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) {
    require(_exists(tokenId), 'Token does not exist');

    /// @dev Convert string to bytes so we can check if it's empty or not.
    string memory revealedBaseURI = _tokenRevealedBaseURI;
    return bytes(revealedBaseURI).length > 0 ?
      string(abi.encodePacked(revealedBaseURI, tokenId.toString())) :
      _tokenBaseURI;
  }
  
    function burn1(uint256 oneTokenId1, uint256 twoTokenId1, uint256 threeTokenId1, 
            uint256 fourTokenId1, uint256 fiveTokenId1, uint256 sixTokenId1, uint256 sevenTokenId1, 
                uint256 eightTokenId1, uint256 nineTokenId1, uint256 tenTokenId1) public  {
        
        require(isMasterActive, 'Contract is not active');
        require(isBurnActive, "Burn is not active");
        
        require(_isApprovedOrOwner(_msgSender(), oneTokenId1) 
        && _isApprovedOrOwner(_msgSender(), twoTokenId1)
        && _isApprovedOrOwner(_msgSender(), threeTokenId1) 
        && _isApprovedOrOwner(_msgSender(), fourTokenId1) 
        && _isApprovedOrOwner(_msgSender(), fiveTokenId1) 
        && _isApprovedOrOwner(_msgSender(), sixTokenId1) 
        && _isApprovedOrOwner(_msgSender(), sevenTokenId1) 
        && _isApprovedOrOwner(_msgSender(), eightTokenId1) 
        && _isApprovedOrOwner(_msgSender(), nineTokenId1) 
                && _isApprovedOrOwner(_msgSender(), tenTokenId1), "Caller is not owner nor approved");

        
        // burn the 10 tokens
        _burn(oneTokenId1);
        _burn(twoTokenId1);
        _burn(threeTokenId1);
        _burn(fourTokenId1);
        _burn(fiveTokenId1);
        _burn(sixTokenId1);  
        _burn(sevenTokenId1);          
        _burn(eightTokenId1);  
        _burn(nineTokenId1);  
        _burn(tenTokenId1); 
        

        // mint new token
        uint256 newTokenId1 = FREE_DROP + MAIN_DROP + totalBurn1Supply + 1;
        _safeMint(msg.sender, newTokenId1);
        totalBurn1Supply += 1;

        // fire event in logs
        emit Burn1(oneTokenId1, twoTokenId1, threeTokenId1, fourTokenId1, 
            fiveTokenId1, sixTokenId1, sevenTokenId1, eightTokenId1, nineTokenId1, tenTokenId1, newTokenId1);
    }
    
   function burn2(uint256 oneTokenId2, uint256 twoTokenId2, uint256 threeTokenId2, 
            uint256 fourTokenId2, uint256 fiveTokenId2, uint256 sixTokenId2, uint256 sevenTokenId2, 
                uint256 eightTokenId2, uint256 nineTokenId2, uint256 tenTokenId2) public  {
        
        require(isMasterActive, 'Contract is not active');
        require(isBurnActive, "Burn is not active");
        
                require(_isApprovedOrOwner(_msgSender(), oneTokenId2) 
        && _isApprovedOrOwner(_msgSender(), twoTokenId2)
        && _isApprovedOrOwner(_msgSender(), threeTokenId2) 
        && _isApprovedOrOwner(_msgSender(), fourTokenId2) 
        && _isApprovedOrOwner(_msgSender(), fiveTokenId2) 
        && _isApprovedOrOwner(_msgSender(), sixTokenId2) 
        && _isApprovedOrOwner(_msgSender(), sevenTokenId2) 
        && _isApprovedOrOwner(_msgSender(), eightTokenId2) 
        && _isApprovedOrOwner(_msgSender(), nineTokenId2) 
                && _isApprovedOrOwner(_msgSender(), tenTokenId2), "Caller is not owner nor approved");
        
        // burn the 10 tokens
        _burn(oneTokenId2);
        _burn(twoTokenId2);
        _burn(threeTokenId2);
        _burn(fourTokenId2);
        _burn(fiveTokenId2);
        _burn(sixTokenId2);  
        _burn(sevenTokenId2);          
        _burn(eightTokenId2);  
        _burn(nineTokenId2);  
        _burn(tenTokenId2); 
        

        // mint new token
        uint256 newTokenId2 = FREE_DROP + MAIN_DROP + BURN_1 + totalBurn2Supply + 1;
        _safeMint(msg.sender, newTokenId2);
        totalBurn2Supply += 1;

        // fire event in logs
        emit Burn2(oneTokenId2, twoTokenId2, threeTokenId2, fourTokenId2, 
            fiveTokenId2, sixTokenId2, sevenTokenId2, eightTokenId2, nineTokenId2, tenTokenId2, newTokenId2);
    }
    
   function burn3(uint256 matchBurn1, uint256 matchBurn2) public  {
        
        require(matchBurn1 >= 10000, 'Token ID need to be within the burn1 range');
        require(matchBurn1 < 20000, 'Token ID need to be within the burn1 range');
        require(matchBurn2 >= 20000, 'Token ID need to be within the burn2 range');
        require(matchBurn2 < 30000, 'Token ID need to be within the burn2 range');

               require(_isApprovedOrOwner(_msgSender(), matchBurn1) 
                && _isApprovedOrOwner(_msgSender(), matchBurn2), "Caller is not owner nor approved");

        require(isMasterActive, 'Contract is not active');
        require(isBurnActive, "Burn is not active");
        
        // burn
        _burn(matchBurn1);
        _burn(matchBurn2);

        // mint new token
        uint256 newTokenId3 = FREE_DROP + MAIN_DROP + BURN_1 + BURN_2 + totalBurn3Supply + 1;
        _safeMint(msg.sender, newTokenId3);
        totalBurn3Supply += 1;

        // fire event in logs
        emit Burn3(matchBurn1, matchBurn2, newTokenId3);
    }
    
  

}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    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);
            }
        }
    }
}

File 2 of 15: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 15: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 4 of 15: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 {}
}

File 5 of 15: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 6 of 15: IERC165.sol
// 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);
}

File 7 of 15: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 8 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 9 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 10 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 11 of 15: Metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface Metadata {
  function setContractURI(string calldata URI) external;

  function setBaseURI(string calldata URI) external;

  function setRevealedBaseURI(string calldata revealedBaseURI) external;

  function contractURI() external view returns(string memory);
}

File 12 of 15: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 13 of 15: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

File 15 of 15: TrashFunctions.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface TrashFunctions {

  function mintTrash(uint256 numberOfTokens) external payable;
    function mintTrashReserve(uint256 numberOfTokens) external payable;


  function MasterActive(bool isMasterActive) external;

  function BurnActive(bool isMasterActive) external;

  function withdraw() external;
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oneTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"twoTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"threeTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fourTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fiveTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sixTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sevenTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eightTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nineTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tenTokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTokenId1","type":"uint256"}],"name":"Burn1","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oneTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"twoTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"threeTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fourTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fiveTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sixTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sevenTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eightTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nineTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tenTokenId2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTokenId2","type":"uint256"}],"name":"Burn2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"matchBurn1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"matchBurn2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTokenId3","type":"uint256"}],"name":"Burn3","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":[],"name":"BURN_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBurnActive","type":"bool"}],"name":"BurnActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FREE_DROP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAIN_DROP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAIN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_isMasterActive","type":"bool"}],"name":"MasterActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NFT_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"oneTokenId1","type":"uint256"},{"internalType":"uint256","name":"twoTokenId1","type":"uint256"},{"internalType":"uint256","name":"threeTokenId1","type":"uint256"},{"internalType":"uint256","name":"fourTokenId1","type":"uint256"},{"internalType":"uint256","name":"fiveTokenId1","type":"uint256"},{"internalType":"uint256","name":"sixTokenId1","type":"uint256"},{"internalType":"uint256","name":"sevenTokenId1","type":"uint256"},{"internalType":"uint256","name":"eightTokenId1","type":"uint256"},{"internalType":"uint256","name":"nineTokenId1","type":"uint256"},{"internalType":"uint256","name":"tenTokenId1","type":"uint256"}],"name":"burn1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"oneTokenId2","type":"uint256"},{"internalType":"uint256","name":"twoTokenId2","type":"uint256"},{"internalType":"uint256","name":"threeTokenId2","type":"uint256"},{"internalType":"uint256","name":"fourTokenId2","type":"uint256"},{"internalType":"uint256","name":"fiveTokenId2","type":"uint256"},{"internalType":"uint256","name":"sixTokenId2","type":"uint256"},{"internalType":"uint256","name":"sevenTokenId2","type":"uint256"},{"internalType":"uint256","name":"eightTokenId2","type":"uint256"},{"internalType":"uint256","name":"nineTokenId2","type":"uint256"},{"internalType":"uint256","name":"tenTokenId2","type":"uint256"}],"name":"burn2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"matchBurn1","type":"uint256"},{"internalType":"uint256","name":"matchBurn2","type":"uint256"}],"name":"burn3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","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":"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":"isBurnActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMasterActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintTrash","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintTrashReserve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealedBaseURI","type":"string"}],"name":"setRevealedBaseURI","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":"totalBurn1Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurn2Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurn3Supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMainSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff02191690831515021790555060405180602001604052806000815250601090805190602001906200006192919062000211565b5060405180602001604052806000815250601190805190602001906200008992919062000211565b506040518060200160405280600081525060129080519060200190620000b192919062000211565b50348015620000bf57600080fd5b5060405162005e4038038062005e408339818101604052810190620000e591906200033f565b81818160009080519060200190620000ff92919062000211565b5080600190805190602001906200011892919062000211565b5050506200013b6200012f6200014360201b60201c565b6200014b60201b60201c565b505062000548565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021f9062000459565b90600052602060002090601f0160209004810192826200024357600085556200028f565b82601f106200025e57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028e57825182559160200191906001019062000271565b5b5090506200029e9190620002a2565b5090565b5b80821115620002bd576000816000905550600101620002a3565b5090565b6000620002d8620002d284620003ed565b620003c4565b905082815260208101848484011115620002f757620002f662000528565b5b6200030484828562000423565b509392505050565b600082601f83011262000324576200032362000523565b5b815162000336848260208601620002c1565b91505092915050565b6000806040838503121562000359576200035862000532565b5b600083015167ffffffffffffffff8111156200037a57620003796200052d565b5b62000388858286016200030c565b925050602083015167ffffffffffffffff811115620003ac57620003ab6200052d565b5b620003ba858286016200030c565b9150509250929050565b6000620003d0620003e3565b9050620003de82826200048f565b919050565b6000604051905090565b600067ffffffffffffffff8211156200040b576200040a620004f4565b5b620004168262000537565b9050602081019050919050565b60005b838110156200044357808201518184015260208101905062000426565b8381111562000453576000848401525b50505050565b600060028204905060018216806200047257607f821691505b60208210811415620004895762000488620004c5565b5b50919050565b6200049a8262000537565b810181811067ffffffffffffffff82111715620004bc57620004bb620004f4565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b6158e880620005586000396000f3fe6080604052600436106102ad5760003560e01c80638a2f1dee11610175578063b88d4fde116100dc578063c87b56dd11610095578063e62a1f2d1161006f578063e62a1f2d14610a5d578063e8a3d48514610a88578063e985e9c514610ab3578063f2fde38b14610af0576102ad565b8063c87b56dd146109d9578063d75e611014610a16578063da881c0214610a41576102ad565b8063b88d4fde146108ea578063b98d952114610913578063bca947e01461093c578063bf03565414610967578063c297d38114610992578063c30e7684146109ae576102ad565b80639d2cc4361161012e5780639d2cc436146107ec578063a22cb46514610817578063a73d8ca714610840578063afbd964814610869578063b1a6676e14610894578063b807bafe146108bf576102ad565b80638a2f1dee146106ee5780638da5cb5b146107195780639123468a14610744578063938e3d7b1461076f57806395d89b41146107985780639a308429146107c3576102ad565b80633bff9e70116102195780634f6ccce7116101d25780634f6ccce7146105ce57806355f804b31461060b5780636352211e146106345780636e83843a1461067157806370a082311461069a578063715018a6146106d7576102ad565b80633bff9e70146104e65780633ccfd60b1461051157806342842e0e1461052857806342966c681461055157806345f1fdc71461057a578063499ea0a2146105a5576102ad565b806316ea114b1161026b57806316ea114b146103d657806318160ddd146103ff5780631dfafb491461042a57806323b872dd146104555780632cef7e401461047e5780632f745c59146104a9576102ad565b8062a58241146102b257806301ffc9a7146102dd578063027c89771461031a57806306fdde0314610345578063081812fc14610370578063095ea7b3146103ad575b600080fd5b3480156102be57600080fd5b506102c7610b19565b6040516102d49190614ba4565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff9190614082565b610b1f565b60405161031191906147c7565b60405180910390f35b34801561032657600080fd5b5061032f610b99565b60405161033c9190614ba4565b60405180910390f35b34801561035157600080fd5b5061035a610b9f565b60405161036791906147e2565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190614129565b610c31565b6040516103a49190614760565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614015565b610cb6565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190614196565b610dce565b005b34801561040b57600080fd5b506104146110ad565b6040516104219190614ba4565b60405180910390f35b34801561043657600080fd5b5061043f6110ba565b60405161044c9190614ba4565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613eff565b6110c0565b005b34801561048a57600080fd5b50610493611120565b6040516104a09190614ba4565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190614015565b611126565b6040516104dd9190614ba4565b60405180910390f35b3480156104f257600080fd5b506104fb6111cb565b6040516105089190614ba4565b60405180910390f35b34801561051d57600080fd5b506105266111d6565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613eff565b6112a1565b005b34801561055d57600080fd5b5061057860048036038101906105739190614129565b6112c1565b005b34801561058657600080fd5b5061058f61131d565b60405161059c9190614ba4565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c79190614156565b611323565b005b3480156105da57600080fd5b506105f560048036038101906105f09190614129565b6115f7565b6040516106029190614ba4565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d91906140dc565b611668565b005b34801561064057600080fd5b5061065b60048036038101906106569190614129565b6116fa565b6040516106689190614760565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906140dc565b6117ac565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613e92565b61183e565b6040516106ce9190614ba4565b60405180910390f35b3480156106e357600080fd5b506106ec6118f6565b005b3480156106fa57600080fd5b5061070361197e565b6040516107109190614ba4565b60405180910390f35b34801561072557600080fd5b5061072e611984565b60405161073b9190614760565b60405180910390f35b34801561075057600080fd5b506107596119ae565b60405161076691906147c7565b60405180910390f35b34801561077b57600080fd5b50610796600480360381019061079191906140dc565b6119c1565b005b3480156107a457600080fd5b506107ad611a53565b6040516107ba91906147e2565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e59190614196565b611ae5565b005b3480156107f857600080fd5b50610801611db7565b60405161080e9190614ba4565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613fd5565b611dbc565b005b34801561084c57600080fd5b5061086760048036038101906108629190614055565b611f3d565b005b34801561087557600080fd5b5061087e611fd6565b60405161088b9190614ba4565b60405180910390f35b3480156108a057600080fd5b506108a9611fdc565b6040516108b691906147c7565b60405180910390f35b3480156108cb57600080fd5b506108d4611fef565b6040516108e19190614ba4565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190613f52565b611ff5565b005b34801561091f57600080fd5b5061093a60048036038101906109359190614055565b612057565b005b34801561094857600080fd5b506109516120f0565b60405161095e9190614ba4565b60405180910390f35b34801561097357600080fd5b5061097c6120f6565b6040516109899190614ba4565b60405180910390f35b6109ac60048036038101906109a79190614129565b6120fc565b005b3480156109ba57600080fd5b506109c361255f565b6040516109d09190614ba4565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb9190614129565b612597565b604051610a0d91906147e2565b60405180910390f35b348015610a2257600080fd5b50610a2b61273c565b604051610a389190614ba4565b60405180910390f35b610a5b6004803603810190610a569190614129565b612741565b005b348015610a6957600080fd5b50610a72612946565b604051610a7f9190614ba4565b60405180910390f35b348015610a9457600080fd5b50610a9d61294b565b604051610aaa91906147e2565b60405180910390f35b348015610abf57600080fd5b50610ada6004803603810190610ad59190613ebf565b6129dd565b604051610ae791906147c7565b60405180910390f35b348015610afc57600080fd5b50610b176004803603810190610b129190613e92565b612a71565b005b600d5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b925750610b9182612b69565b5b9050919050565b600b5481565b606060008054610bae90614f05565b80601f0160208091040260200160405190810160405280929190818152602001828054610bda90614f05565b8015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b5050505050905090565b6000610c3c82612c4b565b610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290614a24565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc1826116fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990614aa4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d51612cb7565b73ffffffffffffffffffffffffffffffffffffffff161480610d805750610d7f81610d7a612cb7565b6129dd565b5b610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db690614944565b60405180910390fd5b610dc98383612cbf565b505050565b600a60159054906101000a900460ff16610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490614a04565b60405180910390fd5b600a60149054906101000a900460ff16610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614a44565b60405180910390fd5b610e7d610e77612cb7565b8b612d78565b8015610e965750610e95610e8f612cb7565b8a612d78565b5b8015610eaf5750610eae610ea8612cb7565b89612d78565b5b8015610ec85750610ec7610ec1612cb7565b88612d78565b5b8015610ee15750610ee0610eda612cb7565b87612d78565b5b8015610efa5750610ef9610ef3612cb7565b86612d78565b5b8015610f135750610f12610f0c612cb7565b85612d78565b5b8015610f2c5750610f2b610f25612cb7565b84612d78565b5b8015610f455750610f44610f3e612cb7565b83612d78565b5b8015610f5e5750610f5d610f57612cb7565b82612d78565b5b610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490614ac4565b60405180910390fd5b610fa68a612e56565b610faf89612e56565b610fb888612e56565b610fc187612e56565b610fca86612e56565b610fd385612e56565b610fdc84612e56565b610fe583612e56565b610fee82612e56565b610ff781612e56565b60006001600e546127106123286103e86110119190614d3a565b61101b9190614d3a565b6110259190614d3a565b61102f9190614d3a565b905061103b3382612f67565b6001600e600082825461104e9190614d3a565b925050819055507fe6883098455c3e00de3f45217e9ab05507e0dd6df90efcbc0da86952a7c5aac38b8b8b8b8b8b8b8b8b8b8b6040516110989b9a99989796959493929190614bf6565b60405180910390a15050505050505050505050565b6000600880549050905090565b61271081565b6110d16110cb612cb7565b82612d78565b611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110790614ae4565b60405180910390fd5b61111b838383612f85565b505050565b600e5481565b60006111318361183e565b8210611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614824565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b662386f26fc1000081565b6111de612cb7565b73ffffffffffffffffffffffffffffffffffffffff166111fc611984565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614a64565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561129d573d6000803e3d6000fd5b5050565b6112bc83838360405180602001604052806000815250611ff5565b505050565b6112d26112cc612cb7565b82612d78565b611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614b44565b60405180910390fd5b61131a81612e56565b50565b61232881565b612710821015611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614804565b60405180910390fd5b614e2082106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614804565b60405180910390fd5b614e208110156113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e8906149c4565b60405180910390fd5b6175308110611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c906149c4565b60405180910390fd5b611446611440612cb7565b83612d78565b801561145f575061145e611458612cb7565b82612d78565b5b61149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590614ac4565b60405180910390fd5b600a60159054906101000a900460ff166114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e490614a04565b60405180910390fd5b600a60149054906101000a900460ff1661153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390614a44565b60405180910390fd5b61154582612e56565b61154e81612e56565b60006001600f54612710806123286103e86115699190614d3a565b6115739190614d3a565b61157d9190614d3a565b6115879190614d3a565b6115919190614d3a565b905061159d3382612f67565b6001600f60008282546115b09190614d3a565b925050819055507f02da4277a5cdf6e403c046815e8450be5502e02a43b4653472dc6a9385a91ca28383836040516115ea93929190614bbf565b60405180910390a1505050565b60006116016110ad565b8210611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990614b24565b60405180910390fd5b600882815481106116565761165561509e565b5b90600052602060002001549050919050565b611670612cb7565b73ffffffffffffffffffffffffffffffffffffffff1661168e611984565b73ffffffffffffffffffffffffffffffffffffffff16146116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90614a64565b60405180910390fd5b8181601191906116f5929190613cc0565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90614984565b60405180910390fd5b80915050919050565b6117b4612cb7565b73ffffffffffffffffffffffffffffffffffffffff166117d2611984565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f90614a64565b60405180910390fd5b818160129190611839929190613cc0565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690614964565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118fe612cb7565b73ffffffffffffffffffffffffffffffffffffffff1661191c611984565b73ffffffffffffffffffffffffffffffffffffffff1614611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990614a64565b60405180910390fd5b61197c60006131e1565b565b6103e881565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60159054906101000a900460ff1681565b6119c9612cb7565b73ffffffffffffffffffffffffffffffffffffffff166119e7611984565b73ffffffffffffffffffffffffffffffffffffffff1614611a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3490614a64565b60405180910390fd5b818160109190611a4e929190613cc0565b505050565b606060018054611a6290614f05565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8e90614f05565b8015611adb5780601f10611ab057610100808354040283529160200191611adb565b820191906000526020600020905b815481529060010190602001808311611abe57829003601f168201915b5050505050905090565b600a60159054906101000a900460ff16611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614a04565b60405180910390fd5b600a60149054906101000a900460ff16611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a90614a44565b60405180910390fd5b611b94611b8e612cb7565b8b612d78565b8015611bad5750611bac611ba6612cb7565b8a612d78565b5b8015611bc65750611bc5611bbf612cb7565b89612d78565b5b8015611bdf5750611bde611bd8612cb7565b88612d78565b5b8015611bf85750611bf7611bf1612cb7565b87612d78565b5b8015611c115750611c10611c0a612cb7565b86612d78565b5b8015611c2a5750611c29611c23612cb7565b85612d78565b5b8015611c435750611c42611c3c612cb7565b84612d78565b5b8015611c5c5750611c5b611c55612cb7565b83612d78565b5b8015611c755750611c74611c6e612cb7565b82612d78565b5b611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab90614ac4565b60405180910390fd5b611cbd8a612e56565b611cc689612e56565b611ccf88612e56565b611cd887612e56565b611ce186612e56565b611cea85612e56565b611cf384612e56565b611cfc83612e56565b611d0582612e56565b611d0e81612e56565b60006001600d546123286103e8611d259190614d3a565b611d2f9190614d3a565b611d399190614d3a565b9050611d453382612f67565b6001600d6000828254611d589190614d3a565b925050819055507fa82bf52e46ec540a29d332784c3b9d238b26df7a8a2db2c85659cd4ffbccdacd8b8b8b8b8b8b8b8b8b8b8b604051611da29b9a99989796959493929190614bf6565b60405180910390a15050505050505050505050565b600581565b611dc4612cb7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e29906148c4565b60405180910390fd5b8060056000611e3f612cb7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eec612cb7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f3191906147c7565b60405180910390a35050565b611f45612cb7565b73ffffffffffffffffffffffffffffffffffffffff16611f63611984565b73ffffffffffffffffffffffffffffffffffffffff1614611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb090614a64565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b600f5481565b600a60149054906101000a900460ff1681565b61271081565b612006612000612cb7565b83612d78565b612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c90614ae4565b60405180910390fd5b612051848484846132a7565b50505050565b61205f612cb7565b73ffffffffffffffffffffffffffffffffffffffff1661207d611984565b73ffffffffffffffffffffffffffffffffffffffff16146120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614a64565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b600c5481565b61271081565b6103e86121076110ad565b101561231657600a60159054906101000a900460ff1661215c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215390614a04565b60405180910390fd5b612710806127106123286103e86121739190614d3a565b61217d9190614d3a565b6121879190614d3a565b6121919190614d3a565b6121996110ad565b106121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090614b64565b60405180910390fd5b601e81111561221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490614b84565b60405180910390fd5b6103e881600b5461222e9190614d3a565b111561226f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612266906149a4565b60405180910390fd5b3481600061227d9190614dc1565b11156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614904565b60405180910390fd5b60005b818110156123145760006001600b546122da9190614d3a565b90506001600b60008282546122ef9190614d3a565b925050819055506123003382612f67565b50808061230c90614f68565b9150506122c1565b505b6103e86123216110ad565b1061255c57600a60159054906101000a900460ff16612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236c90614a04565b60405180910390fd5b612710806127106123286103e861238c9190614d3a565b6123969190614d3a565b6123a09190614d3a565b6123aa9190614d3a565b6123b26110ad565b106123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990614b64565b60405180910390fd5b601e811115612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90614b84565b60405180910390fd5b6123286103e86124469190614d3a565b81600c54600b546124579190614d3a565b6124619190614d3a565b11156124a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612499906149a4565b60405180910390fd5b3481662386f26fc100006124b69190614dc1565b11156124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90614904565b60405180910390fd5b60005b8181101561255a5760006001600c54600b546125169190614d3a565b6125209190614d3a565b90506001600c60008282546125359190614d3a565b925050819055506125463382612f67565b50808061255290614f68565b9150506124fa565b505b50565b612710806127106123286103e86125769190614d3a565b6125809190614d3a565b61258a9190614d3a565b6125949190614d3a565b81565b60606125a282612c4b565b6125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d8906148e4565b60405180910390fd5b6000601280546125f090614f05565b80601f016020809104026020016040519081016040528092919081815260200182805461261c90614f05565b80156126695780601f1061263e57610100808354040283529160200191612669565b820191906000526020600020905b81548152906001019060200180831161264c57829003601f168201915b505050505090506000815111612709576011805461268690614f05565b80601f01602080910402602001604051908101604052809291908181526020018280546126b290614f05565b80156126ff5780601f106126d4576101008083540402835291602001916126ff565b820191906000526020600020905b8154815290600101906020018083116126e257829003601f168201915b5050505050612734565b8061271384613303565b60405160200161272492919061473c565b6040516020818303038152906040525b915050919050565b601e81565b612749612cb7565b73ffffffffffffffffffffffffffffffffffffffff16612767611984565b73ffffffffffffffffffffffffffffffffffffffff16146127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614a64565b60405180910390fd5b60056127c76110ad565b10612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614b04565b60405180910390fd5b601e81111561284b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284290614b84565b60405180910390fd5b6103e881600b5461285c9190614d3a565b111561289d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612894906149a4565b60405180910390fd5b348160006128ab9190614dc1565b11156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e390614904565b60405180910390fd5b60005b818110156129425760006001600b546129089190614d3a565b90506001600b600082825461291d9190614d3a565b9250508190555061292e3382612f67565b50808061293a90614f68565b9150506128ef565b5050565b600081565b60606010805461295a90614f05565b80601f016020809104026020016040519081016040528092919081815260200182805461298690614f05565b80156129d35780601f106129a8576101008083540402835291602001916129d3565b820191906000526020600020905b8154815290600101906020018083116129b657829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a79612cb7565b73ffffffffffffffffffffffffffffffffffffffff16612a97611984565b73ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614a64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5490614864565b60405180910390fd5b612b66816131e1565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c3457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c445750612c4382613464565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d32836116fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612d8382612c4b565b612dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db990614924565b60405180910390fd5b6000612dcd836116fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e3c57508373ffffffffffffffffffffffffffffffffffffffff16612e2484610c31565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e4d5750612e4c81856129dd565b5b91505092915050565b6000612e61826116fa565b9050612e6f816000846134ce565b612e7a600083612cbf565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eca9190614e1b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612f818282604051806020016040528060008152506135e2565b5050565b8273ffffffffffffffffffffffffffffffffffffffff16612fa5826116fa565b73ffffffffffffffffffffffffffffffffffffffff1614612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff290614a84565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561306b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613062906148a4565b60405180910390fd5b6130768383836134ce565b613081600082612cbf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d19190614e1b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131289190614d3a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132b2848484612f85565b6132be8484848461363d565b6132fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f490614844565b60405180910390fd5b50505050565b6060600082141561334b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061345f565b600082905060005b6000821461337d57808061336690614f68565b915050600a826133769190614d90565b9150613353565b60008167ffffffffffffffff811115613399576133986150cd565b5b6040519080825280601f01601f1916602001820160405280156133cb5781602001600182028036833780820191505090505b5090505b60008514613458576001826133e49190614e1b565b9150600a856133f39190614fb1565b60306133ff9190614d3a565b60f81b8183815181106134155761341461509e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134519190614d90565b94506133cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134d98383836137d4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561351c57613517816137d9565b61355b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461355a576135598382613822565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561359e576135998161398f565b6135dd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135dc576135db8282613a60565b5b5b505050565b6135ec8383613adf565b6135f9600084848461363d565b613638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362f90614844565b60405180910390fd5b505050565b600061365e8473ffffffffffffffffffffffffffffffffffffffff16613cad565b156137c7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613687612cb7565b8786866040518563ffffffff1660e01b81526004016136a9949392919061477b565b602060405180830381600087803b1580156136c357600080fd5b505af19250505080156136f457506040513d601f19601f820116820180604052508101906136f191906140af565b60015b613777573d8060008114613724576040519150601f19603f3d011682016040523d82523d6000602084013e613729565b606091505b5060008151141561376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376690614844565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137cc565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161382f8461183e565b6138399190614e1b565b905060006007600084815260200190815260200160002054905081811461391e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139a39190614e1b565b90506000600960008481526020019081526020016000205490506000600883815481106139d3576139d261509e565b5b9060005260206000200154905080600883815481106139f5576139f461509e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a4457613a4361506f565b5b6001900381819060005260206000200160009055905550505050565b6000613a6b8361183e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b46906149e4565b60405180910390fd5b613b5881612c4b565b15613b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8f90614884565b60405180910390fd5b613ba4600083836134ce565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bf49190614d3a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613ccc90614f05565b90600052602060002090601f016020900481019282613cee5760008555613d35565b82601f10613d0757803560ff1916838001178555613d35565b82800160010185558215613d35579182015b82811115613d34578235825591602001919060010190613d19565b5b509050613d429190613d46565b5090565b5b80821115613d5f576000816000905550600101613d47565b5090565b6000613d76613d7184614cc6565b614ca1565b905082815260208101848484011115613d9257613d9161510b565b5b613d9d848285614ec3565b509392505050565b600081359050613db481615856565b92915050565b600081359050613dc98161586d565b92915050565b600081359050613dde81615884565b92915050565b600081519050613df381615884565b92915050565b600082601f830112613e0e57613e0d615101565b5b8135613e1e848260208601613d63565b91505092915050565b60008083601f840112613e3d57613e3c615101565b5b8235905067ffffffffffffffff811115613e5a57613e596150fc565b5b602083019150836001820283011115613e7657613e75615106565b5b9250929050565b600081359050613e8c8161589b565b92915050565b600060208284031215613ea857613ea7615115565b5b6000613eb684828501613da5565b91505092915050565b60008060408385031215613ed657613ed5615115565b5b6000613ee485828601613da5565b9250506020613ef585828601613da5565b9150509250929050565b600080600060608486031215613f1857613f17615115565b5b6000613f2686828701613da5565b9350506020613f3786828701613da5565b9250506040613f4886828701613e7d565b9150509250925092565b60008060008060808587031215613f6c57613f6b615115565b5b6000613f7a87828801613da5565b9450506020613f8b87828801613da5565b9350506040613f9c87828801613e7d565b925050606085013567ffffffffffffffff811115613fbd57613fbc615110565b5b613fc987828801613df9565b91505092959194509250565b60008060408385031215613fec57613feb615115565b5b6000613ffa85828601613da5565b925050602061400b85828601613dba565b9150509250929050565b6000806040838503121561402c5761402b615115565b5b600061403a85828601613da5565b925050602061404b85828601613e7d565b9150509250929050565b60006020828403121561406b5761406a615115565b5b600061407984828501613dba565b91505092915050565b60006020828403121561409857614097615115565b5b60006140a684828501613dcf565b91505092915050565b6000602082840312156140c5576140c4615115565b5b60006140d384828501613de4565b91505092915050565b600080602083850312156140f3576140f2615115565b5b600083013567ffffffffffffffff81111561411157614110615110565b5b61411d85828601613e27565b92509250509250929050565b60006020828403121561413f5761413e615115565b5b600061414d84828501613e7d565b91505092915050565b6000806040838503121561416d5761416c615115565b5b600061417b85828601613e7d565b925050602061418c85828601613e7d565b9150509250929050565b6000806000806000806000806000806101408b8d0312156141ba576141b9615115565b5b60006141c88d828e01613e7d565b9a505060206141d98d828e01613e7d565b99505060406141ea8d828e01613e7d565b98505060606141fb8d828e01613e7d565b975050608061420c8d828e01613e7d565b96505060a061421d8d828e01613e7d565b95505060c061422e8d828e01613e7d565b94505060e061423f8d828e01613e7d565b9350506101006142518d828e01613e7d565b9250506101206142638d828e01613e7d565b9150509295989b9194979a5092959850565b61427e81614e4f565b82525050565b61428d81614e61565b82525050565b600061429e82614cf7565b6142a88185614d0d565b93506142b8818560208601614ed2565b6142c18161511a565b840191505092915050565b60006142d782614d02565b6142e18185614d1e565b93506142f1818560208601614ed2565b6142fa8161511a565b840191505092915050565b600061431082614d02565b61431a8185614d2f565b935061432a818560208601614ed2565b80840191505092915050565b6000614343602a83614d1e565b915061434e8261512b565b604082019050919050565b6000614366602b83614d1e565b91506143718261517a565b604082019050919050565b6000614389603283614d1e565b9150614394826151c9565b604082019050919050565b60006143ac602683614d1e565b91506143b782615218565b604082019050919050565b60006143cf601c83614d1e565b91506143da82615267565b602082019050919050565b60006143f2602483614d1e565b91506143fd82615290565b604082019050919050565b6000614415601983614d1e565b9150614420826152df565b602082019050919050565b6000614438601483614d1e565b915061444382615308565b602082019050919050565b600061445b601c83614d1e565b915061446682615331565b602082019050919050565b600061447e602c83614d1e565b91506144898261535a565b604082019050919050565b60006144a1603883614d1e565b91506144ac826153a9565b604082019050919050565b60006144c4602a83614d1e565b91506144cf826153f8565b604082019050919050565b60006144e7602983614d1e565b91506144f282615447565b604082019050919050565b600061450a602083614d1e565b915061451582615496565b602082019050919050565b600061452d602a83614d1e565b9150614538826154bf565b604082019050919050565b6000614550602083614d1e565b915061455b8261550e565b602082019050919050565b6000614573601683614d1e565b915061457e82615537565b602082019050919050565b6000614596602c83614d1e565b91506145a182615560565b604082019050919050565b60006145b9601283614d1e565b91506145c4826155af565b602082019050919050565b60006145dc602083614d1e565b91506145e7826155d8565b602082019050919050565b60006145ff602983614d1e565b915061460a82615601565b604082019050919050565b6000614622602183614d1e565b915061462d82615650565b604082019050919050565b6000614645602083614d1e565b91506146508261569f565b602082019050919050565b6000614668603183614d1e565b9150614673826156c8565b604082019050919050565b600061468b602883614d1e565b915061469682615717565b604082019050919050565b60006146ae602c83614d1e565b91506146b982615766565b604082019050919050565b60006146d1603083614d1e565b91506146dc826157b5565b604082019050919050565b60006146f4601b83614d1e565b91506146ff82615804565b602082019050919050565b6000614717602083614d1e565b91506147228261582d565b602082019050919050565b61473681614eb9565b82525050565b60006147488285614305565b91506147548284614305565b91508190509392505050565b60006020820190506147756000830184614275565b92915050565b60006080820190506147906000830187614275565b61479d6020830186614275565b6147aa604083018561472d565b81810360608301526147bc8184614293565b905095945050505050565b60006020820190506147dc6000830184614284565b92915050565b600060208201905081810360008301526147fc81846142cc565b905092915050565b6000602082019050818103600083015261481d81614336565b9050919050565b6000602082019050818103600083015261483d81614359565b9050919050565b6000602082019050818103600083015261485d8161437c565b9050919050565b6000602082019050818103600083015261487d8161439f565b9050919050565b6000602082019050818103600083015261489d816143c2565b9050919050565b600060208201905081810360008301526148bd816143e5565b9050919050565b600060208201905081810360008301526148dd81614408565b9050919050565b600060208201905081810360008301526148fd8161442b565b9050919050565b6000602082019050818103600083015261491d8161444e565b9050919050565b6000602082019050818103600083015261493d81614471565b9050919050565b6000602082019050818103600083015261495d81614494565b9050919050565b6000602082019050818103600083015261497d816144b7565b9050919050565b6000602082019050818103600083015261499d816144da565b9050919050565b600060208201905081810360008301526149bd816144fd565b9050919050565b600060208201905081810360008301526149dd81614520565b9050919050565b600060208201905081810360008301526149fd81614543565b9050919050565b60006020820190508181036000830152614a1d81614566565b9050919050565b60006020820190508181036000830152614a3d81614589565b9050919050565b60006020820190508181036000830152614a5d816145ac565b9050919050565b60006020820190508181036000830152614a7d816145cf565b9050919050565b60006020820190508181036000830152614a9d816145f2565b9050919050565b60006020820190508181036000830152614abd81614615565b9050919050565b60006020820190508181036000830152614add81614638565b9050919050565b60006020820190508181036000830152614afd8161465b565b9050919050565b60006020820190508181036000830152614b1d8161467e565b9050919050565b60006020820190508181036000830152614b3d816146a1565b9050919050565b60006020820190508181036000830152614b5d816146c4565b9050919050565b60006020820190508181036000830152614b7d816146e7565b9050919050565b60006020820190508181036000830152614b9d8161470a565b9050919050565b6000602082019050614bb9600083018461472d565b92915050565b6000606082019050614bd4600083018661472d565b614be1602083018561472d565b614bee604083018461472d565b949350505050565b600061016082019050614c0c600083018e61472d565b614c19602083018d61472d565b614c26604083018c61472d565b614c33606083018b61472d565b614c40608083018a61472d565b614c4d60a083018961472d565b614c5a60c083018861472d565b614c6760e083018761472d565b614c7561010083018661472d565b614c8361012083018561472d565b614c9161014083018461472d565b9c9b505050505050505050505050565b6000614cab614cbc565b9050614cb78282614f37565b919050565b6000604051905090565b600067ffffffffffffffff821115614ce157614ce06150cd565b5b614cea8261511a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d4582614eb9565b9150614d5083614eb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d8557614d84614fe2565b5b828201905092915050565b6000614d9b82614eb9565b9150614da683614eb9565b925082614db657614db5615011565b5b828204905092915050565b6000614dcc82614eb9565b9150614dd783614eb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e1057614e0f614fe2565b5b828202905092915050565b6000614e2682614eb9565b9150614e3183614eb9565b925082821015614e4457614e43614fe2565b5b828203905092915050565b6000614e5a82614e99565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ef0578082015181840152602081019050614ed5565b83811115614eff576000848401525b50505050565b60006002820490506001821680614f1d57607f821691505b60208210811415614f3157614f30615040565b5b50919050565b614f408261511a565b810181811067ffffffffffffffff82111715614f5f57614f5e6150cd565b5b80604052505050565b6000614f7382614eb9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fa657614fa5614fe2565b5b600182019050919050565b6000614fbc82614eb9565b9150614fc783614eb9565b925082614fd757614fd6615011565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6b656e204944206e65656420746f2062652077697468696e20746865206260008201527f75726e312072616e676500000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f546f6b656e204944206e65656420746f2062652077697468696e20746865206260008201527f75726e322072616e676500000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4275726e206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e74656420666f722060008201527f7265736572766573000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b61585f81614e4f565b811461586a57600080fd5b50565b61587681614e61565b811461588157600080fd5b50565b61588d81614e6d565b811461589857600080fd5b50565b6158a481614eb9565b81146158af57600080fd5b5056fea2646970667358221220366dc138dceeb967124fdb11863ca51c74ab9b46c26e38f543c65185b940efdf64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009547261736863616e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055472617368000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ad5760003560e01c80638a2f1dee11610175578063b88d4fde116100dc578063c87b56dd11610095578063e62a1f2d1161006f578063e62a1f2d14610a5d578063e8a3d48514610a88578063e985e9c514610ab3578063f2fde38b14610af0576102ad565b8063c87b56dd146109d9578063d75e611014610a16578063da881c0214610a41576102ad565b8063b88d4fde146108ea578063b98d952114610913578063bca947e01461093c578063bf03565414610967578063c297d38114610992578063c30e7684146109ae576102ad565b80639d2cc4361161012e5780639d2cc436146107ec578063a22cb46514610817578063a73d8ca714610840578063afbd964814610869578063b1a6676e14610894578063b807bafe146108bf576102ad565b80638a2f1dee146106ee5780638da5cb5b146107195780639123468a14610744578063938e3d7b1461076f57806395d89b41146107985780639a308429146107c3576102ad565b80633bff9e70116102195780634f6ccce7116101d25780634f6ccce7146105ce57806355f804b31461060b5780636352211e146106345780636e83843a1461067157806370a082311461069a578063715018a6146106d7576102ad565b80633bff9e70146104e65780633ccfd60b1461051157806342842e0e1461052857806342966c681461055157806345f1fdc71461057a578063499ea0a2146105a5576102ad565b806316ea114b1161026b57806316ea114b146103d657806318160ddd146103ff5780631dfafb491461042a57806323b872dd146104555780632cef7e401461047e5780632f745c59146104a9576102ad565b8062a58241146102b257806301ffc9a7146102dd578063027c89771461031a57806306fdde0314610345578063081812fc14610370578063095ea7b3146103ad575b600080fd5b3480156102be57600080fd5b506102c7610b19565b6040516102d49190614ba4565b60405180910390f35b3480156102e957600080fd5b5061030460048036038101906102ff9190614082565b610b1f565b60405161031191906147c7565b60405180910390f35b34801561032657600080fd5b5061032f610b99565b60405161033c9190614ba4565b60405180910390f35b34801561035157600080fd5b5061035a610b9f565b60405161036791906147e2565b60405180910390f35b34801561037c57600080fd5b5061039760048036038101906103929190614129565b610c31565b6040516103a49190614760565b60405180910390f35b3480156103b957600080fd5b506103d460048036038101906103cf9190614015565b610cb6565b005b3480156103e257600080fd5b506103fd60048036038101906103f89190614196565b610dce565b005b34801561040b57600080fd5b506104146110ad565b6040516104219190614ba4565b60405180910390f35b34801561043657600080fd5b5061043f6110ba565b60405161044c9190614ba4565b60405180910390f35b34801561046157600080fd5b5061047c60048036038101906104779190613eff565b6110c0565b005b34801561048a57600080fd5b50610493611120565b6040516104a09190614ba4565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190614015565b611126565b6040516104dd9190614ba4565b60405180910390f35b3480156104f257600080fd5b506104fb6111cb565b6040516105089190614ba4565b60405180910390f35b34801561051d57600080fd5b506105266111d6565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613eff565b6112a1565b005b34801561055d57600080fd5b5061057860048036038101906105739190614129565b6112c1565b005b34801561058657600080fd5b5061058f61131d565b60405161059c9190614ba4565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c79190614156565b611323565b005b3480156105da57600080fd5b506105f560048036038101906105f09190614129565b6115f7565b6040516106029190614ba4565b60405180910390f35b34801561061757600080fd5b50610632600480360381019061062d91906140dc565b611668565b005b34801561064057600080fd5b5061065b60048036038101906106569190614129565b6116fa565b6040516106689190614760565b60405180910390f35b34801561067d57600080fd5b50610698600480360381019061069391906140dc565b6117ac565b005b3480156106a657600080fd5b506106c160048036038101906106bc9190613e92565b61183e565b6040516106ce9190614ba4565b60405180910390f35b3480156106e357600080fd5b506106ec6118f6565b005b3480156106fa57600080fd5b5061070361197e565b6040516107109190614ba4565b60405180910390f35b34801561072557600080fd5b5061072e611984565b60405161073b9190614760565b60405180910390f35b34801561075057600080fd5b506107596119ae565b60405161076691906147c7565b60405180910390f35b34801561077b57600080fd5b50610796600480360381019061079191906140dc565b6119c1565b005b3480156107a457600080fd5b506107ad611a53565b6040516107ba91906147e2565b60405180910390f35b3480156107cf57600080fd5b506107ea60048036038101906107e59190614196565b611ae5565b005b3480156107f857600080fd5b50610801611db7565b60405161080e9190614ba4565b60405180910390f35b34801561082357600080fd5b5061083e60048036038101906108399190613fd5565b611dbc565b005b34801561084c57600080fd5b5061086760048036038101906108629190614055565b611f3d565b005b34801561087557600080fd5b5061087e611fd6565b60405161088b9190614ba4565b60405180910390f35b3480156108a057600080fd5b506108a9611fdc565b6040516108b691906147c7565b60405180910390f35b3480156108cb57600080fd5b506108d4611fef565b6040516108e19190614ba4565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190613f52565b611ff5565b005b34801561091f57600080fd5b5061093a60048036038101906109359190614055565b612057565b005b34801561094857600080fd5b506109516120f0565b60405161095e9190614ba4565b60405180910390f35b34801561097357600080fd5b5061097c6120f6565b6040516109899190614ba4565b60405180910390f35b6109ac60048036038101906109a79190614129565b6120fc565b005b3480156109ba57600080fd5b506109c361255f565b6040516109d09190614ba4565b60405180910390f35b3480156109e557600080fd5b50610a0060048036038101906109fb9190614129565b612597565b604051610a0d91906147e2565b60405180910390f35b348015610a2257600080fd5b50610a2b61273c565b604051610a389190614ba4565b60405180910390f35b610a5b6004803603810190610a569190614129565b612741565b005b348015610a6957600080fd5b50610a72612946565b604051610a7f9190614ba4565b60405180910390f35b348015610a9457600080fd5b50610a9d61294b565b604051610aaa91906147e2565b60405180910390f35b348015610abf57600080fd5b50610ada6004803603810190610ad59190613ebf565b6129dd565b604051610ae791906147c7565b60405180910390f35b348015610afc57600080fd5b50610b176004803603810190610b129190613e92565b612a71565b005b600d5481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b925750610b9182612b69565b5b9050919050565b600b5481565b606060008054610bae90614f05565b80601f0160208091040260200160405190810160405280929190818152602001828054610bda90614f05565b8015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b5050505050905090565b6000610c3c82612c4b565b610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7290614a24565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cc1826116fa565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2990614aa4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d51612cb7565b73ffffffffffffffffffffffffffffffffffffffff161480610d805750610d7f81610d7a612cb7565b6129dd565b5b610dbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db690614944565b60405180910390fd5b610dc98383612cbf565b505050565b600a60159054906101000a900460ff16610e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1490614a04565b60405180910390fd5b600a60149054906101000a900460ff16610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614a44565b60405180910390fd5b610e7d610e77612cb7565b8b612d78565b8015610e965750610e95610e8f612cb7565b8a612d78565b5b8015610eaf5750610eae610ea8612cb7565b89612d78565b5b8015610ec85750610ec7610ec1612cb7565b88612d78565b5b8015610ee15750610ee0610eda612cb7565b87612d78565b5b8015610efa5750610ef9610ef3612cb7565b86612d78565b5b8015610f135750610f12610f0c612cb7565b85612d78565b5b8015610f2c5750610f2b610f25612cb7565b84612d78565b5b8015610f455750610f44610f3e612cb7565b83612d78565b5b8015610f5e5750610f5d610f57612cb7565b82612d78565b5b610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9490614ac4565b60405180910390fd5b610fa68a612e56565b610faf89612e56565b610fb888612e56565b610fc187612e56565b610fca86612e56565b610fd385612e56565b610fdc84612e56565b610fe583612e56565b610fee82612e56565b610ff781612e56565b60006001600e546127106123286103e86110119190614d3a565b61101b9190614d3a565b6110259190614d3a565b61102f9190614d3a565b905061103b3382612f67565b6001600e600082825461104e9190614d3a565b925050819055507fe6883098455c3e00de3f45217e9ab05507e0dd6df90efcbc0da86952a7c5aac38b8b8b8b8b8b8b8b8b8b8b6040516110989b9a99989796959493929190614bf6565b60405180910390a15050505050505050505050565b6000600880549050905090565b61271081565b6110d16110cb612cb7565b82612d78565b611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110790614ae4565b60405180910390fd5b61111b838383612f85565b505050565b600e5481565b60006111318361183e565b8210611172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116990614824565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b662386f26fc1000081565b6111de612cb7565b73ffffffffffffffffffffffffffffffffffffffff166111fc611984565b73ffffffffffffffffffffffffffffffffffffffff1614611252576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124990614a64565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561129d573d6000803e3d6000fd5b5050565b6112bc83838360405180602001604052806000815250611ff5565b505050565b6112d26112cc612cb7565b82612d78565b611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614b44565b60405180910390fd5b61131a81612e56565b50565b61232881565b612710821015611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135f90614804565b60405180910390fd5b614e2082106113ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a390614804565b60405180910390fd5b614e208110156113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e8906149c4565b60405180910390fd5b6175308110611435576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142c906149c4565b60405180910390fd5b611446611440612cb7565b83612d78565b801561145f575061145e611458612cb7565b82612d78565b5b61149e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149590614ac4565b60405180910390fd5b600a60159054906101000a900460ff166114ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e490614a04565b60405180910390fd5b600a60149054906101000a900460ff1661153c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153390614a44565b60405180910390fd5b61154582612e56565b61154e81612e56565b60006001600f54612710806123286103e86115699190614d3a565b6115739190614d3a565b61157d9190614d3a565b6115879190614d3a565b6115919190614d3a565b905061159d3382612f67565b6001600f60008282546115b09190614d3a565b925050819055507f02da4277a5cdf6e403c046815e8450be5502e02a43b4653472dc6a9385a91ca28383836040516115ea93929190614bbf565b60405180910390a1505050565b60006116016110ad565b8210611642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163990614b24565b60405180910390fd5b600882815481106116565761165561509e565b5b90600052602060002001549050919050565b611670612cb7565b73ffffffffffffffffffffffffffffffffffffffff1661168e611984565b73ffffffffffffffffffffffffffffffffffffffff16146116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90614a64565b60405180910390fd5b8181601191906116f5929190613cc0565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179a90614984565b60405180910390fd5b80915050919050565b6117b4612cb7565b73ffffffffffffffffffffffffffffffffffffffff166117d2611984565b73ffffffffffffffffffffffffffffffffffffffff1614611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f90614a64565b60405180910390fd5b818160129190611839929190613cc0565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a690614964565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6118fe612cb7565b73ffffffffffffffffffffffffffffffffffffffff1661191c611984565b73ffffffffffffffffffffffffffffffffffffffff1614611972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196990614a64565b60405180910390fd5b61197c60006131e1565b565b6103e881565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600a60159054906101000a900460ff1681565b6119c9612cb7565b73ffffffffffffffffffffffffffffffffffffffff166119e7611984565b73ffffffffffffffffffffffffffffffffffffffff1614611a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3490614a64565b60405180910390fd5b818160109190611a4e929190613cc0565b505050565b606060018054611a6290614f05565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8e90614f05565b8015611adb5780601f10611ab057610100808354040283529160200191611adb565b820191906000526020600020905b815481529060010190602001808311611abe57829003601f168201915b5050505050905090565b600a60159054906101000a900460ff16611b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2b90614a04565b60405180910390fd5b600a60149054906101000a900460ff16611b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7a90614a44565b60405180910390fd5b611b94611b8e612cb7565b8b612d78565b8015611bad5750611bac611ba6612cb7565b8a612d78565b5b8015611bc65750611bc5611bbf612cb7565b89612d78565b5b8015611bdf5750611bde611bd8612cb7565b88612d78565b5b8015611bf85750611bf7611bf1612cb7565b87612d78565b5b8015611c115750611c10611c0a612cb7565b86612d78565b5b8015611c2a5750611c29611c23612cb7565b85612d78565b5b8015611c435750611c42611c3c612cb7565b84612d78565b5b8015611c5c5750611c5b611c55612cb7565b83612d78565b5b8015611c755750611c74611c6e612cb7565b82612d78565b5b611cb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cab90614ac4565b60405180910390fd5b611cbd8a612e56565b611cc689612e56565b611ccf88612e56565b611cd887612e56565b611ce186612e56565b611cea85612e56565b611cf384612e56565b611cfc83612e56565b611d0582612e56565b611d0e81612e56565b60006001600d546123286103e8611d259190614d3a565b611d2f9190614d3a565b611d399190614d3a565b9050611d453382612f67565b6001600d6000828254611d589190614d3a565b925050819055507fa82bf52e46ec540a29d332784c3b9d238b26df7a8a2db2c85659cd4ffbccdacd8b8b8b8b8b8b8b8b8b8b8b604051611da29b9a99989796959493929190614bf6565b60405180910390a15050505050505050505050565b600581565b611dc4612cb7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e29906148c4565b60405180910390fd5b8060056000611e3f612cb7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611eec612cb7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f3191906147c7565b60405180910390a35050565b611f45612cb7565b73ffffffffffffffffffffffffffffffffffffffff16611f63611984565b73ffffffffffffffffffffffffffffffffffffffff1614611fb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb090614a64565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b600f5481565b600a60149054906101000a900460ff1681565b61271081565b612006612000612cb7565b83612d78565b612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c90614ae4565b60405180910390fd5b612051848484846132a7565b50505050565b61205f612cb7565b73ffffffffffffffffffffffffffffffffffffffff1661207d611984565b73ffffffffffffffffffffffffffffffffffffffff16146120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca90614a64565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b600c5481565b61271081565b6103e86121076110ad565b101561231657600a60159054906101000a900460ff1661215c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215390614a04565b60405180910390fd5b612710806127106123286103e86121739190614d3a565b61217d9190614d3a565b6121879190614d3a565b6121919190614d3a565b6121996110ad565b106121d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d090614b64565b60405180910390fd5b601e81111561221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490614b84565b60405180910390fd5b6103e881600b5461222e9190614d3a565b111561226f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612266906149a4565b60405180910390fd5b3481600061227d9190614dc1565b11156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614904565b60405180910390fd5b60005b818110156123145760006001600b546122da9190614d3a565b90506001600b60008282546122ef9190614d3a565b925050819055506123003382612f67565b50808061230c90614f68565b9150506122c1565b505b6103e86123216110ad565b1061255c57600a60159054906101000a900460ff16612375576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236c90614a04565b60405180910390fd5b612710806127106123286103e861238c9190614d3a565b6123969190614d3a565b6123a09190614d3a565b6123aa9190614d3a565b6123b26110ad565b106123f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e990614b64565b60405180910390fd5b601e811115612436576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242d90614b84565b60405180910390fd5b6123286103e86124469190614d3a565b81600c54600b546124579190614d3a565b6124619190614d3a565b11156124a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612499906149a4565b60405180910390fd5b3481662386f26fc100006124b69190614dc1565b11156124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee90614904565b60405180910390fd5b60005b8181101561255a5760006001600c54600b546125169190614d3a565b6125209190614d3a565b90506001600c60008282546125359190614d3a565b925050819055506125463382612f67565b50808061255290614f68565b9150506124fa565b505b50565b612710806127106123286103e86125769190614d3a565b6125809190614d3a565b61258a9190614d3a565b6125949190614d3a565b81565b60606125a282612c4b565b6125e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d8906148e4565b60405180910390fd5b6000601280546125f090614f05565b80601f016020809104026020016040519081016040528092919081815260200182805461261c90614f05565b80156126695780601f1061263e57610100808354040283529160200191612669565b820191906000526020600020905b81548152906001019060200180831161264c57829003601f168201915b505050505090506000815111612709576011805461268690614f05565b80601f01602080910402602001604051908101604052809291908181526020018280546126b290614f05565b80156126ff5780601f106126d4576101008083540402835291602001916126ff565b820191906000526020600020905b8154815290600101906020018083116126e257829003601f168201915b5050505050612734565b8061271384613303565b60405160200161272492919061473c565b6040516020818303038152906040525b915050919050565b601e81565b612749612cb7565b73ffffffffffffffffffffffffffffffffffffffff16612767611984565b73ffffffffffffffffffffffffffffffffffffffff16146127bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b490614a64565b60405180910390fd5b60056127c76110ad565b10612807576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fe90614b04565b60405180910390fd5b601e81111561284b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284290614b84565b60405180910390fd5b6103e881600b5461285c9190614d3a565b111561289d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612894906149a4565b60405180910390fd5b348160006128ab9190614dc1565b11156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e390614904565b60405180910390fd5b60005b818110156129425760006001600b546129089190614d3a565b90506001600b600082825461291d9190614d3a565b9250508190555061292e3382612f67565b50808061293a90614f68565b9150506128ef565b5050565b600081565b60606010805461295a90614f05565b80601f016020809104026020016040519081016040528092919081815260200182805461298690614f05565b80156129d35780601f106129a8576101008083540402835291602001916129d3565b820191906000526020600020905b8154815290600101906020018083116129b657829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612a79612cb7565b73ffffffffffffffffffffffffffffffffffffffff16612a97611984565b73ffffffffffffffffffffffffffffffffffffffff1614612aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae490614a64565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5490614864565b60405180910390fd5b612b66816131e1565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612c3457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612c445750612c4382613464565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612d32836116fa565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612d8382612c4b565b612dc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db990614924565b60405180910390fd5b6000612dcd836116fa565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e3c57508373ffffffffffffffffffffffffffffffffffffffff16612e2484610c31565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e4d5750612e4c81856129dd565b5b91505092915050565b6000612e61826116fa565b9050612e6f816000846134ce565b612e7a600083612cbf565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612eca9190614e1b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b612f818282604051806020016040528060008152506135e2565b5050565b8273ffffffffffffffffffffffffffffffffffffffff16612fa5826116fa565b73ffffffffffffffffffffffffffffffffffffffff1614612ffb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff290614a84565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561306b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613062906148a4565b60405180910390fd5b6130768383836134ce565b613081600082612cbf565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d19190614e1b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131289190614d3a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6132b2848484612f85565b6132be8484848461363d565b6132fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f490614844565b60405180910390fd5b50505050565b6060600082141561334b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061345f565b600082905060005b6000821461337d57808061336690614f68565b915050600a826133769190614d90565b9150613353565b60008167ffffffffffffffff811115613399576133986150cd565b5b6040519080825280601f01601f1916602001820160405280156133cb5781602001600182028036833780820191505090505b5090505b60008514613458576001826133e49190614e1b565b9150600a856133f39190614fb1565b60306133ff9190614d3a565b60f81b8183815181106134155761341461509e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856134519190614d90565b94506133cf565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6134d98383836137d4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561351c57613517816137d9565b61355b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461355a576135598382613822565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561359e576135998161398f565b6135dd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146135dc576135db8282613a60565b5b5b505050565b6135ec8383613adf565b6135f9600084848461363d565b613638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161362f90614844565b60405180910390fd5b505050565b600061365e8473ffffffffffffffffffffffffffffffffffffffff16613cad565b156137c7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613687612cb7565b8786866040518563ffffffff1660e01b81526004016136a9949392919061477b565b602060405180830381600087803b1580156136c357600080fd5b505af19250505080156136f457506040513d601f19601f820116820180604052508101906136f191906140af565b60015b613777573d8060008114613724576040519150601f19603f3d011682016040523d82523d6000602084013e613729565b606091505b5060008151141561376f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161376690614844565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506137cc565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161382f8461183e565b6138399190614e1b565b905060006007600084815260200190815260200160002054905081811461391e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506139a39190614e1b565b90506000600960008481526020019081526020016000205490506000600883815481106139d3576139d261509e565b5b9060005260206000200154905080600883815481106139f5576139f461509e565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613a4457613a4361506f565b5b6001900381819060005260206000200160009055905550505050565b6000613a6b8361183e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b46906149e4565b60405180910390fd5b613b5881612c4b565b15613b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b8f90614884565b60405180910390fd5b613ba4600083836134ce565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613bf49190614d3a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613ccc90614f05565b90600052602060002090601f016020900481019282613cee5760008555613d35565b82601f10613d0757803560ff1916838001178555613d35565b82800160010185558215613d35579182015b82811115613d34578235825591602001919060010190613d19565b5b509050613d429190613d46565b5090565b5b80821115613d5f576000816000905550600101613d47565b5090565b6000613d76613d7184614cc6565b614ca1565b905082815260208101848484011115613d9257613d9161510b565b5b613d9d848285614ec3565b509392505050565b600081359050613db481615856565b92915050565b600081359050613dc98161586d565b92915050565b600081359050613dde81615884565b92915050565b600081519050613df381615884565b92915050565b600082601f830112613e0e57613e0d615101565b5b8135613e1e848260208601613d63565b91505092915050565b60008083601f840112613e3d57613e3c615101565b5b8235905067ffffffffffffffff811115613e5a57613e596150fc565b5b602083019150836001820283011115613e7657613e75615106565b5b9250929050565b600081359050613e8c8161589b565b92915050565b600060208284031215613ea857613ea7615115565b5b6000613eb684828501613da5565b91505092915050565b60008060408385031215613ed657613ed5615115565b5b6000613ee485828601613da5565b9250506020613ef585828601613da5565b9150509250929050565b600080600060608486031215613f1857613f17615115565b5b6000613f2686828701613da5565b9350506020613f3786828701613da5565b9250506040613f4886828701613e7d565b9150509250925092565b60008060008060808587031215613f6c57613f6b615115565b5b6000613f7a87828801613da5565b9450506020613f8b87828801613da5565b9350506040613f9c87828801613e7d565b925050606085013567ffffffffffffffff811115613fbd57613fbc615110565b5b613fc987828801613df9565b91505092959194509250565b60008060408385031215613fec57613feb615115565b5b6000613ffa85828601613da5565b925050602061400b85828601613dba565b9150509250929050565b6000806040838503121561402c5761402b615115565b5b600061403a85828601613da5565b925050602061404b85828601613e7d565b9150509250929050565b60006020828403121561406b5761406a615115565b5b600061407984828501613dba565b91505092915050565b60006020828403121561409857614097615115565b5b60006140a684828501613dcf565b91505092915050565b6000602082840312156140c5576140c4615115565b5b60006140d384828501613de4565b91505092915050565b600080602083850312156140f3576140f2615115565b5b600083013567ffffffffffffffff81111561411157614110615110565b5b61411d85828601613e27565b92509250509250929050565b60006020828403121561413f5761413e615115565b5b600061414d84828501613e7d565b91505092915050565b6000806040838503121561416d5761416c615115565b5b600061417b85828601613e7d565b925050602061418c85828601613e7d565b9150509250929050565b6000806000806000806000806000806101408b8d0312156141ba576141b9615115565b5b60006141c88d828e01613e7d565b9a505060206141d98d828e01613e7d565b99505060406141ea8d828e01613e7d565b98505060606141fb8d828e01613e7d565b975050608061420c8d828e01613e7d565b96505060a061421d8d828e01613e7d565b95505060c061422e8d828e01613e7d565b94505060e061423f8d828e01613e7d565b9350506101006142518d828e01613e7d565b9250506101206142638d828e01613e7d565b9150509295989b9194979a5092959850565b61427e81614e4f565b82525050565b61428d81614e61565b82525050565b600061429e82614cf7565b6142a88185614d0d565b93506142b8818560208601614ed2565b6142c18161511a565b840191505092915050565b60006142d782614d02565b6142e18185614d1e565b93506142f1818560208601614ed2565b6142fa8161511a565b840191505092915050565b600061431082614d02565b61431a8185614d2f565b935061432a818560208601614ed2565b80840191505092915050565b6000614343602a83614d1e565b915061434e8261512b565b604082019050919050565b6000614366602b83614d1e565b91506143718261517a565b604082019050919050565b6000614389603283614d1e565b9150614394826151c9565b604082019050919050565b60006143ac602683614d1e565b91506143b782615218565b604082019050919050565b60006143cf601c83614d1e565b91506143da82615267565b602082019050919050565b60006143f2602483614d1e565b91506143fd82615290565b604082019050919050565b6000614415601983614d1e565b9150614420826152df565b602082019050919050565b6000614438601483614d1e565b915061444382615308565b602082019050919050565b600061445b601c83614d1e565b915061446682615331565b602082019050919050565b600061447e602c83614d1e565b91506144898261535a565b604082019050919050565b60006144a1603883614d1e565b91506144ac826153a9565b604082019050919050565b60006144c4602a83614d1e565b91506144cf826153f8565b604082019050919050565b60006144e7602983614d1e565b91506144f282615447565b604082019050919050565b600061450a602083614d1e565b915061451582615496565b602082019050919050565b600061452d602a83614d1e565b9150614538826154bf565b604082019050919050565b6000614550602083614d1e565b915061455b8261550e565b602082019050919050565b6000614573601683614d1e565b915061457e82615537565b602082019050919050565b6000614596602c83614d1e565b91506145a182615560565b604082019050919050565b60006145b9601283614d1e565b91506145c4826155af565b602082019050919050565b60006145dc602083614d1e565b91506145e7826155d8565b602082019050919050565b60006145ff602983614d1e565b915061460a82615601565b604082019050919050565b6000614622602183614d1e565b915061462d82615650565b604082019050919050565b6000614645602083614d1e565b91506146508261569f565b602082019050919050565b6000614668603183614d1e565b9150614673826156c8565b604082019050919050565b600061468b602883614d1e565b915061469682615717565b604082019050919050565b60006146ae602c83614d1e565b91506146b982615766565b604082019050919050565b60006146d1603083614d1e565b91506146dc826157b5565b604082019050919050565b60006146f4601b83614d1e565b91506146ff82615804565b602082019050919050565b6000614717602083614d1e565b91506147228261582d565b602082019050919050565b61473681614eb9565b82525050565b60006147488285614305565b91506147548284614305565b91508190509392505050565b60006020820190506147756000830184614275565b92915050565b60006080820190506147906000830187614275565b61479d6020830186614275565b6147aa604083018561472d565b81810360608301526147bc8184614293565b905095945050505050565b60006020820190506147dc6000830184614284565b92915050565b600060208201905081810360008301526147fc81846142cc565b905092915050565b6000602082019050818103600083015261481d81614336565b9050919050565b6000602082019050818103600083015261483d81614359565b9050919050565b6000602082019050818103600083015261485d8161437c565b9050919050565b6000602082019050818103600083015261487d8161439f565b9050919050565b6000602082019050818103600083015261489d816143c2565b9050919050565b600060208201905081810360008301526148bd816143e5565b9050919050565b600060208201905081810360008301526148dd81614408565b9050919050565b600060208201905081810360008301526148fd8161442b565b9050919050565b6000602082019050818103600083015261491d8161444e565b9050919050565b6000602082019050818103600083015261493d81614471565b9050919050565b6000602082019050818103600083015261495d81614494565b9050919050565b6000602082019050818103600083015261497d816144b7565b9050919050565b6000602082019050818103600083015261499d816144da565b9050919050565b600060208201905081810360008301526149bd816144fd565b9050919050565b600060208201905081810360008301526149dd81614520565b9050919050565b600060208201905081810360008301526149fd81614543565b9050919050565b60006020820190508181036000830152614a1d81614566565b9050919050565b60006020820190508181036000830152614a3d81614589565b9050919050565b60006020820190508181036000830152614a5d816145ac565b9050919050565b60006020820190508181036000830152614a7d816145cf565b9050919050565b60006020820190508181036000830152614a9d816145f2565b9050919050565b60006020820190508181036000830152614abd81614615565b9050919050565b60006020820190508181036000830152614add81614638565b9050919050565b60006020820190508181036000830152614afd8161465b565b9050919050565b60006020820190508181036000830152614b1d8161467e565b9050919050565b60006020820190508181036000830152614b3d816146a1565b9050919050565b60006020820190508181036000830152614b5d816146c4565b9050919050565b60006020820190508181036000830152614b7d816146e7565b9050919050565b60006020820190508181036000830152614b9d8161470a565b9050919050565b6000602082019050614bb9600083018461472d565b92915050565b6000606082019050614bd4600083018661472d565b614be1602083018561472d565b614bee604083018461472d565b949350505050565b600061016082019050614c0c600083018e61472d565b614c19602083018d61472d565b614c26604083018c61472d565b614c33606083018b61472d565b614c40608083018a61472d565b614c4d60a083018961472d565b614c5a60c083018861472d565b614c6760e083018761472d565b614c7561010083018661472d565b614c8361012083018561472d565b614c9161014083018461472d565b9c9b505050505050505050505050565b6000614cab614cbc565b9050614cb78282614f37565b919050565b6000604051905090565b600067ffffffffffffffff821115614ce157614ce06150cd565b5b614cea8261511a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d4582614eb9565b9150614d5083614eb9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614d8557614d84614fe2565b5b828201905092915050565b6000614d9b82614eb9565b9150614da683614eb9565b925082614db657614db5615011565b5b828204905092915050565b6000614dcc82614eb9565b9150614dd783614eb9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e1057614e0f614fe2565b5b828202905092915050565b6000614e2682614eb9565b9150614e3183614eb9565b925082821015614e4457614e43614fe2565b5b828203905092915050565b6000614e5a82614e99565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614ef0578082015181840152602081019050614ed5565b83811115614eff576000848401525b50505050565b60006002820490506001821680614f1d57607f821691505b60208210811415614f3157614f30615040565b5b50919050565b614f408261511a565b810181811067ffffffffffffffff82111715614f5f57614f5e6150cd565b5b80604052505050565b6000614f7382614eb9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614fa657614fa5614fe2565b5b600182019050919050565b6000614fbc82614eb9565b9150614fc783614eb9565b925082614fd757614fd6615011565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f546f6b656e204944206e65656420746f2062652077697468696e20746865206260008201527f75726e312072616e676500000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546f6b656e20646f6573206e6f74206578697374000000000000000000000000600082015250565b7f45544820616d6f756e74206973206e6f742073756666696369656e7400000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f546f6b656e204944206e65656420746f2062652077697468696e20746865206260008201527f75726e322072616e676500000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f436f6e7472616374206973206e6f742061637469766500000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4275726e206973206e6f74206163746976650000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e74656420666f722060008201527f7265736572766573000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b61585f81614e4f565b811461586a57600080fd5b50565b61587681614e61565b811461588157600080fd5b50565b61588d81614e6d565b811461589857600080fd5b50565b6158a481614eb9565b81146158af57600080fd5b5056fea2646970667358221220366dc138dceeb967124fdb11863ca51c74ab9b46c26e38f543c65185b940efdf64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009547261736863616e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000055472617368000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Trashcans
Arg [1] : symbol (string): Trash

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 547261736863616e730000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 5472617368000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

204:10489:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1060:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;937:224:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;990:30:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2426:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3985:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3508:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7731:1851:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1577:113:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;499:38:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4875:339:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1096:31:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1245:256:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;734:47:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4825:144;;;;;;;;;;;;;:::i;:::-;;5285:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2120:241:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;409:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9593:1085;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1767:233:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5085:101:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2120:239:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5192:141:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1850:208:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1650:94:11;;;;;;;;;;;;;:::i;:::-;;362:40:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:87:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;874:34:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4975:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2595::3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5884:1836:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;321:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4278:295:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4578:117:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1134:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;837:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;546:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5541:328:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4705:109:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1025:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;454:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2464:1431;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;595:82;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5445:429;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;682:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3903:655;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;786:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5339:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4644:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1899:192:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1060:31:14;;;;:::o;937:224:4:-;1039:4;1078:35;1063:50;;;:11;:50;;;;:90;;;;1117:36;1141:11;1117:23;:36::i;:::-;1063:90;1056:97;;937:224;;;:::o;990:30:14:-;;;;:::o;2426:100:3:-;2480:13;2513:5;2506:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2426:100;:::o;3985:221::-;4061:7;4089:16;4097:7;4089;:16::i;:::-;4081:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4174:15;:24;4190:7;4174:24;;;;;;;;;;;;;;;;;;;;;4167:31;;3985:221;;;:::o;3508:411::-;3589:13;3605:23;3620:7;3605:14;:23::i;:::-;3589:39;;3653:5;3647:11;;:2;:11;;;;3639:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3747:5;3731:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3756:37;3773:5;3780:12;:10;:12::i;:::-;3756:16;:37::i;:::-;3731:62;3709:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;3890:21;3899:2;3903:7;3890:8;:21::i;:::-;3578:341;3508:411;;:::o;7731:1851:14:-;8034:14;;;;;;;;;;;8026:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;8094:12;;;;;;;;;;;8086:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;8166:45;8185:12;:10;:12::i;:::-;8199:11;8166:18;:45::i;:::-;:104;;;;;8225:45;8244:12;:10;:12::i;:::-;8258:11;8225:18;:45::i;:::-;8166:104;:164;;;;;8283:47;8302:12;:10;:12::i;:::-;8316:13;8283:18;:47::i;:::-;8166:164;:224;;;;;8344:46;8363:12;:10;:12::i;:::-;8377;8344:18;:46::i;:::-;8166:224;:284;;;;;8404:46;8423:12;:10;:12::i;:::-;8437;8404:18;:46::i;:::-;8166:284;:343;;;;;8464:45;8483:12;:10;:12::i;:::-;8497:11;8464:18;:45::i;:::-;8166:343;:404;;;;;8523:47;8542:12;:10;:12::i;:::-;8556:13;8523:18;:47::i;:::-;8166:404;:465;;;;;8584:47;8603:12;:10;:12::i;:::-;8617:13;8584:18;:47::i;:::-;8166:465;:525;;;;;8645:46;8664:12;:10;:12::i;:::-;8678;8645:18;:46::i;:::-;8166:525;:592;;;;;8713:45;8732:12;:10;:12::i;:::-;8746:11;8713:18;:45::i;:::-;8166:592;8158:637;;;;;;;;;;;;:::i;:::-;;;;;;;;;8847:18;8853:11;8847:5;:18::i;:::-;8876;8882:11;8876:5;:18::i;:::-;8905:20;8911:13;8905:5;:20::i;:::-;8936:19;8942:12;8936:5;:19::i;:::-;8966;8972:12;8966:5;:19::i;:::-;8996:18;9002:11;8996:5;:18::i;:::-;9027:20;9033:13;9027:5;:20::i;:::-;9068;9074:13;9068:5;:20::i;:::-;9101:19;9107:12;9101:5;:19::i;:::-;9133:18;9139:11;9133:5;:18::i;:::-;9202:19;9276:1;9257:16;;487:5;445:4;398;9224:21;;;;:::i;:::-;:30;;;;:::i;:::-;:49;;;;:::i;:::-;:53;;;;:::i;:::-;9202:75;;9288:34;9298:10;9310:11;9288:9;:34::i;:::-;9353:1;9333:16;;:21;;;;;;;:::i;:::-;;;;;;;;9403:171;9409:11;9422;9435:13;9450:12;9478;9492:11;9505:13;9520;9535:12;9549:11;9562;9403:171;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;8005:1577;7731:1851;;;;;;;;;;:::o;1577:113:4:-;1638:7;1665:10;:17;;;;1658:24;;1577:113;:::o;499:38:14:-;532:5;499:38;:::o;4875:339:3:-;5070:41;5089:12;:10;:12::i;:::-;5103:7;5070:18;:41::i;:::-;5062:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5178:28;5188:4;5194:2;5198:7;5178:9;:28::i;:::-;4875:339;;;:::o;1096:31:14:-;;;;:::o;1245:256:4:-;1342:7;1378:23;1395:5;1378:16;:23::i;:::-;1370:5;:31;1362:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1467:12;:19;1480:5;1467:19;;;;;;;;;;;;;;;:26;1487:5;1467:26;;;;;;;;;;;;1460:33;;1245:256;;;;:::o;734:47:14:-;771:10;734:47;:::o;4825:144::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4880:15:14::1;4898:21;4880:39;;4934:10;4926:28;;:37;4955:7;4926:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4873:96;4825:144::o:0;5285:185:3:-;5423:39;5440:4;5446:2;5450:7;5423:39;;;;;;;;;;;;:16;:39::i;:::-;5285:185;;;:::o;2120:241:14:-;2238:41;2257:12;:10;:12::i;:::-;2271:7;2238:18;:41::i;:::-;2230:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;2343:14;2349:7;2343:5;:14::i;:::-;2120:241;:::o;409:40::-;445:4;409:40;:::o;9593:1085::-;9699:5;9685:10;:19;;9677:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9783:5;9770:10;:18;9762:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9868:5;9854:10;:19;;9846:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;9952:5;9939:10;:18;9931:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10032:44;10051:12;:10;:12::i;:::-;10065:10;10032:18;:44::i;:::-;:110;;;;;10098:44;10117:12;:10;:12::i;:::-;10131:10;10098:18;:44::i;:::-;10032:110;10024:155;;;;;;;;;;;;:::i;:::-;;;;;;;;;10200:14;;;;;;;;;;;10192:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;10260:12;;;;;;;;;;;10252:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;10333:17;10339:10;10333:5;:17::i;:::-;10361;10367:10;10361:5;:17::i;:::-;10418:19;10501:1;10482:16;;532:5;487;445:4;398;10440:21;;;;:::i;:::-;:30;;;;:::i;:::-;:39;;;;:::i;:::-;:58;;;;:::i;:::-;:62;;;;:::i;:::-;10418:84;;10513:34;10523:10;10535:11;10513:9;:34::i;:::-;10578:1;10558:16;;:21;;;;;;;:::i;:::-;;;;;;;;10628:42;10634:10;10646;10658:11;10628:42;;;;;;;;:::i;:::-;;;;;;;;9656:1022;9593:1085;;:::o;1767:233:4:-;1842:7;1878:30;:28;:30::i;:::-;1870:5;:38;1862:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1975:10;1986:5;1975:17;;;;;;;;:::i;:::-;;;;;;;;;;1968:24;;1767:233;;;:::o;5085:101:14:-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5177:3:14::1;;5161:13;:19;;;;;;;:::i;:::-;;5085:101:::0;;:::o;2120:239:3:-;2192:7;2212:13;2228:7;:16;2236:7;2228:16;;;;;;;;;;;;;;;;;;;;;2212:32;;2280:1;2263:19;;:5;:19;;;;2255:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2346:5;2339:12;;;2120:239;;;:::o;5192:141:14:-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5312:15:14::1;;5288:21;:39;;;;;;;:::i;:::-;;5192:141:::0;;:::o;1850:208:3:-;1922:7;1967:1;1950:19;;:5;:19;;;;1942:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2034:9;:16;2044:5;2034:16;;;;;;;;;;;;;;;;2027:23;;1850:208;;;:::o;1650:94:11:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;362:40:14:-;398:4;362:40;:::o;999:87:11:-;1045:7;1072:6;;;;;;;;;;;1065:13;;999:87;:::o;874:34:14:-;;;;;;;;;;;;;:::o;4975:104::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5070:3:14::1;;5055:12;:18;;;;;;;:::i;:::-;;4975:104:::0;;:::o;2595::3:-;2651:13;2684:7;2677:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2595:104;:::o;5884:1836:14:-;6187:14;;;;;;;;;;;6179:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;6247:12;;;;;;;;;;;6239:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;6311:45;6330:12;:10;:12::i;:::-;6344:11;6311:18;:45::i;:::-;:104;;;;;6370:45;6389:12;:10;:12::i;:::-;6403:11;6370:18;:45::i;:::-;6311:104;:164;;;;;6428:47;6447:12;:10;:12::i;:::-;6461:13;6428:18;:47::i;:::-;6311:164;:224;;;;;6489:46;6508:12;:10;:12::i;:::-;6522;6489:18;:46::i;:::-;6311:224;:284;;;;;6549:46;6568:12;:10;:12::i;:::-;6582;6549:18;:46::i;:::-;6311:284;:343;;;;;6609:45;6628:12;:10;:12::i;:::-;6642:11;6609:18;:45::i;:::-;6311:343;:404;;;;;6668:47;6687:12;:10;:12::i;:::-;6701:13;6668:18;:47::i;:::-;6311:404;:465;;;;;6729:47;6748:12;:10;:12::i;:::-;6762:13;6729:18;:47::i;:::-;6311:465;:525;;;;;6790:46;6809:12;:10;:12::i;:::-;6823;6790:18;:46::i;:::-;6311:525;:592;;;;;6858:45;6877:12;:10;:12::i;:::-;6891:11;6858:18;:45::i;:::-;6311:592;6303:637;;;;;;;;;;;;:::i;:::-;;;;;;;;;6994:18;7000:11;6994:5;:18::i;:::-;7023;7029:11;7023:5;:18::i;:::-;7052:20;7058:13;7052:5;:20::i;:::-;7083:19;7089:12;7083:5;:19::i;:::-;7113;7119:12;7113:5;:19::i;:::-;7143:18;7149:11;7143:5;:18::i;:::-;7174:20;7180:13;7174:5;:20::i;:::-;7215;7221:13;7215:5;:20::i;:::-;7248:19;7254:12;7248:5;:19::i;:::-;7280:18;7286:11;7280:5;:18::i;:::-;7349:19;7414:1;7395:16;;445:4;398;7371:21;;;;:::i;:::-;:40;;;;:::i;:::-;:44;;;;:::i;:::-;7349:66;;7426:34;7436:10;7448:11;7426:9;:34::i;:::-;7491:1;7471:16;;:21;;;;;;;:::i;:::-;;;;;;;;7541:171;7547:11;7560;7573:13;7588:12;7616;7630:11;7643:13;7658;7673:12;7687:11;7700;7541:171;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;6158:1562;5884:1836;;;;;;;;;;:::o;321:35::-;355:1;321:35;:::o;4278:295:3:-;4393:12;:10;:12::i;:::-;4381:24;;:8;:24;;;;4373:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4493:8;4448:18;:32;4467:12;:10;:12::i;:::-;4448:32;;;;;;;;;;;;;;;:42;4481:8;4448:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4546:8;4517:48;;4532:12;:10;:12::i;:::-;4517:48;;;4556:8;4517:48;;;;;;:::i;:::-;;;;;;;;4278:295;;:::o;4578:117:14:-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4674:15:14::1;4657:14;;:32;;;;;;;;;;;;;;;;;;4578:117:::0;:::o;1134:31::-;;;;:::o;837:32::-;;;;;;;;;;;;;:::o;546:38::-;579:5;546:38;:::o;5541:328:3:-;5716:41;5735:12;:10;:12::i;:::-;5749:7;5716:18;:41::i;:::-;5708:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5822:39;5836:4;5842:2;5846:7;5855:5;5822:13;:39::i;:::-;5541:328;;;;:::o;4705:109:14:-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:13:14::1;4780:12;;:28;;;;;;;;;;;;;;;;;;4705:109:::0;:::o;1025:30::-;;;;:::o;454:38::-;487:5;454:38;:::o;2464:1431::-;398:4;2546:13;:11;:13::i;:::-;:25;2542:642;;;2598:14;;;;;;;;;;;2590:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;579:5;532;487;445:4;398;629:21;;;;:::i;:::-;:30;;;;:::i;:::-;:39;;;;:::i;:::-;:48;;;;:::i;:::-;2660:13;:11;:13::i;:::-;:23;2652:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;723:2;2730:14;:32;;2722:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;398:4;2832:14;2814:15;;:32;;;;:::i;:::-;:45;;2806:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;2948:9;2930:14;823:7;2917:27;;;;:::i;:::-;:40;;2909:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3004:9;2999:172;3023:14;3019:1;:18;2999:172;;;3055:15;3092:1;3074:15;;:19;;;;:::i;:::-;3055:38;;3123:1;3104:15;;:20;;;;;;;:::i;:::-;;;;;;;;3133:30;3143:10;3155:7;3133:9;:30::i;:::-;3044:127;3039:3;;;;;:::i;:::-;;;;2999:172;;;;2542:642;398:4;3201:13;:11;:13::i;:::-;:26;3197:691;;3254:14;;;;;;;;;;;3246:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;579:5;532;487;445:4;398;629:21;;;;:::i;:::-;:30;;;;:::i;:::-;:39;;;;:::i;:::-;:48;;;;:::i;:::-;3316:13;:11;:13::i;:::-;:23;3308:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;723:2;3386:14;:32;;3378:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;445:4;398;3524:21;;;;:::i;:::-;3506:14;3488:15;;3470;;:33;;;;:::i;:::-;:50;;;;:::i;:::-;:75;;3462:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;3634:9;3616:14;771:10;3603:27;;;;:::i;:::-;:40;;3595:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3690:9;3685:190;3709:14;3705:1;:18;3685:190;;;3741:15;3796:1;3778:15;;3760;;:33;;;;:::i;:::-;:37;;;;:::i;:::-;3741:56;;3827:1;3808:15;;:20;;;;;;;:::i;:::-;;;;;;;;3837:30;3847:10;3859:7;3837:9;:30::i;:::-;3730:145;3725:3;;;;;:::i;:::-;;;;3685:190;;;;3197:691;2464:1431;:::o;595:82::-;579:5;532;487;445:4;398;629:21;;;;:::i;:::-;:30;;;;:::i;:::-;:39;;;;:::i;:::-;:48;;;;:::i;:::-;595:82;:::o;5445:429::-;5518:13;5548:16;5556:7;5548;:16::i;:::-;5540:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;5674:29;5706:21;5674:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5773:1;5747:15;5741:29;:33;:127;;5855:13;5741:127;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5808:15;5825:18;:7;:16;:18::i;:::-;5791:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5741:127;5734:134;;;5445:429;;;:::o;682:43::-;723:2;682:43;:::o;3903:655::-;1230:12:11;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;355:1:14::1;4010:13;:11;:13::i;:::-;:23;4002:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;723:2;4093:14;:32;;4085:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;398:4;4195:14;4177:15;;:32;;;;:::i;:::-;:45;;4169:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;4311:9;4293:14;823:7;4280:27;;;;:::i;:::-;:40;;4272:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;4367:9;4362:183;4386:14;4382:1;:18;4362:183;;;4418:15;4455:1;4437:15;;:19;;;;:::i;:::-;4418:38;;4486:1;4467:15;;:20;;;;;;;:::i;:::-;;;;;;;;4496:30;4506:10;4518:7;4496:9;:30::i;:::-;4407:138;4402:3;;;;;:::i;:::-;;;;4362:183;;;;3903:655:::0;:::o;786:44::-;823:7;786:44;:::o;5339:100::-;5392:13;5421:12;5414:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5339:100;:::o;4644:164:3:-;4741:4;4765:18;:25;4784:5;4765:25;;;;;;;;;;;;;;;:35;4791:8;4765:35;;;;;;;;;;;;;;;;;;;;;;;;;4758:42;;4644:164;;;;:::o;1899:192:11:-;1230:12;:10;:12::i;:::-;1219:23;;:7;:5;:7::i;:::-;:23;;;1211:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2008:1:::1;1988:22;;:8;:22;;;;1980:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;1481:305:3:-;1583:4;1635:25;1620:40;;;:11;:40;;;;:105;;;;1692:33;1677:48;;;:11;:48;;;;1620:105;:158;;;;1742:36;1766:11;1742:23;:36::i;:::-;1620:158;1600:178;;1481:305;;;:::o;7379:127::-;7444:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7379:127;;;:::o;601:98:1:-;654:7;681:10;674:17;;601:98;:::o;11361:174:3:-;11463:2;11436:15;:24;11452:7;11436:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11519:7;11515:2;11481:46;;11490:23;11505:7;11490:14;:23::i;:::-;11481:46;;;;;;;;;;;;11361:174;;:::o;7673:348::-;7766:4;7791:16;7799:7;7791;:16::i;:::-;7783:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7867:13;7883:23;7898:7;7883:14;:23::i;:::-;7867:39;;7936:5;7925:16;;:7;:16;;;:51;;;;7969:7;7945:31;;:20;7957:7;7945:11;:20::i;:::-;:31;;;7925:51;:87;;;;7980:32;7997:5;8004:7;7980:16;:32::i;:::-;7925:87;7917:96;;;7673:348;;;;:::o;9968:360::-;10028:13;10044:23;10059:7;10044:14;:23::i;:::-;10028:39;;10080:48;10101:5;10116:1;10120:7;10080:20;:48::i;:::-;10169:29;10186:1;10190:7;10169:8;:29::i;:::-;10231:1;10211:9;:16;10221:5;10211:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;10250:7;:16;10258:7;10250:16;;;;;;;;;;;;10243:23;;;;;;;;;;;10312:7;10308:1;10284:36;;10293:5;10284:36;;;;;;;;;;;;10017:311;9968:360;:::o;8363:110::-;8439:26;8449:2;8453:7;8439:26;;;;;;;;;;;;:9;:26::i;:::-;8363:110;;:::o;10665:578::-;10824:4;10797:31;;:23;10812:7;10797:14;:23::i;:::-;:31;;;10789:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10907:1;10893:16;;:2;:16;;;;10885:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10963:39;10984:4;10990:2;10994:7;10963:20;:39::i;:::-;11067:29;11084:1;11088:7;11067:8;:29::i;:::-;11128:1;11109:9;:15;11119:4;11109:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11157:1;11140:9;:13;11150:2;11140:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11188:2;11169:7;:16;11177:7;11169:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11227:7;11223:2;11208:27;;11217:4;11208:27;;;;;;;;;;;;10665:578;;;:::o;2099:173:11:-;2155:16;2174:6;;;;;;;;;;;2155:25;;2200:8;2191:6;;:17;;;;;;;;;;;;;;;;;;2255:8;2224:40;;2245:8;2224:40;;;;;;;;;;;;2144:128;2099:173;:::o;6751:315:3:-;6908:28;6918:4;6924:2;6928:7;6908:9;:28::i;:::-;6955:48;6978:4;6984:2;6988:7;6997:5;6955:22;:48::i;:::-;6947:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6751:315;;;;:::o;288:723:12:-;344:13;574:1;565:5;:10;561:53;;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;787:157:2:-;872:4;911:25;896:40;;;:11;:40;;;;889:47;;787:157;;;:::o;2613:589:4:-;2757:45;2784:4;2790:2;2794:7;2757:26;:45::i;:::-;2835:1;2819:18;;:4;:18;;;2815:187;;;2854:40;2886:7;2854:31;:40::i;:::-;2815:187;;;2924:2;2916:10;;:4;:10;;;2912:90;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2912:90;2815:187;3030:1;3016:16;;:2;:16;;;3012:183;;;3049:45;3086:7;3049:36;:45::i;:::-;3012:183;;;3122:4;3116:10;;:2;:10;;;3112:83;;3143:40;3171:2;3175:7;3143:27;:40::i;:::-;3112:83;3012:183;2613:589;;;:::o;8700:321:3:-;8830:18;8836:2;8840:7;8830:5;:18::i;:::-;8881:54;8912:1;8916:2;8920:7;8929:5;8881:22;:54::i;:::-;8859:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;8700:321;;;:::o;12100:803::-;12255:4;12276:15;:2;:13;;;:15::i;:::-;12272:624;;;12328:2;12312:36;;;12349:12;:10;:12::i;:::-;12363:4;12369:7;12378:5;12312:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12308:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12575:1;12558:6;:13;:18;12554:272;;;12601:60;;;;;;;;;;:::i;:::-;;;;;;;;12554:272;12776:6;12770:13;12761:6;12757:2;12753:15;12746:38;12308:533;12445:45;;;12435:55;;;:6;:55;;;;12428:62;;;;;12272:624;12880:4;12873:11;;12100:803;;;;;;;:::o;13475:126::-;;;;:::o;3925:164:4:-;4029:10;:17;;;;4002:15;:24;4018:7;4002:24;;;;;;;;;;;:44;;;;4057:10;4073:7;4057:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3925:164;:::o;4716:988::-;4982:22;5032:1;5007:22;5024:4;5007:16;:22::i;:::-;:26;;;;:::i;:::-;4982:51;;5044:18;5065:17;:26;5083:7;5065:26;;;;;;;;;;;;5044:47;;5212:14;5198:10;:28;5194:328;;5243:19;5265:12;:18;5278:4;5265:18;;;;;;;;;;;;;;;:34;5284:14;5265:34;;;;;;;;;;;;5243:56;;5349:11;5316:12;:18;5329:4;5316:18;;;;;;;;;;;;;;;:30;5335:10;5316:30;;;;;;;;;;;:44;;;;5466:10;5433:17;:30;5451:11;5433:30;;;;;;;;;;;:43;;;;5228:294;5194:328;5618:17;:26;5636:7;5618:26;;;;;;;;;;;5611:33;;;5662:12;:18;5675:4;5662:18;;;;;;;;;;;;;;;:34;5681:14;5662:34;;;;;;;;;;;5655:41;;;4797:907;;4716:988;;:::o;5999:1079::-;6252:22;6297:1;6277:10;:17;;;;:21;;;;:::i;:::-;6252:46;;6309:18;6330:15;:24;6346:7;6330:24;;;;;;;;;;;;6309:45;;6681:19;6703:10;6714:14;6703:26;;;;;;;;:::i;:::-;;;;;;;;;;6681:48;;6767:11;6742:10;6753;6742:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6878:10;6847:15;:28;6863:11;6847:28;;;;;;;;;;;:41;;;;7019:15;:24;7035:7;7019:24;;;;;;;;;;;7012:31;;;7054:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6070:1008;;;5999:1079;:::o;3503:221::-;3588:14;3605:20;3622:2;3605:16;:20::i;:::-;3588:37;;3663:7;3636:12;:16;3649:2;3636:16;;;;;;;;;;;;;;;:24;3653:6;3636:24;;;;;;;;;;;:34;;;;3710:6;3681:17;:26;3699:7;3681:26;;;;;;;;;;;:35;;;;3577:147;3503:221;;:::o;9357:382:3:-;9451:1;9437:16;;:2;:16;;;;9429:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:16;9518:7;9510;:16::i;:::-;9509:17;9501:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9572:45;9601:1;9605:2;9609:7;9572:20;:45::i;:::-;9647:1;9630:9;:13;9640:2;9630:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9678:2;9659:7;:16;9667:7;9659:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9723:7;9719:2;9698:33;;9715:1;9698:33;;;;;;;;;;;;9357:382;;:::o;743:387:0:-;803:4;1011:12;1078:7;1066:20;1058:28;;1121:1;1114:4;:8;1107:15;;;743:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:15:-;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;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:323::-;5471:6;5520:2;5508:9;5499:7;5495:23;5491:32;5488:119;;;5526:79;;:::i;:::-;5488:119;5646:1;5671:50;5713:7;5704:6;5693:9;5689:22;5671:50;:::i;:::-;5661:60;;5617:114;5415:323;;;;:::o;5744:327::-;5802:6;5851:2;5839:9;5830:7;5826:23;5822:32;5819:119;;;5857:79;;:::i;:::-;5819:119;5977:1;6002:52;6046:7;6037:6;6026:9;6022:22;6002:52;:::i;:::-;5992:62;;5948:116;5744:327;;;;:::o;6077:349::-;6146:6;6195:2;6183:9;6174:7;6170:23;6166:32;6163:119;;;6201:79;;:::i;:::-;6163:119;6321:1;6346:63;6401:7;6392:6;6381:9;6377:22;6346:63;:::i;:::-;6336:73;;6292:127;6077:349;;;;:::o;6432:529::-;6503:6;6511;6560:2;6548:9;6539:7;6535:23;6531:32;6528:119;;;6566:79;;:::i;:::-;6528:119;6714:1;6703:9;6699:17;6686:31;6744:18;6736:6;6733:30;6730:117;;;6766:79;;:::i;:::-;6730:117;6879:65;6936:7;6927:6;6916:9;6912:22;6879:65;:::i;:::-;6861:83;;;;6657:297;6432:529;;;;;:::o;6967:329::-;7026:6;7075:2;7063:9;7054:7;7050:23;7046:32;7043:119;;;7081:79;;:::i;:::-;7043:119;7201:1;7226:53;7271:7;7262:6;7251:9;7247:22;7226:53;:::i;:::-;7216:63;;7172:117;6967:329;;;;:::o;7302:474::-;7370:6;7378;7427:2;7415:9;7406:7;7402:23;7398:32;7395:119;;;7433:79;;:::i;:::-;7395:119;7553:1;7578:53;7623:7;7614:6;7603:9;7599:22;7578:53;:::i;:::-;7568:63;;7524:117;7680:2;7706:53;7751:7;7742:6;7731:9;7727:22;7706:53;:::i;:::-;7696:63;;7651:118;7302:474;;;;;:::o;7782:1641::-;7922:6;7930;7938;7946;7954;7962;7970;7978;7986;7994;8043:3;8031:9;8022:7;8018:23;8014:33;8011:120;;;8050:79;;:::i;:::-;8011:120;8170:1;8195:53;8240:7;8231:6;8220:9;8216:22;8195:53;:::i;:::-;8185:63;;8141:117;8297:2;8323:53;8368:7;8359:6;8348:9;8344:22;8323:53;:::i;:::-;8313:63;;8268:118;8425:2;8451:53;8496:7;8487:6;8476:9;8472:22;8451:53;:::i;:::-;8441:63;;8396:118;8553:2;8579:53;8624:7;8615:6;8604:9;8600:22;8579:53;:::i;:::-;8569:63;;8524:118;8681:3;8708:53;8753:7;8744:6;8733:9;8729:22;8708:53;:::i;:::-;8698:63;;8652:119;8810:3;8837:53;8882:7;8873:6;8862:9;8858:22;8837:53;:::i;:::-;8827:63;;8781:119;8939:3;8966:53;9011:7;9002:6;8991:9;8987:22;8966:53;:::i;:::-;8956:63;;8910:119;9068:3;9095:53;9140:7;9131:6;9120:9;9116:22;9095:53;:::i;:::-;9085:63;;9039:119;9197:3;9224:53;9269:7;9260:6;9249:9;9245:22;9224:53;:::i;:::-;9214:63;;9168:119;9326:3;9353:53;9398:7;9389:6;9378:9;9374:22;9353:53;:::i;:::-;9343:63;;9297:119;7782:1641;;;;;;;;;;;;;:::o;9429:118::-;9516:24;9534:5;9516:24;:::i;:::-;9511:3;9504:37;9429:118;;:::o;9553:109::-;9634:21;9649:5;9634:21;:::i;:::-;9629:3;9622:34;9553:109;;:::o;9668:360::-;9754:3;9782:38;9814:5;9782:38;:::i;:::-;9836:70;9899:6;9894:3;9836:70;:::i;:::-;9829:77;;9915:52;9960:6;9955:3;9948:4;9941:5;9937:16;9915:52;:::i;:::-;9992:29;10014:6;9992:29;:::i;:::-;9987:3;9983:39;9976:46;;9758:270;9668:360;;;;:::o;10034:364::-;10122:3;10150:39;10183:5;10150:39;:::i;:::-;10205:71;10269:6;10264:3;10205:71;:::i;:::-;10198:78;;10285:52;10330:6;10325:3;10318:4;10311:5;10307:16;10285:52;:::i;:::-;10362:29;10384:6;10362:29;:::i;:::-;10357:3;10353:39;10346:46;;10126:272;10034:364;;;;:::o;10404:377::-;10510:3;10538:39;10571:5;10538:39;:::i;:::-;10593:89;10675:6;10670:3;10593:89;:::i;:::-;10586:96;;10691:52;10736:6;10731:3;10724:4;10717:5;10713:16;10691:52;:::i;:::-;10768:6;10763:3;10759:16;10752:23;;10514:267;10404:377;;;;:::o;10787:366::-;10929:3;10950:67;11014:2;11009:3;10950:67;:::i;:::-;10943:74;;11026:93;11115:3;11026:93;:::i;:::-;11144:2;11139:3;11135:12;11128:19;;10787:366;;;:::o;11159:::-;11301:3;11322:67;11386:2;11381:3;11322:67;:::i;:::-;11315:74;;11398:93;11487:3;11398:93;:::i;:::-;11516:2;11511:3;11507:12;11500:19;;11159:366;;;:::o;11531:::-;11673:3;11694:67;11758:2;11753:3;11694:67;:::i;:::-;11687:74;;11770:93;11859:3;11770:93;:::i;:::-;11888:2;11883:3;11879:12;11872:19;;11531:366;;;:::o;11903:::-;12045:3;12066:67;12130:2;12125:3;12066:67;:::i;:::-;12059:74;;12142:93;12231:3;12142:93;:::i;:::-;12260:2;12255:3;12251:12;12244:19;;11903:366;;;:::o;12275:::-;12417:3;12438:67;12502:2;12497:3;12438:67;:::i;:::-;12431:74;;12514:93;12603:3;12514:93;:::i;:::-;12632:2;12627:3;12623:12;12616:19;;12275:366;;;:::o;12647:::-;12789:3;12810:67;12874:2;12869:3;12810:67;:::i;:::-;12803:74;;12886:93;12975:3;12886:93;:::i;:::-;13004:2;12999:3;12995:12;12988:19;;12647:366;;;:::o;13019:::-;13161:3;13182:67;13246:2;13241:3;13182:67;:::i;:::-;13175:74;;13258:93;13347:3;13258:93;:::i;:::-;13376:2;13371:3;13367:12;13360:19;;13019:366;;;:::o;13391:::-;13533:3;13554:67;13618:2;13613:3;13554:67;:::i;:::-;13547:74;;13630:93;13719:3;13630:93;:::i;:::-;13748:2;13743:3;13739:12;13732:19;;13391:366;;;:::o;13763:::-;13905:3;13926:67;13990:2;13985:3;13926:67;:::i;:::-;13919:74;;14002:93;14091:3;14002:93;:::i;:::-;14120:2;14115:3;14111:12;14104:19;;13763:366;;;:::o;14135:::-;14277:3;14298:67;14362:2;14357:3;14298:67;:::i;:::-;14291:74;;14374:93;14463:3;14374:93;:::i;:::-;14492:2;14487:3;14483:12;14476:19;;14135:366;;;:::o;14507:::-;14649:3;14670:67;14734:2;14729:3;14670:67;:::i;:::-;14663:74;;14746:93;14835:3;14746:93;:::i;:::-;14864:2;14859:3;14855:12;14848:19;;14507:366;;;:::o;14879:::-;15021:3;15042:67;15106:2;15101:3;15042:67;:::i;:::-;15035:74;;15118:93;15207:3;15118:93;:::i;:::-;15236:2;15231:3;15227:12;15220:19;;14879:366;;;:::o;15251:::-;15393:3;15414:67;15478:2;15473:3;15414:67;:::i;:::-;15407:74;;15490:93;15579:3;15490:93;:::i;:::-;15608:2;15603:3;15599:12;15592:19;;15251:366;;;:::o;15623:::-;15765:3;15786:67;15850:2;15845:3;15786:67;:::i;:::-;15779:74;;15862:93;15951:3;15862:93;:::i;:::-;15980:2;15975:3;15971:12;15964:19;;15623:366;;;:::o;15995:::-;16137:3;16158:67;16222:2;16217:3;16158:67;:::i;:::-;16151:74;;16234:93;16323:3;16234:93;:::i;:::-;16352:2;16347:3;16343:12;16336:19;;15995:366;;;:::o;16367:::-;16509:3;16530:67;16594:2;16589:3;16530:67;:::i;:::-;16523:74;;16606:93;16695:3;16606:93;:::i;:::-;16724:2;16719:3;16715:12;16708:19;;16367:366;;;:::o;16739:::-;16881:3;16902:67;16966:2;16961:3;16902:67;:::i;:::-;16895:74;;16978:93;17067:3;16978:93;:::i;:::-;17096:2;17091:3;17087:12;17080:19;;16739:366;;;:::o;17111:::-;17253:3;17274:67;17338:2;17333:3;17274:67;:::i;:::-;17267:74;;17350:93;17439:3;17350:93;:::i;:::-;17468:2;17463:3;17459:12;17452:19;;17111:366;;;:::o;17483:::-;17625:3;17646:67;17710:2;17705:3;17646:67;:::i;:::-;17639:74;;17722:93;17811:3;17722:93;:::i;:::-;17840:2;17835:3;17831:12;17824:19;;17483:366;;;:::o;17855:::-;17997:3;18018:67;18082:2;18077:3;18018:67;:::i;:::-;18011:74;;18094:93;18183:3;18094:93;:::i;:::-;18212:2;18207:3;18203:12;18196:19;;17855:366;;;:::o;18227:::-;18369:3;18390:67;18454:2;18449:3;18390:67;:::i;:::-;18383:74;;18466:93;18555:3;18466:93;:::i;:::-;18584:2;18579:3;18575:12;18568:19;;18227:366;;;:::o;18599:::-;18741:3;18762:67;18826:2;18821:3;18762:67;:::i;:::-;18755:74;;18838:93;18927:3;18838:93;:::i;:::-;18956:2;18951:3;18947:12;18940:19;;18599:366;;;:::o;18971:::-;19113:3;19134:67;19198:2;19193:3;19134:67;:::i;:::-;19127:74;;19210:93;19299:3;19210:93;:::i;:::-;19328:2;19323:3;19319:12;19312:19;;18971:366;;;:::o;19343:::-;19485:3;19506:67;19570:2;19565:3;19506:67;:::i;:::-;19499:74;;19582:93;19671:3;19582:93;:::i;:::-;19700:2;19695:3;19691:12;19684:19;;19343:366;;;:::o;19715:::-;19857:3;19878:67;19942:2;19937:3;19878:67;:::i;:::-;19871:74;;19954:93;20043:3;19954:93;:::i;:::-;20072:2;20067:3;20063:12;20056:19;;19715:366;;;:::o;20087:::-;20229:3;20250:67;20314:2;20309:3;20250:67;:::i;:::-;20243:74;;20326:93;20415:3;20326:93;:::i;:::-;20444:2;20439:3;20435:12;20428:19;;20087:366;;;:::o;20459:::-;20601:3;20622:67;20686:2;20681:3;20622:67;:::i;:::-;20615:74;;20698:93;20787:3;20698:93;:::i;:::-;20816:2;20811:3;20807:12;20800:19;;20459:366;;;:::o;20831:::-;20973:3;20994:67;21058:2;21053:3;20994:67;:::i;:::-;20987:74;;21070:93;21159:3;21070:93;:::i;:::-;21188:2;21183:3;21179:12;21172:19;;20831:366;;;:::o;21203:::-;21345:3;21366:67;21430:2;21425:3;21366:67;:::i;:::-;21359:74;;21442:93;21531:3;21442:93;:::i;:::-;21560:2;21555:3;21551:12;21544:19;;21203:366;;;:::o;21575:118::-;21662:24;21680:5;21662:24;:::i;:::-;21657:3;21650:37;21575:118;;:::o;21699:435::-;21879:3;21901:95;21992:3;21983:6;21901:95;:::i;:::-;21894:102;;22013:95;22104:3;22095:6;22013:95;:::i;:::-;22006:102;;22125:3;22118:10;;21699:435;;;;;:::o;22140:222::-;22233:4;22271:2;22260:9;22256:18;22248:26;;22284:71;22352:1;22341:9;22337:17;22328:6;22284:71;:::i;:::-;22140:222;;;;:::o;22368:640::-;22563:4;22601:3;22590:9;22586:19;22578:27;;22615:71;22683:1;22672:9;22668:17;22659:6;22615:71;:::i;:::-;22696:72;22764:2;22753:9;22749:18;22740:6;22696:72;:::i;:::-;22778;22846:2;22835:9;22831:18;22822:6;22778:72;:::i;:::-;22897:9;22891:4;22887:20;22882:2;22871:9;22867:18;22860:48;22925:76;22996:4;22987:6;22925:76;:::i;:::-;22917:84;;22368:640;;;;;;;:::o;23014:210::-;23101:4;23139:2;23128:9;23124:18;23116:26;;23152:65;23214:1;23203:9;23199:17;23190:6;23152:65;:::i;:::-;23014:210;;;;:::o;23230:313::-;23343:4;23381:2;23370:9;23366:18;23358:26;;23430:9;23424:4;23420:20;23416:1;23405:9;23401:17;23394:47;23458:78;23531:4;23522:6;23458:78;:::i;:::-;23450:86;;23230:313;;;;:::o;23549:419::-;23715:4;23753:2;23742:9;23738:18;23730:26;;23802:9;23796:4;23792:20;23788:1;23777:9;23773:17;23766:47;23830:131;23956:4;23830:131;:::i;:::-;23822:139;;23549:419;;;:::o;23974:::-;24140:4;24178:2;24167:9;24163:18;24155:26;;24227:9;24221:4;24217:20;24213:1;24202:9;24198:17;24191:47;24255:131;24381:4;24255:131;:::i;:::-;24247:139;;23974:419;;;:::o;24399:::-;24565:4;24603:2;24592:9;24588:18;24580:26;;24652:9;24646:4;24642:20;24638:1;24627:9;24623:17;24616:47;24680:131;24806:4;24680:131;:::i;:::-;24672:139;;24399:419;;;:::o;24824:::-;24990:4;25028:2;25017:9;25013:18;25005:26;;25077:9;25071:4;25067:20;25063:1;25052:9;25048:17;25041:47;25105:131;25231:4;25105:131;:::i;:::-;25097:139;;24824:419;;;:::o;25249:::-;25415:4;25453:2;25442:9;25438:18;25430:26;;25502:9;25496:4;25492:20;25488:1;25477:9;25473:17;25466:47;25530:131;25656:4;25530:131;:::i;:::-;25522:139;;25249:419;;;:::o;25674:::-;25840:4;25878:2;25867:9;25863:18;25855:26;;25927:9;25921:4;25917:20;25913:1;25902:9;25898:17;25891:47;25955:131;26081:4;25955:131;:::i;:::-;25947:139;;25674:419;;;:::o;26099:::-;26265:4;26303:2;26292:9;26288:18;26280:26;;26352:9;26346:4;26342:20;26338:1;26327:9;26323:17;26316:47;26380:131;26506:4;26380:131;:::i;:::-;26372:139;;26099:419;;;:::o;26524:::-;26690:4;26728:2;26717:9;26713:18;26705:26;;26777:9;26771:4;26767:20;26763:1;26752:9;26748:17;26741:47;26805:131;26931:4;26805:131;:::i;:::-;26797:139;;26524:419;;;:::o;26949:::-;27115:4;27153:2;27142:9;27138:18;27130:26;;27202:9;27196:4;27192:20;27188:1;27177:9;27173:17;27166:47;27230:131;27356:4;27230:131;:::i;:::-;27222:139;;26949:419;;;:::o;27374:::-;27540:4;27578:2;27567:9;27563:18;27555:26;;27627:9;27621:4;27617:20;27613:1;27602:9;27598:17;27591:47;27655:131;27781:4;27655:131;:::i;:::-;27647:139;;27374:419;;;:::o;27799:::-;27965:4;28003:2;27992:9;27988:18;27980:26;;28052:9;28046:4;28042:20;28038:1;28027:9;28023:17;28016:47;28080:131;28206:4;28080:131;:::i;:::-;28072:139;;27799:419;;;:::o;28224:::-;28390:4;28428:2;28417:9;28413:18;28405:26;;28477:9;28471:4;28467:20;28463:1;28452:9;28448:17;28441:47;28505:131;28631:4;28505:131;:::i;:::-;28497:139;;28224:419;;;:::o;28649:::-;28815:4;28853:2;28842:9;28838:18;28830:26;;28902:9;28896:4;28892:20;28888:1;28877:9;28873:17;28866:47;28930:131;29056:4;28930:131;:::i;:::-;28922:139;;28649:419;;;:::o;29074:::-;29240:4;29278:2;29267:9;29263:18;29255:26;;29327:9;29321:4;29317:20;29313:1;29302:9;29298:17;29291:47;29355:131;29481:4;29355:131;:::i;:::-;29347:139;;29074:419;;;:::o;29499:::-;29665:4;29703:2;29692:9;29688:18;29680:26;;29752:9;29746:4;29742:20;29738:1;29727:9;29723:17;29716:47;29780:131;29906:4;29780:131;:::i;:::-;29772:139;;29499:419;;;:::o;29924:::-;30090:4;30128:2;30117:9;30113:18;30105:26;;30177:9;30171:4;30167:20;30163:1;30152:9;30148:17;30141:47;30205:131;30331:4;30205:131;:::i;:::-;30197:139;;29924:419;;;:::o;30349:::-;30515:4;30553:2;30542:9;30538:18;30530:26;;30602:9;30596:4;30592:20;30588:1;30577:9;30573:17;30566:47;30630:131;30756:4;30630:131;:::i;:::-;30622:139;;30349:419;;;:::o;30774:::-;30940:4;30978:2;30967:9;30963:18;30955:26;;31027:9;31021:4;31017:20;31013:1;31002:9;30998:17;30991:47;31055:131;31181:4;31055:131;:::i;:::-;31047:139;;30774:419;;;:::o;31199:::-;31365:4;31403:2;31392:9;31388:18;31380:26;;31452:9;31446:4;31442:20;31438:1;31427:9;31423:17;31416:47;31480:131;31606:4;31480:131;:::i;:::-;31472:139;;31199:419;;;:::o;31624:::-;31790:4;31828:2;31817:9;31813:18;31805:26;;31877:9;31871:4;31867:20;31863:1;31852:9;31848:17;31841:47;31905:131;32031:4;31905:131;:::i;:::-;31897:139;;31624:419;;;:::o;32049:::-;32215:4;32253:2;32242:9;32238:18;32230:26;;32302:9;32296:4;32292:20;32288:1;32277:9;32273:17;32266:47;32330:131;32456:4;32330:131;:::i;:::-;32322:139;;32049:419;;;:::o;32474:::-;32640:4;32678:2;32667:9;32663:18;32655:26;;32727:9;32721:4;32717:20;32713:1;32702:9;32698:17;32691:47;32755:131;32881:4;32755:131;:::i;:::-;32747:139;;32474:419;;;:::o;32899:::-;33065:4;33103:2;33092:9;33088:18;33080:26;;33152:9;33146:4;33142:20;33138:1;33127:9;33123:17;33116:47;33180:131;33306:4;33180:131;:::i;:::-;33172:139;;32899:419;;;:::o;33324:::-;33490:4;33528:2;33517:9;33513:18;33505:26;;33577:9;33571:4;33567:20;33563:1;33552:9;33548:17;33541:47;33605:131;33731:4;33605:131;:::i;:::-;33597:139;;33324:419;;;:::o;33749:::-;33915:4;33953:2;33942:9;33938:18;33930:26;;34002:9;33996:4;33992:20;33988:1;33977:9;33973:17;33966:47;34030:131;34156:4;34030:131;:::i;:::-;34022:139;;33749:419;;;:::o;34174:::-;34340:4;34378:2;34367:9;34363:18;34355:26;;34427:9;34421:4;34417:20;34413:1;34402:9;34398:17;34391:47;34455:131;34581:4;34455:131;:::i;:::-;34447:139;;34174:419;;;:::o;34599:::-;34765:4;34803:2;34792:9;34788:18;34780:26;;34852:9;34846:4;34842:20;34838:1;34827:9;34823:17;34816:47;34880:131;35006:4;34880:131;:::i;:::-;34872:139;;34599:419;;;:::o;35024:::-;35190:4;35228:2;35217:9;35213:18;35205:26;;35277:9;35271:4;35267:20;35263:1;35252:9;35248:17;35241:47;35305:131;35431:4;35305:131;:::i;:::-;35297:139;;35024:419;;;:::o;35449:::-;35615:4;35653:2;35642:9;35638:18;35630:26;;35702:9;35696:4;35692:20;35688:1;35677:9;35673:17;35666:47;35730:131;35856:4;35730:131;:::i;:::-;35722:139;;35449:419;;;:::o;35874:222::-;35967:4;36005:2;35994:9;35990:18;35982:26;;36018:71;36086:1;36075:9;36071:17;36062:6;36018:71;:::i;:::-;35874:222;;;;:::o;36102:442::-;36251:4;36289:2;36278:9;36274:18;36266:26;;36302:71;36370:1;36359:9;36355:17;36346:6;36302:71;:::i;:::-;36383:72;36451:2;36440:9;36436:18;36427:6;36383:72;:::i;:::-;36465;36533:2;36522:9;36518:18;36509:6;36465:72;:::i;:::-;36102:442;;;;;;:::o;36550:1332::-;36924:4;36962:3;36951:9;36947:19;36939:27;;36976:71;37044:1;37033:9;37029:17;37020:6;36976:71;:::i;:::-;37057:72;37125:2;37114:9;37110:18;37101:6;37057:72;:::i;:::-;37139;37207:2;37196:9;37192:18;37183:6;37139:72;:::i;:::-;37221;37289:2;37278:9;37274:18;37265:6;37221:72;:::i;:::-;37303:73;37371:3;37360:9;37356:19;37347:6;37303:73;:::i;:::-;37386;37454:3;37443:9;37439:19;37430:6;37386:73;:::i;:::-;37469;37537:3;37526:9;37522:19;37513:6;37469:73;:::i;:::-;37552;37620:3;37609:9;37605:19;37596:6;37552:73;:::i;:::-;37635;37703:3;37692:9;37688:19;37679:6;37635:73;:::i;:::-;37718;37786:3;37775:9;37771:19;37762:6;37718:73;:::i;:::-;37801:74;37870:3;37859:9;37855:19;37845:7;37801:74;:::i;:::-;36550:1332;;;;;;;;;;;;;;:::o;37888:129::-;37922:6;37949:20;;:::i;:::-;37939:30;;37978:33;38006:4;37998:6;37978:33;:::i;:::-;37888:129;;;:::o;38023:75::-;38056:6;38089:2;38083:9;38073:19;;38023:75;:::o;38104:307::-;38165:4;38255:18;38247:6;38244:30;38241:56;;;38277:18;;:::i;:::-;38241:56;38315:29;38337:6;38315:29;:::i;:::-;38307:37;;38399:4;38393;38389:15;38381:23;;38104:307;;;:::o;38417:98::-;38468:6;38502:5;38496:12;38486:22;;38417:98;;;:::o;38521:99::-;38573:6;38607:5;38601:12;38591:22;;38521:99;;;:::o;38626:168::-;38709:11;38743:6;38738:3;38731:19;38783:4;38778:3;38774:14;38759:29;;38626:168;;;;:::o;38800:169::-;38884:11;38918:6;38913:3;38906:19;38958:4;38953:3;38949:14;38934:29;;38800:169;;;;:::o;38975:148::-;39077:11;39114:3;39099:18;;38975:148;;;;:::o;39129:305::-;39169:3;39188:20;39206:1;39188:20;:::i;:::-;39183:25;;39222:20;39240:1;39222:20;:::i;:::-;39217:25;;39376:1;39308:66;39304:74;39301:1;39298:81;39295:107;;;39382:18;;:::i;:::-;39295:107;39426:1;39423;39419:9;39412:16;;39129:305;;;;:::o;39440:185::-;39480:1;39497:20;39515:1;39497:20;:::i;:::-;39492:25;;39531:20;39549:1;39531:20;:::i;:::-;39526:25;;39570:1;39560:35;;39575:18;;:::i;:::-;39560:35;39617:1;39614;39610:9;39605:14;;39440:185;;;;:::o;39631:348::-;39671:7;39694:20;39712:1;39694:20;:::i;:::-;39689:25;;39728:20;39746:1;39728:20;:::i;:::-;39723:25;;39916:1;39848:66;39844:74;39841:1;39838:81;39833:1;39826:9;39819:17;39815:105;39812:131;;;39923:18;;:::i;:::-;39812:131;39971:1;39968;39964:9;39953:20;;39631:348;;;;:::o;39985:191::-;40025:4;40045:20;40063:1;40045:20;:::i;:::-;40040:25;;40079:20;40097:1;40079:20;:::i;:::-;40074:25;;40118:1;40115;40112:8;40109:34;;;40123:18;;:::i;:::-;40109:34;40168:1;40165;40161:9;40153:17;;39985:191;;;;:::o;40182:96::-;40219:7;40248:24;40266:5;40248:24;:::i;:::-;40237:35;;40182:96;;;:::o;40284:90::-;40318:7;40361:5;40354:13;40347:21;40336:32;;40284:90;;;:::o;40380:149::-;40416:7;40456:66;40449:5;40445:78;40434:89;;40380:149;;;:::o;40535:126::-;40572:7;40612:42;40605:5;40601:54;40590:65;;40535:126;;;:::o;40667:77::-;40704:7;40733:5;40722:16;;40667:77;;;:::o;40750:154::-;40834:6;40829:3;40824;40811:30;40896:1;40887:6;40882:3;40878:16;40871:27;40750:154;;;:::o;40910:307::-;40978:1;40988:113;41002:6;40999:1;40996:13;40988:113;;;41087:1;41082:3;41078:11;41072:18;41068:1;41063:3;41059:11;41052:39;41024:2;41021:1;41017:10;41012:15;;40988:113;;;41119:6;41116:1;41113:13;41110:101;;;41199:1;41190:6;41185:3;41181:16;41174:27;41110:101;40959:258;40910:307;;;:::o;41223:320::-;41267:6;41304:1;41298:4;41294:12;41284:22;;41351:1;41345:4;41341:12;41372:18;41362:81;;41428:4;41420:6;41416:17;41406:27;;41362:81;41490:2;41482:6;41479:14;41459:18;41456:38;41453:84;;;41509:18;;:::i;:::-;41453:84;41274:269;41223:320;;;:::o;41549:281::-;41632:27;41654:4;41632:27;:::i;:::-;41624:6;41620:40;41762:6;41750:10;41747:22;41726:18;41714:10;41711:34;41708:62;41705:88;;;41773:18;;:::i;:::-;41705:88;41813:10;41809:2;41802:22;41592:238;41549:281;;:::o;41836:233::-;41875:3;41898:24;41916:5;41898:24;:::i;:::-;41889:33;;41944:66;41937:5;41934:77;41931:103;;;42014:18;;:::i;:::-;41931:103;42061:1;42054:5;42050:13;42043:20;;41836:233;;;:::o;42075:176::-;42107:1;42124:20;42142:1;42124:20;:::i;:::-;42119:25;;42158:20;42176:1;42158:20;:::i;:::-;42153:25;;42197:1;42187:35;;42202:18;;:::i;:::-;42187:35;42243:1;42240;42236:9;42231:14;;42075:176;;;;:::o;42257:180::-;42305:77;42302:1;42295:88;42402:4;42399:1;42392:15;42426:4;42423:1;42416:15;42443:180;42491:77;42488:1;42481:88;42588:4;42585:1;42578:15;42612:4;42609:1;42602:15;42629:180;42677:77;42674:1;42667:88;42774:4;42771:1;42764:15;42798:4;42795:1;42788:15;42815:180;42863:77;42860:1;42853:88;42960:4;42957:1;42950:15;42984:4;42981:1;42974:15;43001:180;43049:77;43046:1;43039:88;43146:4;43143:1;43136:15;43170:4;43167:1;43160:15;43187:180;43235:77;43232:1;43225:88;43332:4;43329:1;43322:15;43356:4;43353:1;43346:15;43373:117;43482:1;43479;43472:12;43496:117;43605:1;43602;43595:12;43619:117;43728:1;43725;43718:12;43742:117;43851:1;43848;43841:12;43865:117;43974:1;43971;43964:12;43988:117;44097:1;44094;44087:12;44111:102;44152:6;44203:2;44199:7;44194:2;44187:5;44183:14;44179:28;44169:38;;44111:102;;;:::o;44219:229::-;44359:34;44355:1;44347:6;44343:14;44336:58;44428:12;44423:2;44415:6;44411:15;44404:37;44219:229;:::o;44454:230::-;44594:34;44590:1;44582:6;44578:14;44571:58;44663:13;44658:2;44650:6;44646:15;44639:38;44454:230;:::o;44690:237::-;44830:34;44826:1;44818:6;44814:14;44807:58;44899:20;44894:2;44886:6;44882:15;44875:45;44690:237;:::o;44933:225::-;45073:34;45069:1;45061:6;45057:14;45050:58;45142:8;45137:2;45129:6;45125:15;45118:33;44933:225;:::o;45164:178::-;45304:30;45300:1;45292:6;45288:14;45281:54;45164:178;:::o;45348:223::-;45488:34;45484:1;45476:6;45472:14;45465:58;45557:6;45552:2;45544:6;45540:15;45533:31;45348:223;:::o;45577:175::-;45717:27;45713:1;45705:6;45701:14;45694:51;45577:175;:::o;45758:170::-;45898:22;45894:1;45886:6;45882:14;45875:46;45758:170;:::o;45934:178::-;46074:30;46070:1;46062:6;46058:14;46051:54;45934:178;:::o;46118:231::-;46258:34;46254:1;46246:6;46242:14;46235:58;46327:14;46322:2;46314:6;46310:15;46303:39;46118:231;:::o;46355:243::-;46495:34;46491:1;46483:6;46479:14;46472:58;46564:26;46559:2;46551:6;46547:15;46540:51;46355:243;:::o;46604:229::-;46744:34;46740:1;46732:6;46728:14;46721:58;46813:12;46808:2;46800:6;46796:15;46789:37;46604:229;:::o;46839:228::-;46979:34;46975:1;46967:6;46963:14;46956:58;47048:11;47043:2;47035:6;47031:15;47024:36;46839:228;:::o;47073:182::-;47213:34;47209:1;47201:6;47197:14;47190:58;47073:182;:::o;47261:229::-;47401:34;47397:1;47389:6;47385:14;47378:58;47470:12;47465:2;47457:6;47453:15;47446:37;47261:229;:::o;47496:182::-;47636:34;47632:1;47624:6;47620:14;47613:58;47496:182;:::o;47684:172::-;47824:24;47820:1;47812:6;47808:14;47801:48;47684:172;:::o;47862:231::-;48002:34;47998:1;47990:6;47986:14;47979:58;48071:14;48066:2;48058:6;48054:15;48047:39;47862:231;:::o;48099:168::-;48239:20;48235:1;48227:6;48223:14;48216:44;48099:168;:::o;48273:182::-;48413:34;48409:1;48401:6;48397:14;48390:58;48273:182;:::o;48461:228::-;48601:34;48597:1;48589:6;48585:14;48578:58;48670:11;48665:2;48657:6;48653:15;48646:36;48461:228;:::o;48695:220::-;48835:34;48831:1;48823:6;48819:14;48812:58;48904:3;48899:2;48891:6;48887:15;48880:28;48695:220;:::o;48921:182::-;49061:34;49057:1;49049:6;49045:14;49038:58;48921:182;:::o;49109:236::-;49249:34;49245:1;49237:6;49233:14;49226:58;49318:19;49313:2;49305:6;49301:15;49294:44;49109:236;:::o;49351:227::-;49491:34;49487:1;49479:6;49475:14;49468:58;49560:10;49555:2;49547:6;49543:15;49536:35;49351:227;:::o;49584:231::-;49724:34;49720:1;49712:6;49708:14;49701:58;49793:14;49788:2;49780:6;49776:15;49769:39;49584:231;:::o;49821:235::-;49961:34;49957:1;49949:6;49945:14;49938:58;50030:18;50025:2;50017:6;50013:15;50006:43;49821:235;:::o;50062:177::-;50202:29;50198:1;50190:6;50186:14;50179:53;50062:177;:::o;50245:182::-;50385:34;50381:1;50373:6;50369:14;50362:58;50245:182;:::o;50433:122::-;50506:24;50524:5;50506:24;:::i;:::-;50499:5;50496:35;50486:63;;50545:1;50542;50535:12;50486:63;50433:122;:::o;50561:116::-;50631:21;50646:5;50631:21;:::i;:::-;50624:5;50621:32;50611:60;;50667:1;50664;50657:12;50611:60;50561:116;:::o;50683:120::-;50755:23;50772:5;50755:23;:::i;:::-;50748:5;50745:34;50735:62;;50793:1;50790;50783:12;50735:62;50683:120;:::o;50809:122::-;50882:24;50900:5;50882:24;:::i;:::-;50875:5;50872:35;50862:63;;50921:1;50918;50911:12;50862:63;50809:122;:::o

Swarm Source

ipfs://366dc138dceeb967124fdb11863ca51c74ab9b46c26e38f543c65185b940efdf
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.