ETH Price: $2,484.24 (-0.92%)
Gas: 7.52 Gwei

TheArityNFT (ARIT)
 

Overview

TokenID

628

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Arity is decentralizing the opportunities and experiences found in the precious minerals and luxury world, revealing a distorted and cryptic reality.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TheArityNFT

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

pragma solidity ^0.8.0;

import "./ERC721.sol";

contract TheArityNFT is ERC721 {
    event Mint(address indexed from, uint256 indexed tokenId);

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    modifier onlyCollaborator() {
        bool isCollaborator = false;
        for (uint256 i; i < collaborators.length; i++) {
            if (collaborators[i].addr == msg.sender) {
                isCollaborator = true;

                break;
            }
        }

        require(
            owner() == _msgSender() || isCollaborator,
            "Ownable: caller is not the owner nor a collaborator"
        );

        _;
    }

    modifier claimStarted() {
        require(
            startPublicClaimDate != 0 && startPublicClaimDate <= block.timestamp,
            "Public sale is not open"
        );

        _;
    }

    modifier presaleStarted() {
        require(
            startPresaleDate != 0 && startPresaleDate <= block.timestamp,
            "Presale is not open"
        );

        _;
    }

    modifier genesisSaleStarted() {
        require(
            startGenesisSaleDate != 0 && startGenesisSaleDate <= block.timestamp,
            "Genesis sale is not open"
        );

        _;
    }

    modifier onlyPresaleWhitelisted() {
        require(presaleWhitelistedAddresses[msg.sender] == true, "You are not whitelisted for presale");

        _;
    }

    modifier onlyGenesisWhitelisted() {
        require(genesisWhitelistedAddresses[msg.sender] == true, "You are not whitelisted for genesis sale");

        _;
    }

    struct Collaborators {
        address addr;
        uint256 cut;
    }

    uint256 private startGenesisSaleDate = 1646838000;
    uint256 private startPublicClaimDate = 1649516400;
    uint256 private startPresaleDate = 1649516400;

    uint256 private genesisSaleMintPrice = 277000000000000000;
    uint256 private publicMintPrice = 277000000000000000;
    uint256 private presaleMintPrice = 277000000000000000;

    uint256 public genesisMintedTokens = 0;
    uint256 public totalMintedTokens = 0;
    uint256 public presaleMintedTokens = 0;

    uint256 private maxArityTokensPerTransaction = 25;

    uint128 private basisPoints = 10000;
    
    string private baseURI = "";
    
    uint256 public giveawayCount = 0;
    
    uint256 public genesisSaleLimit = 1000;
    uint256 public presaleLimit = 2000;

    mapping(address => uint256) private claimedArityTokenPerWallet;

    uint16[] availableArityTokens;
    Collaborators[] private collaborators;

    mapping (address => bool) presaleWhitelistedAddresses;
    mapping (address => bool) genesisWhitelistedAddresses;

    constructor() ERC721("TheArityNFT", "ARIT") {}

    // ONLY OWNER

    /**
     * Sets the collaborators of the project with their cuts
     */
    function addCollaborators(Collaborators[] memory _collaborators)
        external
        onlyOwner
    {
        require(collaborators.length == 0, "Collaborators were already set");

        uint128 totalCut;
        for (uint256 i; i < _collaborators.length; i++) {
            collaborators.push(_collaborators[i]);
            totalCut += uint128(_collaborators[i].cut);
        }

        require(totalCut == basisPoints, "Total cut does not add to 100%");
    }

    // ONLY COLLABORATORS

    /**
     * @dev Allows to withdraw the Ether in the contract and split it among the collaborators
     */
    function withdraw() external onlyCollaborator {
        uint256 totalBalance = address(this).balance;

        for (uint256 i; i < collaborators.length; i++) {
            payable(collaborators[i].addr).transfer(
                mulScale(totalBalance, collaborators[i].cut, basisPoints)
            );
        }
    }

    /**
     * @dev Sets the base URI for the API that provides the NFT data.
     */
    function setBaseTokenURI(string memory _uri) external onlyCollaborator {
        baseURI = _uri;
    }

    /**
     * @dev Sets the claim price for each arity token
     */
    function setPublicMintPrice(uint256 _publicMintPrice) external onlyCollaborator {
        publicMintPrice = _publicMintPrice;
    }

    /**
     * @dev Sets the presale claim price for each arity token
     */
    function setPresaleMintPrice(uint256 _presaleMintPrice) external onlyCollaborator {
        presaleMintPrice = _presaleMintPrice;
    }

    /**
     * @dev Sets the genesis sale claim price for each arity token
     */
    function setGenesisSaleMintPrice(uint256 _genesisSaleMintPrice) external onlyCollaborator {
        genesisSaleMintPrice = _genesisSaleMintPrice;
    }

     /**
     * @dev Sets the date that users can start claiming arity tokens
     */
    function setStartPublicClaimDate(uint256 _startPublicClaimDate)
        external
        onlyCollaborator
    {
        startPublicClaimDate = _startPublicClaimDate;
    }

    /**
     * @dev Sets the date that users can start claiming arity tokens for presale
     */
    function setStartPresaleDate(uint256 _startPresaleDate)
        external
        onlyCollaborator
    {
        startPresaleDate = _startPresaleDate;
    }

    /**
     * @dev Sets the date that users can start claiming arity tokens for genesis sale
     */
    function setStartGenesisSaleDate(uint256 _startGenesisSaleDate)
        external
        onlyCollaborator
    {
        startGenesisSaleDate = _startGenesisSaleDate;
    }

    /**
     * @dev Sets the presale limit for presale
     */
    function setPresaleLimit(uint256 _presaleLimit)
        external
        onlyCollaborator
    {
        presaleLimit = _presaleLimit;
    }

    /**
     * @dev Sets the genesis sale limit for genesisSale
     */
    function setGenesisSaleLimit(uint256 _genesisSaleLimit)
        external
        onlyCollaborator
    {
        genesisSaleLimit = _genesisSaleLimit;
    }

    /**
     * @dev Sets the giveaway count 
     */
    function setGiveawayCount(uint256 _giveawayCount)
        external
        onlyCollaborator
    {
        giveawayCount = _giveawayCount;
    }

    /**
     * @dev Sets the max tokens per transaction 
     */
    function setMaxArityTokensPerTransaction(uint256 _maxArityTokensPerTransaction)
        external
        onlyCollaborator
    {
        maxArityTokensPerTransaction = _maxArityTokensPerTransaction;
    }

    /**
     * @dev Populates the available arity tokens
     */
    function addAvailableArityTokens(uint16 from, uint16 to)
        external
        onlyCollaborator
    {
        for (uint16 i = from; i <= to; i++) {
            availableArityTokens.push(i);
        }
    }

    /**
     * @dev Removes a chosen arity token from the available list, only a utility function
     */
    function removeArityTokenFromAvailableArityTokens(uint16 tokenId)
        external
        onlyCollaborator
    {
        for (uint16 i; i <= availableArityTokens.length; i++) {
            if (availableArityTokens[i] != tokenId) {
                continue;
            }

            availableArityTokens[i] = availableArityTokens[availableArityTokens.length - 1];
            availableArityTokens.pop();

            break;
        }
    }

    /**
     * @dev Checks if a arity token is in the available list
     */
    function isArityTokenAvailable(uint16 tokenId)
        external
        view
        onlyCollaborator
        returns (bool)
    {
        for (uint16 i; i < availableArityTokens.length; i++) {
            if (availableArityTokens[i] == tokenId) {
                return true;
            }
        }

        return false;
    }


    /**
     * @dev Give random giveaway arity tokens to the provided address
     */
    function reserveGiveawayArityTokens(address _address)
        external
        onlyCollaborator
    {
        require(availableArityTokens.length >= giveawayCount, "No arity tokens left to be claimed");
        
        totalMintedTokens += giveawayCount;

        uint256[] memory tokenIds = new uint256[](giveawayCount);

        for (uint256 i; i < giveawayCount; i++) {
            tokenIds[i] = getArityTokenToBeClaimed();
        }

        _batchMint(_address, tokenIds);
        giveawayCount = 0;
    }

    /**
    * @dev Whitelist addresses for presale
     */
    function whitelistAddressForPresale (address[] memory users) external onlyCollaborator {
        for (uint i = 0; i < users.length; i++) {
            presaleWhitelistedAddresses[users[i]] = true;
        }
    }

    /**
    * @dev Whitelist addresses for genesis sale
     */
    function whitelistAddressForGenesisSale (address[] memory users) external onlyCollaborator {
        for (uint i = 0; i < users.length; i++) {
            genesisWhitelistedAddresses[users[i]] = true;
        }
    }

    // END ONLY COLLABORATORS

    /**
     * @dev Claim up to 25 arity tokens at once in public sale
     */
    function claimArityTokens(uint256 quantity)
        external
        payable
        callerIsUser
        claimStarted
        returns (uint256[] memory)
    {
        require(
            msg.value >= publicMintPrice * quantity,
            "Not enough Ether to claim the ArityTokens"
        );

        require(availableArityTokens.length >= quantity, "Not enough arity tokens left");

        require(quantity <= maxArityTokensPerTransaction, "Max tokens per transaction can be 25");

        uint256[] memory tokenIds = new uint256[](quantity);

        claimedArityTokenPerWallet[msg.sender] += quantity;
        totalMintedTokens += quantity;

        for (uint256 i; i < quantity; i++) {
            tokenIds[i] = getArityTokenToBeClaimed();
        }

        _batchMint(msg.sender, tokenIds);
        return tokenIds;
    }

    /**
     * @dev Claim up to 25 arity tokens at once in presale
     */
    function presaleMintArityTokens(uint256 quantity)
        external
        payable
        callerIsUser
        presaleStarted
        onlyPresaleWhitelisted
        returns (uint256[] memory)
    {
        require(
            msg.value >= presaleMintPrice * quantity,
            "Not enough Ether to claim the ArityTokens"
        );
        
        require(availableArityTokens.length >= quantity, "Not enough arity tokens left");

        require(quantity + presaleMintedTokens <= presaleLimit, "No more arity tokens left for presale");

        require(quantity <= maxArityTokensPerTransaction, "Max tokens per transaction can be 25");

        uint256[] memory tokenIds = new uint256[](quantity);

        claimedArityTokenPerWallet[msg.sender] += quantity;
        totalMintedTokens += quantity;
        presaleMintedTokens += quantity;

        for (uint256 i; i < quantity; i++) {
            tokenIds[i] = getArityTokenToBeClaimed();
        }

        _batchMint(msg.sender, tokenIds);
        return tokenIds;
    }

    /**
     * @dev Claim up to 25 arity tokens at once in genesis sale
     */
    function genesisSaleMintArityTokens(uint256 quantity)
        external
        payable
        callerIsUser
        genesisSaleStarted
        onlyGenesisWhitelisted
        returns (uint256[] memory)
    {
        require(
            msg.value >= genesisSaleMintPrice * quantity,
            "Not enough Ether to claim the ArityTokens"
        );
        
        require(availableArityTokens.length >= quantity, "Not enough arity tokens left");

        require(quantity + genesisMintedTokens <= genesisSaleLimit, "No more arity tokens left for genesis sale");

        require(quantity <= maxArityTokensPerTransaction, "Max tokens per transaction can be 25");

        uint256[] memory tokenIds = new uint256[](quantity);

        claimedArityTokenPerWallet[msg.sender] += quantity;
        totalMintedTokens += quantity;
        genesisMintedTokens += quantity;

        for (uint256 i; i < quantity; i++) {
            tokenIds[i] = getArityTokenToBeClaimed();
        }

        _batchMint(msg.sender, tokenIds);
        return tokenIds;
    }

    /**
     * @dev Returns the tokenId by index
     */
    function tokenByIndex(uint256 tokenId) external view returns (uint256) {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );

        return tokenId;
    }

    /**
     * @dev Returns the base URI for the tokens API.
     */
    function baseTokenURI() external view returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Returns how many ArityTokens are still available to be claimed
     */
    function getAvailableArityTokens() external view returns (uint256) {
        return availableArityTokens.length;
    }

    /**
     * @dev Returns the claim price for public mint
     */
    function getPublicMintPrice() external view returns (uint256) {
        return publicMintPrice;
    }

    /**
     * @dev Returns the total supply
     */
    function totalSupply() external view virtual returns (uint256) {
        return totalMintedTokens;
    }

    /**
     * @dev Returns the total minted tokens in presale
     */
    function totalPresaleMintCount() external view virtual returns (uint256) {
        return presaleMintedTokens;
    }

    function totalGenesisMintCount() external view virtual returns (uint256) {
        return genesisMintedTokens;
    }

    // Private and Internal functions

    /**
     * @dev Returns a random available ArityToken to be claimed
     */
    function getArityTokenToBeClaimed() private returns (uint256) {
        uint256 random = _getRandomNumber(availableArityTokens.length);
        uint256 tokenId = uint256(availableArityTokens[random]);

        availableArityTokens[random] = availableArityTokens[availableArityTokens.length - 1];
        availableArityTokens.pop();

        return tokenId;
    }

    /**
     * @dev Generates a pseudo-random number.
     */
    function _getRandomNumber(uint256 _upper) private view returns (uint256) {
        uint256 random = uint256(
            keccak256(
                abi.encodePacked(
                    availableArityTokens.length,
                    blockhash(block.number - 1),
                    block.coinbase,
                    block.difficulty,
                    msg.sender
                )
            )
        );

        return random % _upper;
    }

    /**
     * @dev See {ERC721}.
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function mulScale(
        uint256 x,
        uint256 y,
        uint128 scale
    ) internal pure returns (uint256) {
        uint256 a = x / scale;
        uint256 b = x % scale;
        uint256 c = y / scale;
        uint256 d = y % scale;

        return a * c * scale + a * d + b * c + (b * d) / scale;
    }
}

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 3 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 4 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 5 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";
import "./Ownable.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, Ownable {
    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) internal _owners;

    // Mapping owner address to token count
    mapping(address => uint256) internal _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);
    }

    function _batchMint(address to, uint256[] memory tokenIds)
        internal
        virtual
    {
        require(to != address(0), "ERC721: mint to the zero address");
        _balances[to] += tokenIds.length;

        for (uint256 i; i < tokenIds.length; i++) {
            require(!_exists(tokenIds[i]), "ERC721: token already minted");

            _beforeTokenTransfer(address(0), to, tokenIds[i]);

            _owners[tokenIds[i]] = to;

            emit Transfer(address(0), to, tokenIds[i]);
        }
    }

    /**
     * @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 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: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// 
/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 8 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 9 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 10 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 11 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 12 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":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint16","name":"from","type":"uint16"},{"internalType":"uint16","name":"to","type":"uint16"}],"name":"addAvailableArityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"cut","type":"uint256"}],"internalType":"struct TheArityNFT.Collaborators[]","name":"_collaborators","type":"tuple[]"}],"name":"addCollaborators","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"claimArityTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"genesisMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisSaleLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"genesisSaleMintArityTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"getAvailableArityTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayCount","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":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"isArityTokenAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"presaleMintArityTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"removeArityTokenFromAvailableArityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"reserveGiveawayArityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genesisSaleLimit","type":"uint256"}],"name":"setGenesisSaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_genesisSaleMintPrice","type":"uint256"}],"name":"setGenesisSaleMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_giveawayCount","type":"uint256"}],"name":"setGiveawayCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxArityTokensPerTransaction","type":"uint256"}],"name":"setMaxArityTokensPerTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleLimit","type":"uint256"}],"name":"setPresaleLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_presaleMintPrice","type":"uint256"}],"name":"setPresaleMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMintPrice","type":"uint256"}],"name":"setPublicMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startGenesisSaleDate","type":"uint256"}],"name":"setStartGenesisSaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startPresaleDate","type":"uint256"}],"name":"setStartPresaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startPublicClaimDate","type":"uint256"}],"name":"setStartPublicClaimDate","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":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGenesisMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMintedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPresaleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"whitelistAddressForGenesisSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"whitelistAddressForPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

636228c0f06007556362519f7060088190556009556703d81a084ac88000600a819055600b819055600c556000600d819055600e819055600f8190556019601055601180546001600160801b03191661271017905560a0604081905260808290526200006f916012919062000164565b5060006013556103e86014556107d06015553480156200008e57600080fd5b506040518060400160405280600b81526020016a151a19505c9a5d1e53919560aa1b815250604051806040016040528060048152602001631054925560e21b8152506000620000e26200016060201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516200014190600190602085019062000164565b5080516200015790600290602084019062000164565b50505062000247565b3390565b82805462000172906200020a565b90600052602060002090601f016020900481019282620001965760008555620001e1565b82601f10620001b157805160ff1916838001178555620001e1565b82800160010185558215620001e1579182015b82811115620001e1578251825591602001919060010190620001c4565b50620001ef929150620001f3565b5090565b5b80821115620001ef5760008155600101620001f4565b6002810460018216806200021f57607f821691505b602082108114156200024157634e487b7160e01b600052602260045260246000fd5b50919050565b61423480620002576000396000f3fe6080604052600436106102e45760003560e01c80637346dd0b11610190578063bb173bd5116100dc578063d547cfb711610095578063e985e9c51161006f578063e985e9c51461083e578063e9be0f3f1461085e578063ed0dd9ec14610873578063f2fde38b14610893576102e4565b8063d547cfb7146107e9578063e699ac27146107fe578063e86c6d411461081e576102e4565b8063bb173bd51461074c578063bf15eb2414610761578063c87b56dd14610781578063c9c37205146107a1578063d28ed9cb146107c1578063d3c39519146107d4576102e4565b806395d89b4111610149578063aedf182511610123578063aedf1825146106cc578063b5c1b6c8146106ec578063b88d4fde1461070c578063b99eb2771461072c576102e4565b806395d89b41146106775780639d8e19261461068c578063a22cb465146106ac576102e4565b80637346dd0b146105f0578063744dab38146106055780637e64d99d1461061a5780637fd255f11461062d5780638da5cb5b1461064d5780638e32e31614610662576102e4565b806337a131931161024f5780634f6ccce7116102085780636352211e116101e25780636352211e1461057b5780636d44aef51461059b57806370a08231146105bb578063715018a6146105db576102e4565b80634f6ccce714610526578063525b3fe3146105465780635d82cf6e1461055b576102e4565b806337a13193146104875780633ccfd60b146104a7578063403e03ab146104bc57806342842e0e146104d15780634bd2894e146104f15780634ebdbc9614610506576102e4565b8063095ea7b3116102a1578063095ea7b3146103d05780630aad3a71146103f057806318160ddd1461041257806323b872dd1461042757806325981e8f1461044757806330176e1314610467576102e4565b806301ffc9a7146102e9578063025355571461031f57806306fdde03146103415780630804899f14610363578063081812fc146103835780630955f63c146103b0575b600080fd5b3480156102f557600080fd5b506103096103043660046135da565b6108b3565b60405161031691906137df565b60405180910390f35b34801561032b57600080fd5b5061033f61033a36600461369b565b6108fb565b005b34801561034d57600080fd5b506103566109c6565b60405161031691906137ea565b34801561036f57600080fd5b5061033f61037e36600461369b565b610a58565b34801561038f57600080fd5b506103a361039e36600461369b565b610b1a565b604051610316919061374a565b3480156103bc57600080fd5b5061033f6103cb366004613505565b610b5d565b3480156103dc57600080fd5b5061033f6103eb366004613440565b610cb3565b3480156103fc57600080fd5b50610405610d4b565b6040516103169190614016565b34801561041e57600080fd5b50610405610d51565b34801561043357600080fd5b5061033f610442366004613352565b610d57565b61045a61045536600461369b565b610d8f565b604051610316919061379b565b34801561047357600080fd5b5061033f610482366004613612565b610fbc565b34801561049357600080fd5b5061033f6104a236600461369b565b61108b565b3480156104b357600080fd5b5061033f61114d565b3480156104c857600080fd5b506104056112ee565b3480156104dd57600080fd5b5061033f6104ec366004613352565b6112f4565b3480156104fd57600080fd5b5061040561130f565b34801561051257600080fd5b5061033f610521366004613672565b611315565b34801561053257600080fd5b5061040561054136600461369b565b611452565b34801561055257600080fd5b5061040561147d565b34801561056757600080fd5b5061033f61057636600461369b565b611483565b34801561058757600080fd5b506103a361059636600461369b565b611545565b3480156105a757600080fd5b5061033f6105b636600461369b565b61157a565b3480156105c757600080fd5b506104056105d6366004613306565b61163c565b3480156105e757600080fd5b5061033f611680565b3480156105fc57600080fd5b50610405611709565b34801561061157600080fd5b5061040561170f565b61045a61062836600461369b565b611715565b34801561063957600080fd5b5061033f61064836600461369b565b6118bc565b34801561065957600080fd5b506103a361197e565b34801561066e57600080fd5b5061040561198d565b34801561068357600080fd5b50610356611993565b34801561069857600080fd5b5061033f6106a7366004613658565b6119a2565b3480156106b857600080fd5b5061033f6106c7366004613406565b611bcc565b3480156106d857600080fd5b5061033f6106e736600461369b565b611c9a565b3480156106f857600080fd5b5061033f61070736600461369b565b611d5c565b34801561071857600080fd5b5061033f61072736600461338d565b611e1e565b34801561073857600080fd5b5061033f610747366004613306565b611e57565b34801561075857600080fd5b5061040561200f565b34801561076d57600080fd5b5061033f61077c36600461369b565b612015565b34801561078d57600080fd5b5061035661079c36600461369b565b6120d7565b3480156107ad57600080fd5b5061033f6107bc366004613469565b61215a565b61045a6107cf36600461369b565b61228c565b3480156107e057600080fd5b506104056124ae565b3480156107f557600080fd5b506103566124b4565b34801561080a57600080fd5b5061033f61081936600461369b565b6124c3565b34801561082a57600080fd5b5061033f610839366004613469565b612585565b34801561084a57600080fd5b50610309610859366004613320565b6126b7565b34801561086a57600080fd5b506104056126e5565b34801561087f57600080fd5b5061030961088e366004613658565b6126eb565b34801561089f57600080fd5b5061033f6108ae366004613306565b612833565b60006001600160e01b031982166380ac58cd60e01b14806108e457506001600160e01b03198216635b5e139f60e01b145b806108f357506108f3826128f3565b90505b919050565b6000805b60185481101561096f57336001600160a01b03166018828154811061093457634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561095d576001915061096f565b8061096781614174565b9150506108ff565b5061097861290c565b6001600160a01b031661098961197e565b6001600160a01b0316148061099b5750805b6109c05760405162461bcd60e51b81526004016109b790613e4e565b60405180910390fd5b50600755565b6060600180546109d59061411d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a019061411d565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b5050505050905090565b6000805b601854811015610acc57336001600160a01b031660188281548110610a9157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610aba5760019150610acc565b80610ac481614174565b915050610a5c565b50610ad561290c565b6001600160a01b0316610ae661197e565b6001600160a01b03161480610af85750805b610b145760405162461bcd60e51b81526004016109b790613e4e565b50600a55565b6000610b2582612910565b610b415760405162461bcd60e51b81526004016109b790613cbb565b506000908152600560205260409020546001600160a01b031690565b610b6561290c565b6001600160a01b0316610b7661197e565b6001600160a01b031614610b9c5760405162461bcd60e51b81526004016109b790613d3e565b60185415610bbc5760405162461bcd60e51b81526004016109b790613916565b6000805b8251811015610c81576018838281518110610beb57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b039092169190911781559101519101558251839082908110610c5657634e487b7160e01b600052603260045260246000fd5b60200260200101516020015182610c6d919061406d565b915080610c7981614174565b915050610bc0565b506011546001600160801b03828116911614610caf5760405162461bcd60e51b81526004016109b7906139c8565b5050565b6000610cbe82611545565b9050806001600160a01b0316836001600160a01b03161415610cf25760405162461bcd60e51b81526004016109b790613ece565b806001600160a01b0316610d0461290c565b6001600160a01b03161480610d205750610d208161085961290c565b610d3c5760405162461bcd60e51b81526004016109b790613b08565b610d46838361292d565b505050565b600f5481565b600e5490565b610d68610d6261290c565b8261299b565b610d845760405162461bcd60e51b81526004016109b790613f46565b610d46838383612a20565b6060323314610db05760405162461bcd60e51b81526004016109b790613a8f565b60095415801590610dc357504260095411155b610ddf5760405162461bcd60e51b81526004016109b790613ea1565b3360009081526019602052604090205460ff161515600114610e135760405162461bcd60e51b81526004016109b790613e0b565b81600c54610e2191906140bb565b341015610e405760405162461bcd60e51b81526004016109b790613c72565b601754821115610e625760405162461bcd60e51b81526004016109b790613f0f565b601554600f54610e72908461408f565b1115610e905760405162461bcd60e51b81526004016109b790613bf8565b601054821115610eb25760405162461bcd60e51b81526004016109b7906139ff565b60008267ffffffffffffffff811115610edb57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610f04578160200160208202803683370190505b5033600090815260166020526040812080549293508592909190610f2990849061408f565b9250508190555082600e6000828254610f42919061408f565b9250508190555082600f6000828254610f5b919061408f565b90915550600090505b83811015610fb157610f74612b4d565b828281518110610f9457634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610fa981614174565b915050610f64565b506108f33382612ca4565b6000805b60185481101561103057336001600160a01b031660188281548110610ff557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561101e5760019150611030565b8061102881614174565b915050610fc0565b5061103961290c565b6001600160a01b031661104a61197e565b6001600160a01b0316148061105c5750805b6110785760405162461bcd60e51b81526004016109b790613e4e565b8151610d469060129060208501906131f5565b6000805b6018548110156110ff57336001600160a01b0316601882815481106110c457634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156110ed57600191506110ff565b806110f781614174565b91505061108f565b5061110861290c565b6001600160a01b031661111961197e565b6001600160a01b0316148061112b5750805b6111475760405162461bcd60e51b81526004016109b790613e4e565b50600c55565b6000805b6018548110156111c157336001600160a01b03166018828154811061118657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156111af57600191506111c1565b806111b981614174565b915050611151565b506111ca61290c565b6001600160a01b03166111db61197e565b6001600160a01b031614806111ed5750805b6112095760405162461bcd60e51b81526004016109b790613e4e565b4760005b601854811015610d46576018818154811061123857634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000160009054906101000a90046001600160a01b03166001600160a01b03166108fc6112b3846018858154811061128e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600160029092020101546011546001600160801b0316612e60565b6040518115909202916000818181858888f193505050501580156112db573d6000803e3d6000fd5b50806112e681614174565b91505061120d565b600f5490565b610d4683838360405180602001604052806000815250611e1e565b60145481565b6000805b60185481101561138957336001600160a01b03166018828154811061134e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156113775760019150611389565b8061138181614174565b915050611319565b5061139261290c565b6001600160a01b03166113a361197e565b6001600160a01b031614806113b55750805b6113d15760405162461bcd60e51b81526004016109b790613e4e565b825b8261ffff168161ffff161161144c57601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1560108204018054600f9092166002026101000a61ffff81810219909316928416029190911790558061144481614152565b9150506113d3565b50505050565b600061145d82612910565b6114795760405162461bcd60e51b81526004016109b790613a43565b5090565b60155481565b6000805b6018548110156114f757336001600160a01b0316601882815481106114bc57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156114e557600191506114f7565b806114ef81614174565b915050611487565b5061150061290c565b6001600160a01b031661151161197e565b6001600160a01b031614806115235750805b61153f5760405162461bcd60e51b81526004016109b790613e4e565b50600b55565b6000818152600360205260408120546001600160a01b0316806108f35760405162461bcd60e51b81526004016109b790613baf565b6000805b6018548110156115ee57336001600160a01b0316601882815481106115b357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156115dc57600191506115ee565b806115e681614174565b91505061157e565b506115f761290c565b6001600160a01b031661160861197e565b6001600160a01b0316148061161a5750805b6116365760405162461bcd60e51b81526004016109b790613e4e565b50600955565b60006001600160a01b0382166116645760405162461bcd60e51b81526004016109b790613b65565b506001600160a01b031660009081526004602052604090205490565b61168861290c565b6001600160a01b031661169961197e565b6001600160a01b0316146116bf5760405162461bcd60e51b81526004016109b790613d3e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60175490565b600b5490565b60603233146117365760405162461bcd60e51b81526004016109b790613a8f565b6008541580159061174957504260085411155b6117655760405162461bcd60e51b81526004016109b790613fdf565b81600b5461177391906140bb565b3410156117925760405162461bcd60e51b81526004016109b790613c72565b6017548211156117b45760405162461bcd60e51b81526004016109b790613f0f565b6010548211156117d65760405162461bcd60e51b81526004016109b7906139ff565b60008267ffffffffffffffff8111156117ff57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611828578160200160208202803683370190505b503360009081526016602052604081208054929350859290919061184d90849061408f565b9250508190555082600e6000828254611866919061408f565b90915550600090505b83811015610fb15761187f612b4d565b82828151811061189f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806118b481614174565b91505061186f565b6000805b60185481101561193057336001600160a01b0316601882815481106118f557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561191e5760019150611930565b8061192881614174565b9150506118c0565b5061193961290c565b6001600160a01b031661194a61197e565b6001600160a01b0316148061195c5750805b6119785760405162461bcd60e51b81526004016109b790613e4e565b50601555565b6000546001600160a01b031690565b600e5481565b6060600280546109d59061411d565b6000805b601854811015611a1657336001600160a01b0316601882815481106119db57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611a045760019150611a16565b80611a0e81614174565b9150506119a6565b50611a1f61290c565b6001600160a01b0316611a3061197e565b6001600160a01b03161480611a425750805b611a5e5760405162461bcd60e51b81526004016109b790613e4e565b60005b60175461ffff821611610d46578261ffff1660178261ffff1681548110611a9857634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff1614611ac457611bba565b60178054611ad4906001906140da565b81548110611af257634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660178261ffff1681548110611b3b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506017805480611b8957634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a02191690559055610d46565b80611bc481614152565b915050611a61565b611bd461290c565b6001600160a01b0316826001600160a01b03161415611c055760405162461bcd60e51b81526004016109b790613991565b8060066000611c1261290c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611c5661290c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c8e91906137df565b60405180910390a35050565b6000805b601854811015611d0e57336001600160a01b031660188281548110611cd357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611cfc5760019150611d0e565b80611d0681614174565b915050611c9e565b50611d1761290c565b6001600160a01b0316611d2861197e565b6001600160a01b03161480611d3a5750805b611d565760405162461bcd60e51b81526004016109b790613e4e565b50600855565b6000805b601854811015611dd057336001600160a01b031660188281548110611d9557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611dbe5760019150611dd0565b80611dc881614174565b915050611d60565b50611dd961290c565b6001600160a01b0316611dea61197e565b6001600160a01b03161480611dfc5750805b611e185760405162461bcd60e51b81526004016109b790613e4e565b50601455565b611e2f611e2961290c565b8361299b565b611e4b5760405162461bcd60e51b81526004016109b790613f46565b61144c84848484612f37565b6000805b601854811015611ecb57336001600160a01b031660188281548110611e9057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611eb95760019150611ecb565b80611ec381614174565b915050611e5b565b50611ed461290c565b6001600160a01b0316611ee561197e565b6001600160a01b03161480611ef75750805b611f135760405162461bcd60e51b81526004016109b790613e4e565b6013546017541015611f375760405162461bcd60e51b81526004016109b790613ac6565b601354600e6000828254611f4b919061408f565b909155505060135460009067ffffffffffffffff811115611f7c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611fa5578160200160208202803683370190505b50905060005b601354811015611ffa57611fbd612b4d565b828281518110611fdd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611ff281614174565b915050611fab565b506120058382612ca4565b5050600060135550565b600d5490565b6000805b60185481101561208957336001600160a01b03166018828154811061204e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156120775760019150612089565b8061208181614174565b915050612019565b5061209261290c565b6001600160a01b03166120a361197e565b6001600160a01b031614806120b55750805b6120d15760405162461bcd60e51b81526004016109b790613e4e565b50601055565b60606120e282612910565b6120fe5760405162461bcd60e51b81526004016109b790613dbc565b60006121086124b4565b905060008151116121285760405180602001604052806000815250612153565b8061213284612f6a565b6040516020016121439291906136df565b6040516020818303038152906040525b9392505050565b6000805b6018548110156121ce57336001600160a01b03166018828154811061219357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156121bc57600191506121ce565b806121c681614174565b91505061215e565b506121d761290c565b6001600160a01b03166121e861197e565b6001600160a01b031614806121fa5750805b6122165760405162461bcd60e51b81526004016109b790613e4e565b60005b8251811015610d465760016019600085848151811061224857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061228481614174565b915050612219565b60603233146122ad5760405162461bcd60e51b81526004016109b790613a8f565b600754158015906122c057504260075411155b6122dc5760405162461bcd60e51b81526004016109b790613d07565b336000908152601a602052604090205460ff1615156001146123105760405162461bcd60e51b81526004016109b790613f97565b81600a5461231e91906140bb565b34101561233d5760405162461bcd60e51b81526004016109b790613c72565b60175482111561235f5760405162461bcd60e51b81526004016109b790613f0f565b601454600d5461236f908461408f565b111561238d5760405162461bcd60e51b81526004016109b7906137fd565b6010548211156123af5760405162461bcd60e51b81526004016109b7906139ff565b60008267ffffffffffffffff8111156123d857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612401578160200160208202803683370190505b503360009081526016602052604081208054929350859290919061242690849061408f565b9250508190555082600e600082825461243f919061408f565b9250508190555082600d6000828254612458919061408f565b90915550600090505b83811015610fb157612471612b4d565b82828151811061249157634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806124a681614174565b915050612461565b600d5481565b6060601280546109d59061411d565b6000805b60185481101561253757336001600160a01b0316601882815481106124fc57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156125255760019150612537565b8061252f81614174565b9150506124c7565b5061254061290c565b6001600160a01b031661255161197e565b6001600160a01b031614806125635750805b61257f5760405162461bcd60e51b81526004016109b790613e4e565b50601355565b6000805b6018548110156125f957336001600160a01b0316601882815481106125be57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156125e757600191506125f9565b806125f181614174565b915050612589565b5061260261290c565b6001600160a01b031661261361197e565b6001600160a01b031614806126255750805b6126415760405162461bcd60e51b81526004016109b790613e4e565b60005b8251811015610d46576001601a600085848151811061267357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806126af81614174565b915050612644565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b60135481565b600080805b60185481101561276057336001600160a01b03166018828154811061272557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561274e5760019150612760565b8061275881614174565b9150506126f0565b5061276961290c565b6001600160a01b031661277a61197e565b6001600160a01b0316148061278c5750805b6127a85760405162461bcd60e51b81526004016109b790613e4e565b60005b60175461ffff82161015612827578361ffff1660178261ffff16815481106127e357634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff16141561281557600192505061282d565b8061281f81614152565b9150506127ab565b50600091505b50919050565b61283b61290c565b6001600160a01b031661284c61197e565b6001600160a01b0316146128725760405162461bcd60e51b81526004016109b790613d3e565b6001600160a01b0381166128985760405162461bcd60e51b81526004016109b790613899565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061296282611545565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129a682612910565b6129c25760405162461bcd60e51b81526004016109b790613a43565b60006129cd83611545565b9050806001600160a01b0316846001600160a01b03161480612a085750836001600160a01b03166129fd84610b1a565b6001600160a01b0316145b80612a185750612a1881856126b7565b949350505050565b826001600160a01b0316612a3382611545565b6001600160a01b031614612a595760405162461bcd60e51b81526004016109b790613d73565b6001600160a01b038216612a7f5760405162461bcd60e51b81526004016109b79061394d565b612a8a838383610d46565b612a9560008261292d565b6001600160a01b0383166000908152600460205260408120805460019290612abe9084906140da565b90915550506001600160a01b0382166000908152600460205260408120805460019290612aec90849061408f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612b5e601780549050613085565b9050600060178281548110612b8357634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16905060176001601780549050612bc191906140da565b81548110612bdf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660178381548110612c2457634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506017805480612c7257634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a0219169055905591505090565b6001600160a01b038216612cca5760405162461bcd60e51b81526004016109b790613c3d565b80516001600160a01b03831660009081526004602052604081208054909190612cf490849061408f565b90915550600090505b8151811015610d4657612d36828281518110612d2957634e487b7160e01b600052603260045260246000fd5b6020026020010151612910565b15612d535760405162461bcd60e51b81526004016109b7906138df565b612d86600084848481518110612d7957634e487b7160e01b600052603260045260246000fd5b6020026020010151610d46565b8260036000848481518110612dab57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818181518110612e0557634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480612e5881614174565b915050612cfd565b600080612e766001600160801b038416866140a7565b90506000612e8d6001600160801b0385168761418f565b90506000612ea46001600160801b038616876140a7565b90506000612ebb6001600160801b0387168861418f565b90506001600160801b038616612ed182856140bb565b612edb91906140a7565b612ee583856140bb565b612eef83876140bb565b6001600160801b038916612f0386896140bb565b612f0d91906140bb565b612f17919061408f565b612f21919061408f565b612f2b919061408f565b98975050505050505050565b612f42848484612a20565b612f4e848484846130d4565b61144c5760405162461bcd60e51b81526004016109b790613847565b606081612f8f57506040805180820190915260018152600360fc1b60208201526108f6565b8160005b8115612fb95780612fa381614174565b9150612fb29050600a836140a7565b9150612f93565b60008167ffffffffffffffff811115612fe257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561300c576020820181803683370190505b5090505b8415612a18576130216001836140da565b915061302e600a8661418f565b61303990603061408f565b60f81b81838151811061305c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061307e600a866140a7565b9450613010565b60175460009081906130986001436140da565b404144336040516020016130b095949392919061370e565b60408051601f1981840301815291905280516020909101209050612153838261418f565b60006130e8846001600160a01b03166131ef565b156131e457836001600160a01b031663150b7a0261310461290c565b8786866040518563ffffffff1660e01b8152600401613126949392919061375e565b602060405180830381600087803b15801561314057600080fd5b505af1925050508015613170575060408051601f3d908101601f1916820190925261316d918101906135f6565b60015b6131ca573d80801561319e576040519150601f19603f3d011682016040523d82523d6000602084013e6131a3565b606091505b5080516131c25760405162461bcd60e51b81526004016109b790613847565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a18565b506001949350505050565b3b151590565b8280546132019061411d565b90600052602060002090601f0160209004810192826132235760008555613269565b82601f1061323c57805160ff1916838001178555613269565b82800160010185558215613269579182015b8281111561326957825182559160200191906001019061324e565b506114799291505b808211156114795760008155600101613271565b600067ffffffffffffffff83111561329f5761329f6141cf565b6132b2601f8401601f191660200161401f565b90508281528383830111156132c657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146108f657600080fd5b803561ffff811681146108f657600080fd5b600060208284031215613317578081fd5b612153826132dd565b60008060408385031215613332578081fd5b61333b836132dd565b9150613349602084016132dd565b90509250929050565b600080600060608486031215613366578081fd5b61336f846132dd565b925061337d602085016132dd565b9150604084013590509250925092565b600080600080608085870312156133a2578081fd5b6133ab856132dd565b93506133b9602086016132dd565b925060408501359150606085013567ffffffffffffffff8111156133db578182fd5b8501601f810187136133eb578182fd5b6133fa87823560208401613285565b91505092959194509250565b60008060408385031215613418578182fd5b613421836132dd565b915060208301358015158114613435578182fd5b809150509250929050565b60008060408385031215613452578182fd5b61345b836132dd565b946020939093013593505050565b6000602080838503121561347b578182fd5b823567ffffffffffffffff811115613491578283fd5b8301601f810185136134a1578283fd5b80356134b46134af82614049565b61401f565b81815283810190838501858402850186018910156134d0578687fd5b8694505b838510156134f9576134e5816132dd565b8352600194909401939185019185016134d4565b50979650505050505050565b60006020808385031215613517578182fd5b823567ffffffffffffffff8082111561352e578384fd5b818501915085601f830112613541578384fd5b813561354f6134af82614049565b818152848101908486016040808502870188018b101561356d578889fd5b8896505b848710156135cb5780828c031215613587578889fd5b805181810181811088821117156135a0576135a06141cf565b82526135ab836132dd565b815282890135898201528452600196909601959287019290810190613571565b50909998505050505050505050565b6000602082840312156135eb578081fd5b8135612153816141e5565b600060208284031215613607578081fd5b8151612153816141e5565b600060208284031215613623578081fd5b813567ffffffffffffffff811115613639578182fd5b8201601f81018413613649578182fd5b612a1884823560208401613285565b600060208284031215613669578081fd5b612153826132f4565b60008060408385031215613684578182fd5b61368d836132f4565b9150613349602084016132f4565b6000602082840312156136ac578081fd5b5035919050565b600081518084526136cb8160208601602086016140f1565b601f01601f19169290920160200192915050565b600083516136f18184602088016140f1565b8351908301906137058183602088016140f1565b01949350505050565b94855260208501939093526bffffffffffffffffffffffff19606092831b81166040860152605485019190915291901b16607482015260880190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613791908301846136b3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137d3578351835292840192918401916001016137b7565b50909695505050505050565b901515815260200190565b60006020825261215360208301846136b3565b6020808252602a908201527f4e6f206d6f726520617269747920746f6b656e73206c65667420666f722067656040820152696e657369732073616c6560b01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601e908201527f436f6c6c61626f7261746f7273207765726520616c7265616479207365740000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601e908201527f546f74616c2063757420646f6573206e6f742061646420746f20313030250000604082015260600190565b60208082526024908201527f4d617820746f6b656e7320706572207472616e73616374696f6e2063616e20626040820152636520323560e01b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526022908201527f4e6f20617269747920746f6b656e73206c65667420746f20626520636c61696d604082015261195960f21b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526025908201527f4e6f206d6f726520617269747920746f6b656e73206c65667420666f722070726040820152646573616c6560d81b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526029908201527f4e6f7420656e6f75676820457468657220746f20636c61696d20746865204172604082015268697479546f6b656e7360b81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f47656e657369732073616c65206973206e6f74206f70656e0000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526023908201527f596f7520617265206e6f742077686974656c697374656420666f722070726573604082015262616c6560e81b606082015260800190565b60208082526033908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015272103737b910309031b7b63630b137b930ba37b960691b606082015260800190565b602080825260139082015272283932b9b0b6329034b9903737ba1037b832b760691b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601c908201527f4e6f7420656e6f75676820617269747920746f6b656e73206c65667400000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526028908201527f596f7520617265206e6f742077686974656c697374656420666f722067656e656040820152677369732073616c6560c01b606082015260800190565b60208082526017908201527f5075626c69632073616c65206973206e6f74206f70656e000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715614041576140416141cf565b604052919050565b600067ffffffffffffffff821115614063576140636141cf565b5060209081020190565b60006001600160801b03808316818516808303821115613705576137056141a3565b600082198211156140a2576140a26141a3565b500190565b6000826140b6576140b66141b9565b500490565b60008160001904831182151516156140d5576140d56141a3565b500290565b6000828210156140ec576140ec6141a3565b500390565b60005b8381101561410c5781810151838201526020016140f4565b8381111561144c5750506000910152565b60028104600182168061413157607f821691505b6020821081141561282d57634e487b7160e01b600052602260045260246000fd5b600061ffff8083168181141561416a5761416a6141a3565b6001019392505050565b6000600019821415614188576141886141a3565b5060010190565b60008261419e5761419e6141b9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146141fb57600080fd5b5056fea264697066735822122014ba027fce6f57b7f421a96629bb5ece5186bc7646af1b7cd02b8997b92a800c64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106102e45760003560e01c80637346dd0b11610190578063bb173bd5116100dc578063d547cfb711610095578063e985e9c51161006f578063e985e9c51461083e578063e9be0f3f1461085e578063ed0dd9ec14610873578063f2fde38b14610893576102e4565b8063d547cfb7146107e9578063e699ac27146107fe578063e86c6d411461081e576102e4565b8063bb173bd51461074c578063bf15eb2414610761578063c87b56dd14610781578063c9c37205146107a1578063d28ed9cb146107c1578063d3c39519146107d4576102e4565b806395d89b4111610149578063aedf182511610123578063aedf1825146106cc578063b5c1b6c8146106ec578063b88d4fde1461070c578063b99eb2771461072c576102e4565b806395d89b41146106775780639d8e19261461068c578063a22cb465146106ac576102e4565b80637346dd0b146105f0578063744dab38146106055780637e64d99d1461061a5780637fd255f11461062d5780638da5cb5b1461064d5780638e32e31614610662576102e4565b806337a131931161024f5780634f6ccce7116102085780636352211e116101e25780636352211e1461057b5780636d44aef51461059b57806370a08231146105bb578063715018a6146105db576102e4565b80634f6ccce714610526578063525b3fe3146105465780635d82cf6e1461055b576102e4565b806337a13193146104875780633ccfd60b146104a7578063403e03ab146104bc57806342842e0e146104d15780634bd2894e146104f15780634ebdbc9614610506576102e4565b8063095ea7b3116102a1578063095ea7b3146103d05780630aad3a71146103f057806318160ddd1461041257806323b872dd1461042757806325981e8f1461044757806330176e1314610467576102e4565b806301ffc9a7146102e9578063025355571461031f57806306fdde03146103415780630804899f14610363578063081812fc146103835780630955f63c146103b0575b600080fd5b3480156102f557600080fd5b506103096103043660046135da565b6108b3565b60405161031691906137df565b60405180910390f35b34801561032b57600080fd5b5061033f61033a36600461369b565b6108fb565b005b34801561034d57600080fd5b506103566109c6565b60405161031691906137ea565b34801561036f57600080fd5b5061033f61037e36600461369b565b610a58565b34801561038f57600080fd5b506103a361039e36600461369b565b610b1a565b604051610316919061374a565b3480156103bc57600080fd5b5061033f6103cb366004613505565b610b5d565b3480156103dc57600080fd5b5061033f6103eb366004613440565b610cb3565b3480156103fc57600080fd5b50610405610d4b565b6040516103169190614016565b34801561041e57600080fd5b50610405610d51565b34801561043357600080fd5b5061033f610442366004613352565b610d57565b61045a61045536600461369b565b610d8f565b604051610316919061379b565b34801561047357600080fd5b5061033f610482366004613612565b610fbc565b34801561049357600080fd5b5061033f6104a236600461369b565b61108b565b3480156104b357600080fd5b5061033f61114d565b3480156104c857600080fd5b506104056112ee565b3480156104dd57600080fd5b5061033f6104ec366004613352565b6112f4565b3480156104fd57600080fd5b5061040561130f565b34801561051257600080fd5b5061033f610521366004613672565b611315565b34801561053257600080fd5b5061040561054136600461369b565b611452565b34801561055257600080fd5b5061040561147d565b34801561056757600080fd5b5061033f61057636600461369b565b611483565b34801561058757600080fd5b506103a361059636600461369b565b611545565b3480156105a757600080fd5b5061033f6105b636600461369b565b61157a565b3480156105c757600080fd5b506104056105d6366004613306565b61163c565b3480156105e757600080fd5b5061033f611680565b3480156105fc57600080fd5b50610405611709565b34801561061157600080fd5b5061040561170f565b61045a61062836600461369b565b611715565b34801561063957600080fd5b5061033f61064836600461369b565b6118bc565b34801561065957600080fd5b506103a361197e565b34801561066e57600080fd5b5061040561198d565b34801561068357600080fd5b50610356611993565b34801561069857600080fd5b5061033f6106a7366004613658565b6119a2565b3480156106b857600080fd5b5061033f6106c7366004613406565b611bcc565b3480156106d857600080fd5b5061033f6106e736600461369b565b611c9a565b3480156106f857600080fd5b5061033f61070736600461369b565b611d5c565b34801561071857600080fd5b5061033f61072736600461338d565b611e1e565b34801561073857600080fd5b5061033f610747366004613306565b611e57565b34801561075857600080fd5b5061040561200f565b34801561076d57600080fd5b5061033f61077c36600461369b565b612015565b34801561078d57600080fd5b5061035661079c36600461369b565b6120d7565b3480156107ad57600080fd5b5061033f6107bc366004613469565b61215a565b61045a6107cf36600461369b565b61228c565b3480156107e057600080fd5b506104056124ae565b3480156107f557600080fd5b506103566124b4565b34801561080a57600080fd5b5061033f61081936600461369b565b6124c3565b34801561082a57600080fd5b5061033f610839366004613469565b612585565b34801561084a57600080fd5b50610309610859366004613320565b6126b7565b34801561086a57600080fd5b506104056126e5565b34801561087f57600080fd5b5061030961088e366004613658565b6126eb565b34801561089f57600080fd5b5061033f6108ae366004613306565b612833565b60006001600160e01b031982166380ac58cd60e01b14806108e457506001600160e01b03198216635b5e139f60e01b145b806108f357506108f3826128f3565b90505b919050565b6000805b60185481101561096f57336001600160a01b03166018828154811061093457634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561095d576001915061096f565b8061096781614174565b9150506108ff565b5061097861290c565b6001600160a01b031661098961197e565b6001600160a01b0316148061099b5750805b6109c05760405162461bcd60e51b81526004016109b790613e4e565b60405180910390fd5b50600755565b6060600180546109d59061411d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a019061411d565b8015610a4e5780601f10610a2357610100808354040283529160200191610a4e565b820191906000526020600020905b815481529060010190602001808311610a3157829003601f168201915b5050505050905090565b6000805b601854811015610acc57336001600160a01b031660188281548110610a9157634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415610aba5760019150610acc565b80610ac481614174565b915050610a5c565b50610ad561290c565b6001600160a01b0316610ae661197e565b6001600160a01b03161480610af85750805b610b145760405162461bcd60e51b81526004016109b790613e4e565b50600a55565b6000610b2582612910565b610b415760405162461bcd60e51b81526004016109b790613cbb565b506000908152600560205260409020546001600160a01b031690565b610b6561290c565b6001600160a01b0316610b7661197e565b6001600160a01b031614610b9c5760405162461bcd60e51b81526004016109b790613d3e565b60185415610bbc5760405162461bcd60e51b81526004016109b790613916565b6000805b8251811015610c81576018838281518110610beb57634e487b7160e01b600052603260045260246000fd5b602090810291909101810151825460018082018555600094855293839020825160029092020180546001600160a01b0319166001600160a01b039092169190911781559101519101558251839082908110610c5657634e487b7160e01b600052603260045260246000fd5b60200260200101516020015182610c6d919061406d565b915080610c7981614174565b915050610bc0565b506011546001600160801b03828116911614610caf5760405162461bcd60e51b81526004016109b7906139c8565b5050565b6000610cbe82611545565b9050806001600160a01b0316836001600160a01b03161415610cf25760405162461bcd60e51b81526004016109b790613ece565b806001600160a01b0316610d0461290c565b6001600160a01b03161480610d205750610d208161085961290c565b610d3c5760405162461bcd60e51b81526004016109b790613b08565b610d46838361292d565b505050565b600f5481565b600e5490565b610d68610d6261290c565b8261299b565b610d845760405162461bcd60e51b81526004016109b790613f46565b610d46838383612a20565b6060323314610db05760405162461bcd60e51b81526004016109b790613a8f565b60095415801590610dc357504260095411155b610ddf5760405162461bcd60e51b81526004016109b790613ea1565b3360009081526019602052604090205460ff161515600114610e135760405162461bcd60e51b81526004016109b790613e0b565b81600c54610e2191906140bb565b341015610e405760405162461bcd60e51b81526004016109b790613c72565b601754821115610e625760405162461bcd60e51b81526004016109b790613f0f565b601554600f54610e72908461408f565b1115610e905760405162461bcd60e51b81526004016109b790613bf8565b601054821115610eb25760405162461bcd60e51b81526004016109b7906139ff565b60008267ffffffffffffffff811115610edb57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610f04578160200160208202803683370190505b5033600090815260166020526040812080549293508592909190610f2990849061408f565b9250508190555082600e6000828254610f42919061408f565b9250508190555082600f6000828254610f5b919061408f565b90915550600090505b83811015610fb157610f74612b4d565b828281518110610f9457634e487b7160e01b600052603260045260246000fd5b602090810291909101015280610fa981614174565b915050610f64565b506108f33382612ca4565b6000805b60185481101561103057336001600160a01b031660188281548110610ff557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561101e5760019150611030565b8061102881614174565b915050610fc0565b5061103961290c565b6001600160a01b031661104a61197e565b6001600160a01b0316148061105c5750805b6110785760405162461bcd60e51b81526004016109b790613e4e565b8151610d469060129060208501906131f5565b6000805b6018548110156110ff57336001600160a01b0316601882815481106110c457634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156110ed57600191506110ff565b806110f781614174565b91505061108f565b5061110861290c565b6001600160a01b031661111961197e565b6001600160a01b0316148061112b5750805b6111475760405162461bcd60e51b81526004016109b790613e4e565b50600c55565b6000805b6018548110156111c157336001600160a01b03166018828154811061118657634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156111af57600191506111c1565b806111b981614174565b915050611151565b506111ca61290c565b6001600160a01b03166111db61197e565b6001600160a01b031614806111ed5750805b6112095760405162461bcd60e51b81526004016109b790613e4e565b4760005b601854811015610d46576018818154811061123857634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160000160009054906101000a90046001600160a01b03166001600160a01b03166108fc6112b3846018858154811061128e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600160029092020101546011546001600160801b0316612e60565b6040518115909202916000818181858888f193505050501580156112db573d6000803e3d6000fd5b50806112e681614174565b91505061120d565b600f5490565b610d4683838360405180602001604052806000815250611e1e565b60145481565b6000805b60185481101561138957336001600160a01b03166018828154811061134e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156113775760019150611389565b8061138181614174565b915050611319565b5061139261290c565b6001600160a01b03166113a361197e565b6001600160a01b031614806113b55750805b6113d15760405162461bcd60e51b81526004016109b790613e4e565b825b8261ffff168161ffff161161144c57601780546001810182556000919091527fc624b66cc0138b8fabc209247f72d758e1cf3343756d543badbf24212bed8c1560108204018054600f9092166002026101000a61ffff81810219909316928416029190911790558061144481614152565b9150506113d3565b50505050565b600061145d82612910565b6114795760405162461bcd60e51b81526004016109b790613a43565b5090565b60155481565b6000805b6018548110156114f757336001600160a01b0316601882815481106114bc57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156114e557600191506114f7565b806114ef81614174565b915050611487565b5061150061290c565b6001600160a01b031661151161197e565b6001600160a01b031614806115235750805b61153f5760405162461bcd60e51b81526004016109b790613e4e565b50600b55565b6000818152600360205260408120546001600160a01b0316806108f35760405162461bcd60e51b81526004016109b790613baf565b6000805b6018548110156115ee57336001600160a01b0316601882815481106115b357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156115dc57600191506115ee565b806115e681614174565b91505061157e565b506115f761290c565b6001600160a01b031661160861197e565b6001600160a01b0316148061161a5750805b6116365760405162461bcd60e51b81526004016109b790613e4e565b50600955565b60006001600160a01b0382166116645760405162461bcd60e51b81526004016109b790613b65565b506001600160a01b031660009081526004602052604090205490565b61168861290c565b6001600160a01b031661169961197e565b6001600160a01b0316146116bf5760405162461bcd60e51b81526004016109b790613d3e565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60175490565b600b5490565b60603233146117365760405162461bcd60e51b81526004016109b790613a8f565b6008541580159061174957504260085411155b6117655760405162461bcd60e51b81526004016109b790613fdf565b81600b5461177391906140bb565b3410156117925760405162461bcd60e51b81526004016109b790613c72565b6017548211156117b45760405162461bcd60e51b81526004016109b790613f0f565b6010548211156117d65760405162461bcd60e51b81526004016109b7906139ff565b60008267ffffffffffffffff8111156117ff57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611828578160200160208202803683370190505b503360009081526016602052604081208054929350859290919061184d90849061408f565b9250508190555082600e6000828254611866919061408f565b90915550600090505b83811015610fb15761187f612b4d565b82828151811061189f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806118b481614174565b91505061186f565b6000805b60185481101561193057336001600160a01b0316601882815481106118f557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561191e5760019150611930565b8061192881614174565b9150506118c0565b5061193961290c565b6001600160a01b031661194a61197e565b6001600160a01b0316148061195c5750805b6119785760405162461bcd60e51b81526004016109b790613e4e565b50601555565b6000546001600160a01b031690565b600e5481565b6060600280546109d59061411d565b6000805b601854811015611a1657336001600160a01b0316601882815481106119db57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611a045760019150611a16565b80611a0e81614174565b9150506119a6565b50611a1f61290c565b6001600160a01b0316611a3061197e565b6001600160a01b03161480611a425750805b611a5e5760405162461bcd60e51b81526004016109b790613e4e565b60005b60175461ffff821611610d46578261ffff1660178261ffff1681548110611a9857634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff1614611ac457611bba565b60178054611ad4906001906140da565b81548110611af257634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660178261ffff1681548110611b3b57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506017805480611b8957634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a02191690559055610d46565b80611bc481614152565b915050611a61565b611bd461290c565b6001600160a01b0316826001600160a01b03161415611c055760405162461bcd60e51b81526004016109b790613991565b8060066000611c1261290c565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611c5661290c565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c8e91906137df565b60405180910390a35050565b6000805b601854811015611d0e57336001600160a01b031660188281548110611cd357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611cfc5760019150611d0e565b80611d0681614174565b915050611c9e565b50611d1761290c565b6001600160a01b0316611d2861197e565b6001600160a01b03161480611d3a5750805b611d565760405162461bcd60e51b81526004016109b790613e4e565b50600855565b6000805b601854811015611dd057336001600160a01b031660188281548110611d9557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611dbe5760019150611dd0565b80611dc881614174565b915050611d60565b50611dd961290c565b6001600160a01b0316611dea61197e565b6001600160a01b03161480611dfc5750805b611e185760405162461bcd60e51b81526004016109b790613e4e565b50601455565b611e2f611e2961290c565b8361299b565b611e4b5760405162461bcd60e51b81526004016109b790613f46565b61144c84848484612f37565b6000805b601854811015611ecb57336001600160a01b031660188281548110611e9057634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b03161415611eb95760019150611ecb565b80611ec381614174565b915050611e5b565b50611ed461290c565b6001600160a01b0316611ee561197e565b6001600160a01b03161480611ef75750805b611f135760405162461bcd60e51b81526004016109b790613e4e565b6013546017541015611f375760405162461bcd60e51b81526004016109b790613ac6565b601354600e6000828254611f4b919061408f565b909155505060135460009067ffffffffffffffff811115611f7c57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015611fa5578160200160208202803683370190505b50905060005b601354811015611ffa57611fbd612b4d565b828281518110611fdd57634e487b7160e01b600052603260045260246000fd5b602090810291909101015280611ff281614174565b915050611fab565b506120058382612ca4565b5050600060135550565b600d5490565b6000805b60185481101561208957336001600160a01b03166018828154811061204e57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156120775760019150612089565b8061208181614174565b915050612019565b5061209261290c565b6001600160a01b03166120a361197e565b6001600160a01b031614806120b55750805b6120d15760405162461bcd60e51b81526004016109b790613e4e565b50601055565b60606120e282612910565b6120fe5760405162461bcd60e51b81526004016109b790613dbc565b60006121086124b4565b905060008151116121285760405180602001604052806000815250612153565b8061213284612f6a565b6040516020016121439291906136df565b6040516020818303038152906040525b9392505050565b6000805b6018548110156121ce57336001600160a01b03166018828154811061219357634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156121bc57600191506121ce565b806121c681614174565b91505061215e565b506121d761290c565b6001600160a01b03166121e861197e565b6001600160a01b031614806121fa5750805b6122165760405162461bcd60e51b81526004016109b790613e4e565b60005b8251811015610d465760016019600085848151811061224857634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061228481614174565b915050612219565b60603233146122ad5760405162461bcd60e51b81526004016109b790613a8f565b600754158015906122c057504260075411155b6122dc5760405162461bcd60e51b81526004016109b790613d07565b336000908152601a602052604090205460ff1615156001146123105760405162461bcd60e51b81526004016109b790613f97565b81600a5461231e91906140bb565b34101561233d5760405162461bcd60e51b81526004016109b790613c72565b60175482111561235f5760405162461bcd60e51b81526004016109b790613f0f565b601454600d5461236f908461408f565b111561238d5760405162461bcd60e51b81526004016109b7906137fd565b6010548211156123af5760405162461bcd60e51b81526004016109b7906139ff565b60008267ffffffffffffffff8111156123d857634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612401578160200160208202803683370190505b503360009081526016602052604081208054929350859290919061242690849061408f565b9250508190555082600e600082825461243f919061408f565b9250508190555082600d6000828254612458919061408f565b90915550600090505b83811015610fb157612471612b4d565b82828151811061249157634e487b7160e01b600052603260045260246000fd5b6020908102919091010152806124a681614174565b915050612461565b600d5481565b6060601280546109d59061411d565b6000805b60185481101561253757336001600160a01b0316601882815481106124fc57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156125255760019150612537565b8061252f81614174565b9150506124c7565b5061254061290c565b6001600160a01b031661255161197e565b6001600160a01b031614806125635750805b61257f5760405162461bcd60e51b81526004016109b790613e4e565b50601355565b6000805b6018548110156125f957336001600160a01b0316601882815481106125be57634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b031614156125e757600191506125f9565b806125f181614174565b915050612589565b5061260261290c565b6001600160a01b031661261361197e565b6001600160a01b031614806126255750805b6126415760405162461bcd60e51b81526004016109b790613e4e565b60005b8251811015610d46576001601a600085848151811061267357634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806126af81614174565b915050612644565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b60135481565b600080805b60185481101561276057336001600160a01b03166018828154811061272557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600290910201546001600160a01b0316141561274e5760019150612760565b8061275881614174565b9150506126f0565b5061276961290c565b6001600160a01b031661277a61197e565b6001600160a01b0316148061278c5750805b6127a85760405162461bcd60e51b81526004016109b790613e4e565b60005b60175461ffff82161015612827578361ffff1660178261ffff16815481106127e357634e487b7160e01b600052603260045260246000fd5b60009182526020909120601082040154600f9091166002026101000a900461ffff16141561281557600192505061282d565b8061281f81614152565b9150506127ab565b50600091505b50919050565b61283b61290c565b6001600160a01b031661284c61197e565b6001600160a01b0316146128725760405162461bcd60e51b81526004016109b790613d3e565b6001600160a01b0381166128985760405162461bcd60e51b81526004016109b790613899565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160e01b031981166301ffc9a760e01b14919050565b3390565b6000908152600360205260409020546001600160a01b0316151590565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061296282611545565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129a682612910565b6129c25760405162461bcd60e51b81526004016109b790613a43565b60006129cd83611545565b9050806001600160a01b0316846001600160a01b03161480612a085750836001600160a01b03166129fd84610b1a565b6001600160a01b0316145b80612a185750612a1881856126b7565b949350505050565b826001600160a01b0316612a3382611545565b6001600160a01b031614612a595760405162461bcd60e51b81526004016109b790613d73565b6001600160a01b038216612a7f5760405162461bcd60e51b81526004016109b79061394d565b612a8a838383610d46565b612a9560008261292d565b6001600160a01b0383166000908152600460205260408120805460019290612abe9084906140da565b90915550506001600160a01b0382166000908152600460205260408120805460019290612aec90849061408f565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612b5e601780549050613085565b9050600060178281548110612b8357634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16905060176001601780549050612bc191906140da565b81548110612bdf57634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002029054906101000a900461ffff1660178381548110612c2457634e487b7160e01b600052603260045260246000fd5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055506017805480612c7257634e487b7160e01b600052603160045260246000fd5b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a0219169055905591505090565b6001600160a01b038216612cca5760405162461bcd60e51b81526004016109b790613c3d565b80516001600160a01b03831660009081526004602052604081208054909190612cf490849061408f565b90915550600090505b8151811015610d4657612d36828281518110612d2957634e487b7160e01b600052603260045260246000fd5b6020026020010151612910565b15612d535760405162461bcd60e51b81526004016109b7906138df565b612d86600084848481518110612d7957634e487b7160e01b600052603260045260246000fd5b6020026020010151610d46565b8260036000848481518110612dab57634e487b7160e01b600052603260045260246000fd5b6020026020010151815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550818181518110612e0557634e487b7160e01b600052603260045260246000fd5b6020026020010151836001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480612e5881614174565b915050612cfd565b600080612e766001600160801b038416866140a7565b90506000612e8d6001600160801b0385168761418f565b90506000612ea46001600160801b038616876140a7565b90506000612ebb6001600160801b0387168861418f565b90506001600160801b038616612ed182856140bb565b612edb91906140a7565b612ee583856140bb565b612eef83876140bb565b6001600160801b038916612f0386896140bb565b612f0d91906140bb565b612f17919061408f565b612f21919061408f565b612f2b919061408f565b98975050505050505050565b612f42848484612a20565b612f4e848484846130d4565b61144c5760405162461bcd60e51b81526004016109b790613847565b606081612f8f57506040805180820190915260018152600360fc1b60208201526108f6565b8160005b8115612fb95780612fa381614174565b9150612fb29050600a836140a7565b9150612f93565b60008167ffffffffffffffff811115612fe257634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561300c576020820181803683370190505b5090505b8415612a18576130216001836140da565b915061302e600a8661418f565b61303990603061408f565b60f81b81838151811061305c57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535061307e600a866140a7565b9450613010565b60175460009081906130986001436140da565b404144336040516020016130b095949392919061370e565b60408051601f1981840301815291905280516020909101209050612153838261418f565b60006130e8846001600160a01b03166131ef565b156131e457836001600160a01b031663150b7a0261310461290c565b8786866040518563ffffffff1660e01b8152600401613126949392919061375e565b602060405180830381600087803b15801561314057600080fd5b505af1925050508015613170575060408051601f3d908101601f1916820190925261316d918101906135f6565b60015b6131ca573d80801561319e576040519150601f19603f3d011682016040523d82523d6000602084013e6131a3565b606091505b5080516131c25760405162461bcd60e51b81526004016109b790613847565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612a18565b506001949350505050565b3b151590565b8280546132019061411d565b90600052602060002090601f0160209004810192826132235760008555613269565b82601f1061323c57805160ff1916838001178555613269565b82800160010185558215613269579182015b8281111561326957825182559160200191906001019061324e565b506114799291505b808211156114795760008155600101613271565b600067ffffffffffffffff83111561329f5761329f6141cf565b6132b2601f8401601f191660200161401f565b90508281528383830111156132c657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146108f657600080fd5b803561ffff811681146108f657600080fd5b600060208284031215613317578081fd5b612153826132dd565b60008060408385031215613332578081fd5b61333b836132dd565b9150613349602084016132dd565b90509250929050565b600080600060608486031215613366578081fd5b61336f846132dd565b925061337d602085016132dd565b9150604084013590509250925092565b600080600080608085870312156133a2578081fd5b6133ab856132dd565b93506133b9602086016132dd565b925060408501359150606085013567ffffffffffffffff8111156133db578182fd5b8501601f810187136133eb578182fd5b6133fa87823560208401613285565b91505092959194509250565b60008060408385031215613418578182fd5b613421836132dd565b915060208301358015158114613435578182fd5b809150509250929050565b60008060408385031215613452578182fd5b61345b836132dd565b946020939093013593505050565b6000602080838503121561347b578182fd5b823567ffffffffffffffff811115613491578283fd5b8301601f810185136134a1578283fd5b80356134b46134af82614049565b61401f565b81815283810190838501858402850186018910156134d0578687fd5b8694505b838510156134f9576134e5816132dd565b8352600194909401939185019185016134d4565b50979650505050505050565b60006020808385031215613517578182fd5b823567ffffffffffffffff8082111561352e578384fd5b818501915085601f830112613541578384fd5b813561354f6134af82614049565b818152848101908486016040808502870188018b101561356d578889fd5b8896505b848710156135cb5780828c031215613587578889fd5b805181810181811088821117156135a0576135a06141cf565b82526135ab836132dd565b815282890135898201528452600196909601959287019290810190613571565b50909998505050505050505050565b6000602082840312156135eb578081fd5b8135612153816141e5565b600060208284031215613607578081fd5b8151612153816141e5565b600060208284031215613623578081fd5b813567ffffffffffffffff811115613639578182fd5b8201601f81018413613649578182fd5b612a1884823560208401613285565b600060208284031215613669578081fd5b612153826132f4565b60008060408385031215613684578182fd5b61368d836132f4565b9150613349602084016132f4565b6000602082840312156136ac578081fd5b5035919050565b600081518084526136cb8160208601602086016140f1565b601f01601f19169290920160200192915050565b600083516136f18184602088016140f1565b8351908301906137058183602088016140f1565b01949350505050565b94855260208501939093526bffffffffffffffffffffffff19606092831b81166040860152605485019190915291901b16607482015260880190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613791908301846136b3565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156137d3578351835292840192918401916001016137b7565b50909695505050505050565b901515815260200190565b60006020825261215360208301846136b3565b6020808252602a908201527f4e6f206d6f726520617269747920746f6b656e73206c65667420666f722067656040820152696e657369732073616c6560b01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601e908201527f436f6c6c61626f7261746f7273207765726520616c7265616479207365740000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601e908201527f546f74616c2063757420646f6573206e6f742061646420746f20313030250000604082015260600190565b60208082526024908201527f4d617820746f6b656e7320706572207472616e73616374696f6e2063616e20626040820152636520323560e01b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252601e908201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604082015260600190565b60208082526022908201527f4e6f20617269747920746f6b656e73206c65667420746f20626520636c61696d604082015261195960f21b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526025908201527f4e6f206d6f726520617269747920746f6b656e73206c65667420666f722070726040820152646573616c6560d81b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526029908201527f4e6f7420656e6f75676820457468657220746f20636c61696d20746865204172604082015268697479546f6b656e7360b81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f47656e657369732073616c65206973206e6f74206f70656e0000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526023908201527f596f7520617265206e6f742077686974656c697374656420666f722070726573604082015262616c6560e81b606082015260800190565b60208082526033908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015272103737b910309031b7b63630b137b930ba37b960691b606082015260800190565b602080825260139082015272283932b9b0b6329034b9903737ba1037b832b760691b604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b6020808252601c908201527f4e6f7420656e6f75676820617269747920746f6b656e73206c65667400000000604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526028908201527f596f7520617265206e6f742077686974656c697374656420666f722067656e656040820152677369732073616c6560c01b606082015260800190565b60208082526017908201527f5075626c69632073616c65206973206e6f74206f70656e000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715614041576140416141cf565b604052919050565b600067ffffffffffffffff821115614063576140636141cf565b5060209081020190565b60006001600160801b03808316818516808303821115613705576137056141a3565b600082198211156140a2576140a26141a3565b500190565b6000826140b6576140b66141b9565b500490565b60008160001904831182151516156140d5576140d56141a3565b500290565b6000828210156140ec576140ec6141a3565b500390565b60005b8381101561410c5781810151838201526020016140f4565b8381111561144c5750506000910152565b60028104600182168061413157607f821691505b6020821081141561282d57634e487b7160e01b600052602260045260246000fd5b600061ffff8083168181141561416a5761416a6141a3565b6001019392505050565b6000600019821415614188576141886141a3565b5060010190565b60008261419e5761419e6141b9565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146141fb57600080fd5b5056fea264697066735822122014ba027fce6f57b7f421a96629bb5ece5186bc7646af1b7cd02b8997b92a800c64736f6c63430008000033

Deployed Bytecode Sourcemap

82:14729:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1500:344:4;;;;;;;;;;-1:-1:-1;1500:344:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5318:171:1;;;;;;;;;;-1:-1:-1;5318:171:1;;;;;:::i;:::-;;:::i;:::-;;2618:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4538:151:1:-;;;;;;;;;;-1:-1:-1;4538:151:1;;;;;:::i;:::-;;:::i;4164:295:4:-;;;;;;;;;;-1:-1:-1;4164:295:4;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2901:468:1:-;;;;;;;;;;-1:-1:-1;2901:468:1;;;;;:::i;:::-;;:::i;3679:424:4:-;;;;;;;;;;-1:-1:-1;3679:424:4;;;;;:::i;:::-;;:::i;2173:38:1:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;12912:104::-;;;;;;;;;;;;;:::i;5178:364:4:-;;;;;;;;;;-1:-1:-1;5178:364:4;;;;;:::i;:::-;;:::i;9847:1029:1:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3921:102::-;;;;;;;;;;-1:-1:-1;3921:102:1;;;;;:::i;:::-;;:::i;4314:135::-;;;;;;;;;;-1:-1:-1;4314:135:1;;;;;:::i;:::-;;:::i;3512:317::-;;;;;;;;;;;;;:::i;13093:116::-;;;;;;;;;;;;;:::i;5608:179:4:-;;;;;;;;;;-1:-1:-1;5608:179:4;;;;;:::i;:::-;;:::i;2401:38:1:-;;;;;;;;;;;;;:::i;6477:208::-;;;;;;;;;;-1:-1:-1;6477:208:1;;;;;:::i;:::-;;:::i;12075:220::-;;;;;;;;;;-1:-1:-1;12075:220:1;;;;;:::i;:::-;;:::i;2445:34::-;;;;;;;;;;;;;:::i;4099:131::-;;;;;;;;;;-1:-1:-1;4099:131:1;;;;;:::i;:::-;;:::i;2243:313:4:-;;;;;;;;;;-1:-1:-1;2243:313:4;;;;;:::i;:::-;;:::i;5055:155:1:-;;;;;;;;;;-1:-1:-1;5055:155:1;;;;;:::i;:::-;;:::i;1903:283:4:-;;;;;;;;;;-1:-1:-1;1903:283:4;;;;;:::i;:::-;;:::i;1693:145:11:-;;;;;;;;;;;;;:::i;12560:118:1:-;;;;;;;;;;;;;:::i;12752:101::-;;;;;;;;;;;;;:::i;8933:833::-;;;;;;:::i;:::-;;:::i;5558:139::-;;;;;;;;;;-1:-1:-1;5558:139:1;;;;;:::i;:::-;;:::i;1061:85:11:-;;;;;;;;;;;;;:::i;2131:36:1:-;;;;;;;;;;;;;:::i;2780:102:4:-;;;;;;;;;;;;;:::i;6797:441:1:-;;;;;;;;;;-1:-1:-1;6797:441:1;;;;;:::i;:::-;;:::i;4526:318:4:-;;;;;;;;;;-1:-1:-1;4526:318:4;;;;;:::i;:::-;;:::i;4781:171:1:-;;;;;;;;;;-1:-1:-1;4781:171:1;;;;;:::i;:::-;;:::i;5775:155::-;;;;;;;;;;-1:-1:-1;5775:155:1;;;;;:::i;:::-;;:::i;5853:354:4:-;;;;;;;;;;-1:-1:-1;5853:354:4;;;;;:::i;:::-;;:::i;7743:511:1:-;;;;;;;;;;-1:-1:-1;7743:511:1;;;;;:::i;:::-;;:::i;13215:116::-;;;;;;;;;;;;;:::i;6203:203::-;;;;;;;;;;-1:-1:-1;6203:203:1;;;;;:::i;:::-;;:::i;2948:451:4:-;;;;;;;;;;-1:-1:-1;2948:451:4;;;;;:::i;:::-;;:::i;8319:212:1:-;;;;;;;;;;-1:-1:-1;8319:212:1;;;;;:::i;:::-;;:::i;10962:1050::-;;;;;;:::i;:::-;;:::i;2087:38::-;;;;;;;;;;;;;:::i;12370:93::-;;;;;;;;;;;;;:::i;5989:143::-;;;;;;;;;;-1:-1:-1;5989:143:1;;;;;:::i;:::-;;:::i;8601:216::-;;;;;;;;;;-1:-1:-1;8601:216:1;;;;;:::i;:::-;;:::i;4910:206:4:-;;;;;;;;;;-1:-1:-1;4910:206:4;;;;;:::i;:::-;;:::i;2358:32:1:-;;;;;;;;;;;;;:::i;7321:329::-;;;;;;;;;;-1:-1:-1;7321:329:1;;;;;:::i;:::-;;:::i;1987:240:11:-;;;;;;;;;;-1:-1:-1;1987:240:11;;;;;:::i;:::-;;:::i;1500:344:4:-;1642:4;-1:-1:-1;;;;;;1681:40:4;;-1:-1:-1;;;1681:40:4;;:104;;-1:-1:-1;;;;;;;1737:48:4;;-1:-1:-1;;;1737:48:4;1681:104;:156;;;;1801:36;1825:11;1801:23;:36::i;:::-;1662:175;;1500:344;;;;:::o;5318:171:1:-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;5438:20:1::1;:44:::0;5318:171::o;2618:98:4:-;2672:13;2704:5;2697:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2618:98;:::o;4538:151:1:-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;4638:20:1::1;:44:::0;4538:151::o;4164:295:4:-;4280:7;4324:16;4332:7;4324;:16::i;:::-;4303:107;;;;-1:-1:-1;;;4303:107:4;;;;;;;:::i;:::-;-1:-1:-1;4428:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4428:24:4;;4164:295::o;2901:468:1:-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;-1:-1:-1;;;1265:68:11;;;;;;;:::i;:::-;3023:13:1::1;:20:::0;:25;3015:68:::1;;;;-1:-1:-1::0;;;3015:68:1::1;;;;;;;:::i;:::-;3094:16;3125:9:::0;3120:166:::1;3140:14;:21;3136:1;:25;3120:166;;;3182:13;3201:14;3216:1;3201:17;;;;;;-1:-1:-1::0;;;3201:17:1::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;3182:37;;::::1;::::0;;::::1;::::0;;-1:-1:-1;3182:37:1;;;;;;;;;::::1;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;3182:37:1::1;-1:-1:-1::0;;;;;3182:37:1;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;3253:17;;;;3268:1;;3253:17;::::1;;;-1:-1:-1::0;;;3253:17:1::1;;;;;;;;;;;;;;;:21;;;3233:42;;;;;:::i;:::-;::::0;-1:-1:-1;3163:3:1;::::1;::::0;::::1;:::i;:::-;;;;3120:166;;;-1:-1:-1::0;3316:11:1::1;::::0;-1:-1:-1;;;;;3304:23:1;;::::1;3316:11:::0;::::1;3304:23;3296:66;;;;-1:-1:-1::0;;;3296:66:1::1;;;;;;;:::i;:::-;1343:1:11;2901:468:1::0;:::o;3679:424:4:-;3759:13;3775:23;3790:7;3775:14;:23::i;:::-;3759:39;;3822:5;-1:-1:-1;;;;;3816:11:4;:2;-1:-1:-1;;;;;3816:11:4;;;3808:57;;;;-1:-1:-1;;;3808:57:4;;;;;;;:::i;:::-;3913:5;-1:-1:-1;;;;;3897:21:4;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3897:21:4;;:85;;;;3938:44;3962:5;3969:12;:10;:12::i;3938:44::-;3876:188;;;;-1:-1:-1;;;3876:188:4;;;;;;;:::i;:::-;4075:21;4084:2;4088:7;4075:8;:21::i;:::-;3679:424;;;:::o;2173:38:1:-;;;;:::o;12912:104::-;12992:17;;12912:104;:::o;5178:364:4:-;5380:41;5399:12;:10;:12::i;:::-;5413:7;5380:18;:41::i;:::-;5359:137;;;;-1:-1:-1;;;5359:137:4;;;;;;;:::i;:::-;5507:28;5517:4;5523:2;5527:7;5507:9;:28::i;9847:1029:1:-;10022:16;225:9;238:10;225:23;217:66;;;;-1:-1:-1;;;217:66:1;;;;;;;:::i;:::-;1000:16:::1;::::0;:21;;::::1;::::0;:60:::1;;;1045:15;1025:16;;:35;;1000:60;979:126;;;;-1:-1:-1::0;;;979:126:1::1;;;;;;;:::i;:::-;1414:10:::2;1386:39;::::0;;;:27:::2;:39;::::0;;;;;::::2;;:47;;:39:::0;:47:::2;1378:95;;;;-1:-1:-1::0;;;1378:95:1::2;;;;;;;:::i;:::-;10107:8:::3;10088:16;;:27;;;;:::i;:::-;10075:9;:40;;10054:128;;;;-1:-1:-1::0;;;10054:128:1::3;;;;;;;:::i;:::-;10209:20;:27:::0;:39;-1:-1:-1;10209:39:1::3;10201:80;;;;-1:-1:-1::0;;;10201:80:1::3;;;;;;;:::i;:::-;10334:12;::::0;10311:19:::3;::::0;10300:30:::3;::::0;:8;:30:::3;:::i;:::-;:46;;10292:96;;;;-1:-1:-1::0;;;10292:96:1::3;;;;;;;:::i;:::-;10419:28;;10407:8;:40;;10399:89;;;;-1:-1:-1::0;;;10399:89:1::3;;;;;;;:::i;:::-;10499:25;10541:8;10527:23;;;;;;-1:-1:-1::0;;;10527:23:1::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;10527:23:1::3;-1:-1:-1::0;10588:10:1::3;10561:38;::::0;;;:26:::3;:38;::::0;;;;:50;;10499:51;;-1:-1:-1;10603:8:1;;10561:38;;;:50:::3;::::0;10603:8;;10561:50:::3;:::i;:::-;;;;;;;;10642:8;10621:17;;:29;;;;;;;:::i;:::-;;;;;;;;10683:8;10660:19;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;10707:9:1::3;::::0;-1:-1:-1;10702:100:1::3;10722:8;10718:1;:12;10702:100;;;10765:26;:24;:26::i;:::-;10751:8;10760:1;10751:11;;;;;;-1:-1:-1::0;;;10751:11:1::3;;;;;;;;;;::::0;;::::3;::::0;;;;;:40;10732:3;::::3;::::0;::::3;:::i;:::-;;;;10702:100;;;;10812:32;10823:10;10835:8;10812:10;:32::i;3921:102::-:0;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;4002:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;4314:135::-:0;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;4406:16:1::1;:36:::0;4314:135::o;3512:317::-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;3591:21:::1;3568:20;3623:200;3643:13;:20:::0;3639:24;::::1;3623:200;;;3692:13;3706:1;3692:16;;;;;;-1:-1:-1::0;;;3692:16:1::1;;;;;;;;;;;;;;;;;;;:21;;;;;;;;;;-1:-1:-1::0;;;;;3692:21:1::1;-1:-1:-1::0;;;;;3684:39:1::1;:128;3741:57;3750:12;3764:13;3778:1;3764:16;;;;;;-1:-1:-1::0;;;3764:16:1::1;;;;;;;;;;::::0;;;::::1;::::0;;;:20:::1;:16;::::0;;::::1;;:20;::::0;3786:11:::1;::::0;-1:-1:-1;;;;;3786:11:1::1;3741:8;:57::i;:::-;3684:128;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;3665:3:1;::::1;::::0;::::1;:::i;:::-;;;;3623:200;;13093:116:::0;13183:19;;13093:116;:::o;5608:179:4:-;5741:39;5758:4;5764:2;5768:7;5741:39;;;;;;;;;;;;:16;:39::i;2401:38:1:-;;;;:::o;6477:208::-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;6606:4;6590:89:::1;6617:2;6612:7;;:1;:7;;;6590:89;;6640:20;:28:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;6640:28:1;;;;;::::1;::::0;::::1;;::::0;;;;;;::::1;;;;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;;6621:3:::1;6640:28:::0;6621:3:::1;:::i;:::-;;;;6590:89;;;;6477:208:::0;;;:::o;12075:220::-;12137:7;12177:16;12185:7;12177;:16::i;:::-;12156:107;;;;-1:-1:-1;;;12156:107:1;;;;;;;:::i;:::-;-1:-1:-1;12281:7:1;12075:220::o;2445:34::-;;;;:::o;4099:131::-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;4189:15:1::1;:34:::0;4099:131::o;2243:313:4:-;2355:7;2394:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2394:16:4;2441:19;2420:107;;;;-1:-1:-1;;;2420:107:4;;;;;;;:::i;5055:155:1:-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;5167:16:1::1;:36:::0;5055:155::o;1903:283:4:-;2015:7;-1:-1:-1;;;;;2059:19:4;;2038:108;;;;-1:-1:-1;;;2038:108:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;;2163:16:4;;;;;:9;:16;;;;;;;1903:283::o;1693:145:11:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;-1:-1:-1;;;1265:68:11;;;;;;;:::i;:::-;1799:1:::1;1783:6:::0;;1762:40:::1;::::0;-1:-1:-1;;;;;1783:6:11;;::::1;::::0;1762:40:::1;::::0;1799:1;;1762:40:::1;1829:1;1812:19:::0;;-1:-1:-1;;;;;;1812:19:11::1;::::0;;1693:145::o;12560:118:1:-;12644:20;:27;12560:118;:::o;12752:101::-;12831:15;;12752:101;:::o;8933:833::-;9069:16;225:9;238:10;225:23;217:66;;;;-1:-1:-1;;;217:66:1;;;;;;;:::i;:::-;801:20:::1;::::0;:25;;::::1;::::0;:68:::1;;;854:15;830:20;;:39;;801:68;780:138;;;;-1:-1:-1::0;;;780:138:1::1;;;;;;;:::i;:::-;9153:8:::2;9135:15;;:26;;;;:::i;:::-;9122:9;:39;;9101:127;;;;-1:-1:-1::0;;;9101:127:1::2;;;;;;;:::i;:::-;9247:20;:27:::0;:39;-1:-1:-1;9247:39:1::2;9239:80;;;;-1:-1:-1::0;;;9239:80:1::2;;;;;;;:::i;:::-;9350:28;;9338:8;:40;;9330:89;;;;-1:-1:-1::0;;;9330:89:1::2;;;;;;;:::i;:::-;9430:25;9472:8;9458:23;;;;;;-1:-1:-1::0;;;9458:23:1::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;9458:23:1::2;-1:-1:-1::0;9519:10:1::2;9492:38;::::0;;;:26:::2;:38;::::0;;;;:50;;9430:51;;-1:-1:-1;9534:8:1;;9492:38;;;:50:::2;::::0;9534:8;;9492:50:::2;:::i;:::-;;;;;;;;9573:8;9552:17;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;9597:9:1::2;::::0;-1:-1:-1;9592:100:1::2;9612:8;9608:1;:12;9592:100;;;9655:26;:24;:26::i;:::-;9641:8;9650:1;9641:11;;;;;;-1:-1:-1::0;;;9641:11:1::2;;;;;;;;;;::::0;;::::2;::::0;;;;;:40;9622:3;::::2;::::0;::::2;:::i;:::-;;;;9592:100;;5558:139:::0;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;5662:12:1::1;:28:::0;5558:139::o;1061:85:11:-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:11;1061:85;:::o;2131:36:1:-;;;;:::o;2780:102:4:-;2836:13;2868:7;2861:14;;;;;:::i;6797:441:1:-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;6924:8:::1;6919:313;6939:20;:27:::0;6934:32:::1;::::0;::::1;;6919:313;;7018:7;6991:34;;:20;7012:1;6991:23;;;;;;;;-1:-1:-1::0;;;6991:23:1::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;:34;6987:81;;7045:8;;6987:81;7108:20;7129:27:::0;;:31:::1;::::0;7159:1:::1;::::0;7129:31:::1;:::i;:::-;7108:53;;;;;;-1:-1:-1::0;;;7108:53:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7082:20;7103:1;7082:23;;;;;;;;-1:-1:-1::0;;;7082:23:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;:79;;;;;;;;;;;;;;;;;;7175:20;:26;;;;;-1:-1:-1::0;;;7175:26:1::1;;;;;;;;;;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;7175:26:1;;;;;::::1;;::::0;;::::1;;::::0;;;::::1;;;;;;::::0;;;;7216:5:::1;;6919:313;6968:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6919:313;;4526:318:4::0;4668:12;:10;:12::i;:::-;-1:-1:-1;;;;;4656:24:4;:8;-1:-1:-1;;;;;4656:24:4;;;4648:62;;;;-1:-1:-1;;;4648:62:4;;;;;;;:::i;:::-;4766:8;4721:18;:32;4740:12;:10;:12::i;:::-;-1:-1:-1;;;;;4721:32:4;;;;;;;;;;;;;;;;;-1:-1:-1;4721:32:4;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4721:53:4;;;;;;;;;;;4804:12;:10;:12::i;:::-;-1:-1:-1;;;;;4789:48:4;;4828:8;4789:48;;;;;;:::i;:::-;;;;;;;;4526:318;;:::o;4781:171:1:-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;4901:20:1::1;:44:::0;4781:171::o;5775:155::-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;5887:16:1::1;:36:::0;5775:155::o;5853:354:4:-;6035:41;6054:12;:10;:12::i;:::-;6068:7;6035:18;:41::i;:::-;6014:137;;;;-1:-1:-1;;;6014:137:4;;;;;;;:::i;:::-;6161:39;6175:4;6181:2;6185:7;6194:5;6161:13;:39::i;7743:511:1:-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;7892:13:::1;::::0;7861:20:::1;:27:::0;:44:::1;;7853:91;;;;-1:-1:-1::0;;;7853:91:1::1;;;;;;;:::i;:::-;7984:13;;7963:17;;:34;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;8050:13:1::1;::::0;8008:25:::1;::::0;8036:28:::1;::::0;::::1;;;;-1:-1:-1::0;;;8036:28:1::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;8036:28:1::1;;8008:56;;8080:9;8075:105;8095:13;;8091:1;:17;8075:105;;;8143:26;:24;:26::i;:::-;8129:8;8138:1;8129:11;;;;;;-1:-1:-1::0;;;8129:11:1::1;;;;;;;;;;::::0;;::::1;::::0;;;;;:40;8110:3;::::1;::::0;::::1;:::i;:::-;;;;8075:105;;;;8190:30;8201:8;8211;8190:10;:30::i;:::-;-1:-1:-1::0;;8246:1:1::1;8230:13;:17:::0;-1:-1:-1;7743:511:1:o;13215:116::-;13305:19;;13215:116;:::o;6203:203::-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;6339:28:1::1;:60:::0;6203:203::o;2948:451:4:-;3061:13;3111:16;3119:7;3111;:16::i;:::-;3090:110;;;;-1:-1:-1;;;3090:110:4;;;;;;;:::i;:::-;3211:21;3235:10;:8;:10::i;:::-;3211:34;;3298:1;3280:7;3274:21;:25;:118;;;;;;;;;;;;;;;;;3342:7;3351:18;:7;:16;:18::i;:::-;3325:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3274:118;3255:137;2948:451;-1:-1:-1;;;2948:451:4:o;8319:212:1:-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;8421:6:::1;8416:109;8437:5;:12;8433:1;:16;8416:109;;;8510:4;8470:27;:37;8498:5;8504:1;8498:8;;;;;;-1:-1:-1::0;;;8498:8:1::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;8470:37:1::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;8470:37:1;:44;;-1:-1:-1;;8470:44:1::1;::::0;::::1;;::::0;;;::::1;::::0;;8451:3;::::1;::::0;::::1;:::i;:::-;;;;8416:109;;10962:1050:::0;11145:16;225:9;238:10;225:23;217:66;;;;-1:-1:-1;;;217:66:1;;;;;;;:::i;:::-;1191:20:::1;::::0;:25;;::::1;::::0;:68:::1;;;1244:15;1220:20;;:39;;1191:68;1170:139;;;;-1:-1:-1::0;;;1170:139:1::1;;;;;;;:::i;:::-;1578:10:::2;1550:39;::::0;;;:27:::2;:39;::::0;;;;;::::2;;:47;;:39:::0;:47:::2;1542:100;;;;-1:-1:-1::0;;;1542:100:1::2;;;;;;;:::i;:::-;11234:8:::3;11211:20;;:31;;;;:::i;:::-;11198:9;:44;;11177:132;;;;-1:-1:-1::0;;;11177:132:1::3;;;;;;;:::i;:::-;11336:20;:27:::0;:39;-1:-1:-1;11336:39:1::3;11328:80;;;;-1:-1:-1::0;;;11328:80:1::3;;;;;;;:::i;:::-;11461:16;::::0;11438:19:::3;::::0;11427:30:::3;::::0;:8;:30:::3;:::i;:::-;:50;;11419:105;;;;-1:-1:-1::0;;;11419:105:1::3;;;;;;;:::i;:::-;11555:28;;11543:8;:40;;11535:89;;;;-1:-1:-1::0;;;11535:89:1::3;;;;;;;:::i;:::-;11635:25;11677:8;11663:23;;;;;;-1:-1:-1::0;;;11663:23:1::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;11663:23:1::3;-1:-1:-1::0;11724:10:1::3;11697:38;::::0;;;:26:::3;:38;::::0;;;;:50;;11635:51;;-1:-1:-1;11739:8:1;;11697:38;;;:50:::3;::::0;11739:8;;11697:50:::3;:::i;:::-;;;;;;;;11778:8;11757:17;;:29;;;;;;;:::i;:::-;;;;;;;;11819:8;11796:19;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;11843:9:1::3;::::0;-1:-1:-1;11838:100:1::3;11858:8;11854:1;:12;11838:100;;;11901:26;:24;:26::i;:::-;11887:8;11896:1;11887:11;;;;;;-1:-1:-1::0;;;11887:11:1::3;;;;;;;;;;::::0;;::::3;::::0;;;;;:40;11868:3;::::3;::::0;::::3;:::i;:::-;;;;11838:100;;2087:38:::0;;;;:::o;12370:93::-;12417:13;12449:7;12442:14;;;;;:::i;5989:143::-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;-1:-1:-1;6095:13:1::1;:30:::0;5989:143::o;8601:216::-;345:19;387:9;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;8707:6:::1;8702:109;8723:5;:12;8719:1;:16;8702:109;;;8796:4;8756:27;:37;8784:5;8790:1;8784:8;;;;;;-1:-1:-1::0;;;8784:8:1::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;8756:37:1::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;8756:37:1;:44;;-1:-1:-1;;8756:44:1::1;::::0;::::1;;::::0;;;::::1;::::0;;8737:3;::::1;::::0;::::1;:::i;:::-;;;;8702:109;;4910:206:4::0;-1:-1:-1;;;;;5074:25:4;;;5047:4;5074:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4910:206::o;2358:32:1:-;;;;:::o;7321:329::-;7440:4;;;382:190;402:13;:20;398:24;;382:190;;;472:10;-1:-1:-1;;;;;447:35:1;:13;461:1;447:16;;;;;;-1:-1:-1;;;447:16:1;;;;;;;;;;;;;;;;;;;;;;:21;-1:-1:-1;;;;;447:21:1;:35;443:119;;;519:4;502:21;;542:5;;443:119;424:3;;;;:::i;:::-;;;;382:190;;;;614:12;:10;:12::i;:::-;-1:-1:-1;;;;;603:23:1;:7;:5;:7::i;:::-;-1:-1:-1;;;;;603:23:1;;:41;;;;630:14;603:41;582:139;;;;-1:-1:-1;;;582:139:1;;;;;;;:::i;:::-;7465:8:::1;7460:161;7479:20;:27:::0;7475:31:::1;::::0;::::1;;7460:161;;;7558:7;7531:34;;:20;7552:1;7531:23;;;;;;;;-1:-1:-1::0;;;7531:23:1::1;;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;::::0;;;;;::::1;;;;::::0;::::1;;;:34;7527:84;;;7592:4;7585:11;;;;;7527:84;7508:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7460:161;;;;7638:5;7631:12;;732:1;7321:329:::0;;;;:::o;1987:240:11:-;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;-1:-1:-1;;;1265:68:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;2075:22:11;::::1;2067:73;;;;-1:-1:-1::0;;;2067:73:11::1;;;;;;;:::i;:::-;2176:6;::::0;;2155:38:::1;::::0;-1:-1:-1;;;;;2155:38:11;;::::1;::::0;2176:6;::::1;::::0;2155:38:::1;::::0;::::1;2203:6;:17:::0;;-1:-1:-1;;;;;;2203:17:11::1;-1:-1:-1::0;;;;;2203:17:11;;;::::1;::::0;;;::::1;::::0;;1987:240::o;763:155:3:-;-1:-1:-1;;;;;;871:40:3;;-1:-1:-1;;;871:40:3;763:155;;;:::o;586:96:2:-;665:10;586:96;:::o;7713:125:4:-;7778:4;7801:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7801:16:4;:30;;;7713:125::o;12221:171::-;12295:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12295:29:4;-1:-1:-1;;;;;12295:29:4;;;;;;;;:24;;12348:23;12295:24;12348:14;:23::i;:::-;-1:-1:-1;;;;;12339:46:4;;;;;;;;;;;12221:171;;:::o;7996:445::-;8121:4;8162:16;8170:7;8162;:16::i;:::-;8141:107;;;;-1:-1:-1;;;8141:107:4;;;;;;;:::i;:::-;8258:13;8274:23;8289:7;8274:14;:23::i;:::-;8258:39;;8326:5;-1:-1:-1;;;;;8315:16:4;:7;-1:-1:-1;;;;;8315:16:4;;:63;;;;8371:7;-1:-1:-1;;;;;8347:31:4;:20;8359:7;8347:11;:20::i;:::-;-1:-1:-1;;;;;8347:31:4;;8315:63;:118;;;;8394:39;8418:5;8425:7;8394:23;:39::i;:::-;8307:127;7996:445;-1:-1:-1;;;;7996:445:4:o;11516:594::-;11683:4;-1:-1:-1;;;;;11656:31:4;:23;11671:7;11656:14;:23::i;:::-;-1:-1:-1;;;;;11656:31:4;;11635:119;;;;-1:-1:-1;;;11635:119:4;;;;;;;:::i;:::-;-1:-1:-1;;;;;11772:16:4;;11764:65;;;;-1:-1:-1;;;11764:65:4;;;;;;;:::i;:::-;11840:39;11861:4;11867:2;11871:7;11840:20;:39::i;:::-;11941:29;11958:1;11962:7;11941:8;:29::i;:::-;-1:-1:-1;;;;;11981:15:4;;;;;;:9;:15;;;;;:20;;12000:1;;11981:15;:20;;12000:1;;11981:20;:::i;:::-;;;;-1:-1:-1;;;;;;;12011:13:4;;;;;;:9;:13;;;;;:18;;12028:1;;12011:13;:18;;12028:1;;12011:18;:::i;:::-;;;;-1:-1:-1;;12039:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;12039:21:4;-1:-1:-1;;;;;12039:21:4;;;;;;;;;12076:27;;12039:16;;12076:27;;;;;;;11516:594;;;:::o;13456:362:1:-;13509:7;13528:14;13545:45;13562:20;:27;;;;13545:16;:45::i;:::-;13528:62;;13600:15;13626:20;13647:6;13626:28;;;;;;-1:-1:-1;;;13626:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13618:37;;13600:55;;13697:20;13748:1;13718:20;:27;;;;:31;;;;:::i;:::-;13697:53;;;;;;-1:-1:-1;;;13697:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13666:20;13687:6;13666:28;;;;;;-1:-1:-1;;;13666:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;:84;;;;;;;;;;;;;;;;;;13760:20;:26;;;;;-1:-1:-1;;;13760:26:1;;;;;;;;;;;;;;;;;-1:-1:-1;;13760:26:1;;;;;;;;;;;;;;;;;;;;;;;;13804:7;-1:-1:-1;;13456:362:1;:::o;10111:516:4:-;-1:-1:-1;;;;;10225:16:4;;10217:61;;;;-1:-1:-1;;;10217:61:4;;;;;;;:::i;:::-;10305:15;;-1:-1:-1;;;;;10288:13:4;;;;;;:9;:13;;;;;:32;;:13;;;:32;;10305:15;;10288:32;:::i;:::-;;;;-1:-1:-1;10336:9:4;;-1:-1:-1;10331:290:4;10351:8;:15;10347:1;:19;10331:290;;;10396:20;10404:8;10413:1;10404:11;;;;;;-1:-1:-1;;;10404:11:4;;;;;;;;;;;;;;;10396:7;:20::i;:::-;10395:21;10387:62;;;;-1:-1:-1;;;10387:62:4;;;;;;;:::i;:::-;10464:49;10493:1;10497:2;10501:8;10510:1;10501:11;;;;;;-1:-1:-1;;;10501:11:4;;;;;;;;;;;;;;;10464:20;:49::i;:::-;10551:2;10528:7;:20;10536:8;10545:1;10536:11;;;;;;-1:-1:-1;;;10536:11:4;;;;;;;;;;;;;;;10528:20;;;;;;;;;;;;:25;;;;;-1:-1:-1;;;;;10528:25:4;;;;;-1:-1:-1;;;;;10528:25:4;;;;;;10598:8;10607:1;10598:11;;;;;;-1:-1:-1;;;10598:11:4;;;;;;;;;;;;;;;10594:2;-1:-1:-1;;;;;10573:37:4;10590:1;-1:-1:-1;;;;;10573:37:4;;;;;;;;;;;10368:3;;;;:::i;:::-;;;;10331:290;;14496:313:1;14604:7;;14635:9;-1:-1:-1;;;;;14635:9:1;;:1;:9;:::i;:::-;14623:21;-1:-1:-1;14654:9:1;14666;-1:-1:-1;;;;;14666:9:1;;:1;:9;:::i;:::-;14654:21;-1:-1:-1;14685:9:1;14697;-1:-1:-1;;;;;14697:9:1;;:1;:9;:::i;:::-;14685:21;-1:-1:-1;14716:9:1;14728;-1:-1:-1;;;;;14728:9:1;;:1;:9;:::i;:::-;14716:21;-1:-1:-1;;;;;;14787:15:1;;14788:5;14716:21;14788:1;:5;:::i;:::-;14787:15;;;;:::i;:::-;14779:5;14783:1;14779;:5;:::i;:::-;14771;14775:1;14771;:5;:::i;:::-;-1:-1:-1;;;;;14755:13:1;;:5;14759:1;14755;:5;:::i;:::-;:13;;;;:::i;:::-;:21;;;;:::i;:::-;:29;;;;:::i;:::-;:47;;;;:::i;:::-;14748:54;14496:313;-1:-1:-1;;;;;;;;14496:313:1:o;7069:341:4:-;7220:28;7230:4;7236:2;7240:7;7220:9;:28::i;:::-;7279:48;7302:4;7308:2;7312:7;7321:5;7279:22;:48::i;:::-;7258:145;;;;-1:-1:-1;;;7258:145:4;;;;;;;:::i;271:703:12:-;327:13;544:10;540:51;;-1:-1:-1;570:10:12;;;;;;;;;;;;-1:-1:-1;;;570:10:12;;;;;;540:51;615:5;600:12;654:75;661:9;;654:75;;686:8;;;;:::i;:::-;;-1:-1:-1;708:10:12;;-1:-1:-1;716:2:12;708:10;;:::i;:::-;;;654:75;;;738:19;770:6;760:17;;;;;;-1:-1:-1;;;760:17:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;760:17:12;;738:39;;787:150;794:10;;787:150;;820:11;830:1;820:11;;:::i;:::-;;-1:-1:-1;888:10:12;896:2;888:5;:10;:::i;:::-;875:24;;:2;:24;:::i;:::-;862:39;;845:6;852;845:14;;;;;;-1:-1:-1;;;845:14:12;;;;;;;;;;;;:56;-1:-1:-1;;;;;845:56:12;;;;;;;;-1:-1:-1;915:11:12;924:2;915:11;;:::i;:::-;;;787:150;;13886:450:1;14072:20;:27;13950:7;;;;14131:16;14146:1;14131:12;:16;:::i;:::-;14121:27;14170:14;14206:16;14244:10;14034:238;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14034:238:1;;;;;;;;;14007:279;;14034:238;14007:279;;;;;-1:-1:-1;14314:15:1;14323:6;14007:279;14314:15;:::i;12945:1022:4:-;13095:4;13115:15;:2;-1:-1:-1;;;;;13115:13:4;;:15::i;:::-;13111:850;;;13182:2;-1:-1:-1;;;;;13166:36:4;;13224:12;:10;:12::i;:::-;13258:4;13284:7;13313:5;13166:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13166:170:4;;;;;;;;-1:-1:-1;;13166:170:4;;;;;;;;;;;;:::i;:::-;;;13146:763;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13519:13:4;;13515:380;;13561:106;;-1:-1:-1;;;13561:106:4;;;;;;;:::i;13515:380::-;13847:6;13841:13;13832:6;13828:2;13824:15;13817:38;13146:763;-1:-1:-1;;;;;;13398:55:4;-1:-1:-1;;;13398:55:4;;-1:-1:-1;13391:62:4;;13111:850;-1:-1:-1;13946:4:4;12945:1022;;;;;;:::o;718:413:0:-;1078:20;1116:8;;;718:413::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:409:13;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:13;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:13;;537:42;;527:2;;593:1;590;583:12;608:161;677:20;;737:6;726:18;;716:29;;706:2;;759:1;756;749:12;774:198;;886:2;874:9;865:7;861:23;857:32;854:2;;;907:6;899;892:22;854:2;935:31;956:9;935:31;:::i;977:274::-;;;1106:2;1094:9;1085:7;1081:23;1077:32;1074:2;;;1127:6;1119;1112:22;1074:2;1155:31;1176:9;1155:31;:::i;:::-;1145:41;;1205:40;1241:2;1230:9;1226:18;1205:40;:::i;:::-;1195:50;;1064:187;;;;;:::o;1256:342::-;;;;1402:2;1390:9;1381:7;1377:23;1373:32;1370:2;;;1423:6;1415;1408:22;1370:2;1451:31;1472:9;1451:31;:::i;:::-;1441:41;;1501:40;1537:2;1526:9;1522:18;1501:40;:::i;:::-;1491:50;;1588:2;1577:9;1573:18;1560:32;1550:42;;1360:238;;;;;:::o;1603:702::-;;;;;1775:3;1763:9;1754:7;1750:23;1746:33;1743:2;;;1797:6;1789;1782:22;1743:2;1825:31;1846:9;1825:31;:::i;:::-;1815:41;;1875:40;1911:2;1900:9;1896:18;1875:40;:::i;:::-;1865:50;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:2;;;2081:6;2073;2066:22;2030:2;2109:22;;2162:4;2154:13;;2150:27;-1:-1:-1;2140:2:13;;2196:6;2188;2181:22;2140:2;2224:75;2291:7;2286:2;2273:16;2268:2;2264;2260:11;2224:75;:::i;:::-;2214:85;;;1733:572;;;;;;;:::o;2310:369::-;;;2436:2;2424:9;2415:7;2411:23;2407:32;2404:2;;;2457:6;2449;2442:22;2404:2;2485:31;2506:9;2485:31;:::i;:::-;2475:41;;2566:2;2555:9;2551:18;2538:32;2613:5;2606:13;2599:21;2592:5;2589:32;2579:2;;2640:6;2632;2625:22;2579:2;2668:5;2658:15;;;2394:285;;;;;:::o;2684:266::-;;;2813:2;2801:9;2792:7;2788:23;2784:32;2781:2;;;2834:6;2826;2819:22;2781:2;2862:31;2883:9;2862:31;:::i;:::-;2852:41;2940:2;2925:18;;;;2912:32;;-1:-1:-1;;;2771:179:13:o;2955:961::-;;3070:2;3113;3101:9;3092:7;3088:23;3084:32;3081:2;;;3134:6;3126;3119:22;3081:2;3179:9;3166:23;3212:18;3204:6;3201:30;3198:2;;;3249:6;3241;3234:22;3198:2;3277:22;;3330:4;3322:13;;3318:27;-1:-1:-1;3308:2:13;;3364:6;3356;3349:22;3308:2;3405;3392:16;3428:65;3443:49;3489:2;3443:49;:::i;:::-;3428:65;:::i;:::-;3527:15;;;3558:12;;;;3590:11;;;3628;;;3620:20;;3616:29;;3613:42;-1:-1:-1;3610:2:13;;;3673:6;3665;3658:22;3610:2;3700:6;3691:15;;3715:171;3729:2;3726:1;3723:9;3715:171;;;3786:25;3807:3;3786:25;:::i;:::-;3774:38;;3747:1;3740:9;;;;;3832:12;;;;3864;;3715:171;;;-1:-1:-1;3905:5:13;3050:866;-1:-1:-1;;;;;;;3050:866:13:o;3921:1405::-;;4066:2;4109;4097:9;4088:7;4084:23;4080:32;4077:2;;;4130:6;4122;4115:22;4077:2;4175:9;4162:23;4204:18;4245:2;4237:6;4234:14;4231:2;;;4266:6;4258;4251:22;4231:2;4309:6;4298:9;4294:22;4284:32;;4354:7;4347:4;4343:2;4339:13;4335:27;4325:2;;4381:6;4373;4366:22;4325:2;4422;4409:16;4445:65;4460:49;4506:2;4460:49;:::i;4445:65::-;4544:15;;;4575:12;;;;4607:11;;;4637:4;4668:11;;;4660:20;;4656:29;;4653:42;-1:-1:-1;4650:2:13;;;4713:6;4705;4698:22;4650:2;4740:6;4731:15;;4755:541;4769:2;4766:1;4763:9;4755:541;;;4840:2;4834:3;4825:7;4821:17;4817:26;4814:2;;;4861:6;4853;4846:22;4814:2;4903;4897:9;4949:2;4941:6;4937:15;5006:6;4994:10;4991:22;4986:2;4974:10;4971:18;4968:46;4965:2;;;5017:18;;:::i;:::-;5050:22;;5100:25;5121:3;5100:25;:::i;:::-;5085:41;;5176:12;;;5163:26;5146:15;;;5139:51;5203:19;;4787:1;4780:9;;;;;5242:12;;;;5274;;;;4755:541;;;-1:-1:-1;5315:5:13;;4046:1280;-1:-1:-1;;;;;;;;;4046:1280:13:o;5331:257::-;;5442:2;5430:9;5421:7;5417:23;5413:32;5410:2;;;5463:6;5455;5448:22;5410:2;5507:9;5494:23;5526:32;5552:5;5526:32;:::i;5593:261::-;;5715:2;5703:9;5694:7;5690:23;5686:32;5683:2;;;5736:6;5728;5721:22;5683:2;5773:9;5767:16;5792:32;5818:5;5792:32;:::i;5859:482::-;;5981:2;5969:9;5960:7;5956:23;5952:32;5949:2;;;6002:6;5994;5987:22;5949:2;6047:9;6034:23;6080:18;6072:6;6069:30;6066:2;;;6117:6;6109;6102:22;6066:2;6145:22;;6198:4;6190:13;;6186:27;-1:-1:-1;6176:2:13;;6232:6;6224;6217:22;6176:2;6260:75;6327:7;6322:2;6309:16;6304:2;6300;6296:11;6260:75;:::i;6346:196::-;;6457:2;6445:9;6436:7;6432:23;6428:32;6425:2;;;6478:6;6470;6463:22;6425:2;6506:30;6526:9;6506:30;:::i;6547:270::-;;;6674:2;6662:9;6653:7;6649:23;6645:32;6642:2;;;6695:6;6687;6680:22;6642:2;6723:30;6743:9;6723:30;:::i;:::-;6713:40;;6772:39;6807:2;6796:9;6792:18;6772:39;:::i;6822:190::-;;6934:2;6922:9;6913:7;6909:23;6905:32;6902:2;;;6955:6;6947;6940:22;6902:2;-1:-1:-1;6983:23:13;;6892:120;-1:-1:-1;6892:120:13:o;7017:259::-;;7098:5;7092:12;7125:6;7120:3;7113:19;7141:63;7197:6;7190:4;7185:3;7181:14;7174:4;7167:5;7163:16;7141:63;:::i;:::-;7258:2;7237:15;-1:-1:-1;;7233:29:13;7224:39;;;;7265:4;7220:50;;7068:208;-1:-1:-1;;7068:208:13:o;7281:470::-;;7498:6;7492:13;7514:53;7560:6;7555:3;7548:4;7540:6;7536:17;7514:53;:::i;:::-;7630:13;;7589:16;;;;7652:57;7630:13;7589:16;7686:4;7674:17;;7652:57;:::i;:::-;7725:20;;7468:283;-1:-1:-1;;;;7468:283:13:o;7756:546::-;8013:19;;;8057:2;8048:12;;8041:28;;;;-1:-1:-1;;8157:2:13;8153:15;;;8149:24;;8144:2;8135:12;;8128:46;8199:2;8190:12;;8183:28;;;;8246:15;;;8242:24;8236:3;8227:13;;8220:47;8292:3;8283:13;;8003:299::o;8307:203::-;-1:-1:-1;;;;;8471:32:13;;;;8453:51;;8441:2;8426:18;;8408:102::o;8515:490::-;-1:-1:-1;;;;;8784:15:13;;;8766:34;;8836:15;;8831:2;8816:18;;8809:43;8883:2;8868:18;;8861:34;;;8931:3;8926:2;8911:18;;8904:31;;;8515:490;;8952:47;;8979:19;;8971:6;8952:47;:::i;:::-;8944:55;8718:287;-1:-1:-1;;;;;;8718:287:13:o;9010:635::-;9181:2;9233:21;;;9303:13;;9206:18;;;9325:22;;;9010:635;;9181:2;9404:15;;;;9378:2;9363:18;;;9010:635;9450:169;9464:6;9461:1;9458:13;9450:169;;;9525:13;;9513:26;;9594:15;;;;9559:12;;;;9486:1;9479:9;9450:169;;;-1:-1:-1;9636:3:13;;9161:484;-1:-1:-1;;;;;;9161:484:13:o;9650:187::-;9815:14;;9808:22;9790:41;;9778:2;9763:18;;9745:92::o;9842:221::-;;9991:2;9980:9;9973:21;10011:46;10053:2;10042:9;10038:18;10030:6;10011:46;:::i;10068:406::-;10270:2;10252:21;;;10309:2;10289:18;;;10282:30;10348:34;10343:2;10328:18;;10321:62;-1:-1:-1;;;10414:2:13;10399:18;;10392:40;10464:3;10449:19;;10242:232::o;10479:414::-;10681:2;10663:21;;;10720:2;10700:18;;;10693:30;10759:34;10754:2;10739:18;;10732:62;-1:-1:-1;;;10825:2:13;10810:18;;10803:48;10883:3;10868:19;;10653:240::o;10898:402::-;11100:2;11082:21;;;11139:2;11119:18;;;11112:30;11178:34;11173:2;11158:18;;11151:62;-1:-1:-1;;;11244:2:13;11229:18;;11222:36;11290:3;11275:19;;11072:228::o;11305:352::-;11507:2;11489:21;;;11546:2;11526:18;;;11519:30;11585;11580:2;11565:18;;11558:58;11648:2;11633:18;;11479:178::o;11662:354::-;11864:2;11846:21;;;11903:2;11883:18;;;11876:30;11942:32;11937:2;11922:18;;11915:60;12007:2;11992:18;;11836:180::o;12021:400::-;12223:2;12205:21;;;12262:2;12242:18;;;12235:30;12301:34;12296:2;12281:18;;12274:62;-1:-1:-1;;;12367:2:13;12352:18;;12345:34;12411:3;12396:19;;12195:226::o;12426:349::-;12628:2;12610:21;;;12667:2;12647:18;;;12640:30;12706:27;12701:2;12686:18;;12679:55;12766:2;12751:18;;12600:175::o;12780:354::-;12982:2;12964:21;;;13021:2;13001:18;;;12994:30;13060:32;13055:2;13040:18;;13033:60;13125:2;13110:18;;12954:180::o;13139:400::-;13341:2;13323:21;;;13380:2;13360:18;;;13353:30;13419:34;13414:2;13399:18;;13392:62;-1:-1:-1;;;13485:2:13;13470:18;;13463:34;13529:3;13514:19;;13313:226::o;13544:408::-;13746:2;13728:21;;;13785:2;13765:18;;;13758:30;13824:34;13819:2;13804:18;;13797:62;-1:-1:-1;;;13890:2:13;13875:18;;13868:42;13942:3;13927:19;;13718:234::o;13957:354::-;14159:2;14141:21;;;14198:2;14178:18;;;14171:30;14237:32;14232:2;14217:18;;14210:60;14302:2;14287:18;;14131:180::o;14316:398::-;14518:2;14500:21;;;14557:2;14537:18;;;14530:30;14596:34;14591:2;14576:18;;14569:62;-1:-1:-1;;;14662:2:13;14647:18;;14640:32;14704:3;14689:19;;14490:224::o;14719:420::-;14921:2;14903:21;;;14960:2;14940:18;;;14933:30;14999:34;14994:2;14979:18;;14972:62;15070:26;15065:2;15050:18;;15043:54;15129:3;15114:19;;14893:246::o;15144:406::-;15346:2;15328:21;;;15385:2;15365:18;;;15358:30;15424:34;15419:2;15404:18;;15397:62;-1:-1:-1;;;15490:2:13;15475:18;;15468:40;15540:3;15525:19;;15318:232::o;15555:405::-;15757:2;15739:21;;;15796:2;15776:18;;;15769:30;15835:34;15830:2;15815:18;;15808:62;-1:-1:-1;;;15901:2:13;15886:18;;15879:39;15950:3;15935:19;;15729:231::o;15965:401::-;16167:2;16149:21;;;16206:2;16186:18;;;16179:30;16245:34;16240:2;16225:18;;16218:62;-1:-1:-1;;;16311:2:13;16296:18;;16289:35;16356:3;16341:19;;16139:227::o;16371:356::-;16573:2;16555:21;;;16592:18;;;16585:30;16651:34;16646:2;16631:18;;16624:62;16718:2;16703:18;;16545:182::o;16732:405::-;16934:2;16916:21;;;16973:2;16953:18;;;16946:30;17012:34;17007:2;16992:18;;16985:62;-1:-1:-1;;;17078:2:13;17063:18;;17056:39;17127:3;17112:19;;16906:231::o;17142:408::-;17344:2;17326:21;;;17383:2;17363:18;;;17356:30;17422:34;17417:2;17402:18;;17395:62;-1:-1:-1;;;17488:2:13;17473:18;;17466:42;17540:3;17525:19;;17316:234::o;17555:348::-;17757:2;17739:21;;;17796:2;17776:18;;;17769:30;17835:26;17830:2;17815:18;;17808:54;17894:2;17879:18;;17729:174::o;17908:356::-;18110:2;18092:21;;;18129:18;;;18122:30;18188:34;18183:2;18168:18;;18161:62;18255:2;18240:18;;18082:182::o;18269:405::-;18471:2;18453:21;;;18510:2;18490:18;;;18483:30;18549:34;18544:2;18529:18;;18522:62;-1:-1:-1;;;18615:2:13;18600:18;;18593:39;18664:3;18649:19;;18443:231::o;18679:411::-;18881:2;18863:21;;;18920:2;18900:18;;;18893:30;18959:34;18954:2;18939:18;;18932:62;-1:-1:-1;;;19025:2:13;19010:18;;19003:45;19080:3;19065:19;;18853:237::o;19095:399::-;19297:2;19279:21;;;19336:2;19316:18;;;19309:30;19375:34;19370:2;19355:18;;19348:62;-1:-1:-1;;;19441:2:13;19426:18;;19419:33;19484:3;19469:19;;19269:225::o;19499:415::-;19701:2;19683:21;;;19740:2;19720:18;;;19713:30;19779:34;19774:2;19759:18;;19752:62;-1:-1:-1;;;19845:2:13;19830:18;;19823:49;19904:3;19889:19;;19673:241::o;19919:343::-;20121:2;20103:21;;;20160:2;20140:18;;;20133:30;-1:-1:-1;;;20194:2:13;20179:18;;20172:49;20253:2;20238:18;;20093:169::o;20267:397::-;20469:2;20451:21;;;20508:2;20488:18;;;20481:30;20547:34;20542:2;20527:18;;20520:62;-1:-1:-1;;;20613:2:13;20598:18;;20591:31;20654:3;20639:19;;20441:223::o;20669:352::-;20871:2;20853:21;;;20910:2;20890:18;;;20883:30;20949;20944:2;20929:18;;20922:58;21012:2;20997:18;;20843:178::o;21026:413::-;21228:2;21210:21;;;21267:2;21247:18;;;21240:30;21306:34;21301:2;21286:18;;21279:62;-1:-1:-1;;;21372:2:13;21357:18;;21350:47;21429:3;21414:19;;21200:239::o;21444:404::-;21646:2;21628:21;;;21685:2;21665:18;;;21658:30;21724:34;21719:2;21704:18;;21697:62;-1:-1:-1;;;21790:2:13;21775:18;;21768:38;21838:3;21823:19;;21618:230::o;21853:347::-;22055:2;22037:21;;;22094:2;22074:18;;;22067:30;22133:25;22128:2;22113:18;;22106:53;22191:2;22176:18;;22027:173::o;22205:177::-;22351:25;;;22339:2;22324:18;;22306:76::o;22387:251::-;22457:2;22451:9;22487:17;;;22534:18;22519:34;;22555:22;;;22516:62;22513:2;;;22581:18;;:::i;:::-;22617:2;22610:22;22431:207;;-1:-1:-1;22431:207:13:o;22643:192::-;;22742:18;22734:6;22731:30;22728:2;;;22764:18;;:::i;:::-;-1:-1:-1;22824:4:13;22805:17;;;22801:28;;22718:117::o;22840:253::-;;-1:-1:-1;;;;;22969:2:13;22966:1;22962:10;22999:2;22996:1;22992:10;23030:3;23026:2;23022:12;23017:3;23014:21;23011:2;;;23038:18;;:::i;23098:128::-;;23169:1;23165:6;23162:1;23159:13;23156:2;;;23175:18;;:::i;:::-;-1:-1:-1;23211:9:13;;23146:80::o;23231:120::-;;23297:1;23287:2;;23302:18;;:::i;:::-;-1:-1:-1;23336:9:13;;23277:74::o;23356:168::-;;23462:1;23458;23454:6;23450:14;23447:1;23444:21;23439:1;23432:9;23425:17;23421:45;23418:2;;;23469:18;;:::i;:::-;-1:-1:-1;23509:9:13;;23408:116::o;23529:125::-;;23597:1;23594;23591:8;23588:2;;;23602:18;;:::i;:::-;-1:-1:-1;23639:9:13;;23578:76::o;23659:258::-;23731:1;23741:113;23755:6;23752:1;23749:13;23741:113;;;23831:11;;;23825:18;23812:11;;;23805:39;23777:2;23770:10;23741:113;;;23872:6;23869:1;23866:13;23863:2;;;-1:-1:-1;;23907:1:13;23889:16;;23882:27;23712:205::o;23922:380::-;24007:1;23997:12;;24054:1;24044:12;;;24065:2;;24119:4;24111:6;24107:17;24097:27;;24065:2;24172;24164:6;24161:14;24141:18;24138:38;24135:2;;;24218:10;24213:3;24209:20;24206:1;24199:31;24253:4;24250:1;24243:15;24281:4;24278:1;24271:15;24307:197;;24373:6;24414:2;24407:5;24403:14;24441:2;24432:7;24429:15;24426:2;;;24447:18;;:::i;:::-;24496:1;24483:15;;24353:151;-1:-1:-1;;;24353:151:13:o;24509:135::-;;-1:-1:-1;;24569:17:13;;24566:2;;;24589:18;;:::i;:::-;-1:-1:-1;24636:1:13;24625:13;;24556:88::o;24649:112::-;;24707:1;24697:2;;24712:18;;:::i;:::-;-1:-1:-1;24746:9:13;;24687:74::o;24766:127::-;24827:10;24822:3;24818:20;24815:1;24808:31;24858:4;24855:1;24848:15;24882:4;24879:1;24872:15;24898:127;24959:10;24954:3;24950:20;24947:1;24940:31;24990:4;24987:1;24980:15;25014:4;25011:1;25004:15;25030:127;25091:10;25086:3;25082:20;25079:1;25072:31;25122:4;25119:1;25112:15;25146:4;25143:1;25136:15;25162:133;-1:-1:-1;;;;;;25238:32:13;;25228:43;;25218:2;;25285:1;25282;25275:12;25218:2;25208:87;:::o

Swarm Source

ipfs://14ba027fce6f57b7f421a96629bb5ece5186bc7646af1b7cd02b8997b92a800c
Loading...
Loading
Loading...
Loading
[ 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.