ETH Price: $3,303.79 (-3.56%)
Gas: 7 Gwei

Token

XOXONFT (XOXO)
 

Overview

Max Total Supply

876 XOXO

Holders

390

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 XOXO
0x3a5fc2e0d7df18108473d928fc9512250eee7846
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:
XOXO_By_Maya_and_Yehuda_Devir

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 13 of 15: minter.sol
// SPDX-License-Identifier: MIT
// @author: Exotic Technology LTD




pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ownable.sol";
import "./ERC721enumerable.sol";
import "./merkle.sol";

interface LVS{

    function balanceOf(address owner) external view  returns (uint256);

    function  tokenOfOwnerByIndex(address owner, uint256 index) external view  returns (uint256);

}



contract XOXO_By_Maya_and_Yehuda_Devir is Ownable, ERC721, ERC721Enumerable {
    
    
    
    bool public saleIsActive = false;

    bool public claim = false;

    uint256 constant public claimToken = 101;

    uint256 public claimed = 0;

    uint256 constant public  MAX_TOKEN = 10000;
    

    uint256 constant public MAX_PUBLIC_MINT = 4;
    
    uint256  public royalty = 80;

    uint256 public ogPrice = 0.05 ether;

    uint256 public lvPrice = 0.075 ether;

    uint256 public tokenPrice = 0.101 ether;

    uint256 public startingIndex  = 0;

    uint256 public startingIndexBlock  = 0;

    uint256 public SALE_START = 0;

    address LVScontract;

    bytes32 public ogMerkle = 0x6ee8bee8c77b05f5cf46ea9f7c98b6e3571366d95ccdb3f96be8640e43b6ec21;
    
    bytes32 public lvMerkle = 0x6ee8bee8c77b05f5cf46ea9f7c98b6e3571366d95ccdb3f96be8640e43b6ec21;

    string private _baseURIextended;

    string public PROVENANCE;

    mapping(address => uint) public minters;
    
    mapping(address => bool) private senders;
    
    mapping(uint => bool) private claimedTokens;
   

    
    constructor() ERC721("XOXONFT", "XOXO") {
       

        _baseURIextended = "ipfs://QmXHCA7TxrroX3ghThz3XB4DYJJXWtjd2Eym7jSUvweWL7/"; //cover

        senders[msg.sender] = true; // add owner
        
        SetStartingIndexBlock();
        //setStartingIndex();
        //launchSale();

    }


   function addSender(address _address) public onlyOwner  {
        
        require(_address != address(0));
        senders[_address] = true;
       
    }
    
    function removeSender(address _address) public onlyOwner {
        require(_address != address(0));
        senders[_address] = false;
        
    }

    function SetStartingIndexBlock() public onlyOwner {
        require(startingIndex == 0);
        
        startingIndexBlock = block.number;
    }

    function setStartingIndex() public onlyOwner {
        require(startingIndex == 0);
        require(startingIndexBlock != 0);
        
        startingIndex = uint(blockhash(startingIndexBlock)) % (MAX_TOKEN);
        // Just a sanity case in the worst case if this function is called late (EVM only stores last 256 block hashes)
        if (block.number - startingIndexBlock > 255) {
            startingIndex = uint(blockhash(block.number - 1)) % (MAX_TOKEN);
        }
        // Prevent default sequence
        if (startingIndex == 0) {
            startingIndex++;
        }
    }


     function updateLvsAddress(address _contract)public {
        require(senders[_msgSender()]);
        LVScontract = _contract;
    }

    function updateOgMerkle(bytes32  _root)public {
       require(senders[_msgSender()]);
       ogMerkle = _root;
    }

    function updateLvMerkle(bytes32  _root)public{
        require(senders[_msgSender()]);
       lvMerkle = _root;
    }


   function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view override  returns (
        address receiver,
        uint256 royaltyAmount
    ){
        require(_exists(_tokenId));
        return (owner(), uint256(royalty * _salePrice / 1000));

    }


    function flipSaleState() public  {
        require(senders[_msgSender()]);
        saleIsActive = !saleIsActive;
    }

    function flipclaim() public  {
        require(senders[_msgSender()]);
        claim = !claim;
    }


    function updateRoyalty(uint newRoyalty) public onlyOwner {
        royalty = newRoyalty ;
    }


    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
            super._beforeTokenTransfer(from, to, tokenId);
        }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
            return super.supportsInterface(interfaceId);
        }

    function setBaseURI(string memory baseURI_)  external {
             require(senders[_msgSender()]);
            _baseURIextended = baseURI_;
        }

    function _baseURI() internal view virtual override returns (string memory) {
            return _baseURIextended;
        }

    function setProvenance(string memory provenance) public onlyOwner {
            PROVENANCE = provenance;
        }



    function getSaleState() public view returns (bool) {
            return saleIsActive;
    }

  
 

     function prooveMerkle(bytes32[] calldata _merkleProof, bytes32 _merkleRoot)private view returns (bool) {
        bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));

        require(MerkleProof.verify(_merkleProof, _merkleRoot, leaf));

        return true;
    }


    function launchSale() public  {
        require(senders[_msgSender()]);
        require(SALE_START == 0 );
        require(startingIndex != 0);

        SALE_START = block.timestamp + (101*60); // first 101 minutes for og and wl
        saleIsActive = true;
        claim = true;
        
    }


    
    function _confirmMint(uint _tokenNumber, uint _claim) private view returns (bool) {
        
        uint256 ts = totalSupply();
        uint256 msBalance = balanceOf(_msgSender());
        uint256 totalMinted = minters[_msgSender()];

        if(_claim == 0){
            require(_tokenNumber <= MAX_PUBLIC_MINT,"max!");
            require(totalMinted + _tokenNumber <= MAX_PUBLIC_MINT,"4!");
            require(msBalance + _tokenNumber <= MAX_PUBLIC_MINT, "4");

        }
       
        require(!Address.isContract(_msgSender()),"contract");
        require(saleIsActive, "closed!");
        require(ts + _tokenNumber <= MAX_TOKEN, "max");
        
        if(claim == true){
            require(ts + _tokenNumber <= MAX_TOKEN - claimToken + claimed, "max");

        }

        return true;
    }



    function _doMint(uint numberOfTokens, address _target)private {
        
            minters[_msgSender()]++;   

            uint256 t = totalSupply();

            for (uint256 i = 0; i < numberOfTokens; i++) {
                    _safeMint(_target, t + i);
                    
              }


               
   
    }


    function TeamReserve(uint _amount)public onlyOwner{
        
        require(_amount >0);
        uint256 ts = totalSupply();
        require(ts + _amount <= MAX_TOKEN);
        

        _doMint(_amount,_msgSender());
           
    }


    function LoveStoryClaim()public{
        

        require(claim == true, "claim");

        uint ownerBalance =  LVS(LVScontract).balanceOf(_msgSender()); // check LVS balance for owner

        require(ownerBalance > 0,"balance");

        for (uint i = 0; i < ownerBalance; i++){ // add token to claimed list
            uint claimedToken = LVS(LVScontract).tokenOfOwnerByIndex(_msgSender(),i);
            require(claimedTokens[claimedToken] == false, "claimed");
            claimedTokens[claimedToken] = true;
        }

        
        require(_confirmMint(ownerBalance,1));

        claimed = claimed + ownerBalance;

        _doMint(ownerBalance, _msgSender());
           
    }

    
     //og mint
    function OGMint(uint numberOfTokens, bytes32[] calldata _proof)public payable {
        
        require(block.timestamp < SALE_START, "presale");
  
        require(prooveMerkle(_proof, ogMerkle),"whitelist");
        require(_confirmMint(numberOfTokens,0));
        require(ogPrice * (numberOfTokens) <= msg.value, "Ether");

        _doMint(numberOfTokens, _msgSender());
    }

    
    // Love Story mint
    function LoveListMint(uint numberOfTokens, bytes32[] calldata _proof)public payable {
        
        require(block.timestamp < SALE_START, "presale");
  
        require(prooveMerkle(_proof, lvMerkle ),"whitelist");
        require(_confirmMint(numberOfTokens,0), "failed");
        require(lvPrice * (numberOfTokens) <= msg.value, "Ether");

        _doMint(numberOfTokens, _msgSender());
    }

    // Public Mint
    function XOXOMint(uint256  _amount) public payable {
        require(block.timestamp >= SALE_START, "not yet");
        require(tokenPrice * (_amount) <= msg.value, "Ether");
        require(_confirmMint(_amount,0), "closed");
                  
        _doMint(_amount, _msgSender());
    
    }
    
    function CreditCardMint(address  _target, uint numberOfTokens) public {
        
        require(senders[_msgSender()]);
        require(numberOfTokens >0);
        uint256 ts = totalSupply();
        require(ts + numberOfTokens <= MAX_TOKEN, "max");
        

        _doMint(numberOfTokens, _target);
    }

    function withdraw(address _beneficiary) public onlyOwner {
        uint balance = address(this).balance;
        payable(_beneficiary).transfer(balance);
    }


    function transferOwnership(address newOwner) public override onlyOwner {
        require(newOwner != address(0), "address");
       
        _transferOwnership(newOwner);

    }
    
}   

/*
                                                                                                                                                     
                                                                                
                               %%%%%*       /%%%%*                              
                         %%%                         %%                         
                     .%%                                 %%                     
                   %%                                       %                   
                 %%                                           %                 
               %%                                               %               
             .%     @@@@@@@@@@@@@@@@@@@@@               @@@@                    
            %%      @@@                @@@             @@@         ,            
            %       @@@                  @@@         @@@                        
           %%       &&&                   &@@@     @@@              %           
           %        &&&                     @@@@ @@@                            
          ,%        &&&&&&&&&&&&&&&&&&&%%(.   @@@@@                             
           %        %%%                      @@@@@@@                            
           %        %%%                    @@@@   @@@@                          
           %%       %%%                  @@@@       @@@             %           
            %%      %%%                 @@@           @@@          %            
             %%     %%%               @@@               @@@       %             
              %%    %%%%%%%%%%%%%%%%@@@                  @@@@    %              
                %%                                             %                
                  %%                                         %                  
                    %%                                     %                    
                       %%%                             %%                       
                            %%%                   %%#                           
                                    #%%%%%%%                 

*/

