ETH Price: $3,558.39 (+6.66%)

Token

RealCryptoPunks by VT3.com (RCP)
 

Overview

Max Total Supply

0 RCP

Holders

871

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
blaiseinferno.eth
Balance
1 RCP
0xfe13a69994743ae68053ccc7a4d601d2b63c9318
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

RealCryptoPunks is an NFT collection of 10000 unique characters. ERC-721 Standard. 3 rarity tiers. 87 attributes. 5+1 types.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RealCryptoPunks

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 13: RealCryptoPunks.sol
// contracts/RealCryptoPunks.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC721URIStorage.sol";
import "./Ownable.sol";

contract RealCryptoPunks is ERC721URIStorage, Ownable {
    uint256 public constant MAX_NFT_SUPPLY = 10000;
    bool public saleStarted = false;
    mapping(address => uint256) private _bonusBalance;
    uint256 public _counter = 110;
    uint256 public _ownerCounter;
    
    constructor() ERC721("RealCryptoPunks by VT3.com", "RCP") {}
    
    function _baseURI() internal view virtual override returns (string memory) {
        return "https://realcryptopunks.com/api/";
    }
    
    function getPrice() public view returns (uint256) {
        require(_counter < MAX_NFT_SUPPLY, "Sale has ended.");
        uint256 currentSupply = _counter;
        if (currentSupply >= 9500) { 
            return 1500000000000000000; // 1.5 ETH
        } else if (currentSupply >= 9000) { 
            return 1200000000000000000; // 1.2 ETH
        } else if (currentSupply >= 8500) { 
            return 800000000000000000; // 0.8 ETH
        } else if (currentSupply >= 8000) { 
            return 650000000000000000; // 0.65 ETH
        } else if (currentSupply >= 7500) { 
            return 500000000000000000; // 0.5 ETH
        } else if (currentSupply >= 7000) { 
            return 400000000000000000; // 0.4 ETH
        } else if (currentSupply >= 6500) { 
            return 300000000000000000; // 0.3 ETH
        } else if (currentSupply >= 6000) { 
            return 250000000000000000; // 0.25 ETH
        } else if (currentSupply >= 5500) { 
            return 200000000000000000; // 0.2 ETH
        } else if (currentSupply >= 5000) { 
            return 150000000000000000; // 0.15 ETH
        } else if (currentSupply >= 4500) { 
            return 100000000000000000; // 0.1 ETH
        } else if (currentSupply >= 4000) { 
            return 85000000000000000; // 0.085 ETH
        } else if (currentSupply >= 3500) { 
            return 70000000000000000; // 0.07 ETH
        } else if (currentSupply >= 3000) { 
            return 60000000000000000; // 0.06 ETH
        } else if (currentSupply >= 2500) { 
            return 50000000000000000; // 0.05 ETH
        } else if (currentSupply >= 2000) { 
            return 40000000000000000; // 0.04 ETH
        } else if (currentSupply >= 1500) { 
            return 30000000000000000; // 0.03 ETH
        } else if (currentSupply >= 1000) { 
            return 20000000000000000; // 0.02 ETH
        } else if (currentSupply >= 500) { 
            return 10000000000000000; // 0.01 ETH
        } else {  
            return 5000000000000000; // 0.005 ETH  
        }
    }
    
    function buyPunks(uint256 amount, address refferer) public payable {
        require(saleStarted == true, "Sale has not started.");
        require(_counter < MAX_NFT_SUPPLY, "Supply has ended.");
        require(amount > 0, "You must buy at least one RealCryptoPunk.");
        require(amount <= 25, "You can only buy max 25 RealCryptoPunks at a time.");
        require(_counter + amount <= MAX_NFT_SUPPLY, "The amount you are trying to buy exceeds MAX_NFT_SUPPLY.");
        if (amount == 25){
            require(getPrice() / 100 * 75 * amount == msg.value, "Incorrect Ether value.");
        } else if (amount >= 10) {
            require(getPrice() / 100 * 90 * amount == msg.value, "Incorrect Ether value.");
        } else {
            require(getPrice() * amount == msg.value, "Incorrect Ether value.");
        }
        
        for (uint256 i = 0; i < amount; i++) {
            _safeMint(msg.sender, _counter + i);
            if (_counter == 9999){
                _safeMint(msg.sender, 10000);
            }
            
            _bonusBalance[msg.sender] = _bonusBalance[msg.sender] + 10;
            if (refferer != msg.sender && refferer != address(0)){
                _bonusBalance[refferer] = _bonusBalance[refferer] + 5;
            }
        }
        
        _counter += amount;
    }
    
    function redeemPunks(uint256 amount) public {
        require(saleStarted == true, "Sale has not started.");
        require(_counter < 9999, "Supply has ended.");
        require(amount > 0, "You must buy at least one RealCryptoPunk.");
        require(amount <= 10, "You can only buy max 10 RealCryptoPunks at a time.");
        require(_counter + amount <= 9999, "The amount you are trying to buy exceeds 9999.");
        require(100 * amount <= bonusBalanceOf(msg.sender), "Not enough bonus points.");
        for (uint256 i = 0; i < amount; i++) {
            _safeMint(msg.sender, _counter + i);
        }
        _counter += amount;
        _bonusBalance[msg.sender] = _bonusBalance[msg.sender] - (100 * amount);
    }
    
    function ownerMint(uint256 amount, address to) public onlyOwner{
        require(to != address(0), "ERC721: query for the zero address");
        require(_ownerCounter < _counter, "Supply has ended.");
        require(amount > 0, "You must buy at least one RealCryptoPunk.");
        require(_ownerCounter + amount <= 110, "The amount you are trying to buy exceeds max owner mint.");
        for (uint256 i = 0; i < amount; i++) {
            _safeMint(to, _ownerCounter + i);
        }
        _ownerCounter += amount;
    }
    
    function bonusBalanceOf(address owner) public view returns(uint256){
        require(owner != address(0), "ERC721: query for the zero address");
        return _bonusBalance[owner];
    }
    
    function tokensOfOwner(address owner) external view returns(uint256[] memory ownerTokens) {
        uint256 tokenCount = balanceOf(owner);

        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 resultIndex = 0;

            for (uint256 id = 0; id <= MAX_NFT_SUPPLY; id++) {
                if (_exists(id)){
                    if (ownerOf(id) == owner) {
                        result[resultIndex] = id;
                        resultIndex++;
                    }
                }
            }

            return result;
        }
    }
    
    function withdrawAll() public payable onlyOwner{
        require(payable(msg.sender).send(address(this).balance));
    }

    function startDrop() public onlyOwner{
        saleStarted = true;
    }

    function pauseDrop() public onlyOwner{
        saleStarted = false;
    }
        
}

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

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 13: 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 13: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping (uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping (address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping (uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

File 5 of 13: ERC721URIStorage.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../ERC721.sol";

/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

File 6 of 13: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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

pragma solidity ^0.8.0;

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

File 11 of 13: 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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[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":[],"name":"MAX_NFT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_counter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ownerCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"bonusBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"refferer","type":"address"}],"name":"buyPunks","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemPunks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStarted","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":[],"name":"startDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600760146101000a81548160ff021916908315150217905550606e6009553480156200003157600080fd5b506040518060400160405280601a81526020017f5265616c43727970746f50756e6b73206279205654332e636f6d0000000000008152506040518060400160405280600381526020017f52435000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b692919062000191565b508060019080519060200190620000cf92919062000191565b5050506000620000e46200018960201b60201c565b905080600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002a6565b600033905090565b8280546200019f9062000241565b90600052602060002090601f016020900481019282620001c357600085556200020f565b82601f10620001de57805160ff19168380011785556200020f565b828001600101855582156200020f579182015b828111156200020e578251825591602001919060010190620001f1565b5b5090506200021e919062000222565b5090565b5b808211156200023d57600081600090555060010162000223565b5090565b600060028204905060018216806200025a57607f821691505b6020821081141562000271576200027062000277565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6148d580620002b66000396000f3fe6080604052600436106101c25760003560e01c8063715018a6116100f7578063a0517e3911610095578063c87b56dd11610064578063c87b56dd146105ee578063d52c57e01461062b578063e985e9c514610654578063f2fde38b14610691576101c2565b8063a0517e3914610555578063a22cb46514610571578063b5077f441461059a578063b88d4fde146105c5576101c2565b8063853828b6116100d1578063853828b6146104ca5780638da5cb5b146104d457806395d89b41146104ff57806398d5fdca1461052a576101c2565b8063715018a61461044b5780637cd49fde146104625780638462151c1461048d576101c2565b80632808c92c116101645780635c474f9e1161013e5780635c474f9e146103695780636352211e1461039457806368654ef8146103d157806370a082311461040e576101c2565b80632808c92c1461031257806334d84c7b1461032957806342842e0e14610340576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b3146102975780631f5011b5146102c057806323b872dd146102e9576101c2565b8063013c982d146101c757806301ffc9a7146101f257806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101dc6106ba565b6040516101e99190613c44565b60405180910390f35b3480156101fe57600080fd5b50610219600480360381019061021491906131b7565b6106c0565b6040516102269190613867565b60405180910390f35b34801561023b57600080fd5b506102446107a2565b6040516102519190613882565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190613209565b610834565b60405161028e91906137de565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b9919061317b565b6108b9565b005b3480156102cc57600080fd5b506102e760048036038101906102e29190613209565b6109d1565b005b3480156102f557600080fd5b50610310600480360381019061030b9190613075565b610c89565b005b34801561031e57600080fd5b50610327610ce9565b005b34801561033557600080fd5b5061033e610d82565b005b34801561034c57600080fd5b5061036760048036038101906103629190613075565b610e1b565b005b34801561037557600080fd5b5061037e610e3b565b60405161038b9190613867565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613209565b610e4e565b6040516103c891906137de565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190613010565b610f00565b6040516104059190613c44565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613010565b610fb8565b6040516104429190613c44565b60405180910390f35b34801561045757600080fd5b50610460611070565b005b34801561046e57600080fd5b506104776111ad565b6040516104849190613c44565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190613010565b6111b3565b6040516104c19190613845565b60405180910390f35b6104d2611383565b005b3480156104e057600080fd5b506104e961143f565b6040516104f691906137de565b60405180910390f35b34801561050b57600080fd5b50610514611469565b6040516105219190613882565b60405180910390f35b34801561053657600080fd5b5061053f6114fb565b60405161054c9190613c44565b60405180910390f35b61056f600480360381019061056a9190613232565b611740565b005b34801561057d57600080fd5b506105986004803603810190610593919061313f565b611bf7565b005b3480156105a657600080fd5b506105af611d78565b6040516105bc9190613c44565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e791906130c4565b611d7e565b005b3480156105fa57600080fd5b5061061560048036038101906106109190613209565b611de0565b6040516106229190613882565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190613232565b611f32565b005b34801561066057600080fd5b5061067b60048036038101906106769190613039565b61214b565b6040516106889190613867565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613010565b6121df565b005b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079b575061079a8261238b565b5b9050919050565b6060600080546107b190613efc565b80601f01602080910402602001604051908101604052809291908181526020018280546107dd90613efc565b801561082a5780601f106107ff5761010080835404028352916020019161082a565b820191906000526020600020905b81548152906001019060200180831161080d57829003601f168201915b5050505050905090565b600061083f826123f5565b61087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590613ac4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c482610e4e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90613b84565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610954612461565b73ffffffffffffffffffffffffffffffffffffffff16148061098357506109828161097d612461565b61214b565b5b6109c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b9906139e4565b60405180910390fd5b6109cc8383612469565b505050565b60011515600760149054906101000a900460ff16151514610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e906138a4565b60405180910390fd5b61270f60095410610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6490613bc4565b60405180910390fd5b60008111610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa790613b44565b60405180910390fd5b600a811115610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90613b64565b60405180910390fd5b61270f81600954610b059190613d31565b1115610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d90613c04565b60405180910390fd5b610b4f33610f00565b816064610b5c9190613db8565b1115610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b94906138c4565b60405180910390fd5b60005b81811015610bd257610bbf3382600954610bba9190613d31565b612522565b8080610bca90613f5f565b915050610ba0565b508060096000828254610be59190613d31565b92505081905550806064610bf99190613db8565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c439190613e12565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b610c9a610c94612461565b82612540565b610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090613ba4565b60405180910390fd5b610ce483838361261e565b505050565b610cf1612461565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61143f565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613ae4565b60405180910390fd5b6000600760146101000a81548160ff021916908315150217905550565b610d8a612461565b73ffffffffffffffffffffffffffffffffffffffff16610da861143f565b73ffffffffffffffffffffffffffffffffffffffff1614610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613ae4565b60405180910390fd5b6001600760146101000a81548160ff021916908315150217905550565b610e3683838360405180602001604052806000815250611d7e565b505050565b600760149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613a24565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613c24565b60405180910390fd5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090613a04565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611078612461565b73ffffffffffffffffffffffffffffffffffffffff1661109661143f565b73ffffffffffffffffffffffffffffffffffffffff16146110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60095481565b606060006111c083610fb8565b9050600081141561124357600067ffffffffffffffff81111561120c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561123a5781602001602082028036833780820191505090505b5091505061137e565b60008167ffffffffffffffff811115611285577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112b35781602001602082028036833780820191505090505b5090506000805b6127108111611376576112cc816123f5565b15611363578573ffffffffffffffffffffffffffffffffffffffff166112f182610e4e565b73ffffffffffffffffffffffffffffffffffffffff1614156113625780838381518110611347577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050818061135e90613f5f565b9250505b5b808061136e90613f5f565b9150506112ba565b508193505050505b919050565b61138b612461565b73ffffffffffffffffffffffffffffffffffffffff166113a961143f565b73ffffffffffffffffffffffffffffffffffffffff16146113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f690613ae4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061143d57600080fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461147890613efc565b80601f01602080910402602001604051908101604052809291908181526020018280546114a490613efc565b80156114f15780601f106114c6576101008083540402835291602001916114f1565b820191906000526020600020905b8154815290600101906020018083116114d457829003601f168201915b5050505050905090565b600061271060095410611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90613964565b60405180910390fd5b6000600954905061251c8110611564576714d1120d7b16000091505061173d565b612328811061157e576710a741a46278000091505061173d565b612134811061159857670b1a2bc2ec50000091505061173d565b611f4081106115b257670905438e6001000091505061173d565b611d4c81106115cc576706f05b59d3b2000091505061173d565b611b5881106115e65767058d15e17628000091505061173d565b611964811061160057670429d069189e000091505061173d565b611770811061161a576703782dace9d9000091505061173d565b61157c8110611634576702c68af0bb14000091505061173d565b611388811061164e57670214e8348c4f000091505061173d565b61119481106116685767016345785d8a000091505061173d565b610fa081106116825767012dfb0cb5e8800091505061173d565b610dac811061169b5766f8b0a10e47000091505061173d565b610bb881106116b45766d529ae9e86000091505061173d565b6109c481106116cd5766b1a2bc2ec5000091505061173d565b6107d081106116e657668e1bc9bf04000091505061173d565b6105dc81106116ff57666a94d74f43000091505061173d565b6103e881106117185766470de4df82000091505061173d565b6101f4811061173157662386f26fc1000091505061173d565b6611c37937e080009150505b90565b60011515600760149054906101000a900460ff16151514611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d906138a4565b60405180910390fd5b612710600954106117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d390613bc4565b60405180910390fd5b6000821161181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613b44565b60405180910390fd5b6019821115611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90613944565b60405180910390fd5b612710826009546118749190613d31565b11156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac90613be4565b60405180910390fd5b601982141561192f573482604b60646118cc6114fb565b6118d69190613d87565b6118e09190613db8565b6118ea9190613db8565b1461192a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192190613a64565b60405180910390fd5b6119fe565b600a82106119a8573482605a60646119456114fb565b61194f9190613d87565b6119599190613db8565b6119639190613db8565b146119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a90613a64565b60405180910390fd5b6119fd565b34826119b26114fb565b6119bc9190613db8565b146119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390613a64565b60405180910390fd5b5b5b60005b82811015611bd957611a203382600954611a1b9190613d31565b612522565b61270f6009541415611a3957611a3833612710612522565b5b600a600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a859190613d31565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611b315750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611bc6576005600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b829190613d31565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8080611bd190613f5f565b915050611a01565b508160096000828254611bec9190613d31565b925050819055505050565b611bff612461565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c64906139a4565b60405180910390fd5b8060056000611c7a612461565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d27612461565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d6c9190613867565b60405180910390a35050565b61271081565b611d8f611d89612461565b83612540565b611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc590613ba4565b60405180910390fd5b611dda8484848461287a565b50505050565b6060611deb826123f5565b611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190613aa4565b60405180910390fd5b6000600660008481526020019081526020016000208054611e4a90613efc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7690613efc565b8015611ec35780601f10611e9857610100808354040283529160200191611ec3565b820191906000526020600020905b815481529060010190602001808311611ea657829003601f168201915b505050505090506000611ed46128d6565b9050600081511415611eea578192505050611f2d565b600082511115611f1f578082604051602001611f079291906137ba565b60405160208183030381529060405292505050611f2d565b611f2884612913565b925050505b919050565b611f3a612461565b73ffffffffffffffffffffffffffffffffffffffff16611f5861143f565b73ffffffffffffffffffffffffffffffffffffffff1614611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590613c24565b60405180910390fd5b600954600a5410612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90613bc4565b60405180910390fd5b600082116120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90613b44565b60405180910390fd5b606e82600a546120b79190613d31565b11156120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90613a44565b60405180910390fd5b60005b8281101561212d5761211a8282600a546121159190613d31565b612522565b808061212590613f5f565b9150506120fb565b5081600a60008282546121409190613d31565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121e7612461565b73ffffffffffffffffffffffffffffffffffffffff1661220561143f565b73ffffffffffffffffffffffffffffffffffffffff161461225b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225290613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c290613904565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124dc83610e4e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61253c8282604051806020016040528060008152506129ba565b5050565b600061254b826123f5565b61258a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612581906139c4565b60405180910390fd5b600061259583610e4e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260457508373ffffffffffffffffffffffffffffffffffffffff166125ec84610834565b73ffffffffffffffffffffffffffffffffffffffff16145b806126155750612614818561214b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661263e82610e4e565b73ffffffffffffffffffffffffffffffffffffffff1614612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90613b04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb90613984565b60405180910390fd5b61270f838383612a15565b61271a600082612469565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461276a9190613e12565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c19190613d31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61288584848461261e565b61289184848484612a1a565b6128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c7906138e4565b60405180910390fd5b50505050565b60606040518060400160405280602081526020017f68747470733a2f2f7265616c63727970746f70756e6b732e636f6d2f6170692f815250905090565b606061291e826123f5565b61295d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490613b24565b60405180910390fd5b60006129676128d6565b9050600081511161298757604051806020016040528060008152506129b2565b8061299184612bb1565b6040516020016129a29291906137ba565b6040516020818303038152906040525b915050919050565b6129c48383612d5e565b6129d16000848484612a1a565b612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a07906138e4565b60405180910390fd5b505050565b505050565b6000612a3b8473ffffffffffffffffffffffffffffffffffffffff16612f2c565b15612ba4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a64612461565b8786866040518563ffffffff1660e01b8152600401612a8694939291906137f9565b602060405180830381600087803b158015612aa057600080fd5b505af1925050508015612ad157506040513d601f19601f82011682018060405250810190612ace91906131e0565b60015b612b54573d8060008114612b01576040519150601f19603f3d011682016040523d82523d6000602084013e612b06565b606091505b50600081511415612b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b43906138e4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ba9565b600190505b949350505050565b60606000821415612bf9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d59565b600082905060005b60008214612c2b578080612c1490613f5f565b915050600a82612c249190613d87565b9150612c01565b60008167ffffffffffffffff811115612c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c9f5781602001600182028036833780820191505090505b5090505b60008514612d5257600182612cb89190613e12565b9150600a85612cc79190613fa8565b6030612cd39190613d31565b60f81b818381518110612d0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d4b9190613d87565b9450612ca3565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc590613a84565b60405180910390fd5b612dd7816123f5565b15612e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0e90613924565b60405180910390fd5b612e2360008383612a15565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e739190613d31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000612f52612f4d84613c84565b613c5f565b905082815260208101848484011115612f6a57600080fd5b612f75848285613eba565b509392505050565b600081359050612f8c81614843565b92915050565b600081359050612fa18161485a565b92915050565b600081359050612fb681614871565b92915050565b600081519050612fcb81614871565b92915050565b600082601f830112612fe257600080fd5b8135612ff2848260208601612f3f565b91505092915050565b60008135905061300a81614888565b92915050565b60006020828403121561302257600080fd5b600061303084828501612f7d565b91505092915050565b6000806040838503121561304c57600080fd5b600061305a85828601612f7d565b925050602061306b85828601612f7d565b9150509250929050565b60008060006060848603121561308a57600080fd5b600061309886828701612f7d565b93505060206130a986828701612f7d565b92505060406130ba86828701612ffb565b9150509250925092565b600080600080608085870312156130da57600080fd5b60006130e887828801612f7d565b94505060206130f987828801612f7d565b935050604061310a87828801612ffb565b925050606085013567ffffffffffffffff81111561312757600080fd5b61313387828801612fd1565b91505092959194509250565b6000806040838503121561315257600080fd5b600061316085828601612f7d565b925050602061317185828601612f92565b9150509250929050565b6000806040838503121561318e57600080fd5b600061319c85828601612f7d565b92505060206131ad85828601612ffb565b9150509250929050565b6000602082840312156131c957600080fd5b60006131d784828501612fa7565b91505092915050565b6000602082840312156131f257600080fd5b600061320084828501612fbc565b91505092915050565b60006020828403121561321b57600080fd5b600061322984828501612ffb565b91505092915050565b6000806040838503121561324557600080fd5b600061325385828601612ffb565b925050602061326485828601612f7d565b9150509250929050565b600061327a838361379c565b60208301905092915050565b61328f81613e46565b82525050565b60006132a082613cc5565b6132aa8185613cf3565b93506132b583613cb5565b8060005b838110156132e65781516132cd888261326e565b97506132d883613ce6565b9250506001810190506132b9565b5085935050505092915050565b6132fc81613e58565b82525050565b600061330d82613cd0565b6133178185613d04565b9350613327818560208601613ec9565b61333081614095565b840191505092915050565b600061334682613cdb565b6133508185613d15565b9350613360818560208601613ec9565b61336981614095565b840191505092915050565b600061337f82613cdb565b6133898185613d26565b9350613399818560208601613ec9565b80840191505092915050565b60006133b2601583613d15565b91506133bd826140a6565b602082019050919050565b60006133d5601883613d15565b91506133e0826140cf565b602082019050919050565b60006133f8603283613d15565b9150613403826140f8565b604082019050919050565b600061341b602683613d15565b915061342682614147565b604082019050919050565b600061343e601c83613d15565b915061344982614196565b602082019050919050565b6000613461603283613d15565b915061346c826141bf565b604082019050919050565b6000613484600f83613d15565b915061348f8261420e565b602082019050919050565b60006134a7602483613d15565b91506134b282614237565b604082019050919050565b60006134ca601983613d15565b91506134d582614286565b602082019050919050565b60006134ed602c83613d15565b91506134f8826142af565b604082019050919050565b6000613510603883613d15565b915061351b826142fe565b604082019050919050565b6000613533602a83613d15565b915061353e8261434d565b604082019050919050565b6000613556602983613d15565b91506135618261439c565b604082019050919050565b6000613579603883613d15565b9150613584826143eb565b604082019050919050565b600061359c601683613d15565b91506135a78261443a565b602082019050919050565b60006135bf602083613d15565b91506135ca82614463565b602082019050919050565b60006135e2603183613d15565b91506135ed8261448c565b604082019050919050565b6000613605602c83613d15565b9150613610826144db565b604082019050919050565b6000613628602083613d15565b91506136338261452a565b602082019050919050565b600061364b602983613d15565b915061365682614553565b604082019050919050565b600061366e602f83613d15565b9150613679826145a2565b604082019050919050565b6000613691602983613d15565b915061369c826145f1565b604082019050919050565b60006136b4603283613d15565b91506136bf82614640565b604082019050919050565b60006136d7602183613d15565b91506136e28261468f565b604082019050919050565b60006136fa603183613d15565b9150613705826146de565b604082019050919050565b600061371d601183613d15565b91506137288261472d565b602082019050919050565b6000613740603883613d15565b915061374b82614756565b604082019050919050565b6000613763602e83613d15565b915061376e826147a5565b604082019050919050565b6000613786602283613d15565b9150613791826147f4565b604082019050919050565b6137a581613eb0565b82525050565b6137b481613eb0565b82525050565b60006137c68285613374565b91506137d28284613374565b91508190509392505050565b60006020820190506137f36000830184613286565b92915050565b600060808201905061380e6000830187613286565b61381b6020830186613286565b61382860408301856137ab565b818103606083015261383a8184613302565b905095945050505050565b6000602082019050818103600083015261385f8184613295565b905092915050565b600060208201905061387c60008301846132f3565b92915050565b6000602082019050818103600083015261389c818461333b565b905092915050565b600060208201905081810360008301526138bd816133a5565b9050919050565b600060208201905081810360008301526138dd816133c8565b9050919050565b600060208201905081810360008301526138fd816133eb565b9050919050565b6000602082019050818103600083015261391d8161340e565b9050919050565b6000602082019050818103600083015261393d81613431565b9050919050565b6000602082019050818103600083015261395d81613454565b9050919050565b6000602082019050818103600083015261397d81613477565b9050919050565b6000602082019050818103600083015261399d8161349a565b9050919050565b600060208201905081810360008301526139bd816134bd565b9050919050565b600060208201905081810360008301526139dd816134e0565b9050919050565b600060208201905081810360008301526139fd81613503565b9050919050565b60006020820190508181036000830152613a1d81613526565b9050919050565b60006020820190508181036000830152613a3d81613549565b9050919050565b60006020820190508181036000830152613a5d8161356c565b9050919050565b60006020820190508181036000830152613a7d8161358f565b9050919050565b60006020820190508181036000830152613a9d816135b2565b9050919050565b60006020820190508181036000830152613abd816135d5565b9050919050565b60006020820190508181036000830152613add816135f8565b9050919050565b60006020820190508181036000830152613afd8161361b565b9050919050565b60006020820190508181036000830152613b1d8161363e565b9050919050565b60006020820190508181036000830152613b3d81613661565b9050919050565b60006020820190508181036000830152613b5d81613684565b9050919050565b60006020820190508181036000830152613b7d816136a7565b9050919050565b60006020820190508181036000830152613b9d816136ca565b9050919050565b60006020820190508181036000830152613bbd816136ed565b9050919050565b60006020820190508181036000830152613bdd81613710565b9050919050565b60006020820190508181036000830152613bfd81613733565b9050919050565b60006020820190508181036000830152613c1d81613756565b9050919050565b60006020820190508181036000830152613c3d81613779565b9050919050565b6000602082019050613c5960008301846137ab565b92915050565b6000613c69613c7a565b9050613c758282613f2e565b919050565b6000604051905090565b600067ffffffffffffffff821115613c9f57613c9e614066565b5b613ca882614095565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d3c82613eb0565b9150613d4783613eb0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d7c57613d7b613fd9565b5b828201905092915050565b6000613d9282613eb0565b9150613d9d83613eb0565b925082613dad57613dac614008565b5b828204905092915050565b6000613dc382613eb0565b9150613dce83613eb0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0757613e06613fd9565b5b828202905092915050565b6000613e1d82613eb0565b9150613e2883613eb0565b925082821015613e3b57613e3a613fd9565b5b828203905092915050565b6000613e5182613e90565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ee7578082015181840152602081019050613ecc565b83811115613ef6576000848401525b50505050565b60006002820490506001821680613f1457607f821691505b60208210811415613f2857613f27614037565b5b50919050565b613f3782614095565b810181811067ffffffffffffffff82111715613f5657613f55614066565b5b80604052505050565b6000613f6a82613eb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f9d57613f9c613fd9565b5b600182019050919050565b6000613fb382613eb0565b9150613fbe83613eb0565b925082613fce57613fcd614008565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c6520686173206e6f7420737461727465642e0000000000000000000000600082015250565b7f4e6f7420656e6f75676820626f6e757320706f696e74732e0000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752063616e206f6e6c7920627579206d6178203235205265616c4372797060008201527f746f50756e6b7320617420612074696d652e0000000000000000000000000000602082015250565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f54686520616d6f756e7420796f752061726520747279696e6720746f2062757960008201527f2065786365656473206d6178206f776e6572206d696e742e0000000000000000602082015250565b7f496e636f72726563742045746865722076616c75652e00000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f75206d75737420627579206174206c65617374206f6e65205265616c437260008201527f7970746f50756e6b2e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c7920627579206d6178203130205265616c4372797060008201527f746f50756e6b7320617420612074696d652e0000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f537570706c792068617320656e6465642e000000000000000000000000000000600082015250565b7f54686520616d6f756e7420796f752061726520747279696e6720746f2062757960008201527f2065786365656473204d41585f4e46545f535550504c592e0000000000000000602082015250565b7f54686520616d6f756e7420796f752061726520747279696e6720746f2062757960008201527f206578636565647320393939392e000000000000000000000000000000000000602082015250565b7f4552433732313a20717565727920666f7220746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b61484c81613e46565b811461485757600080fd5b50565b61486381613e58565b811461486e57600080fd5b50565b61487a81613e64565b811461488557600080fd5b50565b61489181613eb0565b811461489c57600080fd5b5056fea2646970667358221220004552ecddf1ad946a6e61eae1467d7e44f6ade18c42d894e7088cbff86ac58c64736f6c63430008010033

Deployed Bytecode

0x6080604052600436106101c25760003560e01c8063715018a6116100f7578063a0517e3911610095578063c87b56dd11610064578063c87b56dd146105ee578063d52c57e01461062b578063e985e9c514610654578063f2fde38b14610691576101c2565b8063a0517e3914610555578063a22cb46514610571578063b5077f441461059a578063b88d4fde146105c5576101c2565b8063853828b6116100d1578063853828b6146104ca5780638da5cb5b146104d457806395d89b41146104ff57806398d5fdca1461052a576101c2565b8063715018a61461044b5780637cd49fde146104625780638462151c1461048d576101c2565b80632808c92c116101645780635c474f9e1161013e5780635c474f9e146103695780636352211e1461039457806368654ef8146103d157806370a082311461040e576101c2565b80632808c92c1461031257806334d84c7b1461032957806342842e0e14610340576101c2565b8063081812fc116101a0578063081812fc1461025a578063095ea7b3146102975780631f5011b5146102c057806323b872dd146102e9576101c2565b8063013c982d146101c757806301ffc9a7146101f257806306fdde031461022f575b600080fd5b3480156101d357600080fd5b506101dc6106ba565b6040516101e99190613c44565b60405180910390f35b3480156101fe57600080fd5b50610219600480360381019061021491906131b7565b6106c0565b6040516102269190613867565b60405180910390f35b34801561023b57600080fd5b506102446107a2565b6040516102519190613882565b60405180910390f35b34801561026657600080fd5b50610281600480360381019061027c9190613209565b610834565b60405161028e91906137de565b60405180910390f35b3480156102a357600080fd5b506102be60048036038101906102b9919061317b565b6108b9565b005b3480156102cc57600080fd5b506102e760048036038101906102e29190613209565b6109d1565b005b3480156102f557600080fd5b50610310600480360381019061030b9190613075565b610c89565b005b34801561031e57600080fd5b50610327610ce9565b005b34801561033557600080fd5b5061033e610d82565b005b34801561034c57600080fd5b5061036760048036038101906103629190613075565b610e1b565b005b34801561037557600080fd5b5061037e610e3b565b60405161038b9190613867565b60405180910390f35b3480156103a057600080fd5b506103bb60048036038101906103b69190613209565b610e4e565b6040516103c891906137de565b60405180910390f35b3480156103dd57600080fd5b506103f860048036038101906103f39190613010565b610f00565b6040516104059190613c44565b60405180910390f35b34801561041a57600080fd5b5061043560048036038101906104309190613010565b610fb8565b6040516104429190613c44565b60405180910390f35b34801561045757600080fd5b50610460611070565b005b34801561046e57600080fd5b506104776111ad565b6040516104849190613c44565b60405180910390f35b34801561049957600080fd5b506104b460048036038101906104af9190613010565b6111b3565b6040516104c19190613845565b60405180910390f35b6104d2611383565b005b3480156104e057600080fd5b506104e961143f565b6040516104f691906137de565b60405180910390f35b34801561050b57600080fd5b50610514611469565b6040516105219190613882565b60405180910390f35b34801561053657600080fd5b5061053f6114fb565b60405161054c9190613c44565b60405180910390f35b61056f600480360381019061056a9190613232565b611740565b005b34801561057d57600080fd5b506105986004803603810190610593919061313f565b611bf7565b005b3480156105a657600080fd5b506105af611d78565b6040516105bc9190613c44565b60405180910390f35b3480156105d157600080fd5b506105ec60048036038101906105e791906130c4565b611d7e565b005b3480156105fa57600080fd5b5061061560048036038101906106109190613209565b611de0565b6040516106229190613882565b60405180910390f35b34801561063757600080fd5b50610652600480360381019061064d9190613232565b611f32565b005b34801561066057600080fd5b5061067b60048036038101906106769190613039565b61214b565b6040516106889190613867565b60405180910390f35b34801561069d57600080fd5b506106b860048036038101906106b39190613010565b6121df565b005b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061079b575061079a8261238b565b5b9050919050565b6060600080546107b190613efc565b80601f01602080910402602001604051908101604052809291908181526020018280546107dd90613efc565b801561082a5780601f106107ff5761010080835404028352916020019161082a565b820191906000526020600020905b81548152906001019060200180831161080d57829003601f168201915b5050505050905090565b600061083f826123f5565b61087e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087590613ac4565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108c482610e4e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092c90613b84565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610954612461565b73ffffffffffffffffffffffffffffffffffffffff16148061098357506109828161097d612461565b61214b565b5b6109c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b9906139e4565b60405180910390fd5b6109cc8383612469565b505050565b60011515600760149054906101000a900460ff16151514610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e906138a4565b60405180910390fd5b61270f60095410610a6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6490613bc4565b60405180910390fd5b60008111610ab0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa790613b44565b60405180910390fd5b600a811115610af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aeb90613b64565b60405180910390fd5b61270f81600954610b059190613d31565b1115610b46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3d90613c04565b60405180910390fd5b610b4f33610f00565b816064610b5c9190613db8565b1115610b9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b94906138c4565b60405180910390fd5b60005b81811015610bd257610bbf3382600954610bba9190613d31565b612522565b8080610bca90613f5f565b915050610ba0565b508060096000828254610be59190613d31565b92505081905550806064610bf99190613db8565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610c439190613e12565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b610c9a610c94612461565b82612540565b610cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd090613ba4565b60405180910390fd5b610ce483838361261e565b505050565b610cf1612461565b73ffffffffffffffffffffffffffffffffffffffff16610d0f61143f565b73ffffffffffffffffffffffffffffffffffffffff1614610d65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5c90613ae4565b60405180910390fd5b6000600760146101000a81548160ff021916908315150217905550565b610d8a612461565b73ffffffffffffffffffffffffffffffffffffffff16610da861143f565b73ffffffffffffffffffffffffffffffffffffffff1614610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590613ae4565b60405180910390fd5b6001600760146101000a81548160ff021916908315150217905550565b610e3683838360405180602001604052806000815250611d7e565b505050565b600760149054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613a24565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890613c24565b60405180910390fd5b600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090613a04565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611078612461565b73ffffffffffffffffffffffffffffffffffffffff1661109661143f565b73ffffffffffffffffffffffffffffffffffffffff16146110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60095481565b606060006111c083610fb8565b9050600081141561124357600067ffffffffffffffff81111561120c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561123a5781602001602082028036833780820191505090505b5091505061137e565b60008167ffffffffffffffff811115611285577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112b35781602001602082028036833780820191505090505b5090506000805b6127108111611376576112cc816123f5565b15611363578573ffffffffffffffffffffffffffffffffffffffff166112f182610e4e565b73ffffffffffffffffffffffffffffffffffffffff1614156113625780838381518110611347577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050818061135e90613f5f565b9250505b5b808061136e90613f5f565b9150506112ba565b508193505050505b919050565b61138b612461565b73ffffffffffffffffffffffffffffffffffffffff166113a961143f565b73ffffffffffffffffffffffffffffffffffffffff16146113ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f690613ae4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061143d57600080fd5b565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461147890613efc565b80601f01602080910402602001604051908101604052809291908181526020018280546114a490613efc565b80156114f15780601f106114c6576101008083540402835291602001916114f1565b820191906000526020600020905b8154815290600101906020018083116114d457829003601f168201915b5050505050905090565b600061271060095410611543576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153a90613964565b60405180910390fd5b6000600954905061251c8110611564576714d1120d7b16000091505061173d565b612328811061157e576710a741a46278000091505061173d565b612134811061159857670b1a2bc2ec50000091505061173d565b611f4081106115b257670905438e6001000091505061173d565b611d4c81106115cc576706f05b59d3b2000091505061173d565b611b5881106115e65767058d15e17628000091505061173d565b611964811061160057670429d069189e000091505061173d565b611770811061161a576703782dace9d9000091505061173d565b61157c8110611634576702c68af0bb14000091505061173d565b611388811061164e57670214e8348c4f000091505061173d565b61119481106116685767016345785d8a000091505061173d565b610fa081106116825767012dfb0cb5e8800091505061173d565b610dac811061169b5766f8b0a10e47000091505061173d565b610bb881106116b45766d529ae9e86000091505061173d565b6109c481106116cd5766b1a2bc2ec5000091505061173d565b6107d081106116e657668e1bc9bf04000091505061173d565b6105dc81106116ff57666a94d74f43000091505061173d565b6103e881106117185766470de4df82000091505061173d565b6101f4811061173157662386f26fc1000091505061173d565b6611c37937e080009150505b90565b60011515600760149054906101000a900460ff16151514611796576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178d906138a4565b60405180910390fd5b612710600954106117dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d390613bc4565b60405180910390fd5b6000821161181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613b44565b60405180910390fd5b6019821115611863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185a90613944565b60405180910390fd5b612710826009546118749190613d31565b11156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac90613be4565b60405180910390fd5b601982141561192f573482604b60646118cc6114fb565b6118d69190613d87565b6118e09190613db8565b6118ea9190613db8565b1461192a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192190613a64565b60405180910390fd5b6119fe565b600a82106119a8573482605a60646119456114fb565b61194f9190613d87565b6119599190613db8565b6119639190613db8565b146119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a90613a64565b60405180910390fd5b6119fd565b34826119b26114fb565b6119bc9190613db8565b146119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f390613a64565b60405180910390fd5b5b5b60005b82811015611bd957611a203382600954611a1b9190613d31565b612522565b61270f6009541415611a3957611a3833612710612522565b5b600a600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611a859190613d31565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611b315750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611bc6576005600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b829190613d31565b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8080611bd190613f5f565b915050611a01565b508160096000828254611bec9190613d31565b925050819055505050565b611bff612461565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c64906139a4565b60405180910390fd5b8060056000611c7a612461565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d27612461565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d6c9190613867565b60405180910390a35050565b61271081565b611d8f611d89612461565b83612540565b611dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc590613ba4565b60405180910390fd5b611dda8484848461287a565b50505050565b6060611deb826123f5565b611e2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2190613aa4565b60405180910390fd5b6000600660008481526020019081526020016000208054611e4a90613efc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7690613efc565b8015611ec35780601f10611e9857610100808354040283529160200191611ec3565b820191906000526020600020905b815481529060010190602001808311611ea657829003601f168201915b505050505090506000611ed46128d6565b9050600081511415611eea578192505050611f2d565b600082511115611f1f578082604051602001611f079291906137ba565b60405160208183030381529060405292505050611f2d565b611f2884612913565b925050505b919050565b611f3a612461565b73ffffffffffffffffffffffffffffffffffffffff16611f5861143f565b73ffffffffffffffffffffffffffffffffffffffff1614611fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa590613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561201e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201590613c24565b60405180910390fd5b600954600a5410612064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205b90613bc4565b60405180910390fd5b600082116120a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209e90613b44565b60405180910390fd5b606e82600a546120b79190613d31565b11156120f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ef90613a44565b60405180910390fd5b60005b8281101561212d5761211a8282600a546121159190613d31565b612522565b808061212590613f5f565b9150506120fb565b5081600a60008282546121409190613d31565b925050819055505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121e7612461565b73ffffffffffffffffffffffffffffffffffffffff1661220561143f565b73ffffffffffffffffffffffffffffffffffffffff161461225b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225290613ae4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156122cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c290613904565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124dc83610e4e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61253c8282604051806020016040528060008152506129ba565b5050565b600061254b826123f5565b61258a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612581906139c4565b60405180910390fd5b600061259583610e4e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061260457508373ffffffffffffffffffffffffffffffffffffffff166125ec84610834565b73ffffffffffffffffffffffffffffffffffffffff16145b806126155750612614818561214b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661263e82610e4e565b73ffffffffffffffffffffffffffffffffffffffff1614612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90613b04565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612704576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fb90613984565b60405180910390fd5b61270f838383612a15565b61271a600082612469565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461276a9190613e12565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c19190613d31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61288584848461261e565b61289184848484612a1a565b6128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c7906138e4565b60405180910390fd5b50505050565b60606040518060400160405280602081526020017f68747470733a2f2f7265616c63727970746f70756e6b732e636f6d2f6170692f815250905090565b606061291e826123f5565b61295d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161295490613b24565b60405180910390fd5b60006129676128d6565b9050600081511161298757604051806020016040528060008152506129b2565b8061299184612bb1565b6040516020016129a29291906137ba565b6040516020818303038152906040525b915050919050565b6129c48383612d5e565b6129d16000848484612a1a565b612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a07906138e4565b60405180910390fd5b505050565b505050565b6000612a3b8473ffffffffffffffffffffffffffffffffffffffff16612f2c565b15612ba4578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a64612461565b8786866040518563ffffffff1660e01b8152600401612a8694939291906137f9565b602060405180830381600087803b158015612aa057600080fd5b505af1925050508015612ad157506040513d601f19601f82011682018060405250810190612ace91906131e0565b60015b612b54573d8060008114612b01576040519150601f19603f3d011682016040523d82523d6000602084013e612b06565b606091505b50600081511415612b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b43906138e4565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ba9565b600190505b949350505050565b60606000821415612bf9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d59565b600082905060005b60008214612c2b578080612c1490613f5f565b915050600a82612c249190613d87565b9150612c01565b60008167ffffffffffffffff811115612c6d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612c9f5781602001600182028036833780820191505090505b5090505b60008514612d5257600182612cb89190613e12565b9150600a85612cc79190613fa8565b6030612cd39190613d31565b60f81b818381518110612d0f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d4b9190613d87565b9450612ca3565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc590613a84565b60405180910390fd5b612dd7816123f5565b15612e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0e90613924565b60405180910390fd5b612e2360008383612a15565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e739190613d31565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b6000612f52612f4d84613c84565b613c5f565b905082815260208101848484011115612f6a57600080fd5b612f75848285613eba565b509392505050565b600081359050612f8c81614843565b92915050565b600081359050612fa18161485a565b92915050565b600081359050612fb681614871565b92915050565b600081519050612fcb81614871565b92915050565b600082601f830112612fe257600080fd5b8135612ff2848260208601612f3f565b91505092915050565b60008135905061300a81614888565b92915050565b60006020828403121561302257600080fd5b600061303084828501612f7d565b91505092915050565b6000806040838503121561304c57600080fd5b600061305a85828601612f7d565b925050602061306b85828601612f7d565b9150509250929050565b60008060006060848603121561308a57600080fd5b600061309886828701612f7d565b93505060206130a986828701612f7d565b92505060406130ba86828701612ffb565b9150509250925092565b600080600080608085870312156130da57600080fd5b60006130e887828801612f7d565b94505060206130f987828801612f7d565b935050604061310a87828801612ffb565b925050606085013567ffffffffffffffff81111561312757600080fd5b61313387828801612fd1565b91505092959194509250565b6000806040838503121561315257600080fd5b600061316085828601612f7d565b925050602061317185828601612f92565b9150509250929050565b6000806040838503121561318e57600080fd5b600061319c85828601612f7d565b92505060206131ad85828601612ffb565b9150509250929050565b6000602082840312156131c957600080fd5b60006131d784828501612fa7565b91505092915050565b6000602082840312156131f257600080fd5b600061320084828501612fbc565b91505092915050565b60006020828403121561321b57600080fd5b600061322984828501612ffb565b91505092915050565b6000806040838503121561324557600080fd5b600061325385828601612ffb565b925050602061326485828601612f7d565b9150509250929050565b600061327a838361379c565b60208301905092915050565b61328f81613e46565b82525050565b60006132a082613cc5565b6132aa8185613cf3565b93506132b583613cb5565b8060005b838110156132e65781516132cd888261326e565b97506132d883613ce6565b9250506001810190506132b9565b5085935050505092915050565b6132fc81613e58565b82525050565b600061330d82613cd0565b6133178185613d04565b9350613327818560208601613ec9565b61333081614095565b840191505092915050565b600061334682613cdb565b6133508185613d15565b9350613360818560208601613ec9565b61336981614095565b840191505092915050565b600061337f82613cdb565b6133898185613d26565b9350613399818560208601613ec9565b80840191505092915050565b60006133b2601583613d15565b91506133bd826140a6565b602082019050919050565b60006133d5601883613d15565b91506133e0826140cf565b602082019050919050565b60006133f8603283613d15565b9150613403826140f8565b604082019050919050565b600061341b602683613d15565b915061342682614147565b604082019050919050565b600061343e601c83613d15565b915061344982614196565b602082019050919050565b6000613461603283613d15565b915061346c826141bf565b604082019050919050565b6000613484600f83613d15565b915061348f8261420e565b602082019050919050565b60006134a7602483613d15565b91506134b282614237565b604082019050919050565b60006134ca601983613d15565b91506134d582614286565b602082019050919050565b60006134ed602c83613d15565b91506134f8826142af565b604082019050919050565b6000613510603883613d15565b915061351b826142fe565b604082019050919050565b6000613533602a83613d15565b915061353e8261434d565b604082019050919050565b6000613556602983613d15565b91506135618261439c565b604082019050919050565b6000613579603883613d15565b9150613584826143eb565b604082019050919050565b600061359c601683613d15565b91506135a78261443a565b602082019050919050565b60006135bf602083613d15565b91506135ca82614463565b602082019050919050565b60006135e2603183613d15565b91506135ed8261448c565b604082019050919050565b6000613605602c83613d15565b9150613610826144db565b604082019050919050565b6000613628602083613d15565b91506136338261452a565b602082019050919050565b600061364b602983613d15565b915061365682614553565b604082019050919050565b600061366e602f83613d15565b9150613679826145a2565b604082019050919050565b6000613691602983613d15565b915061369c826145f1565b604082019050919050565b60006136b4603283613d15565b91506136bf82614640565b604082019050919050565b60006136d7602183613d15565b91506136e28261468f565b604082019050919050565b60006136fa603183613d15565b9150613705826146de565b604082019050919050565b600061371d601183613d15565b91506137288261472d565b602082019050919050565b6000613740603883613d15565b915061374b82614756565b604082019050919050565b6000613763602e83613d15565b915061376e826147a5565b604082019050919050565b6000613786602283613d15565b9150613791826147f4565b604082019050919050565b6137a581613eb0565b82525050565b6137b481613eb0565b82525050565b60006137c68285613374565b91506137d28284613374565b91508190509392505050565b60006020820190506137f36000830184613286565b92915050565b600060808201905061380e6000830187613286565b61381b6020830186613286565b61382860408301856137ab565b818103606083015261383a8184613302565b905095945050505050565b6000602082019050818103600083015261385f8184613295565b905092915050565b600060208201905061387c60008301846132f3565b92915050565b6000602082019050818103600083015261389c818461333b565b905092915050565b600060208201905081810360008301526138bd816133a5565b9050919050565b600060208201905081810360008301526138dd816133c8565b9050919050565b600060208201905081810360008301526138fd816133eb565b9050919050565b6000602082019050818103600083015261391d8161340e565b9050919050565b6000602082019050818103600083015261393d81613431565b9050919050565b6000602082019050818103600083015261395d81613454565b9050919050565b6000602082019050818103600083015261397d81613477565b9050919050565b6000602082019050818103600083015261399d8161349a565b9050919050565b600060208201905081810360008301526139bd816134bd565b9050919050565b600060208201905081810360008301526139dd816134e0565b9050919050565b600060208201905081810360008301526139fd81613503565b9050919050565b60006020820190508181036000830152613a1d81613526565b9050919050565b60006020820190508181036000830152613a3d81613549565b9050919050565b60006020820190508181036000830152613a5d8161356c565b9050919050565b60006020820190508181036000830152613a7d8161358f565b9050919050565b60006020820190508181036000830152613a9d816135b2565b9050919050565b60006020820190508181036000830152613abd816135d5565b9050919050565b60006020820190508181036000830152613add816135f8565b9050919050565b60006020820190508181036000830152613afd8161361b565b9050919050565b60006020820190508181036000830152613b1d8161363e565b9050919050565b60006020820190508181036000830152613b3d81613661565b9050919050565b60006020820190508181036000830152613b5d81613684565b9050919050565b60006020820190508181036000830152613b7d816136a7565b9050919050565b60006020820190508181036000830152613b9d816136ca565b9050919050565b60006020820190508181036000830152613bbd816136ed565b9050919050565b60006020820190508181036000830152613bdd81613710565b9050919050565b60006020820190508181036000830152613bfd81613733565b9050919050565b60006020820190508181036000830152613c1d81613756565b9050919050565b60006020820190508181036000830152613c3d81613779565b9050919050565b6000602082019050613c5960008301846137ab565b92915050565b6000613c69613c7a565b9050613c758282613f2e565b919050565b6000604051905090565b600067ffffffffffffffff821115613c9f57613c9e614066565b5b613ca882614095565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d3c82613eb0565b9150613d4783613eb0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d7c57613d7b613fd9565b5b828201905092915050565b6000613d9282613eb0565b9150613d9d83613eb0565b925082613dad57613dac614008565b5b828204905092915050565b6000613dc382613eb0565b9150613dce83613eb0565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e0757613e06613fd9565b5b828202905092915050565b6000613e1d82613eb0565b9150613e2883613eb0565b925082821015613e3b57613e3a613fd9565b5b828203905092915050565b6000613e5182613e90565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ee7578082015181840152602081019050613ecc565b83811115613ef6576000848401525b50505050565b60006002820490506001821680613f1457607f821691505b60208210811415613f2857613f27614037565b5b50919050565b613f3782614095565b810181811067ffffffffffffffff82111715613f5657613f55614066565b5b80604052505050565b6000613f6a82613eb0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f9d57613f9c613fd9565b5b600182019050919050565b6000613fb382613eb0565b9150613fbe83613eb0565b925082613fce57613fcd614008565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c6520686173206e6f7420737461727465642e0000000000000000000000600082015250565b7f4e6f7420656e6f75676820626f6e757320706f696e74732e0000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f596f752063616e206f6e6c7920627579206d6178203235205265616c4372797060008201527f746f50756e6b7320617420612074696d652e0000000000000000000000000000602082015250565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f54686520616d6f756e7420796f752061726520747279696e6720746f2062757960008201527f2065786365656473206d6178206f776e6572206d696e742e0000000000000000602082015250565b7f496e636f72726563742045746865722076616c75652e00000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f75206d75737420627579206174206c65617374206f6e65205265616c437260008201527f7970746f50756e6b2e0000000000000000000000000000000000000000000000602082015250565b7f596f752063616e206f6e6c7920627579206d6178203130205265616c4372797060008201527f746f50756e6b7320617420612074696d652e0000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f537570706c792068617320656e6465642e000000000000000000000000000000600082015250565b7f54686520616d6f756e7420796f752061726520747279696e6720746f2062757960008201527f2065786365656473204d41585f4e46545f535550504c592e0000000000000000602082015250565b7f54686520616d6f756e7420796f752061726520747279696e6720746f2062757960008201527f206578636565647320393939392e000000000000000000000000000000000000602082015250565b7f4552433732313a20717565727920666f7220746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b61484c81613e46565b811461485757600080fd5b50565b61486381613e58565b811461486e57600080fd5b50565b61487a81613e64565b811461488557600080fd5b50565b61489181613eb0565b811461489c57600080fd5b5056fea2646970667358221220004552ecddf1ad946a6e61eae1467d7e44f6ade18c42d894e7088cbff86ac58c64736f6c63430008010033

Deployed Bytecode Sourcemap

155:6446:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;399:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1471:288:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2377:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3796:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3340:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4113:737:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4660:300:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6513:75:11;;;;;;;;;;;;;:::i;:::-;;6431:74;;;;;;;;;;;;;:::i;:::-;;5026:149:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;269:31:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2080:235:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5408:190:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1818:205:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1693:145:10;;;;;;;;;;;;;:::i;:::-;;363:29:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5610:679;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6301:122;;;:::i;:::-;;1061:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2539:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;659:2090:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2761:1340;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4080:290:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;216:46:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5241:282:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;388:663:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4862:534:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4436:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1987:240:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;399:28:11;;;;:::o;1471:288:3:-;1573:4;1611:25;1596:40;;;:11;:40;;;;:104;;;;1667:33;1652:48;;;:11;:48;;;;1596:104;:156;;;;1716:36;1740:11;1716:23;:36::i;:::-;1596:156;1589:163;;1471:288;;;:::o;2377:98::-;2431:13;2463:5;2456:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:98;:::o;3796:217::-;3872:7;3899:16;3907:7;3899;:16::i;:::-;3891:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3982:15;:24;3998:7;3982:24;;;;;;;;;;;;;;;;;;;;;3975:31;;3796:217;;;:::o;3340:395::-;3420:13;3436:23;3451:7;3436:14;:23::i;:::-;3420:39;;3483:5;3477:11;;:2;:11;;;;3469:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3561:5;3545:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;3570:44;3594:5;3601:12;:10;:12::i;:::-;3570:23;:44::i;:::-;3545:69;3537:159;;;;;;;;;;;;:::i;:::-;;;;;;;;;3707:21;3716:2;3720:7;3707:8;:21::i;:::-;3340:395;;;:::o;4113:737:11:-;4191:4;4176:19;;:11;;;;;;;;;;;:19;;;4168:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4251:4;4240:8;;:15;4232:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;4305:1;4296:6;:10;4288:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4381:2;4371:6;:12;;4363:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4478:4;4468:6;4457:8;;:17;;;;:::i;:::-;:25;;4449:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;4568:26;4583:10;4568:14;:26::i;:::-;4558:6;4552:3;:12;;;;:::i;:::-;:42;;4544:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;4639:9;4634:99;4658:6;4654:1;:10;4634:99;;;4686:35;4696:10;4719:1;4708:8;;:12;;;;:::i;:::-;4686:9;:35::i;:::-;4666:3;;;;;:::i;:::-;;;;4634:99;;;;4755:6;4743:8;;:18;;;;;;;:::i;:::-;;;;;;;;4835:6;4829:3;:12;;;;:::i;:::-;4800:13;:25;4814:10;4800:25;;;;;;;;;;;;;;;;:42;;;;:::i;:::-;4772:13;:25;4786:10;4772:25;;;;;;;;;;;;;;;:70;;;;4113:737;:::o;4660:300:3:-;4819:41;4838:12;:10;:12::i;:::-;4852:7;4819:18;:41::i;:::-;4811:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4925:28;4935:4;4941:2;4945:7;4925:9;:28::i;:::-;4660:300;;;:::o;6513:75:11:-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6575:5:11::1;6561:11;;:19;;;;;;;;;;;;;;;;;;6513:75::o:0;6431:74::-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6493:4:11::1;6479:11;;:18;;;;;;;;;;;;;;;;;;6431:74::o:0;5026:149:3:-;5129:39;5146:4;5152:2;5156:7;5129:39;;;;;;;;;;;;:16;:39::i;:::-;5026:149;;;:::o;269:31:11:-;;;;;;;;;;;;;:::o;2080:235:3:-;2152:7;2171:13;2187:7;:16;2195:7;2187:16;;;;;;;;;;;;;;;;;;;;;2171:32;;2238:1;2221:19;;:5;:19;;;;2213:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2303:5;2296:12;;;2080:235;;;:::o;5408:190:11:-;5467:7;5511:1;5494:19;;:5;:19;;;;5486:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5570:13;:20;5584:5;5570:20;;;;;;;;;;;;;;;;5563:27;;5408:190;;;:::o;1818:205:3:-;1890:7;1934:1;1917:19;;:5;:19;;;;1909:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2000:9;:16;2010:5;2000:16;;;;;;;;;;;;;;;;1993:23;;1818:205;;;:::o;1693:145:10:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1799:1:::1;1762:40;;1783:6;;;;;;;;;;;1762:40;;;;;;;;;;;;1829:1;1812:6;;:19;;;;;;;;;;;;;;;;;;1693:145::o:0;363:29:11:-;;;;:::o;5610:679::-;5670:28;5711:18;5732:16;5742:5;5732:9;:16::i;:::-;5711:37;;5779:1;5765:10;:15;5761:521;;;5818:1;5804:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5797:23;;;;;5761:521;5853:23;5893:10;5879:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5853:51;;5919:19;5964:10;5959:282;257:5;5980:2;:20;5959:282;;6031:11;6039:2;6031:7;:11::i;:::-;6027:199;;;6085:5;6070:20;;:11;6078:2;6070:7;:11::i;:::-;:20;;;6066:141;;;6141:2;6119:6;6126:11;6119:19;;;;;;;;;;;;;;;;;;;;;:24;;;;;6170:13;;;;;:::i;:::-;;;;6066:141;6027:199;6002:4;;;;;:::i;:::-;;;;5959:282;;;;6264:6;6257:13;;;;;5610:679;;;;:::o;6301:122::-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6375:10:11::1;6367:24;;:47;6392:21;6367:47;;;;;;;;;;;;;;;;;;;;;;;6359:56;;;::::0;::::1;;6301:122::o:0;1061:85:10:-;1107:7;1133:6;;;;;;;;;;;1126:13;;1061:85;:::o;2539:102:3:-;2595:13;2627:7;2620:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2539:102;:::o;659:2090:11:-;700:7;257:5;728:8;;:25;720:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;784:21;808:8;;784:32;;848:4;831:13;:21;827:1915;;877:19;870:26;;;;;827:1915;946:4;929:13;:21;925:1817;;975:19;968:26;;;;;925:1817;1044:4;1027:13;:21;1023:1719;;1073:18;1066:25;;;;;1023:1719;1141:4;1124:13;:21;1120:1622;;1170:18;1163:25;;;;;1120:1622;1239:4;1222:13;:21;1218:1524;;1268:18;1261:25;;;;;1218:1524;1336:4;1319:13;:21;1315:1427;;1365:18;1358:25;;;;;1315:1427;1433:4;1416:13;:21;1412:1330;;1462:18;1455:25;;;;;1412:1330;1530:4;1513:13;:21;1509:1233;;1559:18;1552:25;;;;;1509:1233;1628:4;1611:13;:21;1607:1135;;1657:18;1650:25;;;;;1607:1135;1725:4;1708:13;:21;1704:1038;;1754:18;1747:25;;;;;1704:1038;1823:4;1806:13;:21;1802:940;;1852:18;1845:25;;;;;1802:940;1920:4;1903:13;:21;1899:843;;1949:17;1942:24;;;;;1899:843;2018:4;2001:13;:21;1997:745;;2047:17;2040:24;;;;;1997:745;2115:4;2098:13;:21;2094:648;;2144:17;2137:24;;;;;2094:648;2212:4;2195:13;:21;2191:551;;2241:17;2234:24;;;;;2191:551;2309:4;2292:13;:21;2288:454;;2338:17;2331:24;;;;;2288:454;2406:4;2389:13;:21;2385:357;;2435:17;2428:24;;;;;2385:357;2503:4;2486:13;:21;2482:260;;2532:17;2525:24;;;;;2482:260;2600:3;2583:13;:20;2579:163;;2628:17;2621:24;;;;;2579:163;2699:16;2692:23;;;659:2090;;:::o;2761:1340::-;2862:4;2847:19;;:11;;;;;;;;;;;:19;;;2839:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;257:5;2911:8;;:25;2903:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2986:1;2977:6;:10;2969:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;3062:2;3052:6;:12;;3044:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;257:5;3149:6;3138:8;;:17;;;;:::i;:::-;:35;;3130:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;3259:2;3249:6;:12;3245:351;;;3319:9;3309:6;3304:2;3298:3;3285:10;:8;:10::i;:::-;:16;;;;:::i;:::-;:21;;;;:::i;:::-;:30;;;;:::i;:::-;:43;3277:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;3245:351;;;3387:2;3377:6;:12;3373:223;;3448:9;3438:6;3433:2;3427:3;3414:10;:8;:10::i;:::-;:16;;;;:::i;:::-;:21;;;;:::i;:::-;:30;;;;:::i;:::-;:43;3406:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;3373:223;;;3548:9;3538:6;3525:10;:8;:10::i;:::-;:19;;;;:::i;:::-;:32;3517:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3373:223;3245:351;3621:9;3616:439;3640:6;3636:1;:10;3616:439;;;3668:35;3678:10;3701:1;3690:8;;:12;;;;:::i;:::-;3668:9;:35::i;:::-;3734:4;3722:8;;:16;3718:84;;;3758:28;3768:10;3780:5;3758:9;:28::i;:::-;3718:84;3886:2;3858:13;:25;3872:10;3858:25;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;3830:13;:25;3844:10;3830:25;;;;;;;;;;;;;;;:58;;;;3919:10;3907:22;;:8;:22;;;;:48;;;;;3953:1;3933:22;;:8;:22;;;;3907:48;3903:141;;;4027:1;4001:13;:23;4015:8;4001:23;;;;;;;;;;;;;;;;:27;;;;:::i;:::-;3975:13;:23;3989:8;3975:23;;;;;;;;;;;;;;;:53;;;;3903:141;3648:3;;;;;:::i;:::-;;;;3616:439;;;;4087:6;4075:8;;:18;;;;;;;:::i;:::-;;;;;;;;2761:1340;;:::o;4080:290:3:-;4194:12;:10;:12::i;:::-;4182:24;;:8;:24;;;;4174:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4292:8;4247:18;:32;4266:12;:10;:12::i;:::-;4247:32;;;;;;;;;;;;;;;:42;4280:8;4247:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4344:8;4315:48;;4330:12;:10;:12::i;:::-;4315:48;;;4354:8;4315:48;;;;;;:::i;:::-;;;;;;;;4080:290;;:::o;216:46:11:-;257:5;216:46;:::o;5241:282:3:-;5372:41;5391:12;:10;:12::i;:::-;5405:7;5372:18;:41::i;:::-;5364:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5477:39;5491:4;5497:2;5501:7;5510:5;5477:13;:39::i;:::-;5241:282;;;;:::o;388:663:4:-;461:13;494:16;502:7;494;:16::i;:::-;486:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;575:23;601:10;:19;612:7;601:19;;;;;;;;;;;575:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;630:18;651:10;:8;:10::i;:::-;630:31;;756:1;740:4;734:18;:23;730:70;;;780:9;773:16;;;;;;730:70;928:1;908:9;902:23;:27;898:106;;;976:4;982:9;959:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;945:48;;;;;;898:106;1021:23;1036:7;1021:14;:23::i;:::-;1014:30;;;;388:663;;;;:::o;4862:534:11:-;1284:12:10;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4958:1:11::1;4944:16;;:2;:16;;;;4936:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5034:8;;5018:13;;:24;5010:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;5092:1;5083:6;:10;5075:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5184:3;5174:6;5158:13;;:22;;;;:::i;:::-;:29;;5150:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;5264:9;5259:96;5283:6;5279:1;:10;5259:96;;;5311:32;5321:2;5341:1;5325:13;;:17;;;;:::i;:::-;5311:9;:32::i;:::-;5291:3;;;;;:::i;:::-;;;;5259:96;;;;5382:6;5365:13;;:23;;;;;;;:::i;:::-;;;;;;;;4862:534:::0;;:::o;4436:162:3:-;4533:4;4556:18;:25;4575:5;4556:25;;;;;;;;;;;;;;;:35;4582:8;4556:35;;;;;;;;;;;;;;;;;;;;;;;;;4549:42;;4436:162;;;;:::o;1987:240:10:-;1284:12;:10;:12::i;:::-;1273:23;;:7;:5;:7::i;:::-;:23;;;1265:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2095:1:::1;2075:22;;:8;:22;;;;2067:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2184:8;2155:38;;2176:6;;;;;;;;;;;2155:38;;;;;;;;;;;;2212:8;2203:6;;:17;;;;;;;;;;;;;;;;;;1987:240:::0;:::o;763:155:2:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;6957:125:3:-;7022:4;7073:1;7045:30;;:7;:16;7053:7;7045:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7038:37;;6957:125;;;:::o;586:96:1:-;639:7;665:10;658:17;;586:96;:::o;10721:171:3:-;10822:2;10795:15;:24;10811:7;10795:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;10877:7;10873:2;10839:46;;10848:23;10863:7;10848:14;:23::i;:::-;10839:46;;;;;;;;;;;;10721:171;;:::o;7921:108::-;7996:26;8006:2;8010:7;7996:26;;;;;;;;;;;;:9;:26::i;:::-;7921:108;;:::o;7240:351::-;7333:4;7357:16;7365:7;7357;:16::i;:::-;7349:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7432:13;7448:23;7463:7;7448:14;:23::i;:::-;7432:39;;7500:5;7489:16;;:7;:16;;;:51;;;;7533:7;7509:31;;:20;7521:7;7509:11;:20::i;:::-;:31;;;7489:51;:94;;;;7544:39;7568:5;7575:7;7544:23;:39::i;:::-;7489:94;7481:103;;;7240:351;;;;:::o;10080:530::-;10204:4;10177:31;;:23;10192:7;10177:14;:23::i;:::-;:31;;;10169:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10286:1;10272:16;;:2;:16;;;;10264:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10340:39;10361:4;10367:2;10371:7;10340:20;:39::i;:::-;10441:29;10458:1;10462:7;10441:8;:29::i;:::-;10500:1;10481:9;:15;10491:4;10481:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10528:1;10511:9;:13;10521:2;10511:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10558:2;10539:7;:16;10547:7;10539:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10595:7;10591:2;10576:27;;10585:4;10576:27;;;;;;;;;;;;10080:530;;;:::o;6385:269::-;6498:28;6508:4;6514:2;6518:7;6498:9;:28::i;:::-;6544:48;6567:4;6573:2;6577:7;6586:5;6544:22;:48::i;:::-;6536:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6385:269;;;;:::o;512:135:11:-;572:13;598:41;;;;;;;;;;;;;;;;;;;512:135;:::o;2707:353:3:-;2780:13;2813:16;2821:7;2813;:16::i;:::-;2805:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2892:21;2916:10;:8;:10::i;:::-;2892:34;;2967:1;2949:7;2943:21;:25;:110;;;;;;;;;;;;;;;;;3007:7;3016:18;:7;:16;:18::i;:::-;2990:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2943:110;2936:117;;;2707:353;;;:::o;8250:247::-;8345:18;8351:2;8355:7;8345:5;:18::i;:::-;8381:54;8412:1;8416:2;8420:7;8429:5;8381:22;:54::i;:::-;8373:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;8250:247;;;:::o;12865:93::-;;;;:::o;11445:824::-;11565:4;11589:15;:2;:13;;;:15::i;:::-;11585:678;;;11640:2;11624:36;;;11661:12;:10;:12::i;:::-;11675:4;11681:7;11690:5;11624:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11620:591;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11884:1;11867:6;:13;:18;11863:334;;;11909:60;;;;;;;;;;:::i;:::-;;;;;;;;11863:334;12149:6;12143:13;12134:6;12130:2;12126:15;12119:38;11620:591;11756:45;;;11746:55;;;:6;:55;;;;11739:62;;;;;11585:678;12248:4;12241:11;;11445:824;;;;;;;:::o;271:703:12:-;327:13;553:1;544:5;:10;540:51;;;570:10;;;;;;;;;;;;;;;;;;;;;540:51;600:12;615:5;600:20;;630:14;654:75;669:1;661:4;:9;654:75;;686:8;;;;;:::i;:::-;;;;716:2;708:10;;;;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;787:150;803:1;794:5;:10;787:150;;830:1;820:11;;;;;:::i;:::-;;;896:2;888:5;:10;;;;:::i;:::-;875:2;:24;;;;:::i;:::-;862:39;;845:6;852;845:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;924:2;915:11;;;;;:::i;:::-;;;787:150;;;960:6;946:21;;;;;271:703;;;;:::o;8819:372:3:-;8912:1;8898:16;;:2;:16;;;;8890:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8970:16;8978:7;8970;:16::i;:::-;8969:17;8961:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9030:45;9059:1;9063:2;9067:7;9030:20;:45::i;:::-;9103:1;9086:9;:13;9096:2;9086:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9133:2;9114:7;:16;9122:7;9114:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9176:7;9172:2;9151:33;;9168:1;9151:33;;;;;;;;;;;;8819:372;;:::o;718:413:0:-;778:4;981:12;1090:7;1078:20;1070:28;;1123:1;1116:4;:8;1109:15;;;718:413;;;:::o;7:343:13:-;;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;;;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;;;;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;;;;;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;;;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;;;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:407::-;;;5186:2;5174:9;5165:7;5161:23;5157:32;5154:2;;;5202:1;5199;5192:12;5154:2;5245:1;5270:53;5315:7;5306:6;5295:9;5291:22;5270:53;:::i;:::-;5260:63;;5216:117;5372:2;5398:53;5443:7;5434:6;5423:9;5419:22;5398:53;:::i;:::-;5388:63;;5343:118;5144:324;;;;;:::o;5474:179::-;;5564:46;5606:3;5598:6;5564:46;:::i;:::-;5642:4;5637:3;5633:14;5619:28;;5554:99;;;;:::o;5659:118::-;5746:24;5764:5;5746:24;:::i;:::-;5741:3;5734:37;5724:53;;:::o;5813:732::-;;5961:54;6009:5;5961:54;:::i;:::-;6031:86;6110:6;6105:3;6031:86;:::i;:::-;6024:93;;6141:56;6191:5;6141:56;:::i;:::-;6220:7;6251:1;6236:284;6261:6;6258:1;6255:13;6236:284;;;6337:6;6331:13;6364:63;6423:3;6408:13;6364:63;:::i;:::-;6357:70;;6450:60;6503:6;6450:60;:::i;:::-;6440:70;;6296:224;6283:1;6280;6276:9;6271:14;;6236:284;;;6240:14;6536:3;6529:10;;5937:608;;;;;;;:::o;6551:109::-;6632:21;6647:5;6632:21;:::i;:::-;6627:3;6620:34;6610:50;;:::o;6666:360::-;;6780:38;6812:5;6780:38;:::i;:::-;6834:70;6897:6;6892:3;6834:70;:::i;:::-;6827:77;;6913:52;6958:6;6953:3;6946:4;6939:5;6935:16;6913:52;:::i;:::-;6990:29;7012:6;6990:29;:::i;:::-;6985:3;6981:39;6974:46;;6756:270;;;;;:::o;7032:364::-;;7148:39;7181:5;7148:39;:::i;:::-;7203:71;7267:6;7262:3;7203:71;:::i;:::-;7196:78;;7283:52;7328:6;7323:3;7316:4;7309:5;7305:16;7283:52;:::i;:::-;7360:29;7382:6;7360:29;:::i;:::-;7355:3;7351:39;7344:46;;7124:272;;;;;:::o;7402:377::-;;7536:39;7569:5;7536:39;:::i;:::-;7591:89;7673:6;7668:3;7591:89;:::i;:::-;7584:96;;7689:52;7734:6;7729:3;7722:4;7715:5;7711:16;7689:52;:::i;:::-;7766:6;7761:3;7757:16;7750:23;;7512:267;;;;;:::o;7785:366::-;;7948:67;8012:2;8007:3;7948:67;:::i;:::-;7941:74;;8024:93;8113:3;8024:93;:::i;:::-;8142:2;8137:3;8133:12;8126:19;;7931:220;;;:::o;8157:366::-;;8320:67;8384:2;8379:3;8320:67;:::i;:::-;8313:74;;8396:93;8485:3;8396:93;:::i;:::-;8514:2;8509:3;8505:12;8498:19;;8303:220;;;:::o;8529:366::-;;8692:67;8756:2;8751:3;8692:67;:::i;:::-;8685:74;;8768:93;8857:3;8768:93;:::i;:::-;8886:2;8881:3;8877:12;8870:19;;8675:220;;;:::o;8901:366::-;;9064:67;9128:2;9123:3;9064:67;:::i;:::-;9057:74;;9140:93;9229:3;9140:93;:::i;:::-;9258:2;9253:3;9249:12;9242:19;;9047:220;;;:::o;9273:366::-;;9436:67;9500:2;9495:3;9436:67;:::i;:::-;9429:74;;9512:93;9601:3;9512:93;:::i;:::-;9630:2;9625:3;9621:12;9614:19;;9419:220;;;:::o;9645:366::-;;9808:67;9872:2;9867:3;9808:67;:::i;:::-;9801:74;;9884:93;9973:3;9884:93;:::i;:::-;10002:2;9997:3;9993:12;9986:19;;9791:220;;;:::o;10017:366::-;;10180:67;10244:2;10239:3;10180:67;:::i;:::-;10173:74;;10256:93;10345:3;10256:93;:::i;:::-;10374:2;10369:3;10365:12;10358:19;;10163:220;;;:::o;10389:366::-;;10552:67;10616:2;10611:3;10552:67;:::i;:::-;10545:74;;10628:93;10717:3;10628:93;:::i;:::-;10746:2;10741:3;10737:12;10730:19;;10535:220;;;:::o;10761:366::-;;10924:67;10988:2;10983:3;10924:67;:::i;:::-;10917:74;;11000:93;11089:3;11000:93;:::i;:::-;11118:2;11113:3;11109:12;11102:19;;10907:220;;;:::o;11133:366::-;;11296:67;11360:2;11355:3;11296:67;:::i;:::-;11289:74;;11372:93;11461:3;11372:93;:::i;:::-;11490:2;11485:3;11481:12;11474:19;;11279:220;;;:::o;11505:366::-;;11668:67;11732:2;11727:3;11668:67;:::i;:::-;11661:74;;11744:93;11833:3;11744:93;:::i;:::-;11862:2;11857:3;11853:12;11846:19;;11651:220;;;:::o;11877:366::-;;12040:67;12104:2;12099:3;12040:67;:::i;:::-;12033:74;;12116:93;12205:3;12116:93;:::i;:::-;12234:2;12229:3;12225:12;12218:19;;12023:220;;;:::o;12249:366::-;;12412:67;12476:2;12471:3;12412:67;:::i;:::-;12405:74;;12488:93;12577:3;12488:93;:::i;:::-;12606:2;12601:3;12597:12;12590:19;;12395:220;;;:::o;12621:366::-;;12784:67;12848:2;12843:3;12784:67;:::i;:::-;12777:74;;12860:93;12949:3;12860:93;:::i;:::-;12978:2;12973:3;12969:12;12962:19;;12767:220;;;:::o;12993:366::-;;13156:67;13220:2;13215:3;13156:67;:::i;:::-;13149:74;;13232:93;13321:3;13232:93;:::i;:::-;13350:2;13345:3;13341:12;13334:19;;13139:220;;;:::o;13365:366::-;;13528:67;13592:2;13587:3;13528:67;:::i;:::-;13521:74;;13604:93;13693:3;13604:93;:::i;:::-;13722:2;13717:3;13713:12;13706:19;;13511:220;;;:::o;13737:366::-;;13900:67;13964:2;13959:3;13900:67;:::i;:::-;13893:74;;13976:93;14065:3;13976:93;:::i;:::-;14094:2;14089:3;14085:12;14078:19;;13883:220;;;:::o;14109:366::-;;14272:67;14336:2;14331:3;14272:67;:::i;:::-;14265:74;;14348:93;14437:3;14348:93;:::i;:::-;14466:2;14461:3;14457:12;14450:19;;14255:220;;;:::o;14481:366::-;;14644:67;14708:2;14703:3;14644:67;:::i;:::-;14637:74;;14720:93;14809:3;14720:93;:::i;:::-;14838:2;14833:3;14829:12;14822:19;;14627:220;;;:::o;14853:366::-;;15016:67;15080:2;15075:3;15016:67;:::i;:::-;15009:74;;15092:93;15181:3;15092:93;:::i;:::-;15210:2;15205:3;15201:12;15194:19;;14999:220;;;:::o;15225:366::-;;15388:67;15452:2;15447:3;15388:67;:::i;:::-;15381:74;;15464:93;15553:3;15464:93;:::i;:::-;15582:2;15577:3;15573:12;15566:19;;15371:220;;;:::o;15597:366::-;;15760:67;15824:2;15819:3;15760:67;:::i;:::-;15753:74;;15836:93;15925:3;15836:93;:::i;:::-;15954:2;15949:3;15945:12;15938:19;;15743:220;;;:::o;15969:366::-;;16132:67;16196:2;16191:3;16132:67;:::i;:::-;16125:74;;16208:93;16297:3;16208:93;:::i;:::-;16326:2;16321:3;16317:12;16310:19;;16115:220;;;:::o;16341:366::-;;16504:67;16568:2;16563:3;16504:67;:::i;:::-;16497:74;;16580:93;16669:3;16580:93;:::i;:::-;16698:2;16693:3;16689:12;16682:19;;16487:220;;;:::o;16713:366::-;;16876:67;16940:2;16935:3;16876:67;:::i;:::-;16869:74;;16952:93;17041:3;16952:93;:::i;:::-;17070:2;17065:3;17061:12;17054:19;;16859:220;;;:::o;17085:366::-;;17248:67;17312:2;17307:3;17248:67;:::i;:::-;17241:74;;17324:93;17413:3;17324:93;:::i;:::-;17442:2;17437:3;17433:12;17426:19;;17231:220;;;:::o;17457:366::-;;17620:67;17684:2;17679:3;17620:67;:::i;:::-;17613:74;;17696:93;17785:3;17696:93;:::i;:::-;17814:2;17809:3;17805:12;17798:19;;17603:220;;;:::o;17829:366::-;;17992:67;18056:2;18051:3;17992:67;:::i;:::-;17985:74;;18068:93;18157:3;18068:93;:::i;:::-;18186:2;18181:3;18177:12;18170:19;;17975:220;;;:::o;18201:366::-;;18364:67;18428:2;18423:3;18364:67;:::i;:::-;18357:74;;18440:93;18529:3;18440:93;:::i;:::-;18558:2;18553:3;18549:12;18542:19;;18347:220;;;:::o;18573:108::-;18650:24;18668:5;18650:24;:::i;:::-;18645:3;18638:37;18628:53;;:::o;18687:118::-;18774:24;18792:5;18774:24;:::i;:::-;18769:3;18762:37;18752:53;;:::o;18811:435::-;;19013:95;19104:3;19095:6;19013:95;:::i;:::-;19006:102;;19125:95;19216:3;19207:6;19125:95;:::i;:::-;19118:102;;19237:3;19230:10;;18995:251;;;;;:::o;19252:222::-;;19383:2;19372:9;19368:18;19360:26;;19396:71;19464:1;19453:9;19449:17;19440:6;19396:71;:::i;:::-;19350:124;;;;:::o;19480:640::-;;19713:3;19702:9;19698:19;19690:27;;19727:71;19795:1;19784:9;19780:17;19771:6;19727:71;:::i;:::-;19808:72;19876:2;19865:9;19861:18;19852:6;19808:72;:::i;:::-;19890;19958:2;19947:9;19943:18;19934:6;19890:72;:::i;:::-;20009:9;20003:4;19999:20;19994:2;19983:9;19979:18;19972:48;20037:76;20108:4;20099:6;20037:76;:::i;:::-;20029:84;;19680:440;;;;;;;:::o;20126:373::-;;20307:2;20296:9;20292:18;20284:26;;20356:9;20350:4;20346:20;20342:1;20331:9;20327:17;20320:47;20384:108;20487:4;20478:6;20384:108;:::i;:::-;20376:116;;20274:225;;;;:::o;20505:210::-;;20630:2;20619:9;20615:18;20607:26;;20643:65;20705:1;20694:9;20690:17;20681:6;20643:65;:::i;:::-;20597:118;;;;:::o;20721:313::-;;20872:2;20861:9;20857:18;20849:26;;20921:9;20915:4;20911:20;20907:1;20896:9;20892:17;20885:47;20949:78;21022:4;21013:6;20949:78;:::i;:::-;20941:86;;20839:195;;;;:::o;21040:419::-;;21244:2;21233:9;21229:18;21221:26;;21293:9;21287:4;21283:20;21279:1;21268:9;21264:17;21257:47;21321:131;21447:4;21321:131;:::i;:::-;21313:139;;21211:248;;;:::o;21465:419::-;;21669:2;21658:9;21654:18;21646:26;;21718:9;21712:4;21708:20;21704:1;21693:9;21689:17;21682:47;21746:131;21872:4;21746:131;:::i;:::-;21738:139;;21636:248;;;:::o;21890:419::-;;22094:2;22083:9;22079:18;22071:26;;22143:9;22137:4;22133:20;22129:1;22118:9;22114:17;22107:47;22171:131;22297:4;22171:131;:::i;:::-;22163:139;;22061:248;;;:::o;22315:419::-;;22519:2;22508:9;22504:18;22496:26;;22568:9;22562:4;22558:20;22554:1;22543:9;22539:17;22532:47;22596:131;22722:4;22596:131;:::i;:::-;22588:139;;22486:248;;;:::o;22740:419::-;;22944:2;22933:9;22929:18;22921:26;;22993:9;22987:4;22983:20;22979:1;22968:9;22964:17;22957:47;23021:131;23147:4;23021:131;:::i;:::-;23013:139;;22911:248;;;:::o;23165:419::-;;23369:2;23358:9;23354:18;23346:26;;23418:9;23412:4;23408:20;23404:1;23393:9;23389:17;23382:47;23446:131;23572:4;23446:131;:::i;:::-;23438:139;;23336:248;;;:::o;23590:419::-;;23794:2;23783:9;23779:18;23771:26;;23843:9;23837:4;23833:20;23829:1;23818:9;23814:17;23807:47;23871:131;23997:4;23871:131;:::i;:::-;23863:139;;23761:248;;;:::o;24015:419::-;;24219:2;24208:9;24204:18;24196:26;;24268:9;24262:4;24258:20;24254:1;24243:9;24239:17;24232:47;24296:131;24422:4;24296:131;:::i;:::-;24288:139;;24186:248;;;:::o;24440:419::-;;24644:2;24633:9;24629:18;24621:26;;24693:9;24687:4;24683:20;24679:1;24668:9;24664:17;24657:47;24721:131;24847:4;24721:131;:::i;:::-;24713:139;;24611:248;;;:::o;24865:419::-;;25069:2;25058:9;25054:18;25046:26;;25118:9;25112:4;25108:20;25104:1;25093:9;25089:17;25082:47;25146:131;25272:4;25146:131;:::i;:::-;25138:139;;25036:248;;;:::o;25290:419::-;;25494:2;25483:9;25479:18;25471:26;;25543:9;25537:4;25533:20;25529:1;25518:9;25514:17;25507:47;25571:131;25697:4;25571:131;:::i;:::-;25563:139;;25461:248;;;:::o;25715:419::-;;25919:2;25908:9;25904:18;25896:26;;25968:9;25962:4;25958:20;25954:1;25943:9;25939:17;25932:47;25996:131;26122:4;25996:131;:::i;:::-;25988:139;;25886:248;;;:::o;26140:419::-;;26344:2;26333:9;26329:18;26321:26;;26393:9;26387:4;26383:20;26379:1;26368:9;26364:17;26357:47;26421:131;26547:4;26421:131;:::i;:::-;26413:139;;26311:248;;;:::o;26565:419::-;;26769:2;26758:9;26754:18;26746:26;;26818:9;26812:4;26808:20;26804:1;26793:9;26789:17;26782:47;26846:131;26972:4;26846:131;:::i;:::-;26838:139;;26736:248;;;:::o;26990:419::-;;27194:2;27183:9;27179:18;27171:26;;27243:9;27237:4;27233:20;27229:1;27218:9;27214:17;27207:47;27271:131;27397:4;27271:131;:::i;:::-;27263:139;;27161:248;;;:::o;27415:419::-;;27619:2;27608:9;27604:18;27596:26;;27668:9;27662:4;27658:20;27654:1;27643:9;27639:17;27632:47;27696:131;27822:4;27696:131;:::i;:::-;27688:139;;27586:248;;;:::o;27840:419::-;;28044:2;28033:9;28029:18;28021:26;;28093:9;28087:4;28083:20;28079:1;28068:9;28064:17;28057:47;28121:131;28247:4;28121:131;:::i;:::-;28113:139;;28011:248;;;:::o;28265:419::-;;28469:2;28458:9;28454:18;28446:26;;28518:9;28512:4;28508:20;28504:1;28493:9;28489:17;28482:47;28546:131;28672:4;28546:131;:::i;:::-;28538:139;;28436:248;;;:::o;28690:419::-;;28894:2;28883:9;28879:18;28871:26;;28943:9;28937:4;28933:20;28929:1;28918:9;28914:17;28907:47;28971:131;29097:4;28971:131;:::i;:::-;28963:139;;28861:248;;;:::o;29115:419::-;;29319:2;29308:9;29304:18;29296:26;;29368:9;29362:4;29358:20;29354:1;29343:9;29339:17;29332:47;29396:131;29522:4;29396:131;:::i;:::-;29388:139;;29286:248;;;:::o;29540:419::-;;29744:2;29733:9;29729:18;29721:26;;29793:9;29787:4;29783:20;29779:1;29768:9;29764:17;29757:47;29821:131;29947:4;29821:131;:::i;:::-;29813:139;;29711:248;;;:::o;29965:419::-;;30169:2;30158:9;30154:18;30146:26;;30218:9;30212:4;30208:20;30204:1;30193:9;30189:17;30182:47;30246:131;30372:4;30246:131;:::i;:::-;30238:139;;30136:248;;;:::o;30390:419::-;;30594:2;30583:9;30579:18;30571:26;;30643:9;30637:4;30633:20;30629:1;30618:9;30614:17;30607:47;30671:131;30797:4;30671:131;:::i;:::-;30663:139;;30561:248;;;:::o;30815:419::-;;31019:2;31008:9;31004:18;30996:26;;31068:9;31062:4;31058:20;31054:1;31043:9;31039:17;31032:47;31096:131;31222:4;31096:131;:::i;:::-;31088:139;;30986:248;;;:::o;31240:419::-;;31444:2;31433:9;31429:18;31421:26;;31493:9;31487:4;31483:20;31479:1;31468:9;31464:17;31457:47;31521:131;31647:4;31521:131;:::i;:::-;31513:139;;31411:248;;;:::o;31665:419::-;;31869:2;31858:9;31854:18;31846:26;;31918:9;31912:4;31908:20;31904:1;31893:9;31889:17;31882:47;31946:131;32072:4;31946:131;:::i;:::-;31938:139;;31836:248;;;:::o;32090:419::-;;32294:2;32283:9;32279:18;32271:26;;32343:9;32337:4;32333:20;32329:1;32318:9;32314:17;32307:47;32371:131;32497:4;32371:131;:::i;:::-;32363:139;;32261:248;;;:::o;32515:419::-;;32719:2;32708:9;32704:18;32696:26;;32768:9;32762:4;32758:20;32754:1;32743:9;32739:17;32732:47;32796:131;32922:4;32796:131;:::i;:::-;32788:139;;32686:248;;;:::o;32940:419::-;;33144:2;33133:9;33129:18;33121:26;;33193:9;33187:4;33183:20;33179:1;33168:9;33164:17;33157:47;33221:131;33347:4;33221:131;:::i;:::-;33213:139;;33111:248;;;:::o;33365:222::-;;33496:2;33485:9;33481:18;33473:26;;33509:71;33577:1;33566:9;33562:17;33553:6;33509:71;:::i;:::-;33463:124;;;;:::o;33593:129::-;;33654:20;;:::i;:::-;33644:30;;33683:33;33711:4;33703:6;33683:33;:::i;:::-;33634:88;;;:::o;33728:75::-;;33794:2;33788:9;33778:19;;33768:35;:::o;33809:307::-;;33960:18;33952:6;33949:30;33946:2;;;33982:18;;:::i;:::-;33946:2;34020:29;34042:6;34020:29;:::i;:::-;34012:37;;34104:4;34098;34094:15;34086:23;;33875:241;;;:::o;34122:132::-;;34212:3;34204:11;;34242:4;34237:3;34233:14;34225:22;;34194:60;;;:::o;34260:114::-;;34361:5;34355:12;34345:22;;34334:40;;;:::o;34380:98::-;;34465:5;34459:12;34449:22;;34438:40;;;:::o;34484:99::-;;34570:5;34564:12;34554:22;;34543:40;;;:::o;34589:113::-;;34691:4;34686:3;34682:14;34674:22;;34664:38;;;:::o;34708:184::-;;34841:6;34836:3;34829:19;34881:4;34876:3;34872:14;34857:29;;34819:73;;;;:::o;34898:168::-;;35015:6;35010:3;35003:19;35055:4;35050:3;35046:14;35031:29;;34993:73;;;;:::o;35072:169::-;;35190:6;35185:3;35178:19;35230:4;35225:3;35221:14;35206:29;;35168:73;;;;:::o;35247:148::-;;35386:3;35371:18;;35361:34;;;;:::o;35401:305::-;;35460:20;35478:1;35460:20;:::i;:::-;35455:25;;35494:20;35512:1;35494:20;:::i;:::-;35489:25;;35648:1;35580:66;35576:74;35573:1;35570:81;35567:2;;;35654:18;;:::i;:::-;35567:2;35698:1;35695;35691:9;35684:16;;35445:261;;;;:::o;35712:185::-;;35769:20;35787:1;35769:20;:::i;:::-;35764:25;;35803:20;35821:1;35803:20;:::i;:::-;35798:25;;35842:1;35832:2;;35847:18;;:::i;:::-;35832:2;35889:1;35886;35882:9;35877:14;;35754:143;;;;:::o;35903:348::-;;35966:20;35984:1;35966:20;:::i;:::-;35961:25;;36000:20;36018:1;36000:20;:::i;:::-;35995:25;;36188:1;36120:66;36116:74;36113:1;36110:81;36105:1;36098:9;36091:17;36087:105;36084:2;;;36195:18;;:::i;:::-;36084:2;36243:1;36240;36236:9;36225:20;;35951:300;;;;:::o;36257:191::-;;36317:20;36335:1;36317:20;:::i;:::-;36312:25;;36351:20;36369:1;36351:20;:::i;:::-;36346:25;;36390:1;36387;36384:8;36381:2;;;36395:18;;:::i;:::-;36381:2;36440:1;36437;36433:9;36425:17;;36302:146;;;;:::o;36454:96::-;;36520:24;36538:5;36520:24;:::i;:::-;36509:35;;36499:51;;;:::o;36556:90::-;;36633:5;36626:13;36619:21;36608:32;;36598:48;;;:::o;36652:149::-;;36728:66;36721:5;36717:78;36706:89;;36696:105;;;:::o;36807:126::-;;36884:42;36877:5;36873:54;36862:65;;36852:81;;;:::o;36939:77::-;;37005:5;36994:16;;36984:32;;;:::o;37022:154::-;37106:6;37101:3;37096;37083:30;37168:1;37159:6;37154:3;37150:16;37143:27;37073:103;;;:::o;37182:307::-;37250:1;37260:113;37274:6;37271:1;37268:13;37260:113;;;37359:1;37354:3;37350:11;37344:18;37340:1;37335:3;37331:11;37324:39;37296:2;37293:1;37289:10;37284:15;;37260:113;;;37391:6;37388:1;37385:13;37382:2;;;37471:1;37462:6;37457:3;37453:16;37446:27;37382:2;37231:258;;;;:::o;37495:320::-;;37576:1;37570:4;37566:12;37556:22;;37623:1;37617:4;37613:12;37644:18;37634:2;;37700:4;37692:6;37688:17;37678:27;;37634:2;37762;37754:6;37751:14;37731:18;37728:38;37725:2;;;37781:18;;:::i;:::-;37725:2;37546:269;;;;:::o;37821:281::-;37904:27;37926:4;37904:27;:::i;:::-;37896:6;37892:40;38034:6;38022:10;38019:22;37998:18;37986:10;37983:34;37980:62;37977:2;;;38045:18;;:::i;:::-;37977:2;38085:10;38081:2;38074:22;37864:238;;;:::o;38108:233::-;;38170:24;38188:5;38170:24;:::i;:::-;38161:33;;38216:66;38209:5;38206:77;38203:2;;;38286:18;;:::i;:::-;38203:2;38333:1;38326:5;38322:13;38315:20;;38151:190;;;:::o;38347:176::-;;38396:20;38414:1;38396:20;:::i;:::-;38391:25;;38430:20;38448:1;38430:20;:::i;:::-;38425:25;;38469:1;38459:2;;38474:18;;:::i;:::-;38459:2;38515:1;38512;38508:9;38503:14;;38381:142;;;;:::o;38529:180::-;38577:77;38574:1;38567:88;38674:4;38671:1;38664:15;38698:4;38695:1;38688:15;38715:180;38763:77;38760:1;38753:88;38860:4;38857:1;38850:15;38884:4;38881:1;38874:15;38901:180;38949:77;38946:1;38939:88;39046:4;39043:1;39036:15;39070:4;39067:1;39060:15;39087:180;39135:77;39132:1;39125:88;39232:4;39229:1;39222:15;39256:4;39253:1;39246:15;39273:102;;39365:2;39361:7;39356:2;39349:5;39345:14;39341:28;39331:38;;39321:54;;;:::o;39381:171::-;39521:23;39517:1;39509:6;39505:14;39498:47;39487:65;:::o;39558:174::-;39698:26;39694:1;39686:6;39682:14;39675:50;39664:68;:::o;39738:237::-;39878:34;39874:1;39866:6;39862:14;39855:58;39947:20;39942:2;39934:6;39930:15;39923:45;39844:131;:::o;39981:225::-;40121:34;40117:1;40109:6;40105:14;40098:58;40190:8;40185:2;40177:6;40173:15;40166:33;40087:119;:::o;40212:178::-;40352:30;40348:1;40340:6;40336:14;40329:54;40318:72;:::o;40396:237::-;40536:34;40532:1;40524:6;40520:14;40513:58;40605:20;40600:2;40592:6;40588:15;40581:45;40502:131;:::o;40639:165::-;40779:17;40775:1;40767:6;40763:14;40756:41;40745:59;:::o;40810:223::-;40950:34;40946:1;40938:6;40934:14;40927:58;41019:6;41014:2;41006:6;41002:15;40995:31;40916:117;:::o;41039:175::-;41179:27;41175:1;41167:6;41163:14;41156:51;41145:69;:::o;41220:231::-;41360:34;41356:1;41348:6;41344:14;41337:58;41429:14;41424:2;41416:6;41412:15;41405:39;41326:125;:::o;41457:243::-;41597:34;41593:1;41585:6;41581:14;41574:58;41666:26;41661:2;41653:6;41649:15;41642:51;41563:137;:::o;41706:229::-;41846:34;41842:1;41834:6;41830:14;41823:58;41915:12;41910:2;41902:6;41898:15;41891:37;41812:123;:::o;41941:228::-;42081:34;42077:1;42069:6;42065:14;42058:58;42150:11;42145:2;42137:6;42133:15;42126:36;42047:122;:::o;42175:243::-;42315:34;42311:1;42303:6;42299:14;42292:58;42384:26;42379:2;42371:6;42367:15;42360:51;42281:137;:::o;42424:172::-;42564:24;42560:1;42552:6;42548:14;42541:48;42530:66;:::o;42602:182::-;42742:34;42738:1;42730:6;42726:14;42719:58;42708:76;:::o;42790:236::-;42930:34;42926:1;42918:6;42914:14;42907:58;42999:19;42994:2;42986:6;42982:15;42975:44;42896:130;:::o;43032:231::-;43172:34;43168:1;43160:6;43156:14;43149:58;43241:14;43236:2;43228:6;43224:15;43217:39;43138:125;:::o;43269:182::-;43409:34;43405:1;43397:6;43393:14;43386:58;43375:76;:::o;43457:228::-;43597:34;43593:1;43585:6;43581:14;43574:58;43666:11;43661:2;43653:6;43649:15;43642:36;43563:122;:::o;43691:234::-;43831:34;43827:1;43819:6;43815:14;43808:58;43900:17;43895:2;43887:6;43883:15;43876:42;43797:128;:::o;43931:228::-;44071:34;44067:1;44059:6;44055:14;44048:58;44140:11;44135:2;44127:6;44123:15;44116:36;44037:122;:::o;44165:237::-;44305:34;44301:1;44293:6;44289:14;44282:58;44374:20;44369:2;44361:6;44357:15;44350:45;44271:131;:::o;44408:220::-;44548:34;44544:1;44536:6;44532:14;44525:58;44617:3;44612:2;44604:6;44600:15;44593:28;44514:114;:::o;44634:236::-;44774:34;44770:1;44762:6;44758:14;44751:58;44843:19;44838:2;44830:6;44826:15;44819:44;44740:130;:::o;44876:167::-;45016:19;45012:1;45004:6;45000:14;44993:43;44982:61;:::o;45049:243::-;45189:34;45185:1;45177:6;45173:14;45166:58;45258:26;45253:2;45245:6;45241:15;45234:51;45155:137;:::o;45298:233::-;45438:34;45434:1;45426:6;45422:14;45415:58;45507:16;45502:2;45494:6;45490:15;45483:41;45404:127;:::o;45537:221::-;45677:34;45673:1;45665:6;45661:14;45654:58;45746:4;45741:2;45733:6;45729:15;45722:29;45643:115;:::o;45764:122::-;45837:24;45855:5;45837:24;:::i;:::-;45830:5;45827:35;45817:2;;45876:1;45873;45866:12;45817:2;45807:79;:::o;45892:116::-;45962:21;45977:5;45962:21;:::i;:::-;45955:5;45952:32;45942:2;;45998:1;45995;45988:12;45942:2;45932:76;:::o;46014:120::-;46086:23;46103:5;46086:23;:::i;:::-;46079:5;46076:34;46066:2;;46124:1;46121;46114:12;46066:2;46056:78;:::o;46140:122::-;46213:24;46231:5;46213:24;:::i;:::-;46206:5;46203:35;46193:2;;46252:1;46249;46242:12;46193:2;46183:79;:::o

Swarm Source

ipfs://004552ecddf1ad946a6e61eae1467d7e44f6ade18c42d894e7088cbff86ac58c
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.