File 1 of 15: address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 15: context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 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
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./ERC165.sol";
import "./IERC721.sol";
import "./IERC721metadata.sol";
import "./IERC721receiver.sol";
import "./IERC2981.sol";
import "./address.sol";
import "./context.sol";
import "./strings.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, IERC2981 {
    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 ||
            interfaceId == type(IERC2981).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }

    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view virtual override returns (
        address receiver,
        uint256 royaltyAmount
    ){

    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

File 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
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

///
/// @dev Interface for the NFT Royalty Standard
///
interface IERC2981 is IERC165 {
    /// ERC165 bytes to add to interface array - set in parent contract
    /// implementing this standard
    ///
    /// bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    /// bytes4 private constant _INTERFACE_ID_ERC2981 = 0x2a55205a;
    /// _registerInterface(_INTERFACE_ID_ERC2981);

    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _salePrice - the sale price of the NFT asset specified by _tokenId
    /// @return receiver - address of who should be sent the royalty payment
    /// @return royaltyAmount - the royalty payment amount for _salePrice
    function royaltyInfo(
        uint256 _tokenId,
        uint256 _salePrice
    ) external view returns (
        address receiver,
        uint256 royaltyAmount
    );
}

File 8 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 9 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 10 of 15: IERC721metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


interface IERC721Metadata {


  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}

File 11 of 15: IERC721receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 15: merkle.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 14 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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 15 of 15: strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"CreditCardMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"LoveListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"LoveStoryClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"OGMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetStartingIndexBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TeamReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"XOXOMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipclaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"launchSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lvMerkle","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lvPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogMerkle","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStartingIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startingIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startingIndexBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"updateLvMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"updateLvsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"updateOgMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoyalty","type":"uint256"}],"name":"updateRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff0219169083151502179055506000600c556050600d5566b1a2bc2ec50000600e5567010a741a46278000600f55670166d2f7025080006010556000601155600060125560006013557f6ee8bee8c77b05f5cf46ea9f7c98b6e3571366d95ccdb3f96be8640e43b6ec2160001b6015557f6ee8bee8c77b05f5cf46ea9f7c98b6e3571366d95ccdb3f96be8640e43b6ec2160001b601655348015620000d157600080fd5b506040518060400160405280600781526020017f584f584f4e4654000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f584f584f000000000000000000000000000000000000000000000000000000008152506200015e620001526200023260201b60201c565b6200023a60201b60201c565b816001908051906020019062000176929190620003cf565b5080600290805190602001906200018f929190620003cf565b5050506040518060600160405280603681526020016200642d6036913960179080519060200190620001c3929190620003cf565b506001601a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200022c620002fe60201b60201c565b62000567565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200030e6200023260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000334620003a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200038d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038490620004a6565b60405180910390fd5b6000601154146200039d57600080fd5b43601281905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003dd90620004d9565b90600052602060002090601f0160209004810192826200040157600085556200044d565b82601f106200041c57805160ff19168380011785556200044d565b828001600101855582156200044d579182015b828111156200044c5782518255916020019190600101906200042f565b5b5090506200045c919062000460565b5090565b5b808211156200047b57600081600090555060010162000461565b5090565b60006200048e602083620004c8565b91506200049b826200053e565b602082019050919050565b60006020820190508181036000830152620004c1816200047f565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004f257607f821691505b602082108114156200050957620005086200050f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b615eb680620005776000396000f3fe6080604052600436106103805760003560e01c806374101eab116101d1578063bc82ebe011610102578063e985e9c5116100a0578063f2fde38b1161006f578063f2fde38b14610c77578063f46eccc414610ca0578063f674019f14610cdd578063ffe630b514610cf457610380565b8063e985e9c514610bcf578063e986655014610c0c578063eb8d244414610c23578063eee6216614610c4e57610380565b8063cb774d47116100dc578063cb774d4714610b25578063d431260b14610b50578063e36d649814610b79578063e834a83414610ba457610380565b8063bc82ebe014610ab5578063c17fc88114610acc578063c87b56dd14610ae857610380565b806395d89b411161016f578063b2f8764311610149578063b2f8764314610a11578063b697f53114610a3a578063b714493e14610a63578063b88d4fde14610a8c57610380565b806395d89b4114610994578063a22cb465146109bf578063a8383a93146109e857610380565b8063812c82ea116101ab578063812c82ea146108f957806381ca307c146109155780638da5cb5b146109405780638fffd8b51461096b57610380565b806374101eab146108a05780637f7376e8146108b75780637ff9b596146108ce57610380565b80632f745c59116102b657806351cff8d91161025457806365f130971161022357806365f13097146107f65780636e1bd3231461082157806370a082311461084c578063715018a61461088957610380565b806351cff8d91461073c57806355f804b3146107655780636352211e1461078e5780636373a6b1146107cb57610380565b806342842e0e1161029057806342842e0e146106805780634451d89f146106a95780634e71d92d146106d45780634f6ccce7146106ff57610380565b80632f745c591461060157806334918dfd1461063e5780633d63c0ba1461065557610380565b806318160ddd1161032357806325bdb2a8116102fd57806325bdb2a8146105515780632932d1b11461057c57806329ee566c146105985780632a55205a146105c357610380565b806318160ddd146104d257806322673030146104fd57806323b872dd1461052857610380565b806306fdde031161035f57806306fdde0314610416578063081812fc14610441578063095ea7b31461047e57806315f5d8a0146104a757610380565b806282214114610385578063016c5e98146103b057806301ffc9a7146103d9575b600080fd5b34801561039157600080fd5b5061039a610d1d565b6040516103a79190614d68565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906144fb565b610d23565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190614568565b610df8565b60405161040d9190614d4d565b60405180910390f35b34801561042257600080fd5b5061042b610e0a565b6040516104389190614d83565b60405180910390f35b34801561044d57600080fd5b506104686004803603810190610463919061460b565b610e9c565b6040516104759190614cbd565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a091906144fb565b610f21565b005b3480156104b357600080fd5b506104bc611039565b6040516104c991906151c5565b60405180910390f35b3480156104de57600080fd5b506104e761103f565b6040516104f491906151c5565b60405180910390f35b34801561050957600080fd5b5061051261104c565b60405161051f91906151c5565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a91906143e5565b611052565b005b34801561055d57600080fd5b506105666110b2565b6040516105739190614d4d565b60405180910390f35b61059660048036038101906105919190614665565b6110c9565b005b3480156105a457600080fd5b506105ad6111d3565b6040516105ba91906151c5565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e591906146c5565b6111d9565b6040516105f8929190614d24565b60405180910390f35b34801561060d57600080fd5b50610628600480360381019061062391906144fb565b61121c565b60405161063591906151c5565b60405180910390f35b34801561064a57600080fd5b506106536112c1565b005b34801561066157600080fd5b5061066a61134a565b60405161067791906151c5565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a291906143e5565b611350565b005b3480156106b557600080fd5b506106be611370565b6040516106cb91906151c5565b60405180910390f35b3480156106e057600080fd5b506106e9611375565b6040516106f69190614d4d565b60405180910390f35b34801561070b57600080fd5b506107266004803603810190610721919061460b565b611388565b60405161073391906151c5565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e9190614378565b6113f9565b005b34801561077157600080fd5b5061078c600480360381019061078791906145c2565b6114c5565b005b34801561079a57600080fd5b506107b560048036038101906107b0919061460b565b61153c565b6040516107c29190614cbd565b60405180910390f35b3480156107d757600080fd5b506107e06115ee565b6040516107ed9190614d83565b60405180910390f35b34801561080257600080fd5b5061080b61167c565b60405161081891906151c5565b60405180910390f35b34801561082d57600080fd5b50610836611681565b60405161084391906151c5565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614378565b611687565b60405161088091906151c5565b60405180910390f35b34801561089557600080fd5b5061089e61173f565b005b3480156108ac57600080fd5b506108b56117c7565b005b3480156108c357600080fd5b506108cc611850565b005b3480156108da57600080fd5b506108e3611918565b6040516108f091906151c5565b60405180910390f35b610913600480360381019061090e9190614665565b61191e565b005b34801561092157600080fd5b5061092a611a5e565b6040516109379190614d68565b60405180910390f35b34801561094c57600080fd5b50610955611a64565b6040516109629190614cbd565b60405180910390f35b34801561097757600080fd5b50610992600480360381019061098d919061460b565b611a8d565b005b3480156109a057600080fd5b506109a9611b13565b6040516109b69190614d83565b60405180910390f35b3480156109cb57600080fd5b506109e660048036038101906109e191906144bb565b611ba5565b005b3480156109f457600080fd5b50610a0f6004803603810190610a0a919061460b565b611bbb565b005b348015610a1d57600080fd5b50610a386004803603810190610a339190614378565b611c7f565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190614378565b611d90565b005b348015610a6f57600080fd5b50610a8a6004803603810190610a85919061453b565b611ea1565b005b348015610a9857600080fd5b50610ab36004803603810190610aae9190614438565b611f08565b005b348015610ac157600080fd5b50610aca611f6a565b005b610ae66004803603810190610ae1919061460b565b611ffe565b005b348015610af457600080fd5b50610b0f6004803603810190610b0a919061460b565b6120f1565b604051610b1c9190614d83565b60405180910390f35b348015610b3157600080fd5b50610b3a612198565b604051610b4791906151c5565b60405180910390f35b348015610b5c57600080fd5b50610b776004803603810190610b72919061453b565b61219e565b005b348015610b8557600080fd5b50610b8e612205565b604051610b9b91906151c5565b60405180910390f35b348015610bb057600080fd5b50610bb961220b565b604051610bc691906151c5565b60405180910390f35b348015610bdb57600080fd5b50610bf66004803603810190610bf191906143a5565b612211565b604051610c039190614d4d565b60405180910390f35b348015610c1857600080fd5b50610c216122a5565b005b348015610c2f57600080fd5b50610c386123bb565b604051610c459190614d4d565b60405180910390f35b348015610c5a57600080fd5b50610c756004803603810190610c709190614378565b6123ce565b005b348015610c8357600080fd5b50610c9e6004803603810190610c999190614378565b61246f565b005b348015610cac57600080fd5b50610cc76004803603810190610cc29190614378565b612567565b604051610cd491906151c5565b60405180910390f35b348015610ce957600080fd5b50610cf261257f565b005b348015610d0057600080fd5b50610d1b6004803603810190610d1691906145c2565b612875565b005b60155481565b601a6000610d2f61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d8057600080fd5b60008111610d8d57600080fd5b6000610d9761103f565b90506127108282610da891906152aa565b1115610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090615085565b60405180910390fd5b610df38284612913565b505050565b6000610e03826129b4565b9050919050565b606060018054610e199061547f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e459061547f565b8015610e925780601f10610e6757610100808354040283529160200191610e92565b820191906000526020600020905b815481529060010190602001808311610e7557829003601f168201915b5050505050905090565b6000610ea782612a2e565b610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90615005565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f2c8261153c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906150a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fbc61290b565b73ffffffffffffffffffffffffffffffffffffffff161480610feb5750610fea81610fe561290b565b612211565b5b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190614f45565b60405180910390fd5b6110348383612a9a565b505050565b600e5481565b6000600980549050905090565b60135481565b61106361105d61290b565b82612b53565b6110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990615105565b60405180910390fd5b6110ad838383612c31565b505050565b6000600b60009054906101000a900460ff16905090565b601354421061110d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611104906151a5565b60405180910390fd5b61111a8282601554612e98565b611159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115090614ec5565b60405180910390fd5b611164836000612f2c565b61116d57600080fd5b3483600e5461117c9190615331565b11156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490615045565b60405180910390fd5b6111ce836111c961290b565b612913565b505050565b600d5481565b6000806111e584612a2e565b6111ee57600080fd5b6111f6611a64565b6103e884600d546112079190615331565b6112119190615300565b915091509250929050565b600061122783611687565b8210611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90614de5565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601a60006112cd61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661131e57600080fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b600f5481565b61136b83838360405180602001604052806000815250611f08565b505050565b606581565b600b60019054906101000a900460ff1681565b600061139261103f565b82106113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90615125565b60405180910390fd5b600982815481106113e7576113e661563c565b5b90600052602060002001549050919050565b61140161290b565b73ffffffffffffffffffffffffffffffffffffffff1661141f611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90615025565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114c0573d6000803e3d6000fd5b505050565b601a60006114d161290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661152257600080fd5b806017908051906020019061153892919061410c565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90614f85565b60405180910390fd5b80915050919050565b601880546115fb9061547f565b80601f01602080910402602001604051908101604052809291908181526020018280546116279061547f565b80156116745780601f1061164957610100808354040283529160200191611674565b820191906000526020600020905b81548152906001019060200180831161165757829003601f168201915b505050505081565b600481565b61271081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef90614f65565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174761290b565b73ffffffffffffffffffffffffffffffffffffffff16611765611a64565b73ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290615025565b60405180910390fd5b6117c56000613206565b565b601a60006117d361290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661182457600080fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b601a600061185c61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ad57600080fd5b6000601354146118bc57600080fd5b600060115414156118cc57600080fd5b6117ac426118da91906152aa565b6013819055506001600b60006101000a81548160ff0219169083151502179055506001600b60016101000a81548160ff021916908315150217905550565b60105481565b6013544210611962576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611959906151a5565b60405180910390fd5b61196f8282601654612e98565b6119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614ec5565b60405180910390fd5b6119b9836000612f2c565b6119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614fe5565b60405180910390fd5b3483600f54611a079190615331565b1115611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f90615045565b60405180910390fd5b611a5983611a5461290b565b612913565b505050565b60165481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a9561290b565b73ffffffffffffffffffffffffffffffffffffffff16611ab3611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090615025565b60405180910390fd5b80600d8190555050565b606060028054611b229061547f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4e9061547f565b8015611b9b5780601f10611b7057610100808354040283529160200191611b9b565b820191906000526020600020905b815481529060010190602001808311611b7e57829003601f168201915b5050505050905090565b611bb7611bb061290b565b83836132ca565b5050565b611bc361290b565b73ffffffffffffffffffffffffffffffffffffffff16611be1611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90615025565b60405180910390fd5b60008111611c4457600080fd5b6000611c4e61103f565b90506127108282611c5f91906152aa565b1115611c6a57600080fd5b611c7b82611c7661290b565b612913565b5050565b611c8761290b565b73ffffffffffffffffffffffffffffffffffffffff16611ca5611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290615025565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d3557600080fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611d9861290b565b73ffffffffffffffffffffffffffffffffffffffff16611db6611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390615025565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e4657600080fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601a6000611ead61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611efe57600080fd5b8060158190555050565b611f19611f1361290b565b83612b53565b611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f90615105565b60405180910390fd5b611f6484848484613437565b50505050565b611f7261290b565b73ffffffffffffffffffffffffffffffffffffffff16611f90611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90615025565b60405180910390fd5b600060115414611ff557600080fd5b43601281905550565b601354421015612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a906150c5565b60405180910390fd5b34816010546120529190615331565b1115612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90615045565b60405180910390fd5b61209e816000612f2c565b6120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d490614f05565b60405180910390fd5b6120ee816120e961290b565b612913565b50565b60606120fc82612a2e565b61213b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213290615065565b60405180910390fd5b6000612145613493565b905060008151116121655760405180602001604052806000815250612190565b8061216f84613525565b604051602001612180929190614c99565b6040516020818303038152906040525b915050919050565b60115481565b601a60006121aa61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121fb57600080fd5b8060168190555050565b60125481565b600c5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122ad61290b565b73ffffffffffffffffffffffffffffffffffffffff166122cb611a64565b73ffffffffffffffffffffffffffffffffffffffff1614612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890615025565b60405180910390fd5b60006011541461233057600080fd5b6000601254141561234057600080fd5b6127106012544060001c612354919061554f565b60118190555060ff6012544361236a919061538b565b111561239557612710600143612380919061538b565b4060001c61238e919061554f565b6011819055505b600060115414156123b957601160008154809291906123b3906154e2565b91905055505b565b600b60009054906101000a900460ff1681565b601a60006123da61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661242b57600080fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61247761290b565b73ffffffffffffffffffffffffffffffffffffffff16612495611a64565b73ffffffffffffffffffffffffffffffffffffffff16146124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290615025565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255290614e65565b60405180910390fd5b61256481613206565b50565b60196020528060005260406000206000915090505481565b60011515600b60019054906101000a900460ff161515146125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc906150e5565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161261d61290b565b6040518263ffffffff1660e01b81526004016126399190614cbd565b60206040518083038186803b15801561265157600080fd5b505afa158015612665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126899190614638565b9050600081116126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590615165565b60405180910390fd5b60005b81811015612838576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5961272161290b565b846040518363ffffffff1660e01b815260040161273f929190614d24565b60206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278f9190614638565b905060001515601b600083815260200190815260200160002060009054906101000a900460ff161515146127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef90614f25565b60405180910390fd5b6001601b600083815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612830906154e2565b9150506126d1565b50612844816001612f2c565b61284d57600080fd5b80600c5461285b91906152aa565b600c819055506128728161286d61290b565b612913565b50565b61287d61290b565b73ffffffffffffffffffffffffffffffffffffffff1661289b611a64565b73ffffffffffffffffffffffffffffffffffffffff16146128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890615025565b60405180910390fd5b806018908051906020019061290792919061410c565b5050565b600033905090565b6019600061291f61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061296a906154e2565b9190505550600061297961103f565b905060005b838110156129ae5761299b83828461299691906152aa565b613686565b80806129a6906154e2565b91505061297e565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a275750612a26826136a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b0d8361153c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b5e82612a2e565b612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9490614ee5565b60405180910390fd5b6000612ba88361153c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c1757508373ffffffffffffffffffffffffffffffffffffffff16612bff84610e9c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c285750612c278185612211565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c518261153c565b73ffffffffffffffffffffffffffffffffffffffff1614612ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9e90614e25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0e90614e85565b60405180910390fd5b612d22838383613846565b612d2d600082612a9a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d7d919061538b565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd491906152aa565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e93838383613856565b505050565b600080612ea361290b565b604051602001612eb39190614c7e565b604051602081830303815290604052805190602001209050612f17858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848361385b565b612f2057600080fd5b60019150509392505050565b600080612f3761103f565b90506000612f4b612f4661290b565b611687565b9050600060196000612f5b61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415613084576004861115612fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdc90615185565b60405180910390fd5b60048682612ff391906152aa565b1115613034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302b90615145565b60405180910390fd5b6004868361304291906152aa565b1115613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a90614da5565b60405180910390fd5b5b61309461308f61290b565b613872565b156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb90614fa5565b60405180910390fd5b600b60009054906101000a900460ff16613123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311a90614dc5565b60405180910390fd5b612710868461313291906152aa565b1115613173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316a90615085565b60405180910390fd5b60011515600b60019054906101000a900460ff16151514156131f957600c5460656127106131a1919061538b565b6131ab91906152aa565b86846131b791906152aa565b11156131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef90615085565b60405180910390fd5b5b6001935050505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333090614ea5565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161342a9190614d4d565b60405180910390a3505050565b613442848484612c31565b61344e84848484613895565b61348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348490614e05565b60405180910390fd5b50505050565b6060601780546134a29061547f565b80601f01602080910402602001604051908101604052809291908181526020018280546134ce9061547f565b801561351b5780601f106134f05761010080835404028352916020019161351b565b820191906000526020600020905b8154815290600101906020018083116134fe57829003601f168201915b5050505050905090565b6060600082141561356d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613681565b600082905060005b6000821461359f578080613588906154e2565b915050600a826135989190615300565b9150613575565b60008167ffffffffffffffff8111156135bb576135ba61566b565b5b6040519080825280601f01601f1916602001820160405280156135ed5781602001600182028036833780820191505090505b5090505b6000851461367a57600182613606919061538b565b9150600a85613615919061554f565b603061362191906152aa565b60f81b8183815181106136375761363661563c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136739190615300565b94506135f1565b8093505050505b919050565b6136a0828260405180602001604052806000815250613a2c565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061376f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806137d757507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061383f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b613851838383613a87565b505050565b505050565b6000826138688584613b9b565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006138b68473ffffffffffffffffffffffffffffffffffffffff16613872565b15613a1f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138df61290b565b8786866040518563ffffffff1660e01b81526004016139019493929190614cd8565b602060405180830381600087803b15801561391b57600080fd5b505af192505050801561394c57506040513d601f19601f820116820180604052508101906139499190614595565b60015b6139cf573d806000811461397c576040519150601f19603f3d011682016040523d82523d6000602084013e613981565b606091505b506000815114156139c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139be90614e05565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a24565b600190505b949350505050565b613a368383613c10565b613a436000848484613895565b613a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7990614e05565b60405180910390fd5b505050565b613a92838383613dea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613ad557613ad081613def565b613b14565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b1357613b128382613e38565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b5757613b5281613fa5565b613b96565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b9557613b948282614076565b5b5b505050565b60008082905060005b8451811015613c05576000858281518110613bc257613bc161563c565b5b60200260200101519050808311613be457613bdd83826140f5565b9250613bf1565b613bee81846140f5565b92505b508080613bfd906154e2565b915050613ba4565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c7790614fc5565b60405180910390fd5b613c8981612a2e565b15613cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cc090614e45565b60405180910390fd5b613cd560008383613846565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d2591906152aa565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613de660008383613856565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e4584611687565b613e4f919061538b565b9050600060086000848152602001908152602001600020549050818114613f34576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613fb9919061538b565b90506000600a6000848152602001908152602001600020549050600060098381548110613fe957613fe861563c565b5b90600052602060002001549050806009838154811061400b5761400a61563c565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061405a5761405961560d565b5b6001900381819060005260206000200160009055905550505050565b600061408183611687565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b8280546141189061547f565b90600052602060002090601f01602090048101928261413a5760008555614181565b82601f1061415357805160ff1916838001178555614181565b82800160010185558215614181579182015b82811115614180578251825591602001919060010190614165565b5b50905061418e9190614192565b5090565b5b808211156141ab576000816000905550600101614193565b5090565b60006141c26141bd84615205565b6151e0565b9050828152602081018484840111156141de576141dd6156a9565b5b6141e984828561543d565b509392505050565b60006142046141ff84615236565b6151e0565b9050828152602081018484840111156142205761421f6156a9565b5b61422b84828561543d565b509392505050565b60008135905061424281615e0d565b92915050565b60008083601f84011261425e5761425d61569f565b5b8235905067ffffffffffffffff81111561427b5761427a61569a565b5b602083019150836020820283011115614297576142966156a4565b5b9250929050565b6000813590506142ad81615e24565b92915050565b6000813590506142c281615e3b565b92915050565b6000813590506142d781615e52565b92915050565b6000815190506142ec81615e52565b92915050565b600082601f8301126143075761430661569f565b5b81356143178482602086016141af565b91505092915050565b600082601f8301126143355761433461569f565b5b81356143458482602086016141f1565b91505092915050565b60008135905061435d81615e69565b92915050565b60008151905061437281615e69565b92915050565b60006020828403121561438e5761438d6156b3565b5b600061439c84828501614233565b91505092915050565b600080604083850312156143bc576143bb6156b3565b5b60006143ca85828601614233565b92505060206143db85828601614233565b9150509250929050565b6000806000606084860312156143fe576143fd6156b3565b5b600061440c86828701614233565b935050602061441d86828701614233565b925050604061442e8682870161434e565b9150509250925092565b60008060008060808587031215614452576144516156b3565b5b600061446087828801614233565b945050602061447187828801614233565b93505060406144828782880161434e565b925050606085013567ffffffffffffffff8111156144a3576144a26156ae565b5b6144af878288016142f2565b91505092959194509250565b600080604083850312156144d2576144d16156b3565b5b60006144e085828601614233565b92505060206144f18582860161429e565b9150509250929050565b60008060408385031215614512576145116156b3565b5b600061452085828601614233565b92505060206145318582860161434e565b9150509250929050565b600060208284031215614551576145506156b3565b5b600061455f848285016142b3565b91505092915050565b60006020828403121561457e5761457d6156b3565b5b600061458c848285016142c8565b91505092915050565b6000602082840312156145ab576145aa6156b3565b5b60006145b9848285016142dd565b91505092915050565b6000602082840312156145d8576145d76156b3565b5b600082013567ffffffffffffffff8111156145f6576145f56156ae565b5b61460284828501614320565b91505092915050565b600060208284031215614621576146206156b3565b5b600061462f8482850161434e565b91505092915050565b60006020828403121561464e5761464d6156b3565b5b600061465c84828501614363565b91505092915050565b60008060006040848603121561467e5761467d6156b3565b5b600061468c8682870161434e565b935050602084013567ffffffffffffffff8111156146ad576146ac6156ae565b5b6146b986828701614248565b92509250509250925092565b600080604083850312156146dc576146db6156b3565b5b60006146ea8582860161434e565b92505060206146fb8582860161434e565b9150509250929050565b61470e816153bf565b82525050565b614725614720826153bf565b61552b565b82525050565b614734816153d1565b82525050565b614743816153dd565b82525050565b600061475482615267565b61475e818561527d565b935061476e81856020860161544c565b614777816156b8565b840191505092915050565b600061478d82615272565b614797818561528e565b93506147a781856020860161544c565b6147b0816156b8565b840191505092915050565b60006147c682615272565b6147d0818561529f565b93506147e081856020860161544c565b80840191505092915050565b60006147f960018361528e565b9150614804826156d6565b602082019050919050565b600061481c60078361528e565b9150614827826156ff565b602082019050919050565b600061483f602b8361528e565b915061484a82615728565b604082019050919050565b600061486260328361528e565b915061486d82615777565b604082019050919050565b600061488560258361528e565b9150614890826157c6565b604082019050919050565b60006148a8601c8361528e565b91506148b382615815565b602082019050919050565b60006148cb60078361528e565b91506148d68261583e565b602082019050919050565b60006148ee60248361528e565b91506148f982615867565b604082019050919050565b600061491160198361528e565b915061491c826158b6565b602082019050919050565b600061493460098361528e565b915061493f826158df565b602082019050919050565b6000614957602c8361528e565b915061496282615908565b604082019050919050565b600061497a60068361528e565b915061498582615957565b602082019050919050565b600061499d60078361528e565b91506149a882615980565b602082019050919050565b60006149c060388361528e565b91506149cb826159a9565b604082019050919050565b60006149e3602a8361528e565b91506149ee826159f8565b604082019050919050565b6000614a0660298361528e565b9150614a1182615a47565b604082019050919050565b6000614a2960088361528e565b9150614a3482615a96565b602082019050919050565b6000614a4c60208361528e565b9150614a5782615abf565b602082019050919050565b6000614a6f60068361528e565b9150614a7a82615ae8565b602082019050919050565b6000614a92602c8361528e565b9150614a9d82615b11565b604082019050919050565b6000614ab560208361528e565b9150614ac082615b60565b602082019050919050565b6000614ad860058361528e565b9150614ae382615b89565b602082019050919050565b6000614afb602f8361528e565b9150614b0682615bb2565b604082019050919050565b6000614b1e60038361528e565b9150614b2982615c01565b602082019050919050565b6000614b4160218361528e565b9150614b4c82615c2a565b604082019050919050565b6000614b6460078361528e565b9150614b6f82615c79565b602082019050919050565b6000614b8760058361528e565b9150614b9282615ca2565b602082019050919050565b6000614baa60318361528e565b9150614bb582615ccb565b604082019050919050565b6000614bcd602c8361528e565b9150614bd882615d1a565b604082019050919050565b6000614bf060028361528e565b9150614bfb82615d69565b602082019050919050565b6000614c1360078361528e565b9150614c1e82615d92565b602082019050919050565b6000614c3660048361528e565b9150614c4182615dbb565b602082019050919050565b6000614c5960078361528e565b9150614c6482615de4565b602082019050919050565b614c7881615433565b82525050565b6000614c8a8284614714565b60148201915081905092915050565b6000614ca582856147bb565b9150614cb182846147bb565b91508190509392505050565b6000602082019050614cd26000830184614705565b92915050565b6000608082019050614ced6000830187614705565b614cfa6020830186614705565b614d076040830185614c6f565b8181036060830152614d198184614749565b905095945050505050565b6000604082019050614d396000830185614705565b614d466020830184614c6f565b9392505050565b6000602082019050614d62600083018461472b565b92915050565b6000602082019050614d7d600083018461473a565b92915050565b60006020820190508181036000830152614d9d8184614782565b905092915050565b60006020820190508181036000830152614dbe816147ec565b9050919050565b60006020820190508181036000830152614dde8161480f565b9050919050565b60006020820190508181036000830152614dfe81614832565b9050919050565b60006020820190508181036000830152614e1e81614855565b9050919050565b60006020820190508181036000830152614e3e81614878565b9050919050565b60006020820190508181036000830152614e5e8161489b565b9050919050565b60006020820190508181036000830152614e7e816148be565b9050919050565b60006020820190508181036000830152614e9e816148e1565b9050919050565b60006020820190508181036000830152614ebe81614904565b9050919050565b60006020820190508181036000830152614ede81614927565b9050919050565b60006020820190508181036000830152614efe8161494a565b9050919050565b60006020820190508181036000830152614f1e8161496d565b9050919050565b60006020820190508181036000830152614f3e81614990565b9050919050565b60006020820190508181036000830152614f5e816149b3565b9050919050565b60006020820190508181036000830152614f7e816149d6565b9050919050565b60006020820190508181036000830152614f9e816149f9565b9050919050565b60006020820190508181036000830152614fbe81614a1c565b9050919050565b60006020820190508181036000830152614fde81614a3f565b9050919050565b60006020820190508181036000830152614ffe81614a62565b9050919050565b6000602082019050818103600083015261501e81614a85565b9050919050565b6000602082019050818103600083015261503e81614aa8565b9050919050565b6000602082019050818103600083015261505e81614acb565b9050919050565b6000602082019050818103600083015261507e81614aee565b9050919050565b6000602082019050818103600083015261509e81614b11565b9050919050565b600060208201905081810360008301526150be81614b34565b9050919050565b600060208201905081810360008301526150de81614b57565b9050919050565b600060208201905081810360008301526150fe81614b7a565b9050919050565b6000602082019050818103600083015261511e81614b9d565b9050919050565b6000602082019050818103600083015261513e81614bc0565b9050919050565b6000602082019050818103600083015261515e81614be3565b9050919050565b6000602082019050818103600083015261517e81614c06565b9050919050565b6000602082019050818103600083015261519e81614c29565b9050919050565b600060208201905081810360008301526151be81614c4c565b9050919050565b60006020820190506151da6000830184614c6f565b92915050565b60006151ea6151fb565b90506151f682826154b1565b919050565b6000604051905090565b600067ffffffffffffffff8211156152205761521f61566b565b5b615229826156b8565b9050602081019050919050565b600067ffffffffffffffff8211156152515761525061566b565b5b61525a826156b8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152b582615433565b91506152c083615433565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152f5576152f4615580565b5b828201905092915050565b600061530b82615433565b915061531683615433565b925082615326576153256155af565b5b828204905092915050565b600061533c82615433565b915061534783615433565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153805761537f615580565b5b828202905092915050565b600061539682615433565b91506153a183615433565b9250828210156153b4576153b3615580565b5b828203905092915050565b60006153ca82615413565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561546a57808201518184015260208101905061544f565b83811115615479576000848401525b50505050565b6000600282049050600182168061549757607f821691505b602082108114156154ab576154aa6155de565b5b50919050565b6154ba826156b8565b810181811067ffffffffffffffff821117156154d9576154d861566b565b5b80604052505050565b60006154ed82615433565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155205761551f615580565b5b600182019050919050565b60006155368261553d565b9050919050565b6000615548826156c9565b9050919050565b600061555a82615433565b915061556583615433565b925082615575576155746155af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f636c6f7365642100000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6164647265737300000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636c6f7365640000000000000000000000000000000000000000000000000000600082015250565b7f636c61696d656400000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4574686572000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6d61780000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f742079657400000000000000000000000000000000000000000000000000600082015250565b7f636c61696d000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3421000000000000000000000000000000000000000000000000000000000000600082015250565b7f62616c616e636500000000000000000000000000000000000000000000000000600082015250565b7f6d61782100000000000000000000000000000000000000000000000000000000600082015250565b7f70726573616c6500000000000000000000000000000000000000000000000000600082015250565b615e16816153bf565b8114615e2157600080fd5b50565b615e2d816153d1565b8114615e3857600080fd5b50565b615e44816153dd565b8114615e4f57600080fd5b50565b615e5b816153e7565b8114615e6657600080fd5b50565b615e7281615433565b8114615e7d57600080fd5b5056fea26469706673582212201184bd16d6ece640908ddebbcb31f8f257da93c946d15119e19a78360e26eb2864736f6c63430008070033697066733a2f2f516d5848434137547872726f5833676854687a3358423444594a4a5857746a643245796d376a5355767765574c372f

Deployed Bytecode

0x6080604052600436106103805760003560e01c806374101eab116101d1578063bc82ebe011610102578063e985e9c5116100a0578063f2fde38b1161006f578063f2fde38b14610c77578063f46eccc414610ca0578063f674019f14610cdd578063ffe630b514610cf457610380565b8063e985e9c514610bcf578063e986655014610c0c578063eb8d244414610c23578063eee6216614610c4e57610380565b8063cb774d47116100dc578063cb774d4714610b25578063d431260b14610b50578063e36d649814610b79578063e834a83414610ba457610380565b8063bc82ebe014610ab5578063c17fc88114610acc578063c87b56dd14610ae857610380565b806395d89b411161016f578063b2f8764311610149578063b2f8764314610a11578063b697f53114610a3a578063b714493e14610a63578063b88d4fde14610a8c57610380565b806395d89b4114610994578063a22cb465146109bf578063a8383a93146109e857610380565b8063812c82ea116101ab578063812c82ea146108f957806381ca307c146109155780638da5cb5b146109405780638fffd8b51461096b57610380565b806374101eab146108a05780637f7376e8146108b75780637ff9b596146108ce57610380565b80632f745c59116102b657806351cff8d91161025457806365f130971161022357806365f13097146107f65780636e1bd3231461082157806370a082311461084c578063715018a61461088957610380565b806351cff8d91461073c57806355f804b3146107655780636352211e1461078e5780636373a6b1146107cb57610380565b806342842e0e1161029057806342842e0e146106805780634451d89f146106a95780634e71d92d146106d45780634f6ccce7146106ff57610380565b80632f745c591461060157806334918dfd1461063e5780633d63c0ba1461065557610380565b806318160ddd1161032357806325bdb2a8116102fd57806325bdb2a8146105515780632932d1b11461057c57806329ee566c146105985780632a55205a146105c357610380565b806318160ddd146104d257806322673030146104fd57806323b872dd1461052857610380565b806306fdde031161035f57806306fdde0314610416578063081812fc14610441578063095ea7b31461047e57806315f5d8a0146104a757610380565b806282214114610385578063016c5e98146103b057806301ffc9a7146103d9575b600080fd5b34801561039157600080fd5b5061039a610d1d565b6040516103a79190614d68565b60405180910390f35b3480156103bc57600080fd5b506103d760048036038101906103d291906144fb565b610d23565b005b3480156103e557600080fd5b5061040060048036038101906103fb9190614568565b610df8565b60405161040d9190614d4d565b60405180910390f35b34801561042257600080fd5b5061042b610e0a565b6040516104389190614d83565b60405180910390f35b34801561044d57600080fd5b506104686004803603810190610463919061460b565b610e9c565b6040516104759190614cbd565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a091906144fb565b610f21565b005b3480156104b357600080fd5b506104bc611039565b6040516104c991906151c5565b60405180910390f35b3480156104de57600080fd5b506104e761103f565b6040516104f491906151c5565b60405180910390f35b34801561050957600080fd5b5061051261104c565b60405161051f91906151c5565b60405180910390f35b34801561053457600080fd5b5061054f600480360381019061054a91906143e5565b611052565b005b34801561055d57600080fd5b506105666110b2565b6040516105739190614d4d565b60405180910390f35b61059660048036038101906105919190614665565b6110c9565b005b3480156105a457600080fd5b506105ad6111d3565b6040516105ba91906151c5565b60405180910390f35b3480156105cf57600080fd5b506105ea60048036038101906105e591906146c5565b6111d9565b6040516105f8929190614d24565b60405180910390f35b34801561060d57600080fd5b50610628600480360381019061062391906144fb565b61121c565b60405161063591906151c5565b60405180910390f35b34801561064a57600080fd5b506106536112c1565b005b34801561066157600080fd5b5061066a61134a565b60405161067791906151c5565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a291906143e5565b611350565b005b3480156106b557600080fd5b506106be611370565b6040516106cb91906151c5565b60405180910390f35b3480156106e057600080fd5b506106e9611375565b6040516106f69190614d4d565b60405180910390f35b34801561070b57600080fd5b506107266004803603810190610721919061460b565b611388565b60405161073391906151c5565b60405180910390f35b34801561074857600080fd5b50610763600480360381019061075e9190614378565b6113f9565b005b34801561077157600080fd5b5061078c600480360381019061078791906145c2565b6114c5565b005b34801561079a57600080fd5b506107b560048036038101906107b0919061460b565b61153c565b6040516107c29190614cbd565b60405180910390f35b3480156107d757600080fd5b506107e06115ee565b6040516107ed9190614d83565b60405180910390f35b34801561080257600080fd5b5061080b61167c565b60405161081891906151c5565b60405180910390f35b34801561082d57600080fd5b50610836611681565b60405161084391906151c5565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190614378565b611687565b60405161088091906151c5565b60405180910390f35b34801561089557600080fd5b5061089e61173f565b005b3480156108ac57600080fd5b506108b56117c7565b005b3480156108c357600080fd5b506108cc611850565b005b3480156108da57600080fd5b506108e3611918565b6040516108f091906151c5565b60405180910390f35b610913600480360381019061090e9190614665565b61191e565b005b34801561092157600080fd5b5061092a611a5e565b6040516109379190614d68565b60405180910390f35b34801561094c57600080fd5b50610955611a64565b6040516109629190614cbd565b60405180910390f35b34801561097757600080fd5b50610992600480360381019061098d919061460b565b611a8d565b005b3480156109a057600080fd5b506109a9611b13565b6040516109b69190614d83565b60405180910390f35b3480156109cb57600080fd5b506109e660048036038101906109e191906144bb565b611ba5565b005b3480156109f457600080fd5b50610a0f6004803603810190610a0a919061460b565b611bbb565b005b348015610a1d57600080fd5b50610a386004803603810190610a339190614378565b611c7f565b005b348015610a4657600080fd5b50610a616004803603810190610a5c9190614378565b611d90565b005b348015610a6f57600080fd5b50610a8a6004803603810190610a85919061453b565b611ea1565b005b348015610a9857600080fd5b50610ab36004803603810190610aae9190614438565b611f08565b005b348015610ac157600080fd5b50610aca611f6a565b005b610ae66004803603810190610ae1919061460b565b611ffe565b005b348015610af457600080fd5b50610b0f6004803603810190610b0a919061460b565b6120f1565b604051610b1c9190614d83565b60405180910390f35b348015610b3157600080fd5b50610b3a612198565b604051610b4791906151c5565b60405180910390f35b348015610b5c57600080fd5b50610b776004803603810190610b72919061453b565b61219e565b005b348015610b8557600080fd5b50610b8e612205565b604051610b9b91906151c5565b60405180910390f35b348015610bb057600080fd5b50610bb961220b565b604051610bc691906151c5565b60405180910390f35b348015610bdb57600080fd5b50610bf66004803603810190610bf191906143a5565b612211565b604051610c039190614d4d565b60405180910390f35b348015610c1857600080fd5b50610c216122a5565b005b348015610c2f57600080fd5b50610c386123bb565b604051610c459190614d4d565b60405180910390f35b348015610c5a57600080fd5b50610c756004803603810190610c709190614378565b6123ce565b005b348015610c8357600080fd5b50610c9e6004803603810190610c999190614378565b61246f565b005b348015610cac57600080fd5b50610cc76004803603810190610cc29190614378565b612567565b604051610cd491906151c5565b60405180910390f35b348015610ce957600080fd5b50610cf261257f565b005b348015610d0057600080fd5b50610d1b6004803603810190610d1691906145c2565b612875565b005b60155481565b601a6000610d2f61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d8057600080fd5b60008111610d8d57600080fd5b6000610d9761103f565b90506127108282610da891906152aa565b1115610de9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de090615085565b60405180910390fd5b610df38284612913565b505050565b6000610e03826129b4565b9050919050565b606060018054610e199061547f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e459061547f565b8015610e925780601f10610e6757610100808354040283529160200191610e92565b820191906000526020600020905b815481529060010190602001808311610e7557829003601f168201915b5050505050905090565b6000610ea782612a2e565b610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90615005565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f2c8261153c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f94906150a5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fbc61290b565b73ffffffffffffffffffffffffffffffffffffffff161480610feb5750610fea81610fe561290b565b612211565b5b61102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102190614f45565b60405180910390fd5b6110348383612a9a565b505050565b600e5481565b6000600980549050905090565b60135481565b61106361105d61290b565b82612b53565b6110a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109990615105565b60405180910390fd5b6110ad838383612c31565b505050565b6000600b60009054906101000a900460ff16905090565b601354421061110d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611104906151a5565b60405180910390fd5b61111a8282601554612e98565b611159576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115090614ec5565b60405180910390fd5b611164836000612f2c565b61116d57600080fd5b3483600e5461117c9190615331565b11156111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490615045565b60405180910390fd5b6111ce836111c961290b565b612913565b505050565b600d5481565b6000806111e584612a2e565b6111ee57600080fd5b6111f6611a64565b6103e884600d546112079190615331565b6112119190615300565b915091509250929050565b600061122783611687565b8210611268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125f90614de5565b60405180910390fd5b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601a60006112cd61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661131e57600080fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b600f5481565b61136b83838360405180602001604052806000815250611f08565b505050565b606581565b600b60019054906101000a900460ff1681565b600061139261103f565b82106113d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ca90615125565b60405180910390fd5b600982815481106113e7576113e661563c565b5b90600052602060002001549050919050565b61140161290b565b73ffffffffffffffffffffffffffffffffffffffff1661141f611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146c90615025565b60405180910390fd5b60004790508173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114c0573d6000803e3d6000fd5b505050565b601a60006114d161290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661152257600080fd5b806017908051906020019061153892919061410c565b5050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dc90614f85565b60405180910390fd5b80915050919050565b601880546115fb9061547f565b80601f01602080910402602001604051908101604052809291908181526020018280546116279061547f565b80156116745780601f1061164957610100808354040283529160200191611674565b820191906000526020600020905b81548152906001019060200180831161165757829003601f168201915b505050505081565b600481565b61271081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef90614f65565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61174761290b565b73ffffffffffffffffffffffffffffffffffffffff16611765611a64565b73ffffffffffffffffffffffffffffffffffffffff16146117bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b290615025565b60405180910390fd5b6117c56000613206565b565b601a60006117d361290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661182457600080fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b601a600061185c61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ad57600080fd5b6000601354146118bc57600080fd5b600060115414156118cc57600080fd5b6117ac426118da91906152aa565b6013819055506001600b60006101000a81548160ff0219169083151502179055506001600b60016101000a81548160ff021916908315150217905550565b60105481565b6013544210611962576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611959906151a5565b60405180910390fd5b61196f8282601654612e98565b6119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a590614ec5565b60405180910390fd5b6119b9836000612f2c565b6119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90614fe5565b60405180910390fd5b3483600f54611a079190615331565b1115611a48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3f90615045565b60405180910390fd5b611a5983611a5461290b565b612913565b505050565b60165481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a9561290b565b73ffffffffffffffffffffffffffffffffffffffff16611ab3611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611b09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0090615025565b60405180910390fd5b80600d8190555050565b606060028054611b229061547f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4e9061547f565b8015611b9b5780601f10611b7057610100808354040283529160200191611b9b565b820191906000526020600020905b815481529060010190602001808311611b7e57829003601f168201915b5050505050905090565b611bb7611bb061290b565b83836132ca565b5050565b611bc361290b565b73ffffffffffffffffffffffffffffffffffffffff16611be1611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2e90615025565b60405180910390fd5b60008111611c4457600080fd5b6000611c4e61103f565b90506127108282611c5f91906152aa565b1115611c6a57600080fd5b611c7b82611c7661290b565b612913565b5050565b611c8761290b565b73ffffffffffffffffffffffffffffffffffffffff16611ca5611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611cfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf290615025565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d3557600080fd5b6000601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b611d9861290b565b73ffffffffffffffffffffffffffffffffffffffff16611db6611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0390615025565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e4657600080fd5b6001601a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b601a6000611ead61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611efe57600080fd5b8060158190555050565b611f19611f1361290b565b83612b53565b611f58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4f90615105565b60405180910390fd5b611f6484848484613437565b50505050565b611f7261290b565b73ffffffffffffffffffffffffffffffffffffffff16611f90611a64565b73ffffffffffffffffffffffffffffffffffffffff1614611fe6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fdd90615025565b60405180910390fd5b600060115414611ff557600080fd5b43601281905550565b601354421015612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a906150c5565b60405180910390fd5b34816010546120529190615331565b1115612093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208a90615045565b60405180910390fd5b61209e816000612f2c565b6120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d490614f05565b60405180910390fd5b6120ee816120e961290b565b612913565b50565b60606120fc82612a2e565b61213b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213290615065565b60405180910390fd5b6000612145613493565b905060008151116121655760405180602001604052806000815250612190565b8061216f84613525565b604051602001612180929190614c99565b6040516020818303038152906040525b915050919050565b60115481565b601a60006121aa61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166121fb57600080fd5b8060168190555050565b60125481565b600c5481565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122ad61290b565b73ffffffffffffffffffffffffffffffffffffffff166122cb611a64565b73ffffffffffffffffffffffffffffffffffffffff1614612321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231890615025565b60405180910390fd5b60006011541461233057600080fd5b6000601254141561234057600080fd5b6127106012544060001c612354919061554f565b60118190555060ff6012544361236a919061538b565b111561239557612710600143612380919061538b565b4060001c61238e919061554f565b6011819055505b600060115414156123b957601160008154809291906123b3906154e2565b91905055505b565b600b60009054906101000a900460ff1681565b601a60006123da61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661242b57600080fd5b80601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61247761290b565b73ffffffffffffffffffffffffffffffffffffffff16612495611a64565b73ffffffffffffffffffffffffffffffffffffffff16146124eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e290615025565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561255b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255290614e65565b60405180910390fd5b61256481613206565b50565b60196020528060005260406000206000915090505481565b60011515600b60019054906101000a900460ff161515146125d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125cc906150e5565b60405180910390fd5b6000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161261d61290b565b6040518263ffffffff1660e01b81526004016126399190614cbd565b60206040518083038186803b15801561265157600080fd5b505afa158015612665573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126899190614638565b9050600081116126ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c590615165565b60405180910390fd5b60005b81811015612838576000601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5961272161290b565b846040518363ffffffff1660e01b815260040161273f929190614d24565b60206040518083038186803b15801561275757600080fd5b505afa15801561276b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278f9190614638565b905060001515601b600083815260200190815260200160002060009054906101000a900460ff161515146127f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ef90614f25565b60405180910390fd5b6001601b600083815260200190815260200160002060006101000a81548160ff021916908315150217905550508080612830906154e2565b9150506126d1565b50612844816001612f2c565b61284d57600080fd5b80600c5461285b91906152aa565b600c819055506128728161286d61290b565b612913565b50565b61287d61290b565b73ffffffffffffffffffffffffffffffffffffffff1661289b611a64565b73ffffffffffffffffffffffffffffffffffffffff16146128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e890615025565b60405180910390fd5b806018908051906020019061290792919061410c565b5050565b600033905090565b6019600061291f61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061296a906154e2565b9190505550600061297961103f565b905060005b838110156129ae5761299b83828461299691906152aa565b613686565b80806129a6906154e2565b91505061297e565b50505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a275750612a26826136a4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612b0d8361153c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612b5e82612a2e565b612b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9490614ee5565b60405180910390fd5b6000612ba88361153c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612c1757508373ffffffffffffffffffffffffffffffffffffffff16612bff84610e9c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612c285750612c278185612211565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612c518261153c565b73ffffffffffffffffffffffffffffffffffffffff1614612ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c9e90614e25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0e90614e85565b60405180910390fd5b612d22838383613846565b612d2d600082612a9a565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612d7d919061538b565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612dd491906152aa565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e93838383613856565b505050565b600080612ea361290b565b604051602001612eb39190614c7e565b604051602081830303815290604052805190602001209050612f17858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848361385b565b612f2057600080fd5b60019150509392505050565b600080612f3761103f565b90506000612f4b612f4661290b565b611687565b9050600060196000612f5b61290b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415613084576004861115612fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fdc90615185565b60405180910390fd5b60048682612ff391906152aa565b1115613034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302b90615145565b60405180910390fd5b6004868361304291906152aa565b1115613083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307a90614da5565b60405180910390fd5b5b61309461308f61290b565b613872565b156130d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cb90614fa5565b60405180910390fd5b600b60009054906101000a900460ff16613123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311a90614dc5565b60405180910390fd5b612710868461313291906152aa565b1115613173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161316a90615085565b60405180910390fd5b60011515600b60019054906101000a900460ff16151514156131f957600c5460656127106131a1919061538b565b6131ab91906152aa565b86846131b791906152aa565b11156131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef90615085565b60405180910390fd5b5b6001935050505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333090614ea5565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161342a9190614d4d565b60405180910390a3505050565b613442848484612c31565b61344e84848484613895565b61348d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348490614e05565b60405180910390fd5b50505050565b6060601780546134a29061547f565b80601f01602080910402602001604051908101604052809291908181526020018280546134ce9061547f565b801561351b5780601f106134f05761010080835404028352916020019161351b565b820191906000526020600020905b8154815290600101906020018083116134fe57829003601f168201915b5050505050905090565b6060600082141561356d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613681565b600082905060005b6000821461359f578080613588906154e2565b915050600a826135989190615300565b9150613575565b60008167ffffffffffffffff8111156135bb576135ba61566b565b5b6040519080825280601f01601f1916602001820160405280156135ed5781602001600182028036833780820191505090505b5090505b6000851461367a57600182613606919061538b565b9150600a85613615919061554f565b603061362191906152aa565b60f81b8183815181106136375761363661563c565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136739190615300565b94506135f1565b8093505050505b919050565b6136a0828260405180602001604052806000815250613a2c565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061376f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806137d757507f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061383f57507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b613851838383613a87565b505050565b505050565b6000826138688584613b9b565b1490509392505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006138b68473ffffffffffffffffffffffffffffffffffffffff16613872565b15613a1f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026138df61290b565b8786866040518563ffffffff1660e01b81526004016139019493929190614cd8565b602060405180830381600087803b15801561391b57600080fd5b505af192505050801561394c57506040513d601f19601f820116820180604052508101906139499190614595565b60015b6139cf573d806000811461397c576040519150601f19603f3d011682016040523d82523d6000602084013e613981565b606091505b506000815114156139c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139be90614e05565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a24565b600190505b949350505050565b613a368383613c10565b613a436000848484613895565b613a82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7990614e05565b60405180910390fd5b505050565b613a92838383613dea565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613ad557613ad081613def565b613b14565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613b1357613b128382613e38565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b5757613b5281613fa5565b613b96565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613b9557613b948282614076565b5b5b505050565b60008082905060005b8451811015613c05576000858281518110613bc257613bc161563c565b5b60200260200101519050808311613be457613bdd83826140f5565b9250613bf1565b613bee81846140f5565b92505b508080613bfd906154e2565b915050613ba4565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c7790614fc5565b60405180910390fd5b613c8981612a2e565b15613cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cc090614e45565b60405180910390fd5b613cd560008383613846565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613d2591906152aa565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613de660008383613856565b5050565b505050565b600980549050600a600083815260200190815260200160002081905550600981908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613e4584611687565b613e4f919061538b565b9050600060086000848152602001908152602001600020549050818114613f34576000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816008600083815260200190815260200160002081905550505b6008600084815260200190815260200160002060009055600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600980549050613fb9919061538b565b90506000600a6000848152602001908152602001600020549050600060098381548110613fe957613fe861563c565b5b90600052602060002001549050806009838154811061400b5761400a61563c565b5b906000526020600020018190555081600a600083815260200190815260200160002081905550600a600085815260200190815260200160002060009055600980548061405a5761405961560d565b5b6001900381819060005260206000200160009055905550505050565b600061408183611687565b905081600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806008600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b8280546141189061547f565b90600052602060002090601f01602090048101928261413a5760008555614181565b82601f1061415357805160ff1916838001178555614181565b82800160010185558215614181579182015b82811115614180578251825591602001919060010190614165565b5b50905061418e9190614192565b5090565b5b808211156141ab576000816000905550600101614193565b5090565b60006141c26141bd84615205565b6151e0565b9050828152602081018484840111156141de576141dd6156a9565b5b6141e984828561543d565b509392505050565b60006142046141ff84615236565b6151e0565b9050828152602081018484840111156142205761421f6156a9565b5b61422b84828561543d565b509392505050565b60008135905061424281615e0d565b92915050565b60008083601f84011261425e5761425d61569f565b5b8235905067ffffffffffffffff81111561427b5761427a61569a565b5b602083019150836020820283011115614297576142966156a4565b5b9250929050565b6000813590506142ad81615e24565b92915050565b6000813590506142c281615e3b565b92915050565b6000813590506142d781615e52565b92915050565b6000815190506142ec81615e52565b92915050565b600082601f8301126143075761430661569f565b5b81356143178482602086016141af565b91505092915050565b600082601f8301126143355761433461569f565b5b81356143458482602086016141f1565b91505092915050565b60008135905061435d81615e69565b92915050565b60008151905061437281615e69565b92915050565b60006020828403121561438e5761438d6156b3565b5b600061439c84828501614233565b91505092915050565b600080604083850312156143bc576143bb6156b3565b5b60006143ca85828601614233565b92505060206143db85828601614233565b9150509250929050565b6000806000606084860312156143fe576143fd6156b3565b5b600061440c86828701614233565b935050602061441d86828701614233565b925050604061442e8682870161434e565b9150509250925092565b60008060008060808587031215614452576144516156b3565b5b600061446087828801614233565b945050602061447187828801614233565b93505060406144828782880161434e565b925050606085013567ffffffffffffffff8111156144a3576144a26156ae565b5b6144af878288016142f2565b91505092959194509250565b600080604083850312156144d2576144d16156b3565b5b60006144e085828601614233565b92505060206144f18582860161429e565b9150509250929050565b60008060408385031215614512576145116156b3565b5b600061452085828601614233565b92505060206145318582860161434e565b9150509250929050565b600060208284031215614551576145506156b3565b5b600061455f848285016142b3565b91505092915050565b60006020828403121561457e5761457d6156b3565b5b600061458c848285016142c8565b91505092915050565b6000602082840312156145ab576145aa6156b3565b5b60006145b9848285016142dd565b91505092915050565b6000602082840312156145d8576145d76156b3565b5b600082013567ffffffffffffffff8111156145f6576145f56156ae565b5b61460284828501614320565b91505092915050565b600060208284031215614621576146206156b3565b5b600061462f8482850161434e565b91505092915050565b60006020828403121561464e5761464d6156b3565b5b600061465c84828501614363565b91505092915050565b60008060006040848603121561467e5761467d6156b3565b5b600061468c8682870161434e565b935050602084013567ffffffffffffffff8111156146ad576146ac6156ae565b5b6146b986828701614248565b92509250509250925092565b600080604083850312156146dc576146db6156b3565b5b60006146ea8582860161434e565b92505060206146fb8582860161434e565b9150509250929050565b61470e816153bf565b82525050565b614725614720826153bf565b61552b565b82525050565b614734816153d1565b82525050565b614743816153dd565b82525050565b600061475482615267565b61475e818561527d565b935061476e81856020860161544c565b614777816156b8565b840191505092915050565b600061478d82615272565b614797818561528e565b93506147a781856020860161544c565b6147b0816156b8565b840191505092915050565b60006147c682615272565b6147d0818561529f565b93506147e081856020860161544c565b80840191505092915050565b60006147f960018361528e565b9150614804826156d6565b602082019050919050565b600061481c60078361528e565b9150614827826156ff565b602082019050919050565b600061483f602b8361528e565b915061484a82615728565b604082019050919050565b600061486260328361528e565b915061486d82615777565b604082019050919050565b600061488560258361528e565b9150614890826157c6565b604082019050919050565b60006148a8601c8361528e565b91506148b382615815565b602082019050919050565b60006148cb60078361528e565b91506148d68261583e565b602082019050919050565b60006148ee60248361528e565b91506148f982615867565b604082019050919050565b600061491160198361528e565b915061491c826158b6565b602082019050919050565b600061493460098361528e565b915061493f826158df565b602082019050919050565b6000614957602c8361528e565b915061496282615908565b604082019050919050565b600061497a60068361528e565b915061498582615957565b602082019050919050565b600061499d60078361528e565b91506149a882615980565b602082019050919050565b60006149c060388361528e565b91506149cb826159a9565b604082019050919050565b60006149e3602a8361528e565b91506149ee826159f8565b604082019050919050565b6000614a0660298361528e565b9150614a1182615a47565b604082019050919050565b6000614a2960088361528e565b9150614a3482615a96565b602082019050919050565b6000614a4c60208361528e565b9150614a5782615abf565b602082019050919050565b6000614a6f60068361528e565b9150614a7a82615ae8565b602082019050919050565b6000614a92602c8361528e565b9150614a9d82615b11565b604082019050919050565b6000614ab560208361528e565b9150614ac082615b60565b602082019050919050565b6000614ad860058361528e565b9150614ae382615b89565b602082019050919050565b6000614afb602f8361528e565b9150614b0682615bb2565b604082019050919050565b6000614b1e60038361528e565b9150614b2982615c01565b602082019050919050565b6000614b4160218361528e565b9150614b4c82615c2a565b604082019050919050565b6000614b6460078361528e565b9150614b6f82615c79565b602082019050919050565b6000614b8760058361528e565b9150614b9282615ca2565b602082019050919050565b6000614baa60318361528e565b9150614bb582615ccb565b604082019050919050565b6000614bcd602c8361528e565b9150614bd882615d1a565b604082019050919050565b6000614bf060028361528e565b9150614bfb82615d69565b602082019050919050565b6000614c1360078361528e565b9150614c1e82615d92565b602082019050919050565b6000614c3660048361528e565b9150614c4182615dbb565b602082019050919050565b6000614c5960078361528e565b9150614c6482615de4565b602082019050919050565b614c7881615433565b82525050565b6000614c8a8284614714565b60148201915081905092915050565b6000614ca582856147bb565b9150614cb182846147bb565b91508190509392505050565b6000602082019050614cd26000830184614705565b92915050565b6000608082019050614ced6000830187614705565b614cfa6020830186614705565b614d076040830185614c6f565b8181036060830152614d198184614749565b905095945050505050565b6000604082019050614d396000830185614705565b614d466020830184614c6f565b9392505050565b6000602082019050614d62600083018461472b565b92915050565b6000602082019050614d7d600083018461473a565b92915050565b60006020820190508181036000830152614d9d8184614782565b905092915050565b60006020820190508181036000830152614dbe816147ec565b9050919050565b60006020820190508181036000830152614dde8161480f565b9050919050565b60006020820190508181036000830152614dfe81614832565b9050919050565b60006020820190508181036000830152614e1e81614855565b9050919050565b60006020820190508181036000830152614e3e81614878565b9050919050565b60006020820190508181036000830152614e5e8161489b565b9050919050565b60006020820190508181036000830152614e7e816148be565b9050919050565b60006020820190508181036000830152614e9e816148e1565b9050919050565b60006020820190508181036000830152614ebe81614904565b9050919050565b60006020820190508181036000830152614ede81614927565b9050919050565b60006020820190508181036000830152614efe8161494a565b9050919050565b60006020820190508181036000830152614f1e8161496d565b9050919050565b60006020820190508181036000830152614f3e81614990565b9050919050565b60006020820190508181036000830152614f5e816149b3565b9050919050565b60006020820190508181036000830152614f7e816149d6565b9050919050565b60006020820190508181036000830152614f9e816149f9565b9050919050565b60006020820190508181036000830152614fbe81614a1c565b9050919050565b60006020820190508181036000830152614fde81614a3f565b9050919050565b60006020820190508181036000830152614ffe81614a62565b9050919050565b6000602082019050818103600083015261501e81614a85565b9050919050565b6000602082019050818103600083015261503e81614aa8565b9050919050565b6000602082019050818103600083015261505e81614acb565b9050919050565b6000602082019050818103600083015261507e81614aee565b9050919050565b6000602082019050818103600083015261509e81614b11565b9050919050565b600060208201905081810360008301526150be81614b34565b9050919050565b600060208201905081810360008301526150de81614b57565b9050919050565b600060208201905081810360008301526150fe81614b7a565b9050919050565b6000602082019050818103600083015261511e81614b9d565b9050919050565b6000602082019050818103600083015261513e81614bc0565b9050919050565b6000602082019050818103600083015261515e81614be3565b9050919050565b6000602082019050818103600083015261517e81614c06565b9050919050565b6000602082019050818103600083015261519e81614c29565b9050919050565b600060208201905081810360008301526151be81614c4c565b9050919050565b60006020820190506151da6000830184614c6f565b92915050565b60006151ea6151fb565b90506151f682826154b1565b919050565b6000604051905090565b600067ffffffffffffffff8211156152205761521f61566b565b5b615229826156b8565b9050602081019050919050565b600067ffffffffffffffff8211156152515761525061566b565b5b61525a826156b8565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006152b582615433565b91506152c083615433565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152f5576152f4615580565b5b828201905092915050565b600061530b82615433565b915061531683615433565b925082615326576153256155af565b5b828204905092915050565b600061533c82615433565b915061534783615433565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153805761537f615580565b5b828202905092915050565b600061539682615433565b91506153a183615433565b9250828210156153b4576153b3615580565b5b828203905092915050565b60006153ca82615413565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561546a57808201518184015260208101905061544f565b83811115615479576000848401525b50505050565b6000600282049050600182168061549757607f821691505b602082108114156154ab576154aa6155de565b5b50919050565b6154ba826156b8565b810181811067ffffffffffffffff821117156154d9576154d861566b565b5b80604052505050565b60006154ed82615433565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155205761551f615580565b5b600182019050919050565b60006155368261553d565b9050919050565b6000615548826156c9565b9050919050565b600061555a82615433565b915061556583615433565b925082615575576155746155af565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f636c6f7365642100000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6164647265737300000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f77686974656c6973740000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f636c6f7365640000000000000000000000000000000000000000000000000000600082015250565b7f636c61696d656400000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f636f6e7472616374000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f6661696c65640000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4574686572000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6d61780000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f6e6f742079657400000000000000000000000000000000000000000000000000600082015250565b7f636c61696d000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3421000000000000000000000000000000000000000000000000000000000000600082015250565b7f62616c616e636500000000000000000000000000000000000000000000000000600082015250565b7f6d61782100000000000000000000000000000000000000000000000000000000600082015250565b7f70726573616c6500000000000000000000000000000000000000000000000000600082015250565b615e16816153bf565b8114615e2157600080fd5b50565b615e2d816153d1565b8114615e3857600080fd5b50565b615e44816153dd565b8114615e4f57600080fd5b50565b615e5b816153e7565b8114615e6657600080fd5b50565b615e7281615433565b8114615e7d57600080fd5b5056fea26469706673582212201184bd16d6ece640908ddebbcb31f8f257da93c946d15119e19a78360e26eb2864736f6c63430008070033

Deployed Bytecode Sourcemap

392:8850:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1061:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8578:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4059:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2708:98:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4220:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3758:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;783:35:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1536:111:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;999:29:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4947:330:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4650:91:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7436:380;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;748:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3242:284;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1212:253:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3533:118:12;;;;;;;;;;;;;:::i;:::-;;825:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5343:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;560:40:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;528:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1719:230:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8892:159:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4242:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2411:235:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1301:24:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;694:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;640:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2149:205:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1608:101:13;;;;;;;;;;;;;:::i;:::-;;3657:100:12;;;;;;;;;;;;;:::i;:::-;;5030:294;;;;;;;;;;;;;:::i;:::-;;868:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7850:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1164:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;976:85:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3764:95:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2870:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4504:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6478:236:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1958:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1794:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2996:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5588:320:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2113:146:12;;;;;;;;;;;;;:::i;:::-;;8272:296;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3039:329:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;914:33:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3119:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;954:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;607:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4723:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2265:586:12;;;;;;;;;;;;;:::i;:::-;;489:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2859:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9058:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1332:39;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6721:689;;;;;;;;;;;;;:::i;:::-;;4528:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1061:92;;;;:::o;8578:308::-;8675:7;:21;8683:12;:10;:12::i;:::-;8675:21;;;;;;;;;;;;;;;;;;;;;;;;;8667:30;;;;;;8731:1;8715:14;:17;8707:26;;;;;;8743:10;8756:13;:11;:13::i;:::-;8743:26;;677:5;8792:14;8787:2;:19;;;;:::i;:::-;:32;;8779:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;8847:32;8855:14;8871:7;8847;:32::i;:::-;8648:238;8578:308;;:::o;4059:177::-;4162:4;4189:36;4213:11;4189:23;:36::i;:::-;4182:43;;4059:177;;;:::o;2708:98:1:-;2762:13;2794:5;2787:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2708:98;:::o;4220:217::-;4296:7;4323:16;4331:7;4323;:16::i;:::-;4315:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4406:15;:24;4422:7;4406:24;;;;;;;;;;;;;;;;;;;;;4399:31;;4220:217;;;:::o;3758:401::-;3838:13;3854:23;3869:7;3854:14;:23::i;:::-;3838:39;;3901:5;3895:11;;:2;:11;;;;3887:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3992:5;3976:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;4001:37;4018:5;4025:12;:10;:12::i;:::-;4001:16;:37::i;:::-;3976:62;3955:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;4131:21;4140:2;4144:7;4131:8;:21::i;:::-;3828:331;3758:401;;:::o;783:35:12:-;;;;:::o;1536:111:2:-;1597:7;1623:10;:17;;;;1616:24;;1536:111;:::o;999:29:12:-;;;;:::o;4947:330:1:-;5136:41;5155:12;:10;:12::i;:::-;5169:7;5136:18;:41::i;:::-;5128:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5242:28;5252:4;5258:2;5262:7;5242:9;:28::i;:::-;4947:330;;;:::o;4650:91:12:-;4695:4;4722:12;;;;;;;;;;;4715:19;;4650:91;:::o;7436:380::-;7559:10;;7541:15;:28;7533:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;7602:30;7615:6;;7623:8;;7602:12;:30::i;:::-;7594:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;7663:30;7676:14;7691:1;7663:12;:30::i;:::-;7655:39;;;;;;7742:9;7723:14;7712:7;;:26;;;;:::i;:::-;:39;;7704:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;7772:37;7780:14;7796:12;:10;:12::i;:::-;7772:7;:37::i;:::-;7436:380;;;:::o;748:28::-;;;;:::o;3242:284::-;3365:16;3391:21;3436:17;3444:8;3436:7;:17::i;:::-;3428:26;;;;;;3472:7;:5;:7::i;:::-;3512:4;3499:10;3489:7;;:20;;;;:::i;:::-;:27;;;;:::i;:::-;3464:54;;;;3242:284;;;;;:::o;1212:253:2:-;1309:7;1344:23;1361:5;1344:16;:23::i;:::-;1336:5;:31;1328:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1432:12;:19;1445:5;1432:19;;;;;;;;;;;;;;;:26;1452:5;1432:26;;;;;;;;;;;;1425:33;;1212:253;;;;:::o;3533:118:12:-;3584:7;:21;3592:12;:10;:12::i;:::-;3584:21;;;;;;;;;;;;;;;;;;;;;;;;;3576:30;;;;;;3632:12;;;;;;;;;;;3631:13;3616:12;;:28;;;;;;;;;;;;;;;;;;3533:118::o;825:36::-;;;;:::o;5343:179:1:-;5476:39;5493:4;5499:2;5503:7;5476:39;;;;;;;;;;;;:16;:39::i;:::-;5343:179;;;:::o;560:40:12:-;597:3;560:40;:::o;528:25::-;;;;;;;;;;;;;:::o;1719:230:2:-;1794:7;1829:30;:28;:30::i;:::-;1821:5;:38;1813:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1925:10;1936:5;1925:17;;;;;;;;:::i;:::-;;;;;;;;;;1918:24;;1719:230;;;:::o;8892:159:12:-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8959:12:12::1;8974:21;8959:36;;9013:12;9005:30;;:39;9036:7;9005:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;8949:102;8892:159:::0;:::o;4242:151::-;4319:7;:21;4327:12;:10;:12::i;:::-;4319:21;;;;;;;;;;;;;;;;;;;;;;;;;4311:30;;;;;;4374:8;4355:16;:27;;;;;;;;;;;;:::i;:::-;;4242:151;:::o;2411:235:1:-;2483:7;2502:13;2518:7;:16;2526:7;2518:16;;;;;;;;;;;;;;;;;;;;;2502:32;;2569:1;2552:19;;:5;:19;;;;2544:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2634:5;2627:12;;;2411:235;;;:::o;1301:24:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;694:43::-;736:1;694:43;:::o;640:42::-;677:5;640:42;:::o;2149:205:1:-;2221:7;2265:1;2248:19;;:5;:19;;;;2240:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2331:9;:16;2341:5;2331:16;;;;;;;;;;;;;;;;2324:23;;2149:205;;;:::o;1608:101:13:-;1199:12;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1672:30:::1;1699:1;1672:18;:30::i;:::-;1608:101::o:0;3657:100:12:-;3704:7;:21;3712:12;:10;:12::i;:::-;3704:21;;;;;;;;;;;;;;;;;;;;;;;;;3696:30;;;;;;3745:5;;;;;;;;;;;3744:6;3736:5;;:14;;;;;;;;;;;;;;;;;;3657:100::o;5030:294::-;5078:7;:21;5086:12;:10;:12::i;:::-;5078:21;;;;;;;;;;;;;;;;;;;;;;;;;5070:30;;;;;;5132:1;5118:10;;:15;5110:25;;;;;;5170:1;5153:13;;:18;;5145:27;;;;;;5215:6;5196:15;:26;;;;:::i;:::-;5183:10;:39;;;;5282:4;5267:12;;:19;;;;;;;;;;;;;;;;;;5304:4;5296:5;;:12;;;;;;;;;;;;;;;;;;5030:294::o;868:39::-;;;;:::o;7850:397::-;7979:10;;7961:15;:28;7953:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;8022:31;8035:6;;8043:8;;8022:12;:31::i;:::-;8014:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;8084:30;8097:14;8112:1;8084:12;:30::i;:::-;8076:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;8173:9;8154:14;8143:7;;:26;;;;:::i;:::-;:39;;8135:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;8203:37;8211:14;8227:12;:10;:12::i;:::-;8203:7;:37::i;:::-;7850:397;;;:::o;1164:92::-;;;;:::o;976:85:13:-;1022:7;1048:6;;;;;;;;;;;1041:13;;976:85;:::o;3764:95:12:-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3841:10:12::1;3831:7;:20;;;;3764:95:::0;:::o;2870:102:1:-;2926:13;2958:7;2951:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2870:102;:::o;4504:153::-;4598:52;4617:12;:10;:12::i;:::-;4631:8;4641;4598:18;:52::i;:::-;4504:153;;:::o;6478:236:12:-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6564:1:12::1;6555:7;:10;6547:19;;;::::0;::::1;;6576:10;6589:13;:11;:13::i;:::-;6576:26;;677:5;6625:7;6620:2;:12;;;;:::i;:::-;:25;;6612:34;;;::::0;::::1;;6666:29;6674:7;6682:12;:10;:12::i;:::-;6666:7;:29::i;:::-;6528:186;6478:236:::0;:::o;1958:149::-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2053:1:12::1;2033:22;;:8;:22;;;;2025:31;;;::::0;::::1;;2086:5;2066:7;:17;2074:8;2066:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;1958:149:::0;:::o;1794:154::-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1896:1:12::1;1876:22;;:8;:22;;;;1868:31;;;::::0;::::1;;1929:4;1909:7;:17;1917:8;1909:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;1794:154:::0;:::o;2996:117::-;3059:7;:21;3067:12;:10;:12::i;:::-;3059:21;;;;;;;;;;;;;;;;;;;;;;;;;3051:30;;;;;;3101:5;3090:8;:16;;;;2996:117;:::o;5588:320:1:-;5757:41;5776:12;:10;:12::i;:::-;5790:7;5757:18;:41::i;:::-;5749:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5862:39;5876:4;5882:2;5886:7;5895:5;5862:13;:39::i;:::-;5588:320;;;;:::o;2113:146:12:-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2198:1:12::1;2181:13;;:18;2173:27;;;::::0;::::1;;2240:12;2219:18;:33;;;;2113:146::o:0;8272:296::-;8360:10;;8341:15;:29;;8333:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;8426:9;8414:7;8400:10;;:22;;;;:::i;:::-;:35;;8392:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;8463:23;8476:7;8484:1;8463:12;:23::i;:::-;8455:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;8526:30;8534:7;8543:12;:10;:12::i;:::-;8526:7;:30::i;:::-;8272:296;:::o;3039:329:1:-;3112:13;3145:16;3153:7;3145;:16::i;:::-;3137:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3224:21;3248:10;:8;:10::i;:::-;3224:34;;3299:1;3281:7;3275:21;:25;:86;;;;;;;;;;;;;;;;;3327:7;3336:18;:7;:16;:18::i;:::-;3310:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3275:86;3268:93;;;3039:329;;;:::o;914:33:12:-;;;;:::o;3119:117::-;3182:7;:21;3190:12;:10;:12::i;:::-;3182:21;;;;;;;;;;;;;;;;;;;;;;;;;3174:30;;;;;;3224:5;3213:8;:16;;;;3119:117;:::o;954:38::-;;;;:::o;607:26::-;;;;:::o;4723:162:1:-;4820:4;4843:18;:25;4862:5;4843:25;;;;;;;;;;;;;;;:35;4869:8;4843:35;;;;;;;;;;;;;;;;;;;;;;;;;4836:42;;4723:162;;;;:::o;2265:586:12:-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2345:1:12::1;2328:13;;:18;2320:27;;;::::0;::::1;;2387:1;2365:18;;:23;;2357:32;;;::::0;::::1;;677:5;2439:18;;2429:29;2424:35;;:49;;;;:::i;:::-;2408:13;:65;;;;2643:3;2622:18;;2607:12;:33;;;;:::i;:::-;:39;2603:133;;;677:5;2708:1;2693:12;:16;;;;:::i;:::-;2683:27;2678:33;;:47;;;;:::i;:::-;2662:13;:63;;;;2603:133;2802:1;2785:13;;:18;2781:64;;;2819:13;;:15;;;;;;;;;:::i;:::-;;;;;;2781:64;2265:586::o:0;489:32::-;;;;;;;;;;;;;:::o;2859:131::-;2928:7;:21;2936:12;:10;:12::i;:::-;2928:21;;;;;;;;;;;;;;;;;;;;;;;;;2920:30;;;;;;2974:9;2960:11;;:23;;;;;;;;;;;;;;;;;;2859:131;:::o;9058:177::-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9167:1:12::1;9147:22;;:8;:22;;;;9139:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;9199:28;9218:8;9199:18;:28::i;:::-;9058:177:::0;:::o;1332:39::-;;;;;;;;;;;;;;;;;:::o;6721:689::-;6789:4;6780:13;;:5;;;;;;;;;;;:13;;;6772:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;6814:17;6839:11;;;;;;;;;;;6835:26;;;6862:12;:10;:12::i;:::-;6835:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6814:61;;6940:1;6925:12;:16;6917:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;6968:6;6963:283;6984:12;6980:1;:16;6963:283;;;7045:17;7069:11;;;;;;;;;;;7065:36;;;7102:12;:10;:12::i;:::-;7115:1;7065:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7045:72;;7170:5;7139:36;;:13;:27;7153:12;7139:27;;;;;;;;;;;;;;;;;;;;;:36;;;7131:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;7231:4;7201:13;:27;7215:12;7201:27;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;7002:244;6998:3;;;;;:::i;:::-;;;;6963:283;;;;7273:28;7286:12;7299:1;7273:12;:28::i;:::-;7265:37;;;;;;7333:12;7323:7;;:22;;;;:::i;:::-;7313:7;:32;;;;7356:35;7364:12;7378;:10;:12::i;:::-;7356:7;:35::i;:::-;6752:658;6721:689::o;4528:114::-;1199:12:13;:10;:12::i;:::-;1188:23;;:7;:5;:7::i;:::-;:23;;;1180:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4621:10:12::1;4608;:23;;;;;;;;;;;;:::i;:::-;;4528:114:::0;:::o;640:96:10:-;693:7;719:10;712:17;;640:96;:::o;6147:324:12:-;6232:7;:21;6240:12;:10;:12::i;:::-;6232:21;;;;;;;;;;;;;;;;:23;;;;;;;;;:::i;:::-;;;;;;6273:9;6285:13;:11;:13::i;:::-;6273:25;;6318:9;6313:130;6337:14;6333:1;:18;6313:130;;;6380:25;6390:7;6403:1;6399;:5;;;;:::i;:::-;6380:9;:25::i;:::-;6353:3;;;;;:::i;:::-;;;;6313:130;;;;6209:262;6147:324;;:::o;911:222:2:-;1013:4;1051:35;1036:50;;;:11;:50;;;;:90;;;;1090:36;1114:11;1090:23;:36::i;:::-;1036:90;1029:97;;911:222;;;:::o;7380:125:1:-;7445:4;7496:1;7468:30;;:7;:16;7476:7;7468:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7461:37;;7380:125;;;:::o;11389:171::-;11490:2;11463:15;:24;11479:7;11463:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11545:7;11541:2;11507:46;;11516:23;11531:7;11516:14;:23::i;:::-;11507:46;;;;;;;;;;;;11389:171;;:::o;7663:344::-;7756:4;7780:16;7788:7;7780;:16::i;:::-;7772:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7855:13;7871:23;7886:7;7871:14;:23::i;:::-;7855:39;;7923:5;7912:16;;:7;:16;;;:51;;;;7956:7;7932:31;;:20;7944:7;7932:11;:20::i;:::-;:31;;;7912:51;:87;;;;7967:32;7984:5;7991:7;7967:16;:32::i;:::-;7912:87;7904:96;;;7663:344;;;;:::o;10673:605::-;10827:4;10800:31;;:23;10815:7;10800:14;:23::i;:::-;:31;;;10792:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10905:1;10891:16;;:2;:16;;;;10883:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10959:39;10980:4;10986:2;10990:7;10959:20;:39::i;:::-;11060:29;11077:1;11081:7;11060:8;:29::i;:::-;11119:1;11100:9;:15;11110:4;11100:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;11147:1;11130:9;:13;11140:2;11130:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;11177:2;11158:7;:16;11166:7;11158:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;11214:7;11210:2;11195:27;;11204:4;11195:27;;;;;;;;;;;;11233:38;11253:4;11259:2;11263:7;11233:19;:38::i;:::-;10673:605;;;:::o;4754:269:12:-;4851:4;4867:12;4909;:10;:12::i;:::-;4892:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;4882:41;;;;;;4867:56;;4942:51;4961:12;;4942:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4975:11;4988:4;4942:18;:51::i;:::-;4934:60;;;;;;5012:4;5005:11;;;4754:269;;;;;:::o;5336:803::-;5412:4;5437:10;5450:13;:11;:13::i;:::-;5437:26;;5473:17;5493:23;5503:12;:10;:12::i;:::-;5493:9;:23::i;:::-;5473:43;;5526:19;5548:7;:21;5556:12;:10;:12::i;:::-;5548:21;;;;;;;;;;;;;;;;5526:43;;5593:1;5583:6;:11;5580:232;;;736:1;5617:12;:31;;5609:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;736:1;5692:12;5678:11;:26;;;;:::i;:::-;:45;;5670:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;736:1;5763:12;5751:9;:24;;;;:::i;:::-;:43;;5743:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;5580:232;5838:32;5857:12;:10;:12::i;:::-;5838:18;:32::i;:::-;5837:33;5829:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;5900:12;;;;;;;;;;;5892:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;677:5;5947:12;5942:2;:17;;;;:::i;:::-;:30;;5934:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;6011:4;6002:13;;:5;;;;;;;;;;;:13;;;5999:112;;;6084:7;;597:3;677:5;6059:22;;;;:::i;:::-;:32;;;;:::i;:::-;6043:12;6038:2;:17;;;;:::i;:::-;:53;;6030:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;5999:112;6128:4;6121:11;;;;;5336:803;;;;:::o;2210:187:13:-;2283:16;2302:6;;;;;;;;;;;2283:25;;2327:8;2318:6;;:17;;;;;;;;;;;;;;;;;;2381:8;2350:40;;2371:8;2350:40;;;;;;;;;;;;2273:124;2210:187;:::o;11695:307:1:-;11845:8;11836:17;;:5;:17;;;;11828:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11931:8;11893:18;:25;11912:5;11893:25;;;;;;;;;;;;;;;:35;11919:8;11893:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11976:8;11954:41;;11969:5;11954:41;;;11986:8;11954:41;;;;;;:::i;:::-;;;;;;;;11695:307;;;:::o;6770:::-;6921:28;6931:4;6937:2;6941:7;6921:9;:28::i;:::-;6967:48;6990:4;6996:2;7000:7;7009:5;6967:22;:48::i;:::-;6959:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6770:307;;;;:::o;4399:123:12:-;4459:13;4495:16;4488:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4399:123;:::o;328:703:14:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;8337:108:1:-;8412:26;8422:2;8426:7;8412:26;;;;;;;;;;;;:9;:26::i;:::-;8337:108;;:::o;1532:361::-;1634:4;1684:25;1669:40;;;:11;:40;;;;:104;;;;1740:33;1725:48;;;:11;:48;;;;1669:104;:161;;;;1804:26;1789:41;;;:11;:41;;;;1669:161;:217;;;;1861:25;1846:40;;;:11;:40;;;;1669:217;1650:236;;1532:361;;;:::o;3866:187:12:-;3997:45;4024:4;4030:2;4034:7;3997:26;:45::i;:::-;3866:187;;;:::o;14397:121:1:-;;;;:::o;1139:184:11:-;1260:4;1312;1283:25;1296:5;1303:4;1283:12;:25::i;:::-;:33;1276:40;;1139:184;;;;;:::o;1160:320:9:-;1220:4;1472:1;1450:7;:19;;;:23;1443:30;;1160:320;;;:::o;12555:778:1:-;12705:4;12725:15;:2;:13;;;:15::i;:::-;12721:606;;;12776:2;12760:36;;;12797:12;:10;:12::i;:::-;12811:4;12817:7;12826:5;12760:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12756:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13016:1;12999:6;:13;:18;12995:266;;;13041:60;;;;;;;;;;:::i;:::-;;;;;;;;12995:266;13213:6;13207:13;13198:6;13194:2;13190:15;13183:38;12756:519;12892:41;;;12882:51;;;:6;:51;;;;12875:58;;;;;12721:606;13312:4;13305:11;;12555:778;;;;;;;:::o;8666:311::-;8791:18;8797:2;8801:7;8791:5;:18::i;:::-;8840:54;8871:1;8875:2;8879:7;8888:5;8840:22;:54::i;:::-;8819:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8666:311;;;:::o;2545:572:2:-;2684:45;2711:4;2717:2;2721:7;2684:26;:45::i;:::-;2760:1;2744:18;;:4;:18;;;2740:183;;;2778:40;2810:7;2778:31;:40::i;:::-;2740:183;;;2847:2;2839:10;;:4;:10;;;2835:88;;2865:47;2898:4;2904:7;2865:32;:47::i;:::-;2835:88;2740:183;2950:1;2936:16;;:2;:16;;;2932:179;;;2968:45;3005:7;2968:36;:45::i;:::-;2932:179;;;3040:4;3034:10;;:2;:10;;;3030:81;;3060:40;3088:2;3092:7;3060:27;:40::i;:::-;3030:81;2932:179;2545:572;;;:::o;1674:662:11:-;1757:7;1776:20;1799:4;1776:27;;1818:9;1813:488;1837:5;:12;1833:1;:16;1813:488;;;1870:20;1893:5;1899:1;1893:8;;;;;;;;:::i;:::-;;;;;;;;1870:31;;1935:12;1919;:28;1915:376;;2060:42;2075:12;2089;2060:14;:42::i;:::-;2045:57;;1915:376;;;2234:42;2249:12;2263;2234:14;:42::i;:::-;2219:57;;1915:376;1856:445;1851:3;;;;;:::i;:::-;;;;1813:488;;;;2317:12;2310:19;;;1674:662;;;;:::o;9299:427:1:-;9392:1;9378:16;;:2;:16;;;;9370:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9450:16;9458:7;9450;:16::i;:::-;9449:17;9441:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9510:45;9539:1;9543:2;9547:7;9510:20;:45::i;:::-;9583:1;9566:9;:13;9576:2;9566:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9613:2;9594:7;:16;9602:7;9594:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9656:7;9652:2;9631:33;;9648:1;9631:33;;;;;;;;;;;;9675:44;9703:1;9707:2;9711:7;9675:19;:44::i;:::-;9299:427;;:::o;13895:122::-;;;;:::o;3823:161:2:-;3926:10;:17;;;;3899:15;:24;3915:7;3899:24;;;;;;;;;;;:44;;;;3953:10;3969:7;3953:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3823:161;:::o;4601:970::-;4863:22;4913:1;4888:22;4905:4;4888:16;:22::i;:::-;:26;;;;:::i;:::-;4863:51;;4924:18;4945:17;:26;4963:7;4945:26;;;;;;;;;;;;4924:47;;5089:14;5075:10;:28;5071:323;;5119:19;5141:12;:18;5154:4;5141:18;;;;;;;;;;;;;;;:34;5160:14;5141:34;;;;;;;;;;;;5119:56;;5223:11;5190:12;:18;5203:4;5190:18;;;;;;;;;;;;;;;:30;5209:10;5190:30;;;;;;;;;;;:44;;;;5339:10;5306:17;:30;5324:11;5306:30;;;;;;;;;;;:43;;;;5105:289;5071:323;5487:17;:26;5505:7;5487:26;;;;;;;;;;;5480:33;;;5530:12;:18;5543:4;5530:18;;;;;;;;;;;;;;;:34;5549:14;5530:34;;;;;;;;;;;5523:41;;;4682:889;;4601:970;;:::o;5859:1061::-;6108:22;6153:1;6133:10;:17;;;;:21;;;;:::i;:::-;6108:46;;6164:18;6185:15;:24;6201:7;6185:24;;;;;;;;;;;;6164:45;;6531:19;6553:10;6564:14;6553:26;;;;;;;;:::i;:::-;;;;;;;;;;6531:48;;6615:11;6590:10;6601;6590:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6725:10;6694:15;:28;6710:11;6694:28;;;;;;;;;;;:41;;;;6863:15;:24;6879:7;6863:24;;;;;;;;;;;6856:31;;;6897:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5930:990;;;5859:1061;:::o;3411:217::-;3495:14;3512:20;3529:2;3512:16;:20::i;:::-;3495:37;;3569:7;3542:12;:16;3555:2;3542:16;;;;;;;;;;;;;;;:24;3559:6;3542:24;;;;;;;;;;;:34;;;;3615:6;3586:17;:26;3604:7;3586:26;;;;;;;;;;;:35;;;;3485:143;3411:217;;:::o;2342:218:11:-;2410:13;2471:1;2465:4;2458:15;2499:1;2493:4;2486:15;2539:4;2533;2523:21;2514:30;;2342:218;;;;:::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:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1716:139;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1861:137;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2004:141;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:122;;2276:79;;:::i;:::-;2235:122;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;2164:338;;;;:::o;2522:340::-;2578:5;2627:3;2620:4;2612:6;2608:17;2604:27;2594:122;;2635:79;;:::i;:::-;2594:122;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2584:278;2522:340;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2868:139;;;;:::o;3013:143::-;3070:5;3101:6;3095:13;3086:22;;3117:33;3144:5;3117:33;:::i;:::-;3013:143;;;;:::o;3162:329::-;3221:6;3270:2;3258:9;3249:7;3245:23;3241:32;3238:119;;;3276:79;;:::i;:::-;3238:119;3396:1;3421:53;3466:7;3457:6;3446:9;3442:22;3421:53;:::i;:::-;3411:63;;3367:117;3162:329;;;;:::o;3497:474::-;3565:6;3573;3622:2;3610:9;3601:7;3597:23;3593:32;3590:119;;;3628:79;;:::i;:::-;3590:119;3748:1;3773:53;3818:7;3809:6;3798:9;3794:22;3773:53;:::i;:::-;3763:63;;3719:117;3875:2;3901:53;3946:7;3937:6;3926:9;3922:22;3901:53;:::i;:::-;3891:63;;3846:118;3497:474;;;;;:::o;3977:619::-;4054:6;4062;4070;4119:2;4107:9;4098:7;4094:23;4090:32;4087:119;;;4125:79;;:::i;:::-;4087:119;4245:1;4270:53;4315:7;4306:6;4295:9;4291:22;4270:53;:::i;:::-;4260:63;;4216:117;4372:2;4398:53;4443:7;4434:6;4423:9;4419:22;4398:53;:::i;:::-;4388:63;;4343:118;4500:2;4526:53;4571:7;4562:6;4551:9;4547:22;4526:53;:::i;:::-;4516:63;;4471:118;3977:619;;;;;:::o;4602:943::-;4697:6;4705;4713;4721;4770:3;4758:9;4749:7;4745:23;4741:33;4738:120;;;4777:79;;:::i;:::-;4738:120;4897:1;4922:53;4967:7;4958:6;4947:9;4943:22;4922:53;:::i;:::-;4912:63;;4868:117;5024:2;5050:53;5095:7;5086:6;5075:9;5071:22;5050:53;:::i;:::-;5040:63;;4995:118;5152:2;5178:53;5223:7;5214:6;5203:9;5199:22;5178:53;:::i;:::-;5168:63;;5123:118;5308:2;5297:9;5293:18;5280:32;5339:18;5331:6;5328:30;5325:117;;;5361:79;;:::i;:::-;5325:117;5466:62;5520:7;5511:6;5500:9;5496:22;5466:62;:::i;:::-;5456:72;;5251:287;4602:943;;;;;;;:::o;5551:468::-;5616:6;5624;5673:2;5661:9;5652:7;5648:23;5644:32;5641:119;;;5679:79;;:::i;:::-;5641:119;5799:1;5824:53;5869:7;5860:6;5849:9;5845:22;5824:53;:::i;:::-;5814:63;;5770:117;5926:2;5952:50;5994:7;5985:6;5974:9;5970:22;5952:50;:::i;:::-;5942:60;;5897:115;5551:468;;;;;:::o;6025:474::-;6093:6;6101;6150:2;6138:9;6129:7;6125:23;6121:32;6118:119;;;6156:79;;:::i;:::-;6118:119;6276:1;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6247:117;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;6025:474;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:327::-;6898:6;6947:2;6935:9;6926:7;6922:23;6918:32;6915:119;;;6953:79;;:::i;:::-;6915:119;7073:1;7098:52;7142:7;7133:6;7122:9;7118:22;7098:52;:::i;:::-;7088:62;;7044:116;6840:327;;;;:::o;7173:349::-;7242:6;7291:2;7279:9;7270:7;7266:23;7262:32;7259:119;;;7297:79;;:::i;:::-;7259:119;7417:1;7442:63;7497:7;7488:6;7477:9;7473:22;7442:63;:::i;:::-;7432:73;;7388:127;7173:349;;;;:::o;7528:509::-;7597:6;7646:2;7634:9;7625:7;7621:23;7617:32;7614:119;;;7652:79;;:::i;:::-;7614:119;7800:1;7789:9;7785:17;7772:31;7830:18;7822:6;7819:30;7816:117;;;7852:79;;:::i;:::-;7816:117;7957:63;8012:7;8003:6;7992:9;7988:22;7957:63;:::i;:::-;7947:73;;7743:287;7528:509;;;;:::o;8043:329::-;8102:6;8151:2;8139:9;8130:7;8126:23;8122:32;8119:119;;;8157:79;;:::i;:::-;8119:119;8277:1;8302:53;8347:7;8338:6;8327:9;8323:22;8302:53;:::i;:::-;8292:63;;8248:117;8043:329;;;;:::o;8378:351::-;8448:6;8497:2;8485:9;8476:7;8472:23;8468:32;8465:119;;;8503:79;;:::i;:::-;8465:119;8623:1;8648:64;8704:7;8695:6;8684:9;8680:22;8648:64;:::i;:::-;8638:74;;8594:128;8378:351;;;;:::o;8735:704::-;8830:6;8838;8846;8895:2;8883:9;8874:7;8870:23;8866:32;8863:119;;;8901:79;;:::i;:::-;8863:119;9021:1;9046:53;9091:7;9082:6;9071:9;9067:22;9046:53;:::i;:::-;9036:63;;8992:117;9176:2;9165:9;9161:18;9148:32;9207:18;9199:6;9196:30;9193:117;;;9229:79;;:::i;:::-;9193:117;9342:80;9414:7;9405:6;9394:9;9390:22;9342:80;:::i;:::-;9324:98;;;;9119:313;8735:704;;;;;:::o;9445:474::-;9513:6;9521;9570:2;9558:9;9549:7;9545:23;9541:32;9538:119;;;9576:79;;:::i;:::-;9538:119;9696:1;9721:53;9766:7;9757:6;9746:9;9742:22;9721:53;:::i;:::-;9711:63;;9667:117;9823:2;9849:53;9894:7;9885:6;9874:9;9870:22;9849:53;:::i;:::-;9839:63;;9794:118;9445:474;;;;;:::o;9925:118::-;10012:24;10030:5;10012:24;:::i;:::-;10007:3;10000:37;9925:118;;:::o;10049:157::-;10154:45;10174:24;10192:5;10174:24;:::i;:::-;10154:45;:::i;:::-;10149:3;10142:58;10049:157;;:::o;10212:109::-;10293:21;10308:5;10293:21;:::i;:::-;10288:3;10281:34;10212:109;;:::o;10327:118::-;10414:24;10432:5;10414:24;:::i;:::-;10409:3;10402:37;10327:118;;:::o;10451:360::-;10537:3;10565:38;10597:5;10565:38;:::i;:::-;10619:70;10682:6;10677:3;10619:70;:::i;:::-;10612:77;;10698:52;10743:6;10738:3;10731:4;10724:5;10720:16;10698:52;:::i;:::-;10775:29;10797:6;10775:29;:::i;:::-;10770:3;10766:39;10759:46;;10541:270;10451:360;;;;:::o;10817:364::-;10905:3;10933:39;10966:5;10933:39;:::i;:::-;10988:71;11052:6;11047:3;10988:71;:::i;:::-;10981:78;;11068:52;11113:6;11108:3;11101:4;11094:5;11090:16;11068:52;:::i;:::-;11145:29;11167:6;11145:29;:::i;:::-;11140:3;11136:39;11129:46;;10909:272;10817:364;;;;:::o;11187:377::-;11293:3;11321:39;11354:5;11321:39;:::i;:::-;11376:89;11458:6;11453:3;11376:89;:::i;:::-;11369:96;;11474:52;11519:6;11514:3;11507:4;11500:5;11496:16;11474:52;:::i;:::-;11551:6;11546:3;11542:16;11535:23;;11297:267;11187:377;;;;:::o;11570:365::-;11712:3;11733:66;11797:1;11792:3;11733:66;:::i;:::-;11726:73;;11808:93;11897:3;11808:93;:::i;:::-;11926:2;11921:3;11917:12;11910:19;;11570:365;;;:::o;11941:::-;12083:3;12104:66;12168:1;12163:3;12104:66;:::i;:::-;12097:73;;12179:93;12268:3;12179:93;:::i;:::-;12297:2;12292:3;12288:12;12281:19;;11941:365;;;:::o;12312:366::-;12454:3;12475:67;12539:2;12534:3;12475:67;:::i;:::-;12468:74;;12551:93;12640:3;12551:93;:::i;:::-;12669:2;12664:3;12660:12;12653:19;;12312:366;;;:::o;12684:::-;12826:3;12847:67;12911:2;12906:3;12847:67;:::i;:::-;12840:74;;12923:93;13012:3;12923:93;:::i;:::-;13041:2;13036:3;13032:12;13025:19;;12684:366;;;:::o;13056:::-;13198:3;13219:67;13283:2;13278:3;13219:67;:::i;:::-;13212:74;;13295:93;13384:3;13295:93;:::i;:::-;13413:2;13408:3;13404:12;13397:19;;13056:366;;;:::o;13428:::-;13570:3;13591:67;13655:2;13650:3;13591:67;:::i;:::-;13584:74;;13667:93;13756:3;13667:93;:::i;:::-;13785:2;13780:3;13776:12;13769:19;;13428:366;;;:::o;13800:365::-;13942:3;13963:66;14027:1;14022:3;13963:66;:::i;:::-;13956:73;;14038:93;14127:3;14038:93;:::i;:::-;14156:2;14151:3;14147:12;14140:19;;13800:365;;;:::o;14171:366::-;14313:3;14334:67;14398:2;14393:3;14334:67;:::i;:::-;14327:74;;14410:93;14499:3;14410:93;:::i;:::-;14528:2;14523:3;14519:12;14512:19;;14171:366;;;:::o;14543:::-;14685:3;14706:67;14770:2;14765:3;14706:67;:::i;:::-;14699:74;;14782:93;14871:3;14782:93;:::i;:::-;14900:2;14895:3;14891:12;14884:19;;14543:366;;;:::o;14915:365::-;15057:3;15078:66;15142:1;15137:3;15078:66;:::i;:::-;15071:73;;15153:93;15242:3;15153:93;:::i;:::-;15271:2;15266:3;15262:12;15255:19;;14915:365;;;:::o;15286:366::-;15428:3;15449:67;15513:2;15508:3;15449:67;:::i;:::-;15442:74;;15525:93;15614:3;15525:93;:::i;:::-;15643:2;15638:3;15634:12;15627:19;;15286:366;;;:::o;15658:365::-;15800:3;15821:66;15885:1;15880:3;15821:66;:::i;:::-;15814:73;;15896:93;15985:3;15896:93;:::i;:::-;16014:2;16009:3;16005:12;15998:19;;15658:365;;;:::o;16029:::-;16171:3;16192:66;16256:1;16251:3;16192:66;:::i;:::-;16185:73;;16267:93;16356:3;16267:93;:::i;:::-;16385:2;16380:3;16376:12;16369:19;;16029:365;;;:::o;16400:366::-;16542:3;16563:67;16627:2;16622:3;16563:67;:::i;:::-;16556:74;;16639:93;16728:3;16639:93;:::i;:::-;16757:2;16752:3;16748:12;16741:19;;16400:366;;;:::o;16772:::-;16914:3;16935:67;16999:2;16994:3;16935:67;:::i;:::-;16928:74;;17011:93;17100:3;17011:93;:::i;:::-;17129:2;17124:3;17120:12;17113:19;;16772:366;;;:::o;17144:::-;17286:3;17307:67;17371:2;17366:3;17307:67;:::i;:::-;17300:74;;17383:93;17472:3;17383:93;:::i;:::-;17501:2;17496:3;17492:12;17485:19;;17144:366;;;:::o;17516:365::-;17658:3;17679:66;17743:1;17738:3;17679:66;:::i;:::-;17672:73;;17754:93;17843:3;17754:93;:::i;:::-;17872:2;17867:3;17863:12;17856:19;;17516:365;;;:::o;17887:366::-;18029:3;18050:67;18114:2;18109:3;18050:67;:::i;:::-;18043:74;;18126:93;18215:3;18126:93;:::i;:::-;18244:2;18239:3;18235:12;18228:19;;17887:366;;;:::o;18259:365::-;18401:3;18422:66;18486:1;18481:3;18422:66;:::i;:::-;18415:73;;18497:93;18586:3;18497:93;:::i;:::-;18615:2;18610:3;18606:12;18599:19;;18259:365;;;:::o;18630:366::-;18772:3;18793:67;18857:2;18852:3;18793:67;:::i;:::-;18786:74;;18869:93;18958:3;18869:93;:::i;:::-;18987:2;18982:3;18978:12;18971:19;;18630:366;;;:::o;19002:::-;19144:3;19165:67;19229:2;19224:3;19165:67;:::i;:::-;19158:74;;19241:93;19330:3;19241:93;:::i;:::-;19359:2;19354:3;19350:12;19343:19;;19002:366;;;:::o;19374:365::-;19516:3;19537:66;19601:1;19596:3;19537:66;:::i;:::-;19530:73;;19612:93;19701:3;19612:93;:::i;:::-;19730:2;19725:3;19721:12;19714:19;;19374:365;;;:::o;19745:366::-;19887:3;19908:67;19972:2;19967:3;19908:67;:::i;:::-;19901:74;;19984:93;20073:3;19984:93;:::i;:::-;20102:2;20097:3;20093:12;20086:19;;19745:366;;;:::o;20117:365::-;20259:3;20280:66;20344:1;20339:3;20280:66;:::i;:::-;20273:73;;20355:93;20444:3;20355:93;:::i;:::-;20473:2;20468:3;20464:12;20457:19;;20117:365;;;:::o;20488:366::-;20630:3;20651:67;20715:2;20710:3;20651:67;:::i;:::-;20644:74;;20727:93;20816:3;20727:93;:::i;:::-;20845:2;20840:3;20836:12;20829:19;;20488:366;;;:::o;20860:365::-;21002:3;21023:66;21087:1;21082:3;21023:66;:::i;:::-;21016:73;;21098:93;21187:3;21098:93;:::i;:::-;21216:2;21211:3;21207:12;21200:19;;20860:365;;;:::o;21231:::-;21373:3;21394:66;21458:1;21453:3;21394:66;:::i;:::-;21387:73;;21469:93;21558:3;21469:93;:::i;:::-;21587:2;21582:3;21578:12;21571:19;;21231:365;;;:::o;21602:366::-;21744:3;21765:67;21829:2;21824:3;21765:67;:::i;:::-;21758:74;;21841:93;21930:3;21841:93;:::i;:::-;21959:2;21954:3;21950:12;21943:19;;21602:366;;;:::o;21974:::-;22116:3;22137:67;22201:2;22196:3;22137:67;:::i;:::-;22130:74;;22213:93;22302:3;22213:93;:::i;:::-;22331:2;22326:3;22322:12;22315:19;;21974:366;;;:::o;22346:365::-;22488:3;22509:66;22573:1;22568:3;22509:66;:::i;:::-;22502:73;;22584:93;22673:3;22584:93;:::i;:::-;22702:2;22697:3;22693:12;22686:19;;22346:365;;;:::o;22717:::-;22859:3;22880:66;22944:1;22939:3;22880:66;:::i;:::-;22873:73;;22955:93;23044:3;22955:93;:::i;:::-;23073:2;23068:3;23064:12;23057:19;;22717:365;;;:::o;23088:::-;23230:3;23251:66;23315:1;23310:3;23251:66;:::i;:::-;23244:73;;23326:93;23415:3;23326:93;:::i;:::-;23444:2;23439:3;23435:12;23428:19;;23088:365;;;:::o;23459:::-;23601:3;23622:66;23686:1;23681:3;23622:66;:::i;:::-;23615:73;;23697:93;23786:3;23697:93;:::i;:::-;23815:2;23810:3;23806:12;23799:19;;23459:365;;;:::o;23830:118::-;23917:24;23935:5;23917:24;:::i;:::-;23912:3;23905:37;23830:118;;:::o;23954:256::-;24066:3;24081:75;24152:3;24143:6;24081:75;:::i;:::-;24181:2;24176:3;24172:12;24165:19;;24201:3;24194:10;;23954:256;;;;:::o;24216:435::-;24396:3;24418:95;24509:3;24500:6;24418:95;:::i;:::-;24411:102;;24530:95;24621:3;24612:6;24530:95;:::i;:::-;24523:102;;24642:3;24635:10;;24216:435;;;;;:::o;24657:222::-;24750:4;24788:2;24777:9;24773:18;24765:26;;24801:71;24869:1;24858:9;24854:17;24845:6;24801:71;:::i;:::-;24657:222;;;;:::o;24885:640::-;25080:4;25118:3;25107:9;25103:19;25095:27;;25132:71;25200:1;25189:9;25185:17;25176:6;25132:71;:::i;:::-;25213:72;25281:2;25270:9;25266:18;25257:6;25213:72;:::i;:::-;25295;25363:2;25352:9;25348:18;25339:6;25295:72;:::i;:::-;25414:9;25408:4;25404:20;25399:2;25388:9;25384:18;25377:48;25442:76;25513:4;25504:6;25442:76;:::i;:::-;25434:84;;24885:640;;;;;;;:::o;25531:332::-;25652:4;25690:2;25679:9;25675:18;25667:26;;25703:71;25771:1;25760:9;25756:17;25747:6;25703:71;:::i;:::-;25784:72;25852:2;25841:9;25837:18;25828:6;25784:72;:::i;:::-;25531:332;;;;;:::o;25869:210::-;25956:4;25994:2;25983:9;25979:18;25971:26;;26007:65;26069:1;26058:9;26054:17;26045:6;26007:65;:::i;:::-;25869:210;;;;:::o;26085:222::-;26178:4;26216:2;26205:9;26201:18;26193:26;;26229:71;26297:1;26286:9;26282:17;26273:6;26229:71;:::i;:::-;26085:222;;;;:::o;26313:313::-;26426:4;26464:2;26453:9;26449:18;26441:26;;26513:9;26507:4;26503:20;26499:1;26488:9;26484:17;26477:47;26541:78;26614:4;26605:6;26541:78;:::i;:::-;26533:86;;26313:313;;;;:::o;26632:419::-;26798:4;26836:2;26825:9;26821:18;26813:26;;26885:9;26879:4;26875:20;26871:1;26860:9;26856:17;26849:47;26913:131;27039:4;26913:131;:::i;:::-;26905:139;;26632:419;;;:::o;27057:::-;27223:4;27261:2;27250:9;27246:18;27238:26;;27310:9;27304:4;27300:20;27296:1;27285:9;27281:17;27274:47;27338:131;27464:4;27338:131;:::i;:::-;27330:139;;27057:419;;;:::o;27482:::-;27648:4;27686:2;27675:9;27671:18;27663:26;;27735:9;27729:4;27725:20;27721:1;27710:9;27706:17;27699:47;27763:131;27889:4;27763:131;:::i;:::-;27755:139;;27482:419;;;:::o;27907:::-;28073:4;28111:2;28100:9;28096:18;28088:26;;28160:9;28154:4;28150:20;28146:1;28135:9;28131:17;28124:47;28188:131;28314:4;28188:131;:::i;:::-;28180:139;;27907:419;;;:::o;28332:::-;28498:4;28536:2;28525:9;28521:18;28513:26;;28585:9;28579:4;28575:20;28571:1;28560:9;28556:17;28549:47;28613:131;28739:4;28613:131;:::i;:::-;28605:139;;28332:419;;;:::o;28757:::-;28923:4;28961:2;28950:9;28946:18;28938:26;;29010:9;29004:4;29000:20;28996:1;28985:9;28981:17;28974:47;29038:131;29164:4;29038:131;:::i;:::-;29030:139;;28757:419;;;:::o;29182:::-;29348:4;29386:2;29375:9;29371:18;29363:26;;29435:9;29429:4;29425:20;29421:1;29410:9;29406:17;29399:47;29463:131;29589:4;29463:131;:::i;:::-;29455:139;;29182:419;;;:::o;29607:::-;29773:4;29811:2;29800:9;29796:18;29788:26;;29860:9;29854:4;29850:20;29846:1;29835:9;29831:17;29824:47;29888:131;30014:4;29888:131;:::i;:::-;29880:139;;29607:419;;;:::o;30032:::-;30198:4;30236:2;30225:9;30221:18;30213:26;;30285:9;30279:4;30275:20;30271:1;30260:9;30256:17;30249:47;30313:131;30439:4;30313:131;:::i;:::-;30305:139;;30032:419;;;:::o;30457:::-;30623:4;30661:2;30650:9;30646:18;30638:26;;30710:9;30704:4;30700:20;30696:1;30685:9;30681:17;30674:47;30738:131;30864:4;30738:131;:::i;:::-;30730:139;;30457:419;;;:::o;30882:::-;31048:4;31086:2;31075:9;31071:18;31063:26;;31135:9;31129:4;31125:20;31121:1;31110:9;31106:17;31099:47;31163:131;31289:4;31163:131;:::i;:::-;31155:139;;30882:419;;;:::o;31307:::-;31473:4;31511:2;31500:9;31496:18;31488:26;;31560:9;31554:4;31550:20;31546:1;31535:9;31531:17;31524:47;31588:131;31714:4;31588:131;:::i;:::-;31580:139;;31307:419;;;:::o;31732:::-;31898:4;31936:2;31925:9;31921:18;31913:26;;31985:9;31979:4;31975:20;31971:1;31960:9;31956:17;31949:47;32013:131;32139:4;32013:131;:::i;:::-;32005:139;;31732:419;;;:::o;32157:::-;32323:4;32361:2;32350:9;32346:18;32338:26;;32410:9;32404:4;32400:20;32396:1;32385:9;32381:17;32374:47;32438:131;32564:4;32438:131;:::i;:::-;32430:139;;32157:419;;;:::o;32582:::-;32748:4;32786:2;32775:9;32771:18;32763:26;;32835:9;32829:4;32825:20;32821:1;32810:9;32806:17;32799:47;32863:131;32989:4;32863:131;:::i;:::-;32855:139;;32582:419;;;:::o;33007:::-;33173:4;33211:2;33200:9;33196:18;33188:26;;33260:9;33254:4;33250:20;33246:1;33235:9;33231:17;33224:47;33288:131;33414:4;33288:131;:::i;:::-;33280:139;;33007:419;;;:::o;33432:::-;33598:4;33636:2;33625:9;33621:18;33613:26;;33685:9;33679:4;33675:20;33671:1;33660:9;33656:17;33649:47;33713:131;33839:4;33713:131;:::i;:::-;33705:139;;33432:419;;;:::o;33857:::-;34023:4;34061:2;34050:9;34046:18;34038:26;;34110:9;34104:4;34100:20;34096:1;34085:9;34081:17;34074:47;34138:131;34264:4;34138:131;:::i;:::-;34130:139;;33857:419;;;:::o;34282:::-;34448:4;34486:2;34475:9;34471:18;34463:26;;34535:9;34529:4;34525:20;34521:1;34510:9;34506:17;34499:47;34563:131;34689:4;34563:131;:::i;:::-;34555:139;;34282:419;;;:::o;34707:::-;34873:4;34911:2;34900:9;34896:18;34888:26;;34960:9;34954:4;34950:20;34946:1;34935:9;34931:17;34924:47;34988:131;35114:4;34988:131;:::i;:::-;34980:139;;34707:419;;;:::o;35132:::-;35298:4;35336:2;35325:9;35321:18;35313:26;;35385:9;35379:4;35375:20;35371:1;35360:9;35356:17;35349:47;35413:131;35539:4;35413:131;:::i;:::-;35405:139;;35132:419;;;:::o;35557:::-;35723:4;35761:2;35750:9;35746:18;35738:26;;35810:9;35804:4;35800:20;35796:1;35785:9;35781:17;35774:47;35838:131;35964:4;35838:131;:::i;:::-;35830:139;;35557:419;;;:::o;35982:::-;36148:4;36186:2;36175:9;36171:18;36163:26;;36235:9;36229:4;36225:20;36221:1;36210:9;36206:17;36199:47;36263:131;36389:4;36263:131;:::i;:::-;36255:139;;35982:419;;;:::o;36407:::-;36573:4;36611:2;36600:9;36596:18;36588:26;;36660:9;36654:4;36650:20;36646:1;36635:9;36631:17;36624:47;36688:131;36814:4;36688:131;:::i;:::-;36680:139;;36407:419;;;:::o;36832:::-;36998:4;37036:2;37025:9;37021:18;37013:26;;37085:9;37079:4;37075:20;37071:1;37060:9;37056:17;37049:47;37113:131;37239:4;37113:131;:::i;:::-;37105:139;;36832:419;;;:::o;37257:::-;37423:4;37461:2;37450:9;37446:18;37438:26;;37510:9;37504:4;37500:20;37496:1;37485:9;37481:17;37474:47;37538:131;37664:4;37538:131;:::i;:::-;37530:139;;37257:419;;;:::o;37682:::-;37848:4;37886:2;37875:9;37871:18;37863:26;;37935:9;37929:4;37925:20;37921:1;37910:9;37906:17;37899:47;37963:131;38089:4;37963:131;:::i;:::-;37955:139;;37682:419;;;:::o;38107:::-;38273:4;38311:2;38300:9;38296:18;38288:26;;38360:9;38354:4;38350:20;38346:1;38335:9;38331:17;38324:47;38388:131;38514:4;38388:131;:::i;:::-;38380:139;;38107:419;;;:::o;38532:::-;38698:4;38736:2;38725:9;38721:18;38713:26;;38785:9;38779:4;38775:20;38771:1;38760:9;38756:17;38749:47;38813:131;38939:4;38813:131;:::i;:::-;38805:139;;38532:419;;;:::o;38957:::-;39123:4;39161:2;39150:9;39146:18;39138:26;;39210:9;39204:4;39200:20;39196:1;39185:9;39181:17;39174:47;39238:131;39364:4;39238:131;:::i;:::-;39230:139;;38957:419;;;:::o;39382:::-;39548:4;39586:2;39575:9;39571:18;39563:26;;39635:9;39629:4;39625:20;39621:1;39610:9;39606:17;39599:47;39663:131;39789:4;39663:131;:::i;:::-;39655:139;;39382:419;;;:::o;39807:::-;39973:4;40011:2;40000:9;39996:18;39988:26;;40060:9;40054:4;40050:20;40046:1;40035:9;40031:17;40024:47;40088:131;40214:4;40088:131;:::i;:::-;40080:139;;39807:419;;;:::o;40232:::-;40398:4;40436:2;40425:9;40421:18;40413:26;;40485:9;40479:4;40475:20;40471:1;40460:9;40456:17;40449:47;40513:131;40639:4;40513:131;:::i;:::-;40505:139;;40232:419;;;:::o;40657:222::-;40750:4;40788:2;40777:9;40773:18;40765:26;;40801:71;40869:1;40858:9;40854:17;40845:6;40801:71;:::i;:::-;40657:222;;;;:::o;40885:129::-;40919:6;40946:20;;:::i;:::-;40936:30;;40975:33;41003:4;40995:6;40975:33;:::i;:::-;40885:129;;;:::o;41020:75::-;41053:6;41086:2;41080:9;41070:19;;41020:75;:::o;41101:307::-;41162:4;41252:18;41244:6;41241:30;41238:56;;;41274:18;;:::i;:::-;41238:56;41312:29;41334:6;41312:29;:::i;:::-;41304:37;;41396:4;41390;41386:15;41378:23;;41101:307;;;:::o;41414:308::-;41476:4;41566:18;41558:6;41555:30;41552:56;;;41588:18;;:::i;:::-;41552:56;41626:29;41648:6;41626:29;:::i;:::-;41618:37;;41710:4;41704;41700:15;41692:23;;41414:308;;;:::o;41728:98::-;41779:6;41813:5;41807:12;41797:22;;41728:98;;;:::o;41832:99::-;41884:6;41918:5;41912:12;41902:22;;41832:99;;;:::o;41937:168::-;42020:11;42054:6;42049:3;42042:19;42094:4;42089:3;42085:14;42070:29;;41937:168;;;;:::o;42111:169::-;42195:11;42229:6;42224:3;42217:19;42269:4;42264:3;42260:14;42245:29;;42111:169;;;;:::o;42286:148::-;42388:11;42425:3;42410:18;;42286:148;;;;:::o;42440:305::-;42480:3;42499:20;42517:1;42499:20;:::i;:::-;42494:25;;42533:20;42551:1;42533:20;:::i;:::-;42528:25;;42687:1;42619:66;42615:74;42612:1;42609:81;42606:107;;;42693:18;;:::i;:::-;42606:107;42737:1;42734;42730:9;42723:16;;42440:305;;;;:::o;42751:185::-;42791:1;42808:20;42826:1;42808:20;:::i;:::-;42803:25;;42842:20;42860:1;42842:20;:::i;:::-;42837:25;;42881:1;42871:35;;42886:18;;:::i;:::-;42871:35;42928:1;42925;42921:9;42916:14;;42751:185;;;;:::o;42942:348::-;42982:7;43005:20;43023:1;43005:20;:::i;:::-;43000:25;;43039:20;43057:1;43039:20;:::i;:::-;43034:25;;43227:1;43159:66;43155:74;43152:1;43149:81;43144:1;43137:9;43130:17;43126:105;43123:131;;;43234:18;;:::i;:::-;43123:131;43282:1;43279;43275:9;43264:20;;42942:348;;;;:::o;43296:191::-;43336:4;43356:20;43374:1;43356:20;:::i;:::-;43351:25;;43390:20;43408:1;43390:20;:::i;:::-;43385:25;;43429:1;43426;43423:8;43420:34;;;43434:18;;:::i;:::-;43420:34;43479:1;43476;43472:9;43464:17;;43296:191;;;;:::o;43493:96::-;43530:7;43559:24;43577:5;43559:24;:::i;:::-;43548:35;;43493:96;;;:::o;43595:90::-;43629:7;43672:5;43665:13;43658:21;43647:32;;43595:90;;;:::o;43691:77::-;43728:7;43757:5;43746:16;;43691:77;;;:::o;43774:149::-;43810:7;43850:66;43843:5;43839:78;43828:89;;43774:149;;;:::o;43929:126::-;43966:7;44006:42;43999:5;43995:54;43984:65;;43929:126;;;:::o;44061:77::-;44098:7;44127:5;44116:16;;44061:77;;;:::o;44144:154::-;44228:6;44223:3;44218;44205:30;44290:1;44281:6;44276:3;44272:16;44265:27;44144:154;;;:::o;44304:307::-;44372:1;44382:113;44396:6;44393:1;44390:13;44382:113;;;44481:1;44476:3;44472:11;44466:18;44462:1;44457:3;44453:11;44446:39;44418:2;44415:1;44411:10;44406:15;;44382:113;;;44513:6;44510:1;44507:13;44504:101;;;44593:1;44584:6;44579:3;44575:16;44568:27;44504:101;44353:258;44304:307;;;:::o;44617:320::-;44661:6;44698:1;44692:4;44688:12;44678:22;;44745:1;44739:4;44735:12;44766:18;44756:81;;44822:4;44814:6;44810:17;44800:27;;44756:81;44884:2;44876:6;44873:14;44853:18;44850:38;44847:84;;;44903:18;;:::i;:::-;44847:84;44668:269;44617:320;;;:::o;44943:281::-;45026:27;45048:4;45026:27;:::i;:::-;45018:6;45014:40;45156:6;45144:10;45141:22;45120:18;45108:10;45105:34;45102:62;45099:88;;;45167:18;;:::i;:::-;45099:88;45207:10;45203:2;45196:22;44986:238;44943:281;;:::o;45230:233::-;45269:3;45292:24;45310:5;45292:24;:::i;:::-;45283:33;;45338:66;45331:5;45328:77;45325:103;;;45408:18;;:::i;:::-;45325:103;45455:1;45448:5;45444:13;45437:20;;45230:233;;;:::o;45469:100::-;45508:7;45537:26;45557:5;45537:26;:::i;:::-;45526:37;;45469:100;;;:::o;45575:94::-;45614:7;45643:20;45657:5;45643:20;:::i;:::-;45632:31;;45575:94;;;:::o;45675:176::-;45707:1;45724:20;45742:1;45724:20;:::i;:::-;45719:25;;45758:20;45776:1;45758:20;:::i;:::-;45753:25;;45797:1;45787:35;;45802:18;;:::i;:::-;45787:35;45843:1;45840;45836:9;45831:14;;45675:176;;;;:::o;45857:180::-;45905:77;45902:1;45895:88;46002:4;45999:1;45992:15;46026:4;46023:1;46016:15;46043:180;46091:77;46088:1;46081:88;46188:4;46185:1;46178:15;46212:4;46209:1;46202:15;46229:180;46277:77;46274:1;46267:88;46374:4;46371:1;46364:15;46398:4;46395:1;46388:15;46415:180;46463:77;46460:1;46453:88;46560:4;46557:1;46550:15;46584:4;46581:1;46574:15;46601:180;46649:77;46646:1;46639:88;46746:4;46743:1;46736:15;46770:4;46767:1;46760:15;46787:180;46835:77;46832:1;46825:88;46932:4;46929:1;46922:15;46956:4;46953:1;46946:15;46973:117;47082:1;47079;47072:12;47096:117;47205:1;47202;47195:12;47219:117;47328:1;47325;47318:12;47342:117;47451:1;47448;47441:12;47465:117;47574:1;47571;47564:12;47588:117;47697:1;47694;47687:12;47711:102;47752:6;47803:2;47799:7;47794:2;47787:5;47783:14;47779:28;47769:38;;47711:102;;;:::o;47819:94::-;47852:8;47900:5;47896:2;47892:14;47871:35;;47819:94;;;:::o;47919:151::-;48059:3;48055:1;48047:6;48043:14;48036:27;47919:151;:::o;48076:157::-;48216:9;48212:1;48204:6;48200:14;48193:33;48076:157;:::o;48239:230::-;48379:34;48375:1;48367:6;48363:14;48356:58;48448:13;48443:2;48435:6;48431:15;48424:38;48239:230;:::o;48475:237::-;48615:34;48611:1;48603:6;48599:14;48592:58;48684:20;48679:2;48671:6;48667:15;48660:45;48475:237;:::o;48718:224::-;48858:34;48854:1;48846:6;48842:14;48835:58;48927:7;48922:2;48914:6;48910:15;48903:32;48718:224;:::o;48948:178::-;49088:30;49084:1;49076:6;49072:14;49065:54;48948:178;:::o;49132:157::-;49272:9;49268:1;49260:6;49256:14;49249:33;49132:157;:::o;49295:223::-;49435:34;49431:1;49423:6;49419:14;49412:58;49504:6;49499:2;49491:6;49487:15;49480:31;49295:223;:::o;49524:175::-;49664:27;49660:1;49652:6;49648:14;49641:51;49524:175;:::o;49705:159::-;49845:11;49841:1;49833:6;49829:14;49822:35;49705:159;:::o;49870:231::-;50010:34;50006:1;49998:6;49994:14;49987:58;50079:14;50074:2;50066:6;50062:15;50055:39;49870:231;:::o;50107:156::-;50247:8;50243:1;50235:6;50231:14;50224:32;50107:156;:::o;50269:157::-;50409:9;50405:1;50397:6;50393:14;50386:33;50269:157;:::o;50432:243::-;50572:34;50568:1;50560:6;50556:14;50549:58;50641:26;50636:2;50628:6;50624:15;50617:51;50432:243;:::o;50681:229::-;50821:34;50817:1;50809:6;50805:14;50798:58;50890:12;50885:2;50877:6;50873:15;50866:37;50681:229;:::o;50916:228::-;51056:34;51052:1;51044:6;51040:14;51033:58;51125:11;51120:2;51112:6;51108:15;51101:36;50916:228;:::o;51150:158::-;51290:10;51286:1;51278:6;51274:14;51267:34;51150:158;:::o;51314:182::-;51454:34;51450:1;51442:6;51438:14;51431:58;51314:182;:::o;51502:156::-;51642:8;51638:1;51630:6;51626:14;51619:32;51502:156;:::o;51664:231::-;51804:34;51800:1;51792:6;51788:14;51781:58;51873:14;51868:2;51860:6;51856:15;51849:39;51664:231;:::o;51901:182::-;52041:34;52037:1;52029:6;52025:14;52018:58;51901:182;:::o;52089:155::-;52229:7;52225:1;52217:6;52213:14;52206:31;52089:155;:::o;52250:234::-;52390:34;52386:1;52378:6;52374:14;52367:58;52459:17;52454:2;52446:6;52442:15;52435:42;52250:234;:::o;52490:153::-;52630:5;52626:1;52618:6;52614:14;52607:29;52490:153;:::o;52649:220::-;52789:34;52785:1;52777:6;52773:14;52766:58;52858:3;52853:2;52845:6;52841:15;52834:28;52649:220;:::o;52875:157::-;53015:9;53011:1;53003:6;52999:14;52992:33;52875:157;:::o;53038:155::-;53178:7;53174:1;53166:6;53162:14;53155:31;53038:155;:::o;53199:236::-;53339:34;53335:1;53327:6;53323:14;53316:58;53408:19;53403:2;53395:6;53391:15;53384:44;53199:236;:::o;53441:231::-;53581:34;53577:1;53569:6;53565:14;53558:58;53650:14;53645:2;53637:6;53633:15;53626:39;53441:231;:::o;53678:152::-;53818:4;53814:1;53806:6;53802:14;53795:28;53678:152;:::o;53836:157::-;53976:9;53972:1;53964:6;53960:14;53953:33;53836:157;:::o;53999:154::-;54139:6;54135:1;54127:6;54123:14;54116:30;53999:154;:::o;54159:157::-;54299:9;54295:1;54287:6;54283:14;54276:33;54159:157;:::o;54322:122::-;54395:24;54413:5;54395:24;:::i;:::-;54388:5;54385:35;54375:63;;54434:1;54431;54424:12;54375:63;54322:122;:::o;54450:116::-;54520:21;54535:5;54520:21;:::i;:::-;54513:5;54510:32;54500:60;;54556:1;54553;54546:12;54500:60;54450:116;:::o;54572:122::-;54645:24;54663:5;54645:24;:::i;:::-;54638:5;54635:35;54625:63;;54684:1;54681;54674:12;54625:63;54572:122;:::o;54700:120::-;54772:23;54789:5;54772:23;:::i;:::-;54765:5;54762:34;54752:62;;54810:1;54807;54800:12;54752:62;54700:120;:::o;54826:122::-;54899:24;54917:5;54899:24;:::i;:::-;54892:5;54889:35;54879:63;;54938:1;54935;54928:12;54879:63;54826:122;:::o

Swarm Source

ipfs://1184bd16d6ece640908ddebbcb31f8f257da93c946d15119e19a78360e26eb28
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.