ETH Price: $2,616.06 (-3.28%)

Token

Rich Jaguarz (RJ)
 

Overview

Max Total Supply

118 RJ

Holders

54

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 RJ
0x294901de875244fd77916db52791afb496bf6929
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RichJaguarz

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 13 of 14: RichJaguarz.sol
pragma solidity ^0.8.0;

import "./ERC721Enumerable.sol";
import "./Ownable.sol";

contract RichJaguarz is ERC721Enumerable, Ownable {
  uint256 public mintPrice = 0.07 ether;
  uint256 public preSaleMintPrice = 0.05 ether;

  uint256 private reserveAtATime = 50;
  uint256 private reservedCount = 0;
  uint256 private maxReserveCount = 500;

  string _baseTokenURI;

  bool public isMintActive = false;
  bool public isPreSaleMintActive = false;
  bool public isClosedMintForever = false;

  uint256 public maximumMintSupply = 9999;
  uint256 public maximumAllowedTokensPerPurchase = 5;
  uint256 public maximumAllowedTokensPerWallet = 5;
  uint256 public allowListMaxMint = 5;

  address private OtherAddress = 0x3b49471D57e4bD3346ee0Bb8aADCb6Fc017863bB;

  mapping(address => bool) private _allowList;
  mapping(address => uint256) private _allowListClaimed;

  event AssetMinted(uint256 tokenId, address sender);
  event SaleActivation(bool isMintActive);

  constructor(string memory baseURI) ERC721("Rich Jaguarz", "RJ") {
    setBaseURI(baseURI);
  }

  modifier saleIsOpen {
    require(totalSupply() <= maximumMintSupply, "Sale has ended.");
    _;
  }

  modifier onlyAuthorized() {
    require(owner() == msg.sender);
    _;
  }

  function setMaximumAllowedTokens(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerPurchase = _count;
  }

  function setMaximumAllowedTokensPerWallet(uint256 _count) public onlyAuthorized {
    maximumAllowedTokensPerWallet = _count;
  }

  function setMintActive(bool val) public onlyAuthorized {
    isMintActive = val;
    emit SaleActivation(val);
  }

  function setMaxMintSupply(uint256 maxMintSupply) external  onlyAuthorized {
    maximumMintSupply = maxMintSupply;
  }

  function setIsPreSaleMintActive(bool _isPreSaleMintActive) external onlyAuthorized {
    isPreSaleMintActive = _isPreSaleMintActive;
  }

  function setAllowListMaxMint(uint256 maxMint) external  onlyAuthorized {
    allowListMaxMint = maxMint;
  }

  function addToAllowList(address[] calldata addresses) external onlyAuthorized {
    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add a null address");
      _allowList[addresses[i]] = true;
      _allowListClaimed[addresses[i]] > 0 ? _allowListClaimed[addresses[i]] : 0;
    }
  }

  function checkIfOnAllowList(address addr) external view returns (bool) {
    return _allowList[addr];
  }

  function removeFromAllowList(address[] calldata addresses) external onlyAuthorized {
    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add a null address");
      _allowList[addresses[i]] = false;
    }
  }

  function allowListClaimedBy(address owner) external view returns (uint256){
    require(owner != address(0), 'Zero address not on Allow List');
    return _allowListClaimed[owner];
  }

  function setReserveAtATime(uint256 val) public onlyAuthorized {
    reserveAtATime = val;
  }

  function setMaxReserve(uint256 val) public onlyAuthorized {
    maxReserveCount = val;
  }

  function setMintPrice(uint256 _price) public onlyAuthorized {
    mintPrice = _price;
  }

  function setPreSaleMintPrice(uint256 _price) public onlyAuthorized {
    preSaleMintPrice = _price;
  }

  function setBaseURI(string memory baseURI) public onlyAuthorized {
    _baseTokenURI = baseURI;
  }

  function getMaximumAllowedTokens() public view onlyAuthorized returns (uint256) {
    return maximumAllowedTokensPerPurchase;
  }

  function getMintPrice() external view returns (uint256) {
    return mintPrice;
  }

  function getPreSaleMintPrice() external view returns (uint256) {
    return preSaleMintPrice;
  }

  function getIsClosedMintForever() external view returns (bool) {
    return isClosedMintForever;
  }

  function setIsClosedMintForever() external onlyAuthorized {
    isClosedMintForever = true;
  }

  function getReserveAtATime() external view returns (uint256) {
    return reserveAtATime;
  }

  function getTotalSupply() external view returns (uint256) {
    return totalSupply();
  }

  function getContractOwner() public view returns (address) {
    return owner();
  }

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

  function reserveNft() public onlyAuthorized {
    require(reservedCount <= maxReserveCount, "Max Reserves taken already!");
    uint256 supply = totalSupply();
    uint256 i;

    for (i = 0; i < reserveAtATime; i++) {
      emit AssetMinted(supply + i, msg.sender);
      _safeMint(msg.sender, supply + i);
      reservedCount++;
    }
  }

  function reserveToCustomWallet(address _walletAddress, uint256 _count) public onlyAuthorized {
    for (uint256 i = 0; i < _count; i++) {
      emit AssetMinted(totalSupply(), _walletAddress);
      _safeMint(_walletAddress, totalSupply());
    }
  }

  function mint(address _to, uint256 _count) public payable saleIsOpen {
    if (msg.sender != owner()) {
      require(isMintActive, "Sale is not active currently.");
    }

    if(_to != owner()) {
      require(balanceOf(_to) + _count <= maximumAllowedTokensPerWallet, "Max holding cap reached.");
    }

    require(totalSupply() + _count <= maximumMintSupply, "Total supply exceeded.");
    require(totalSupply() <= maximumMintSupply, "Total supply spent.");
    require(
      _count <= maximumAllowedTokensPerPurchase,
      "Exceeds maximum allowed tokens"
    );
    require(!isClosedMintForever, "Mint Closed Forever");

    require(msg.value >= mintPrice * _count, "Insufficient ETH amount sent.");

    for (uint256 i = 0; i < _count; i++) {
      emit AssetMinted(totalSupply(), _to);
      _safeMint(_to, totalSupply());
    }
  }

  function preSaleMint(uint256 _count) public payable saleIsOpen {
    require(isPreSaleMintActive, 'Pre Sale Mint is not active');
    require(_allowList[msg.sender], 'You are not on the Allow List');
    require(totalSupply() < maximumMintSupply, 'All tokens have been minted');
    require(_count <= allowListMaxMint, 'Cannot purchase this many tokens');
    require(_allowListClaimed[msg.sender] + _count <= allowListMaxMint, 'Purchase exceeds max allowed');
    require(msg.value >= preSaleMintPrice * _count, 'Insufficient ETH amount sent.');
    require(!isClosedMintForever, 'Mint Closed Forever');

    for (uint256 i = 0; i < _count; i++) {
      _allowListClaimed[msg.sender] += 1;
      emit AssetMinted(totalSupply(), msg.sender);
      _safeMint(msg.sender, totalSupply());
    }
  }

  function walletOfOwner(address _owner) external view returns(uint256[] memory) {
    uint tokenCount = balanceOf(_owner);
    uint256[] memory tokensId = new uint256[](tokenCount);

    for(uint i = 0; i < tokenCount; i++){
      tokensId[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokensId;
  }

  function withdraw() external onlyAuthorized {
    uint balance = address(this).balance;
    payable(OtherAddress).transfer(balance * 10000 / 10000);
    payable(owner()).transfer(balance * 0 / 10000);
  }
}

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 3 of 14: ECDSA.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 4 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

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 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 7 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

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 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

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 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

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 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"AssetMinted","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":false,"internalType":"bool","name":"isMintActive","type":"bool"}],"name":"SaleActivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allowListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkIfOnAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsClosedMintForever","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaximumAllowedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPreSaleMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveAtATime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClosedMintForever","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumAllowedTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maximumMintSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"preSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preSaleMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reserveNft","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"reserveToCustomWallet","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":"uint256","name":"maxMint","type":"uint256"}],"name":"setAllowListMaxMint","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setIsClosedMintForever","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPreSaleMintActive","type":"bool"}],"name":"setIsPreSaleMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMintSupply","type":"uint256"}],"name":"setMaxMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setMaxReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setMintActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPreSaleMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setReserveAtATime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266f8b0a10e470000600b5566b1a2bc2ec50000600c556032600d556000600e556101f4600f556000601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff0219169083151502179055506000601160026101000a81548160ff02191690831515021790555061270f601255600560135560056014556005601555733b49471d57e4bd3346ee0bb8aadcb6fc017863bb601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000f257600080fd5b50604051620060f3380380620060f383398181016040528101906200011891906200046e565b6040518060400160405280600c81526020017f52696368204a61677561727a00000000000000000000000000000000000000008152506040518060400160405280600281526020017f524a00000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200019c9291906200034c565b508060019080519060200190620001b59291906200034c565b505050620001d8620001cc620001f060201b60201c565b620001f860201b60201c565b620001e981620002be60201b60201c565b50620005e4565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16620002e56200032260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200030657600080fd5b80601090805190602001906200031e9291906200034c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200035a9062000550565b90600052602060002090601f0160209004810192826200037e5760008555620003ca565b82601f106200039957805160ff1916838001178555620003ca565b82800160010185558215620003ca579182015b82811115620003c9578251825591602001919060010190620003ac565b5b509050620003d99190620003dd565b5090565b5b80821115620003f8576000816000905550600101620003de565b5090565b6000620004136200040d84620004e7565b620004b3565b9050828152602081018484840111156200042c57600080fd5b620004398482856200051a565b509392505050565b600082601f8301126200045357600080fd5b815162000465848260208601620003fc565b91505092915050565b6000602082840312156200048157600080fd5b600082015167ffffffffffffffff8111156200049c57600080fd5b620004aa8482850162000441565b91505092915050565b6000604051905081810181811067ffffffffffffffff82111715620004dd57620004dc620005b5565b5b8060405250919050565b600067ffffffffffffffff821115620005055762000504620005b5565b5b601f19601f8301169050602081019050919050565b60005b838110156200053a5780820151818401526020810190506200051d565b838111156200054a576000848401525b50505050565b600060028204905060018216806200056957607f821691505b6020821081141562000580576200057f62000586565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b615aff80620005f46000396000f3fe6080604052600436106103755760003560e01c80637263cfe2116101d1578063a7f93ebd11610102578063e985e9c5116100a0578063f132dc291161006f578063f132dc2914610c97578063f2fde38b14610cc2578063f4a0a52814610ceb578063f6c9d9e314610d1457610375565b8063e985e9c514610bdd578063ea6eb83614610c1a578063ec7d099114610c43578063ee1cc94414610c6e57610375565b8063c4e41b22116100dc578063c4e41b2214610b1f578063c87b56dd14610b4a578063cadf881814610b87578063e7b62d9614610bb257610375565b8063a7f93ebd14610aa0578063ad06d75814610acb578063b88d4fde14610af657610375565b80638da5cb5b1161016f5780639a3bf728116101495780639a3bf728146109f85780639ccb0fea14610a23578063a22cb46514610a4e578063a51312c814610a7757610375565b80638da5cb5b1461098b578063932ecebc146109b657806395d89b41146109cd57610375565b80637835c635116101ab5780637835c635146108f05780637a6685f11461090c5780637d26f470146109355780637f44ab2f1461096057610375565b80637263cfe2146108755780637389fbb71461089e57806377b501b9146108c757610375565b806342842e0e116102ab57806356a87caa116102495780636817c76c116102235780636817c76c146107df57806370a082311461080a578063715018a61461084757806371e3500c1461085e57610375565b806356a87caa1461074e5780635b92ac0d146107775780636352211e146107a257610375565b80634d0550de116102855780634d0550de146106945780634dfea627146106bf5780634f6ccce7146106e857806355f804b31461072557610375565b806342842e0e14610603578063438b63001461062c578063442890d51461066957610375565b806323b872dd116103185780633b9ee7e4116102f25780633b9ee7e41461057e5780633ccfd60b146105a75780633cfac570146105be57806340c10f19146105e757610375565b806323b872dd146104db5780632c1205f4146105045780632f745c591461054157610375565b8063081812fc11610354578063081812fc1461041f578063095ea7b31461045c57806318160ddd1461048557806321a911f8146104b057610375565b806208ffdd1461037a57806301ffc9a7146103b757806306fdde03146103f4575b600080fd5b34801561038657600080fd5b506103a1600480360381019061039c91906141f4565b610d3d565b6040516103ae91906155d8565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190614409565b610df5565b6040516103eb919061515b565b60405180910390f35b34801561040057600080fd5b50610409610e6f565b6040516104169190615176565b60405180910390f35b34801561042b57600080fd5b506104466004803603810190610441919061449c565b610f01565b60405161045391906150d2565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061435f565b610f86565b005b34801561049157600080fd5b5061049a61109e565b6040516104a791906155d8565b60405180910390f35b3480156104bc57600080fd5b506104c56110ab565b6040516104d291906155d8565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190614259565b6110b5565b005b34801561051057600080fd5b5061052b600480360381019061052691906141f4565b611115565b604051610538919061515b565b60405180910390f35b34801561054d57600080fd5b506105686004803603810190610563919061435f565b61116b565b60405161057591906155d8565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a0919061449c565b611210565b005b3480156105b357600080fd5b506105bc611259565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906143e0565b611388565b005b61060160048036038101906105fc919061435f565b6113e4565b005b34801561060f57600080fd5b5061062a60048036038101906106259190614259565b611749565b005b34801561063857600080fd5b50610653600480360381019061064e91906141f4565b611769565b6040516106609190615139565b60405180910390f35b34801561067557600080fd5b5061067e611863565b60405161068b91906150d2565b60405180910390f35b3480156106a057600080fd5b506106a9611872565b6040516106b691906155d8565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061449c565b611878565b005b3480156106f457600080fd5b5061070f600480360381019061070a919061449c565b6118c1565b60405161071c91906155d8565b60405180910390f35b34801561073157600080fd5b5061074c6004803603810190610747919061445b565b611958565b005b34801561075a57600080fd5b506107756004803603810190610770919061449c565b6119b1565b005b34801561078357600080fd5b5061078c6119fa565b604051610799919061515b565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c4919061449c565b611a0d565b6040516107d691906150d2565b60405180910390f35b3480156107eb57600080fd5b506107f4611abf565b60405161080191906155d8565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906141f4565b611ac5565b60405161083e91906155d8565b60405180910390f35b34801561085357600080fd5b5061085c611b7d565b005b34801561086a57600080fd5b50610873611c05565b005b34801561088157600080fd5b5061089c6004803603810190610897919061439b565b611d2c565b005b3480156108aa57600080fd5b506108c560048036038101906108c0919061449c565b61201d565b005b3480156108d357600080fd5b506108ee60048036038101906108e9919061435f565b612066565b005b61090a6004803603810190610905919061449c565b612119565b005b34801561091857600080fd5b50610933600480360381019061092e919061449c565b6124c9565b005b34801561094157600080fd5b5061094a612512565b604051610957919061515b565b60405180910390f35b34801561096c57600080fd5b50610975612525565b60405161098291906155d8565b60405180910390f35b34801561099757600080fd5b506109a061252b565b6040516109ad91906150d2565b60405180910390f35b3480156109c257600080fd5b506109cb612555565b005b3480156109d957600080fd5b506109e26125b1565b6040516109ef9190615176565b60405180910390f35b348015610a0457600080fd5b50610a0d612643565b604051610a1a91906155d8565b60405180910390f35b348015610a2f57600080fd5b50610a38612649565b604051610a45919061515b565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190614323565b61265c565b005b348015610a8357600080fd5b50610a9e6004803603810190610a99919061439b565b612672565b005b348015610aac57600080fd5b50610ab5612839565b604051610ac291906155d8565b60405180910390f35b348015610ad757600080fd5b50610ae0612843565b604051610aed91906155d8565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b1891906142a8565b61288c565b005b348015610b2b57600080fd5b50610b346128ee565b604051610b4191906155d8565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c919061449c565b6128fd565b604051610b7e9190615176565b60405180910390f35b348015610b9357600080fd5b50610b9c6129a4565b604051610ba991906155d8565b60405180910390f35b348015610bbe57600080fd5b50610bc76129aa565b604051610bd491906155d8565b60405180910390f35b348015610be957600080fd5b50610c046004803603810190610bff919061421d565b6129b4565b604051610c11919061515b565b60405180910390f35b348015610c2657600080fd5b50610c416004803603810190610c3c919061449c565b612a48565b005b348015610c4f57600080fd5b50610c58612a91565b604051610c6591906155d8565b60405180910390f35b348015610c7a57600080fd5b50610c956004803603810190610c9091906143e0565b612a97565b005b348015610ca357600080fd5b50610cac612b2a565b604051610cb9919061515b565b60405180910390f35b348015610cce57600080fd5b50610ce96004803603810190610ce491906141f4565b612b41565b005b348015610cf757600080fd5b50610d126004803603810190610d0d919061449c565b612c39565b005b348015610d2057600080fd5b50610d3b6004803603810190610d36919061449c565b612c82565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590615418565b60405180910390fd5b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e685750610e6782612ccb565b5b9050919050565b606060008054610e7e906158f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa906158f4565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b5050505050905090565b6000610f0c82612dad565b610f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f42906153b8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f9182611a0d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990615498565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611021612e19565b73ffffffffffffffffffffffffffffffffffffffff161480611050575061104f8161104a612e19565b6129b4565b5b61108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690615338565b60405180910390fd5b6110998383612e21565b505050565b6000600880549050905090565b6000600c54905090565b6110c66110c0612e19565b82612eda565b611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc906154d8565b60405180910390fd5b611110838383612fb8565b505050565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600061117683611ac5565b82106111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae906151f8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661122f61252b565b73ffffffffffffffffffffffffffffffffffffffff161461124f57600080fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661127861252b565b73ffffffffffffffffffffffffffffffffffffffff161461129857600080fd5b6000479050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61271080846112e891906157b0565b6112f2919061577f565b9081150290604051600060405180830381858888f1935050505015801561131d573d6000803e3d6000fd5b5061132661252b565b73ffffffffffffffffffffffffffffffffffffffff166108fc61271060008461134f91906157b0565b611359919061577f565b9081150290604051600060405180830381858888f19350505050158015611384573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff166113a761252b565b73ffffffffffffffffffffffffffffffffffffffff16146113c757600080fd5b80601160016101000a81548160ff02191690831515021790555050565b6012546113ef61109e565b1115611430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611427906152b8565b60405180910390fd5b61143861252b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ba57601160009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b0906151d8565b60405180910390fd5b5b6114c261252b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461154d576014548161150184611ac5565b61150b9190615729565b111561154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390615298565b60405180910390fd5b5b6012548161155961109e565b6115639190615729565b11156115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b906154b8565b60405180910390fd5b6012546115af61109e565b11156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790615538565b60405180910390fd5b601354811115611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90615478565b60405180910390fd5b601160029054906101000a900460ff1615611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90615278565b60405180910390fd5b80600b5461169391906157b0565b3410156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90615598565b60405180910390fd5b60005b81811015611744577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd35561170961109e565b846040516117189291906155f3565b60405180910390a16117318361172c61109e565b613214565b808061173c90615926565b9150506116d8565b505050565b6117648383836040518060200160405280600081525061288c565b505050565b6060600061177683611ac5565b905060008167ffffffffffffffff8111156117ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117e85781602001602082028036833780820191505090505b50905060005b8281101561185857611800858261116b565b828281518110611839577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061185090615926565b9150506117ee565b508092505050919050565b600061186d61252b565b905090565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff1661189761252b565b73ffffffffffffffffffffffffffffffffffffffff16146118b757600080fd5b8060138190555050565b60006118cb61109e565b821061190c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611903906154f8565b60405180910390fd5b60088281548110611946577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff1661197761252b565b73ffffffffffffffffffffffffffffffffffffffff161461199757600080fd5b80601090805190602001906119ad929190613fce565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166119d061252b565b73ffffffffffffffffffffffffffffffffffffffff16146119f057600080fd5b80600f8190555050565b601160009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90615378565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2d90615358565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b85612e19565b73ffffffffffffffffffffffffffffffffffffffff16611ba361252b565b73ffffffffffffffffffffffffffffffffffffffff1614611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf0906153f8565b60405180910390fd5b611c036000613232565b565b3373ffffffffffffffffffffffffffffffffffffffff16611c2461252b565b73ffffffffffffffffffffffffffffffffffffffff1614611c4457600080fd5b600f54600e541115611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290615198565b60405180910390fd5b6000611c9561109e565b905060005b600d54811015611d28577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3558183611cd19190615729565b33604051611ce09291906155f3565b60405180910390a1611cfd338284611cf89190615729565b613214565b600e6000815480929190611d1090615926565b91905055508080611d2090615926565b915050611c9a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611d4b61252b565b73ffffffffffffffffffffffffffffffffffffffff1614611d6b57600080fd5b60005b8282905081101561201857600073ffffffffffffffffffffffffffffffffffffffff16838383818110611dca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611ddf91906141f4565b73ffffffffffffffffffffffffffffffffffffffff161415611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d906153d8565b60405180910390fd5b600160176000858585818110611e75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e8a91906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060186000858585818110611f1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611f2f91906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f76576000612004565b60186000848484818110611fb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611fc891906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b50808061201090615926565b915050611d6e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661203c61252b565b73ffffffffffffffffffffffffffffffffffffffff161461205c57600080fd5b8060128190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661208561252b565b73ffffffffffffffffffffffffffffffffffffffff16146120a557600080fd5b60005b81811015612114577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556120d961109e565b846040516120e89291906155f3565b60405180910390a1612101836120fc61109e565b613214565b808061210c90615926565b9150506120a8565b505050565b60125461212461109e565b1115612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c906152b8565b60405180910390fd5b601160019054906101000a900460ff166121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90615518565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612237906151b8565b60405180910390fd5b60125461224b61109e565b1061228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228290615578565b60405180910390fd5b6015548111156122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c7906155b8565b60405180910390fd5b60155481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461231e9190615729565b111561235f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235690615558565b60405180910390fd5b80600c5461236d91906157b0565b3410156123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690615598565b60405180910390fd5b601160029054906101000a900460ff16156123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f690615278565b60405180910390fd5b60005b818110156124c5576001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245a9190615729565b925050819055507f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd35561248a61109e565b336040516124999291906155f3565b60405180910390a16124b2336124ad61109e565b613214565b80806124bd90615926565b915050612402565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166124e861252b565b73ffffffffffffffffffffffffffffffffffffffff161461250857600080fd5b8060158190555050565b601160029054906101000a900460ff1681565b60155481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1661257461252b565b73ffffffffffffffffffffffffffffffffffffffff161461259457600080fd5b6001601160026101000a81548160ff021916908315150217905550565b6060600180546125c0906158f4565b80601f01602080910402602001604051908101604052809291908181526020018280546125ec906158f4565b80156126395780601f1061260e57610100808354040283529160200191612639565b820191906000526020600020905b81548152906001019060200180831161261c57829003601f168201915b5050505050905090565b60135481565b601160019054906101000a900460ff1681565b61266e612667612e19565b83836132f8565b5050565b3373ffffffffffffffffffffffffffffffffffffffff1661269161252b565b73ffffffffffffffffffffffffffffffffffffffff16146126b157600080fd5b60005b8282905081101561283457600073ffffffffffffffffffffffffffffffffffffffff16838383818110612710577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061272591906141f4565b73ffffffffffffffffffffffffffffffffffffffff16141561277c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612773906153d8565b60405180910390fd5b6000601760008585858181106127bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906127d091906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061282c90615926565b9150506126b4565b505050565b6000600b54905090565b60003373ffffffffffffffffffffffffffffffffffffffff1661286461252b565b73ffffffffffffffffffffffffffffffffffffffff161461288457600080fd5b601354905090565b61289d612897612e19565b83612eda565b6128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d3906154d8565b60405180910390fd5b6128e884848484613465565b50505050565b60006128f861109e565b905090565b606061290882612dad565b612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293e90615458565b60405180910390fd5b60006129516134c1565b90506000815111612971576040518060200160405280600081525061299c565b8061297b84613553565b60405160200161298c9291906150ae565b6040516020818303038152906040525b915050919050565b60145481565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16612a6761252b565b73ffffffffffffffffffffffffffffffffffffffff1614612a8757600080fd5b8060148190555050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff16612ab661252b565b73ffffffffffffffffffffffffffffffffffffffff1614612ad657600080fd5b80601160006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f81604051612b1f919061515b565b60405180910390a150565b6000601160029054906101000a900460ff16905090565b612b49612e19565b73ffffffffffffffffffffffffffffffffffffffff16612b6761252b565b73ffffffffffffffffffffffffffffffffffffffff1614612bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb4906153f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2490615238565b60405180910390fd5b612c3681613232565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612c5861252b565b73ffffffffffffffffffffffffffffffffffffffff1614612c7857600080fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16612ca161252b565b73ffffffffffffffffffffffffffffffffffffffff1614612cc157600080fd5b80600d8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d9657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612da65750612da582613700565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e9483611a0d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ee582612dad565b612f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1b90615318565b60405180910390fd5b6000612f2f83611a0d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f9e57508373ffffffffffffffffffffffffffffffffffffffff16612f8684610f01565b73ffffffffffffffffffffffffffffffffffffffff16145b80612faf5750612fae81856129b4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612fd882611a0d565b73ffffffffffffffffffffffffffffffffffffffff161461302e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302590615438565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561309e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613095906152d8565b60405180910390fd5b6130a983838361376a565b6130b4600082612e21565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613104919061580a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315b9190615729565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61322e82826040518060200160405280600081525061387e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e906152f8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613458919061515b565b60405180910390a3505050565b613470848484612fb8565b61347c848484846138d9565b6134bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b290615218565b60405180910390fd5b50505050565b6060601080546134d0906158f4565b80601f01602080910402602001604051908101604052809291908181526020018280546134fc906158f4565b80156135495780601f1061351e57610100808354040283529160200191613549565b820191906000526020600020905b81548152906001019060200180831161352c57829003601f168201915b5050505050905090565b6060600082141561359b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136fb565b600082905060005b600082146135cd5780806135b690615926565b915050600a826135c6919061577f565b91506135a3565b60008167ffffffffffffffff81111561360f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136415781602001600182028036833780820191505090505b5090505b600085146136f45760018261365a919061580a565b9150600a85613669919061596f565b60306136759190615729565b60f81b8183815181106136b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136ed919061577f565b9450613645565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613775838383613a70565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137b8576137b381613a75565b6137f7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137f6576137f58382613abe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561383a5761383581613c2b565b613879565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613878576138778282613d6e565b5b5b505050565b6138888383613ded565b61389560008484846138d9565b6138d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138cb90615218565b60405180910390fd5b505050565b60006138fa8473ffffffffffffffffffffffffffffffffffffffff16613fbb565b15613a63578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613923612e19565b8786866040518563ffffffff1660e01b815260040161394594939291906150ed565b602060405180830381600087803b15801561395f57600080fd5b505af192505050801561399057506040513d601f19601f8201168201806040525081019061398d9190614432565b60015b613a13573d80600081146139c0576040519150601f19603f3d011682016040523d82523d6000602084013e6139c5565b606091505b50600081511415613a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0290615218565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a68565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613acb84611ac5565b613ad5919061580a565b9050600060076000848152602001908152602001600020549050818114613bba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c3f919061580a565b9050600060096000848152602001908152602001600020549050600060088381548110613c95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d7983611ac5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5490615398565b60405180910390fd5b613e6681612dad565b15613ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9d90615258565b60405180910390fd5b613eb26000838361376a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f029190615729565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613fda906158f4565b90600052602060002090601f016020900481019282613ffc5760008555614043565b82601f1061401557805160ff1916838001178555614043565b82800160010185558215614043579182015b82811115614042578251825591602001919060010190614027565b5b5090506140509190614054565b5090565b5b8082111561406d576000816000905550600101614055565b5090565b600061408461407f8461564d565b61561c565b90508281526020810184848401111561409c57600080fd5b6140a78482856158b2565b509392505050565b60006140c26140bd8461567d565b61561c565b9050828152602081018484840111156140da57600080fd5b6140e58482856158b2565b509392505050565b6000813590506140fc81615a6d565b92915050565b60008083601f84011261411457600080fd5b8235905067ffffffffffffffff81111561412d57600080fd5b60208301915083602082028301111561414557600080fd5b9250929050565b60008135905061415b81615a84565b92915050565b60008135905061417081615a9b565b92915050565b60008151905061418581615a9b565b92915050565b600082601f83011261419c57600080fd5b81356141ac848260208601614071565b91505092915050565b600082601f8301126141c657600080fd5b81356141d68482602086016140af565b91505092915050565b6000813590506141ee81615ab2565b92915050565b60006020828403121561420657600080fd5b6000614214848285016140ed565b91505092915050565b6000806040838503121561423057600080fd5b600061423e858286016140ed565b925050602061424f858286016140ed565b9150509250929050565b60008060006060848603121561426e57600080fd5b600061427c868287016140ed565b935050602061428d868287016140ed565b925050604061429e868287016141df565b9150509250925092565b600080600080608085870312156142be57600080fd5b60006142cc878288016140ed565b94505060206142dd878288016140ed565b93505060406142ee878288016141df565b925050606085013567ffffffffffffffff81111561430b57600080fd5b6143178782880161418b565b91505092959194509250565b6000806040838503121561433657600080fd5b6000614344858286016140ed565b92505060206143558582860161414c565b9150509250929050565b6000806040838503121561437257600080fd5b6000614380858286016140ed565b9250506020614391858286016141df565b9150509250929050565b600080602083850312156143ae57600080fd5b600083013567ffffffffffffffff8111156143c857600080fd5b6143d485828601614102565b92509250509250929050565b6000602082840312156143f257600080fd5b60006144008482850161414c565b91505092915050565b60006020828403121561441b57600080fd5b600061442984828501614161565b91505092915050565b60006020828403121561444457600080fd5b600061445284828501614176565b91505092915050565b60006020828403121561446d57600080fd5b600082013567ffffffffffffffff81111561448757600080fd5b614493848285016141b5565b91505092915050565b6000602082840312156144ae57600080fd5b60006144bc848285016141df565b91505092915050565b60006144d18383615090565b60208301905092915050565b6144e68161583e565b82525050565b60006144f7826156bd565b61450181856156eb565b935061450c836156ad565b8060005b8381101561453d57815161452488826144c5565b975061452f836156de565b925050600181019050614510565b5085935050505092915050565b61455381615850565b82525050565b6000614564826156c8565b61456e81856156fc565b935061457e8185602086016158c1565b61458781615a5c565b840191505092915050565b600061459d826156d3565b6145a7818561570d565b93506145b78185602086016158c1565b6145c081615a5c565b840191505092915050565b60006145d6826156d3565b6145e0818561571e565b93506145f08185602086016158c1565b80840191505092915050565b6000614609601b8361570d565b91507f4d61782052657365727665732074616b656e20616c72656164792100000000006000830152602082019050919050565b6000614649601d8361570d565b91507f596f7520617265206e6f74206f6e2074686520416c6c6f77204c6973740000006000830152602082019050919050565b6000614689601d8361570d565b91507f53616c65206973206e6f74206163746976652063757272656e746c792e0000006000830152602082019050919050565b60006146c9602b8361570d565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061472f60328361570d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061479560268361570d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147fb601c8361570d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061483b60138361570d565b91507f4d696e7420436c6f73656420466f7265766572000000000000000000000000006000830152602082019050919050565b600061487b60188361570d565b91507f4d617820686f6c64696e672063617020726561636865642e00000000000000006000830152602082019050919050565b60006148bb600f8361570d565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b60006148fb60248361570d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061496160198361570d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006149a1602c8361570d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a0760388361570d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614a6d602a8361570d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ad360298361570d565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b3960208361570d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614b79602c8361570d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bdf60188361570d565b91507f43616e2774206164642061206e756c6c206164647265737300000000000000006000830152602082019050919050565b6000614c1f60208361570d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c5f601e8361570d565b91507f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c69737400006000830152602082019050919050565b6000614c9f60298361570d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d05602f8361570d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614d6b601e8361570d565b91507f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e7300006000830152602082019050919050565b6000614dab60218361570d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e1160168361570d565b91507f546f74616c20737570706c792065786365656465642e000000000000000000006000830152602082019050919050565b6000614e5160318361570d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614eb7602c8361570d565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614f1d601b8361570d565b91507f5072652053616c65204d696e74206973206e6f742061637469766500000000006000830152602082019050919050565b6000614f5d60138361570d565b91507f546f74616c20737570706c79207370656e742e000000000000000000000000006000830152602082019050919050565b6000614f9d601c8361570d565b91507f50757263686173652065786365656473206d617820616c6c6f776564000000006000830152602082019050919050565b6000614fdd601b8361570d565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b600061501d601d8361570d565b91507f496e73756666696369656e742045544820616d6f756e742073656e742e0000006000830152602082019050919050565b600061505d60208361570d565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736000830152602082019050919050565b615099816158a8565b82525050565b6150a8816158a8565b82525050565b60006150ba82856145cb565b91506150c682846145cb565b91508190509392505050565b60006020820190506150e760008301846144dd565b92915050565b600060808201905061510260008301876144dd565b61510f60208301866144dd565b61511c604083018561509f565b818103606083015261512e8184614559565b905095945050505050565b6000602082019050818103600083015261515381846144ec565b905092915050565b6000602082019050615170600083018461454a565b92915050565b600060208201905081810360008301526151908184614592565b905092915050565b600060208201905081810360008301526151b1816145fc565b9050919050565b600060208201905081810360008301526151d18161463c565b9050919050565b600060208201905081810360008301526151f18161467c565b9050919050565b60006020820190508181036000830152615211816146bc565b9050919050565b6000602082019050818103600083015261523181614722565b9050919050565b6000602082019050818103600083015261525181614788565b9050919050565b60006020820190508181036000830152615271816147ee565b9050919050565b600060208201905081810360008301526152918161482e565b9050919050565b600060208201905081810360008301526152b18161486e565b9050919050565b600060208201905081810360008301526152d1816148ae565b9050919050565b600060208201905081810360008301526152f1816148ee565b9050919050565b6000602082019050818103600083015261531181614954565b9050919050565b6000602082019050818103600083015261533181614994565b9050919050565b60006020820190508181036000830152615351816149fa565b9050919050565b6000602082019050818103600083015261537181614a60565b9050919050565b6000602082019050818103600083015261539181614ac6565b9050919050565b600060208201905081810360008301526153b181614b2c565b9050919050565b600060208201905081810360008301526153d181614b6c565b9050919050565b600060208201905081810360008301526153f181614bd2565b9050919050565b6000602082019050818103600083015261541181614c12565b9050919050565b6000602082019050818103600083015261543181614c52565b9050919050565b6000602082019050818103600083015261545181614c92565b9050919050565b6000602082019050818103600083015261547181614cf8565b9050919050565b6000602082019050818103600083015261549181614d5e565b9050919050565b600060208201905081810360008301526154b181614d9e565b9050919050565b600060208201905081810360008301526154d181614e04565b9050919050565b600060208201905081810360008301526154f181614e44565b9050919050565b6000602082019050818103600083015261551181614eaa565b9050919050565b6000602082019050818103600083015261553181614f10565b9050919050565b6000602082019050818103600083015261555181614f50565b9050919050565b6000602082019050818103600083015261557181614f90565b9050919050565b6000602082019050818103600083015261559181614fd0565b9050919050565b600060208201905081810360008301526155b181615010565b9050919050565b600060208201905081810360008301526155d181615050565b9050919050565b60006020820190506155ed600083018461509f565b92915050565b6000604082019050615608600083018561509f565b61561560208301846144dd565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171561564357615642615a2d565b5b8060405250919050565b600067ffffffffffffffff82111561566857615667615a2d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561569857615697615a2d565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615734826158a8565b915061573f836158a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615774576157736159a0565b5b828201905092915050565b600061578a826158a8565b9150615795836158a8565b9250826157a5576157a46159cf565b5b828204905092915050565b60006157bb826158a8565b91506157c6836158a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157ff576157fe6159a0565b5b828202905092915050565b6000615815826158a8565b9150615820836158a8565b925082821015615833576158326159a0565b5b828203905092915050565b600061584982615888565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156158df5780820151818401526020810190506158c4565b838111156158ee576000848401525b50505050565b6000600282049050600182168061590c57607f821691505b602082108114156159205761591f6159fe565b5b50919050565b6000615931826158a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615964576159636159a0565b5b600182019050919050565b600061597a826158a8565b9150615985836158a8565b925082615995576159946159cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615a768161583e565b8114615a8157600080fd5b50565b615a8d81615850565b8114615a9857600080fd5b50565b615aa48161585c565b8114615aaf57600080fd5b50565b615abb816158a8565b8114615ac657600080fd5b5056fea264697066735822122042fcc47b80b0db253d3006bd0c230a8f04e8134cf58b8198643415823717f06c64736f6c634300080000330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005768747470733a2f2f726963686a61677561727a2e6d7970696e6174612e636c6f75642f697066732f516d6477523361427656794c744b6d7437625775716d7641676b544e3278557670744863526771456b713350726d2f000000000000000000

Deployed Bytecode

0x6080604052600436106103755760003560e01c80637263cfe2116101d1578063a7f93ebd11610102578063e985e9c5116100a0578063f132dc291161006f578063f132dc2914610c97578063f2fde38b14610cc2578063f4a0a52814610ceb578063f6c9d9e314610d1457610375565b8063e985e9c514610bdd578063ea6eb83614610c1a578063ec7d099114610c43578063ee1cc94414610c6e57610375565b8063c4e41b22116100dc578063c4e41b2214610b1f578063c87b56dd14610b4a578063cadf881814610b87578063e7b62d9614610bb257610375565b8063a7f93ebd14610aa0578063ad06d75814610acb578063b88d4fde14610af657610375565b80638da5cb5b1161016f5780639a3bf728116101495780639a3bf728146109f85780639ccb0fea14610a23578063a22cb46514610a4e578063a51312c814610a7757610375565b80638da5cb5b1461098b578063932ecebc146109b657806395d89b41146109cd57610375565b80637835c635116101ab5780637835c635146108f05780637a6685f11461090c5780637d26f470146109355780637f44ab2f1461096057610375565b80637263cfe2146108755780637389fbb71461089e57806377b501b9146108c757610375565b806342842e0e116102ab57806356a87caa116102495780636817c76c116102235780636817c76c146107df57806370a082311461080a578063715018a61461084757806371e3500c1461085e57610375565b806356a87caa1461074e5780635b92ac0d146107775780636352211e146107a257610375565b80634d0550de116102855780634d0550de146106945780634dfea627146106bf5780634f6ccce7146106e857806355f804b31461072557610375565b806342842e0e14610603578063438b63001461062c578063442890d51461066957610375565b806323b872dd116103185780633b9ee7e4116102f25780633b9ee7e41461057e5780633ccfd60b146105a75780633cfac570146105be57806340c10f19146105e757610375565b806323b872dd146104db5780632c1205f4146105045780632f745c591461054157610375565b8063081812fc11610354578063081812fc1461041f578063095ea7b31461045c57806318160ddd1461048557806321a911f8146104b057610375565b806208ffdd1461037a57806301ffc9a7146103b757806306fdde03146103f4575b600080fd5b34801561038657600080fd5b506103a1600480360381019061039c91906141f4565b610d3d565b6040516103ae91906155d8565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190614409565b610df5565b6040516103eb919061515b565b60405180910390f35b34801561040057600080fd5b50610409610e6f565b6040516104169190615176565b60405180910390f35b34801561042b57600080fd5b506104466004803603810190610441919061449c565b610f01565b60405161045391906150d2565b60405180910390f35b34801561046857600080fd5b50610483600480360381019061047e919061435f565b610f86565b005b34801561049157600080fd5b5061049a61109e565b6040516104a791906155d8565b60405180910390f35b3480156104bc57600080fd5b506104c56110ab565b6040516104d291906155d8565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190614259565b6110b5565b005b34801561051057600080fd5b5061052b600480360381019061052691906141f4565b611115565b604051610538919061515b565b60405180910390f35b34801561054d57600080fd5b506105686004803603810190610563919061435f565b61116b565b60405161057591906155d8565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a0919061449c565b611210565b005b3480156105b357600080fd5b506105bc611259565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906143e0565b611388565b005b61060160048036038101906105fc919061435f565b6113e4565b005b34801561060f57600080fd5b5061062a60048036038101906106259190614259565b611749565b005b34801561063857600080fd5b50610653600480360381019061064e91906141f4565b611769565b6040516106609190615139565b60405180910390f35b34801561067557600080fd5b5061067e611863565b60405161068b91906150d2565b60405180910390f35b3480156106a057600080fd5b506106a9611872565b6040516106b691906155d8565b60405180910390f35b3480156106cb57600080fd5b506106e660048036038101906106e1919061449c565b611878565b005b3480156106f457600080fd5b5061070f600480360381019061070a919061449c565b6118c1565b60405161071c91906155d8565b60405180910390f35b34801561073157600080fd5b5061074c6004803603810190610747919061445b565b611958565b005b34801561075a57600080fd5b506107756004803603810190610770919061449c565b6119b1565b005b34801561078357600080fd5b5061078c6119fa565b604051610799919061515b565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c4919061449c565b611a0d565b6040516107d691906150d2565b60405180910390f35b3480156107eb57600080fd5b506107f4611abf565b60405161080191906155d8565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906141f4565b611ac5565b60405161083e91906155d8565b60405180910390f35b34801561085357600080fd5b5061085c611b7d565b005b34801561086a57600080fd5b50610873611c05565b005b34801561088157600080fd5b5061089c6004803603810190610897919061439b565b611d2c565b005b3480156108aa57600080fd5b506108c560048036038101906108c0919061449c565b61201d565b005b3480156108d357600080fd5b506108ee60048036038101906108e9919061435f565b612066565b005b61090a6004803603810190610905919061449c565b612119565b005b34801561091857600080fd5b50610933600480360381019061092e919061449c565b6124c9565b005b34801561094157600080fd5b5061094a612512565b604051610957919061515b565b60405180910390f35b34801561096c57600080fd5b50610975612525565b60405161098291906155d8565b60405180910390f35b34801561099757600080fd5b506109a061252b565b6040516109ad91906150d2565b60405180910390f35b3480156109c257600080fd5b506109cb612555565b005b3480156109d957600080fd5b506109e26125b1565b6040516109ef9190615176565b60405180910390f35b348015610a0457600080fd5b50610a0d612643565b604051610a1a91906155d8565b60405180910390f35b348015610a2f57600080fd5b50610a38612649565b604051610a45919061515b565b60405180910390f35b348015610a5a57600080fd5b50610a756004803603810190610a709190614323565b61265c565b005b348015610a8357600080fd5b50610a9e6004803603810190610a99919061439b565b612672565b005b348015610aac57600080fd5b50610ab5612839565b604051610ac291906155d8565b60405180910390f35b348015610ad757600080fd5b50610ae0612843565b604051610aed91906155d8565b60405180910390f35b348015610b0257600080fd5b50610b1d6004803603810190610b1891906142a8565b61288c565b005b348015610b2b57600080fd5b50610b346128ee565b604051610b4191906155d8565b60405180910390f35b348015610b5657600080fd5b50610b716004803603810190610b6c919061449c565b6128fd565b604051610b7e9190615176565b60405180910390f35b348015610b9357600080fd5b50610b9c6129a4565b604051610ba991906155d8565b60405180910390f35b348015610bbe57600080fd5b50610bc76129aa565b604051610bd491906155d8565b60405180910390f35b348015610be957600080fd5b50610c046004803603810190610bff919061421d565b6129b4565b604051610c11919061515b565b60405180910390f35b348015610c2657600080fd5b50610c416004803603810190610c3c919061449c565b612a48565b005b348015610c4f57600080fd5b50610c58612a91565b604051610c6591906155d8565b60405180910390f35b348015610c7a57600080fd5b50610c956004803603810190610c9091906143e0565b612a97565b005b348015610ca357600080fd5b50610cac612b2a565b604051610cb9919061515b565b60405180910390f35b348015610cce57600080fd5b50610ce96004803603810190610ce491906141f4565b612b41565b005b348015610cf757600080fd5b50610d126004803603810190610d0d919061449c565b612c39565b005b348015610d2057600080fd5b50610d3b6004803603810190610d36919061449c565b612c82565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da590615418565b60405180910390fd5b601860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610e685750610e6782612ccb565b5b9050919050565b606060008054610e7e906158f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610eaa906158f4565b8015610ef75780601f10610ecc57610100808354040283529160200191610ef7565b820191906000526020600020905b815481529060010190602001808311610eda57829003601f168201915b5050505050905090565b6000610f0c82612dad565b610f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f42906153b8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f9182611a0d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff990615498565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611021612e19565b73ffffffffffffffffffffffffffffffffffffffff161480611050575061104f8161104a612e19565b6129b4565b5b61108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690615338565b60405180910390fd5b6110998383612e21565b505050565b6000600880549050905090565b6000600c54905090565b6110c66110c0612e19565b82612eda565b611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc906154d8565b60405180910390fd5b611110838383612fb8565b505050565b6000601760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b600061117683611ac5565b82106111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae906151f8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b3373ffffffffffffffffffffffffffffffffffffffff1661122f61252b565b73ffffffffffffffffffffffffffffffffffffffff161461124f57600080fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661127861252b565b73ffffffffffffffffffffffffffffffffffffffff161461129857600080fd5b6000479050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61271080846112e891906157b0565b6112f2919061577f565b9081150290604051600060405180830381858888f1935050505015801561131d573d6000803e3d6000fd5b5061132661252b565b73ffffffffffffffffffffffffffffffffffffffff166108fc61271060008461134f91906157b0565b611359919061577f565b9081150290604051600060405180830381858888f19350505050158015611384573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff166113a761252b565b73ffffffffffffffffffffffffffffffffffffffff16146113c757600080fd5b80601160016101000a81548160ff02191690831515021790555050565b6012546113ef61109e565b1115611430576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611427906152b8565b60405180910390fd5b61143861252b565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ba57601160009054906101000a900460ff166114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b0906151d8565b60405180910390fd5b5b6114c261252b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461154d576014548161150184611ac5565b61150b9190615729565b111561154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390615298565b60405180910390fd5b5b6012548161155961109e565b6115639190615729565b11156115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b906154b8565b60405180910390fd5b6012546115af61109e565b11156115f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e790615538565b60405180910390fd5b601354811115611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c90615478565b60405180910390fd5b601160029054906101000a900460ff1615611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90615278565b60405180910390fd5b80600b5461169391906157b0565b3410156116d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cc90615598565b60405180910390fd5b60005b81811015611744577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd35561170961109e565b846040516117189291906155f3565b60405180910390a16117318361172c61109e565b613214565b808061173c90615926565b9150506116d8565b505050565b6117648383836040518060200160405280600081525061288c565b505050565b6060600061177683611ac5565b905060008167ffffffffffffffff8111156117ba577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156117e85781602001602082028036833780820191505090505b50905060005b8281101561185857611800858261116b565b828281518110611839577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061185090615926565b9150506117ee565b508092505050919050565b600061186d61252b565b905090565b60125481565b3373ffffffffffffffffffffffffffffffffffffffff1661189761252b565b73ffffffffffffffffffffffffffffffffffffffff16146118b757600080fd5b8060138190555050565b60006118cb61109e565b821061190c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611903906154f8565b60405180910390fd5b60088281548110611946577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff1661197761252b565b73ffffffffffffffffffffffffffffffffffffffff161461199757600080fd5b80601090805190602001906119ad929190613fce565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166119d061252b565b73ffffffffffffffffffffffffffffffffffffffff16146119f057600080fd5b80600f8190555050565b601160009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ab6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aad90615378565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2d90615358565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b85612e19565b73ffffffffffffffffffffffffffffffffffffffff16611ba361252b565b73ffffffffffffffffffffffffffffffffffffffff1614611bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf0906153f8565b60405180910390fd5b611c036000613232565b565b3373ffffffffffffffffffffffffffffffffffffffff16611c2461252b565b73ffffffffffffffffffffffffffffffffffffffff1614611c4457600080fd5b600f54600e541115611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290615198565b60405180910390fd5b6000611c9561109e565b905060005b600d54811015611d28577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3558183611cd19190615729565b33604051611ce09291906155f3565b60405180910390a1611cfd338284611cf89190615729565b613214565b600e6000815480929190611d1090615926565b91905055508080611d2090615926565b915050611c9a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611d4b61252b565b73ffffffffffffffffffffffffffffffffffffffff1614611d6b57600080fd5b60005b8282905081101561201857600073ffffffffffffffffffffffffffffffffffffffff16838383818110611dca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611ddf91906141f4565b73ffffffffffffffffffffffffffffffffffffffff161415611e36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2d906153d8565b60405180910390fd5b600160176000858585818110611e75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611e8a91906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060186000858585818110611f1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611f2f91906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611f76576000612004565b60186000848484818110611fb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611fc891906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b50808061201090615926565b915050611d6e565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661203c61252b565b73ffffffffffffffffffffffffffffffffffffffff161461205c57600080fd5b8060128190555050565b3373ffffffffffffffffffffffffffffffffffffffff1661208561252b565b73ffffffffffffffffffffffffffffffffffffffff16146120a557600080fd5b60005b81811015612114577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556120d961109e565b846040516120e89291906155f3565b60405180910390a1612101836120fc61109e565b613214565b808061210c90615926565b9150506120a8565b505050565b60125461212461109e565b1115612165576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161215c906152b8565b60405180910390fd5b601160019054906101000a900460ff166121b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ab90615518565b60405180910390fd5b601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612240576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612237906151b8565b60405180910390fd5b60125461224b61109e565b1061228b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228290615578565b60405180910390fd5b6015548111156122d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c7906155b8565b60405180910390fd5b60155481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461231e9190615729565b111561235f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235690615558565b60405180910390fd5b80600c5461236d91906157b0565b3410156123af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a690615598565b60405180910390fd5b601160029054906101000a900460ff16156123ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f690615278565b60405180910390fd5b60005b818110156124c5576001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461245a9190615729565b925050819055507f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd35561248a61109e565b336040516124999291906155f3565b60405180910390a16124b2336124ad61109e565b613214565b80806124bd90615926565b915050612402565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166124e861252b565b73ffffffffffffffffffffffffffffffffffffffff161461250857600080fd5b8060158190555050565b601160029054906101000a900460ff1681565b60155481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff1661257461252b565b73ffffffffffffffffffffffffffffffffffffffff161461259457600080fd5b6001601160026101000a81548160ff021916908315150217905550565b6060600180546125c0906158f4565b80601f01602080910402602001604051908101604052809291908181526020018280546125ec906158f4565b80156126395780601f1061260e57610100808354040283529160200191612639565b820191906000526020600020905b81548152906001019060200180831161261c57829003601f168201915b5050505050905090565b60135481565b601160019054906101000a900460ff1681565b61266e612667612e19565b83836132f8565b5050565b3373ffffffffffffffffffffffffffffffffffffffff1661269161252b565b73ffffffffffffffffffffffffffffffffffffffff16146126b157600080fd5b60005b8282905081101561283457600073ffffffffffffffffffffffffffffffffffffffff16838383818110612710577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061272591906141f4565b73ffffffffffffffffffffffffffffffffffffffff16141561277c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612773906153d8565b60405180910390fd5b6000601760008585858181106127bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906127d091906141f4565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061282c90615926565b9150506126b4565b505050565b6000600b54905090565b60003373ffffffffffffffffffffffffffffffffffffffff1661286461252b565b73ffffffffffffffffffffffffffffffffffffffff161461288457600080fd5b601354905090565b61289d612897612e19565b83612eda565b6128dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d3906154d8565b60405180910390fd5b6128e884848484613465565b50505050565b60006128f861109e565b905090565b606061290882612dad565b612947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293e90615458565b60405180910390fd5b60006129516134c1565b90506000815111612971576040518060200160405280600081525061299c565b8061297b84613553565b60405160200161298c9291906150ae565b6040516020818303038152906040525b915050919050565b60145481565b6000600d54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16612a6761252b565b73ffffffffffffffffffffffffffffffffffffffff1614612a8757600080fd5b8060148190555050565b600c5481565b3373ffffffffffffffffffffffffffffffffffffffff16612ab661252b565b73ffffffffffffffffffffffffffffffffffffffff1614612ad657600080fd5b80601160006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f81604051612b1f919061515b565b60405180910390a150565b6000601160029054906101000a900460ff16905090565b612b49612e19565b73ffffffffffffffffffffffffffffffffffffffff16612b6761252b565b73ffffffffffffffffffffffffffffffffffffffff1614612bbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb4906153f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2490615238565b60405180910390fd5b612c3681613232565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612c5861252b565b73ffffffffffffffffffffffffffffffffffffffff1614612c7857600080fd5b80600b8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16612ca161252b565b73ffffffffffffffffffffffffffffffffffffffff1614612cc157600080fd5b80600d8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d9657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612da65750612da582613700565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612e9483611a0d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612ee582612dad565b612f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1b90615318565b60405180910390fd5b6000612f2f83611a0d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612f9e57508373ffffffffffffffffffffffffffffffffffffffff16612f8684610f01565b73ffffffffffffffffffffffffffffffffffffffff16145b80612faf5750612fae81856129b4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612fd882611a0d565b73ffffffffffffffffffffffffffffffffffffffff161461302e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302590615438565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561309e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613095906152d8565b60405180910390fd5b6130a983838361376a565b6130b4600082612e21565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613104919061580a565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315b9190615729565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61322e82826040518060200160405280600081525061387e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613367576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161335e906152f8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051613458919061515b565b60405180910390a3505050565b613470848484612fb8565b61347c848484846138d9565b6134bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b290615218565b60405180910390fd5b50505050565b6060601080546134d0906158f4565b80601f01602080910402602001604051908101604052809291908181526020018280546134fc906158f4565b80156135495780601f1061351e57610100808354040283529160200191613549565b820191906000526020600020905b81548152906001019060200180831161352c57829003601f168201915b5050505050905090565b6060600082141561359b576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136fb565b600082905060005b600082146135cd5780806135b690615926565b915050600a826135c6919061577f565b91506135a3565b60008167ffffffffffffffff81111561360f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156136415781602001600182028036833780820191505090505b5090505b600085146136f45760018261365a919061580a565b9150600a85613669919061596f565b60306136759190615729565b60f81b8183815181106136b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856136ed919061577f565b9450613645565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613775838383613a70565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156137b8576137b381613a75565b6137f7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146137f6576137f58382613abe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561383a5761383581613c2b565b613879565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613878576138778282613d6e565b5b5b505050565b6138888383613ded565b61389560008484846138d9565b6138d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138cb90615218565b60405180910390fd5b505050565b60006138fa8473ffffffffffffffffffffffffffffffffffffffff16613fbb565b15613a63578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613923612e19565b8786866040518563ffffffff1660e01b815260040161394594939291906150ed565b602060405180830381600087803b15801561395f57600080fd5b505af192505050801561399057506040513d601f19601f8201168201806040525081019061398d9190614432565b60015b613a13573d80600081146139c0576040519150601f19603f3d011682016040523d82523d6000602084013e6139c5565b606091505b50600081511415613a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a0290615218565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613a68565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613acb84611ac5565b613ad5919061580a565b9050600060076000848152602001908152602001600020549050818114613bba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613c3f919061580a565b9050600060096000848152602001908152602001600020549050600060088381548110613c95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613d52577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613d7983611ac5565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e5490615398565b60405180910390fd5b613e6681612dad565b15613ea6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e9d90615258565b60405180910390fd5b613eb26000838361376a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f029190615729565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613fda906158f4565b90600052602060002090601f016020900481019282613ffc5760008555614043565b82601f1061401557805160ff1916838001178555614043565b82800160010185558215614043579182015b82811115614042578251825591602001919060010190614027565b5b5090506140509190614054565b5090565b5b8082111561406d576000816000905550600101614055565b5090565b600061408461407f8461564d565b61561c565b90508281526020810184848401111561409c57600080fd5b6140a78482856158b2565b509392505050565b60006140c26140bd8461567d565b61561c565b9050828152602081018484840111156140da57600080fd5b6140e58482856158b2565b509392505050565b6000813590506140fc81615a6d565b92915050565b60008083601f84011261411457600080fd5b8235905067ffffffffffffffff81111561412d57600080fd5b60208301915083602082028301111561414557600080fd5b9250929050565b60008135905061415b81615a84565b92915050565b60008135905061417081615a9b565b92915050565b60008151905061418581615a9b565b92915050565b600082601f83011261419c57600080fd5b81356141ac848260208601614071565b91505092915050565b600082601f8301126141c657600080fd5b81356141d68482602086016140af565b91505092915050565b6000813590506141ee81615ab2565b92915050565b60006020828403121561420657600080fd5b6000614214848285016140ed565b91505092915050565b6000806040838503121561423057600080fd5b600061423e858286016140ed565b925050602061424f858286016140ed565b9150509250929050565b60008060006060848603121561426e57600080fd5b600061427c868287016140ed565b935050602061428d868287016140ed565b925050604061429e868287016141df565b9150509250925092565b600080600080608085870312156142be57600080fd5b60006142cc878288016140ed565b94505060206142dd878288016140ed565b93505060406142ee878288016141df565b925050606085013567ffffffffffffffff81111561430b57600080fd5b6143178782880161418b565b91505092959194509250565b6000806040838503121561433657600080fd5b6000614344858286016140ed565b92505060206143558582860161414c565b9150509250929050565b6000806040838503121561437257600080fd5b6000614380858286016140ed565b9250506020614391858286016141df565b9150509250929050565b600080602083850312156143ae57600080fd5b600083013567ffffffffffffffff8111156143c857600080fd5b6143d485828601614102565b92509250509250929050565b6000602082840312156143f257600080fd5b60006144008482850161414c565b91505092915050565b60006020828403121561441b57600080fd5b600061442984828501614161565b91505092915050565b60006020828403121561444457600080fd5b600061445284828501614176565b91505092915050565b60006020828403121561446d57600080fd5b600082013567ffffffffffffffff81111561448757600080fd5b614493848285016141b5565b91505092915050565b6000602082840312156144ae57600080fd5b60006144bc848285016141df565b91505092915050565b60006144d18383615090565b60208301905092915050565b6144e68161583e565b82525050565b60006144f7826156bd565b61450181856156eb565b935061450c836156ad565b8060005b8381101561453d57815161452488826144c5565b975061452f836156de565b925050600181019050614510565b5085935050505092915050565b61455381615850565b82525050565b6000614564826156c8565b61456e81856156fc565b935061457e8185602086016158c1565b61458781615a5c565b840191505092915050565b600061459d826156d3565b6145a7818561570d565b93506145b78185602086016158c1565b6145c081615a5c565b840191505092915050565b60006145d6826156d3565b6145e0818561571e565b93506145f08185602086016158c1565b80840191505092915050565b6000614609601b8361570d565b91507f4d61782052657365727665732074616b656e20616c72656164792100000000006000830152602082019050919050565b6000614649601d8361570d565b91507f596f7520617265206e6f74206f6e2074686520416c6c6f77204c6973740000006000830152602082019050919050565b6000614689601d8361570d565b91507f53616c65206973206e6f74206163746976652063757272656e746c792e0000006000830152602082019050919050565b60006146c9602b8361570d565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061472f60328361570d565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061479560268361570d565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006147fb601c8361570d565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600061483b60138361570d565b91507f4d696e7420436c6f73656420466f7265766572000000000000000000000000006000830152602082019050919050565b600061487b60188361570d565b91507f4d617820686f6c64696e672063617020726561636865642e00000000000000006000830152602082019050919050565b60006148bb600f8361570d565b91507f53616c652068617320656e6465642e00000000000000000000000000000000006000830152602082019050919050565b60006148fb60248361570d565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061496160198361570d565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006149a1602c8361570d565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614a0760388361570d565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614a6d602a8361570d565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614ad360298361570d565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614b3960208361570d565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614b79602c8361570d565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bdf60188361570d565b91507f43616e2774206164642061206e756c6c206164647265737300000000000000006000830152602082019050919050565b6000614c1f60208361570d565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614c5f601e8361570d565b91507f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c69737400006000830152602082019050919050565b6000614c9f60298361570d565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d05602f8361570d565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614d6b601e8361570d565b91507f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e7300006000830152602082019050919050565b6000614dab60218361570d565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e1160168361570d565b91507f546f74616c20737570706c792065786365656465642e000000000000000000006000830152602082019050919050565b6000614e5160318361570d565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614eb7602c8361570d565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614f1d601b8361570d565b91507f5072652053616c65204d696e74206973206e6f742061637469766500000000006000830152602082019050919050565b6000614f5d60138361570d565b91507f546f74616c20737570706c79207370656e742e000000000000000000000000006000830152602082019050919050565b6000614f9d601c8361570d565b91507f50757263686173652065786365656473206d617820616c6c6f776564000000006000830152602082019050919050565b6000614fdd601b8361570d565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b600061501d601d8361570d565b91507f496e73756666696369656e742045544820616d6f756e742073656e742e0000006000830152602082019050919050565b600061505d60208361570d565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736000830152602082019050919050565b615099816158a8565b82525050565b6150a8816158a8565b82525050565b60006150ba82856145cb565b91506150c682846145cb565b91508190509392505050565b60006020820190506150e760008301846144dd565b92915050565b600060808201905061510260008301876144dd565b61510f60208301866144dd565b61511c604083018561509f565b818103606083015261512e8184614559565b905095945050505050565b6000602082019050818103600083015261515381846144ec565b905092915050565b6000602082019050615170600083018461454a565b92915050565b600060208201905081810360008301526151908184614592565b905092915050565b600060208201905081810360008301526151b1816145fc565b9050919050565b600060208201905081810360008301526151d18161463c565b9050919050565b600060208201905081810360008301526151f18161467c565b9050919050565b60006020820190508181036000830152615211816146bc565b9050919050565b6000602082019050818103600083015261523181614722565b9050919050565b6000602082019050818103600083015261525181614788565b9050919050565b60006020820190508181036000830152615271816147ee565b9050919050565b600060208201905081810360008301526152918161482e565b9050919050565b600060208201905081810360008301526152b18161486e565b9050919050565b600060208201905081810360008301526152d1816148ae565b9050919050565b600060208201905081810360008301526152f1816148ee565b9050919050565b6000602082019050818103600083015261531181614954565b9050919050565b6000602082019050818103600083015261533181614994565b9050919050565b60006020820190508181036000830152615351816149fa565b9050919050565b6000602082019050818103600083015261537181614a60565b9050919050565b6000602082019050818103600083015261539181614ac6565b9050919050565b600060208201905081810360008301526153b181614b2c565b9050919050565b600060208201905081810360008301526153d181614b6c565b9050919050565b600060208201905081810360008301526153f181614bd2565b9050919050565b6000602082019050818103600083015261541181614c12565b9050919050565b6000602082019050818103600083015261543181614c52565b9050919050565b6000602082019050818103600083015261545181614c92565b9050919050565b6000602082019050818103600083015261547181614cf8565b9050919050565b6000602082019050818103600083015261549181614d5e565b9050919050565b600060208201905081810360008301526154b181614d9e565b9050919050565b600060208201905081810360008301526154d181614e04565b9050919050565b600060208201905081810360008301526154f181614e44565b9050919050565b6000602082019050818103600083015261551181614eaa565b9050919050565b6000602082019050818103600083015261553181614f10565b9050919050565b6000602082019050818103600083015261555181614f50565b9050919050565b6000602082019050818103600083015261557181614f90565b9050919050565b6000602082019050818103600083015261559181614fd0565b9050919050565b600060208201905081810360008301526155b181615010565b9050919050565b600060208201905081810360008301526155d181615050565b9050919050565b60006020820190506155ed600083018461509f565b92915050565b6000604082019050615608600083018561509f565b61561560208301846144dd565b9392505050565b6000604051905081810181811067ffffffffffffffff8211171561564357615642615a2d565b5b8060405250919050565b600067ffffffffffffffff82111561566857615667615a2d565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561569857615697615a2d565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000615734826158a8565b915061573f836158a8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115615774576157736159a0565b5b828201905092915050565b600061578a826158a8565b9150615795836158a8565b9250826157a5576157a46159cf565b5b828204905092915050565b60006157bb826158a8565b91506157c6836158a8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156157ff576157fe6159a0565b5b828202905092915050565b6000615815826158a8565b9150615820836158a8565b925082821015615833576158326159a0565b5b828203905092915050565b600061584982615888565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156158df5780820151818401526020810190506158c4565b838111156158ee576000848401525b50505050565b6000600282049050600182168061590c57607f821691505b602082108114156159205761591f6159fe565b5b50919050565b6000615931826158a8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615964576159636159a0565b5b600182019050919050565b600061597a826158a8565b9150615985836158a8565b925082615995576159946159cf565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615a768161583e565b8114615a8157600080fd5b50565b615a8d81615850565b8114615a9857600080fd5b50565b615aa48161585c565b8114615aaf57600080fd5b50565b615abb816158a8565b8114615ac657600080fd5b5056fea264697066735822122042fcc47b80b0db253d3006bd0c230a8f04e8134cf58b8198643415823717f06c64736f6c63430008000033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005768747470733a2f2f726963686a61677561727a2e6d7970696e6174612e636c6f75642f697066732f516d6477523361427656794c744b6d7437625775716d7641676b544e3278557670744863526771456b713350726d2f000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://richjaguarz.mypinata.cloud/ipfs/QmdwR3aBvVyLtKmt7bWuqmvAgkTN2xUvptHcRgqEkq3Prm/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000057
Arg [2] : 68747470733a2f2f726963686a61677561727a2e6d7970696e6174612e636c6f
Arg [3] : 75642f697066732f516d6477523361427656794c744b6d7437625775716d7641
Arg [4] : 676b544e3278557670744863526771456b713350726d2f000000000000000000


Deployed Bytecode Sourcemap

84:6971:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2703:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;989:222:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1614:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3605:97:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4646:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2332:105:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1290:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3175:103:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6849:204;;;;;;;;;;;;;:::i;:::-;;1743:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4894:842;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5042:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6539:306:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4099:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;494:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1244:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1797:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3282:99:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2988:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;371:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2111:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;138:37:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1849:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:11;;;;;;;;;;;;;:::i;:::-;;4296:340:12;;;;;;;;;;;;;:::i;:::-;;1995:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1621:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4640:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5740:795;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1883:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;450:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;643:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3810:95:12;;;;;;;;;;;;;:::i;:::-;;2570:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;537:50:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;407:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4203:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2441:258:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3518:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3385:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5287:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4006:89:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2738:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;591:48:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3909:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4422:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1370:129:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;179:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1503:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3706:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3082:89:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2891:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2703:184;2769:7;2808:1;2791:19;;:5;:19;;;;2783:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2858:17;:24;2876:5;2858:24;;;;;;;;;;;;;;;;2851:31;;2703:184;;;:::o;989:222:5:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;2408:98:4:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3457:401;;;:::o;1614:111:5:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;3605:97:12:-;3659:7;3681:16;;3674:23;;3605:97;:::o;4646:330:4:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;:::-;4646:330;;;:::o;2332:105:12:-;2397:4;2416:10;:16;2427:4;2416:16;;;;;;;;;;;;;;;;;;;;;;;;;2409:23;;2332:105;;;:::o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;3175:103:12:-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;3267:6:::1;3248:16;:25;;;;3175:103:::0;:::o;6849:204::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;6899:12:::1;6914:21;6899:36;;6949:12;;;;;;;;;;;6941:30;;:55;6990:5;6982::::0;6972:7:::1;:15;;;;:::i;:::-;:23;;;;:::i;:::-;6941:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7010:7;:5;:7::i;:::-;7002:25;;:46;7042:5;7038:1;7028:7;:11;;;;:::i;:::-;:19;;;;:::i;:::-;7002:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;1234:1;6849:204::o:0;1743:136::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;1854:20:::1;1832:19;;:42;;;;;;;;;;;;;;;;;;1743:136:::0;:::o;4894:842::-;1113:17;;1096:13;:11;:13::i;:::-;:34;;1088:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4987:7:::1;:5;:7::i;:::-;4973:21;;:10;:21;;;4969:96;;5012:12;;;;;;;;;;;5004:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;4969:96;5081:7;:5;:7::i;:::-;5074:14;;:3;:14;;;5071:127;;5133:29;;5123:6;5106:14;5116:3;5106:9;:14::i;:::-;:23;;;;:::i;:::-;:56;;5098:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;5071:127;5238:17;;5228:6;5212:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:43;;5204:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;5313:17;;5296:13;:11;:13::i;:::-;:34;;5288:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5385:31;;5375:6;:41;;5360:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;5477:19;;;;;;;;;;;5476:20;5468:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;5560:6;5548:9;;:18;;;;:::i;:::-;5535:9;:31;;5527:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5612:9;5607:125;5631:6;5627:1;:10;5607:125;;;5657:31;5669:13;:11;:13::i;:::-;5684:3;5657:31;;;;;;;:::i;:::-;;;;;;;;5696:29;5706:3;5711:13;:11;:13::i;:::-;5696:9;:29::i;:::-;5639:3;;;;;:::i;:::-;;;;5607:125;;;;4894:842:::0;;:::o;5042:179:4:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;:::-;5042:179;;;:::o;6539:306:12:-;6600:16;6624:15;6642:17;6652:6;6642:9;:17::i;:::-;6624:35;;6665:25;6707:10;6693:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6665:53;;6729:6;6725:95;6745:10;6741:1;:14;6725:95;;;6783:30;6803:6;6811:1;6783:19;:30::i;:::-;6769:8;6778:1;6769:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;6757:3;;;;;:::i;:::-;;;;6725:95;;;;6832:8;6825:15;;;;6539:306;;;:::o;4099:83::-;4148:7;4170;:5;:7::i;:::-;4163:14;;4099:83;:::o;494:39::-;;;;:::o;1244:122::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;1355:6:::1;1321:31;:40;;;;1244:122:::0;:::o;1797:230:5:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;;;;;;;;;;;;;;;;;1996:24;;1797:230;;;:::o;3282:99:12:-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;3369:7:::1;3353:13;:23;;;;;;;;;;;;:::i;:::-;;3282:99:::0;:::o;2988:90::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;3070:3:::1;3052:15;:21;;;;2988:90:::0;:::o;371:32::-;;;;;;;;;;;;;:::o;2111:235:4:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;138:37:12:-;;;;:::o;1849:205:4:-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;1661:101:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4296:340:12:-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;4371:15:::1;;4354:13;;:32;;4346:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4424:14;4441:13;:11;:13::i;:::-;4424:30;;4460:9;4476:156;4492:14;;4488:1;:18;4476:156;;;4526:35;4547:1;4538:6;:10;;;;:::i;:::-;4550;4526:35;;;;;;;:::i;:::-;;;;;;;;4569:33;4579:10;4600:1;4591:6;:10;;;;:::i;:::-;4569:9;:33::i;:::-;4610:13;;:15;;;;;;;;;:::i;:::-;;;;;;4508:3;;;;;:::i;:::-;;;;4476:156;;;1234:1;;4296:340::o:0;1995:333::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;2084:9:::1;2079:245;2103:9;;:16;;2099:1;:20;2079:245;;;2166:1;2142:26;;:9;;2152:1;2142:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;;;2134:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2232:4;2205:10;:24;2216:9;;2226:1;2216:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2205:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2278:1;2244:17;:31;2262:9;;2272:1;2262:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2244:31;;;;;;;;;;;;;;;;:35;:73;;2316:1;2244:73;;;2282:17;:31;2300:9;;2310:1;2300:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2282:31;;;;;;;;;;;;;;;;2244:73;;2121:3;;;;;:::i;:::-;;;;2079:245;;;;1995:333:::0;;:::o;1621:118::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;1721:13:::1;1701:17;:33;;;;1621:118:::0;:::o;4640:250::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;4744:9:::1;4739:147;4763:6;4759:1;:10;4739:147;;;4789:42;4801:13;:11;:13::i;:::-;4816:14;4789:42;;;;;;;:::i;:::-;;;;;;;;4839:40;4849:14;4865:13;:11;:13::i;:::-;4839:9;:40::i;:::-;4771:3;;;;;:::i;:::-;;;;4739:147;;;;4640:250:::0;;:::o;5740:795::-;1113:17;;1096:13;:11;:13::i;:::-;:34;;1088:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;5817:19:::1;;;;;;;;;;;5809:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;5882:10;:22;5893:10;5882:22;;;;;;;;;;;;;;;;;;;;;;;;;5874:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5968:17;;5952:13;:11;:13::i;:::-;:33;5944:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6041:16;;6031:6;:26;;6023:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6150:16;;6140:6;6108:17;:29;6126:10;6108:29;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:58;;6100:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;6245:6;6226:16;;:25;;;;:::i;:::-;6213:9;:38;;6205:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;6300:19;;;;;;;;;;;6299:20;6291:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6355:9;6350:181;6374:6;6370:1;:10;6350:181;;;6428:1;6395:17;:29;6413:10;6395:29;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;6442:38;6454:13;:11;:13::i;:::-;6469:10;6442:38;;;;;;;:::i;:::-;;;;;;;;6488:36;6498:10;6510:13;:11;:13::i;:::-;6488:9;:36::i;:::-;6382:3;;;;;:::i;:::-;;;;6350:181;;;;5740:795:::0;:::o;1883:108::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;1979:7:::1;1960:16;:26;;;;1883:108:::0;:::o;450:39::-;;;;;;;;;;;;;:::o;643:35::-;;;;:::o;1029:85:11:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;3810:95:12:-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;3896:4:::1;3874:19;;:26;;;;;;;;;;;;;;;;;;3810:95::o:0;2570:102:4:-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;537:50:12:-;;;;:::o;407:39::-;;;;;;;;;;;;;:::o;4203:153:4:-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;2441:258:12:-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;2535:9:::1;2530:165;2554:9;;:16;;2550:1;:20;2530:165;;;2617:1;2593:26;;:9;;2603:1;2593:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;;;2585:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2683:5;2656:10;:24;2667:9;;2677:1;2667:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2656:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;2572:3;;;;;:::i;:::-;;;;2530:165;;;;2441:258:::0;;:::o;3518:83::-;3565:7;3587:9;;3580:16;;3518:83;:::o;3385:129::-;3456:7;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;3478:31:::1;;3471:38;;3385:129:::0;:::o;5287:320:4:-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;4006:89:12:-;4055:7;4077:13;:11;:13::i;:::-;4070:20;;4006:89;:::o;2738:329:4:-;2811:13;2844:16;2852:7;2844;:16::i;:::-;2836:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;;;2738:329;;;:::o;591:48:12:-;;;;:::o;3909:93::-;3961:7;3983:14;;3976:21;;3909:93;:::o;4422:162:4:-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;1370:129:12:-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;1488:6:::1;1456:29;:38;;;;1370:129:::0;:::o;179:44::-;;;;:::o;1503:114::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;1579:3:::1;1564:12;;:18;;;;;;;;;;;;;;;;;;1593:19;1608:3;1593:19;;;;;;:::i;:::-;;;;;;;;1503:114:::0;:::o;3706:100::-;3763:4;3782:19;;;;;;;;;;;3775:26;;3706:100;:::o;1911:198:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;3082:89:12:-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;3160:6:::1;3148:9;:18;;;;3082:89:::0;:::o;2891:93::-;1217:10;1206:21;;:7;:5;:7::i;:::-;:21;;;1198:30;;;;;;2976:3:::1;2959:14;:20;;;;2891:93:::0;:::o;1490:300:4:-;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;7079:125::-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10930:171:4:-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;8036:108::-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;:::-;8036:108;;:::o;2263:187:11:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2263:187;;:::o;11236:307:4:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;4186:106:12:-;4246:13;4274;4267:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4186:106;:::o;328:703:13:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2623:572:5:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;8365:311:4:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8365:311;;;:::o;12096:778::-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;13430:122::-;;;;:::o;3901:161:5:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5149:323;;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4679:970;;;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;;;;;;;;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5937:1061;;;;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3489:217;;;:::o;8998:372:4:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:14:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;867:367::-;;;1000:3;993:4;985:6;981:17;977:27;967:2;;1018:1;1015;1008:12;967:2;1054:6;1041:20;1031:30;;1084:18;1076:6;1073:30;1070:2;;;1116:1;1113;1106:12;1070:2;1153:4;1145:6;1141:17;1129:29;;1207:3;1199:4;1191:6;1187:17;1177:8;1173:32;1170:41;1167:2;;;1224:1;1221;1214:12;1167:2;957:277;;;;;:::o;1240:133::-;;1321:6;1308:20;1299:29;;1337:30;1361:5;1337:30;:::i;:::-;1289:84;;;;:::o;1379:137::-;;1462:6;1449:20;1440:29;;1478:32;1504:5;1478:32;:::i;:::-;1430:86;;;;:::o;1522:141::-;;1609:6;1603:13;1594:22;;1625:32;1651:5;1625:32;:::i;:::-;1584:79;;;;:::o;1682:271::-;;1786:3;1779:4;1771:6;1767:17;1763:27;1753:2;;1804:1;1801;1794:12;1753:2;1844:6;1831:20;1869:78;1943:3;1935:6;1928:4;1920:6;1916:17;1869:78;:::i;:::-;1860:87;;1743:210;;;;;:::o;1973:273::-;;2078:3;2071:4;2063:6;2059:17;2055:27;2045:2;;2096:1;2093;2086:12;2045:2;2136:6;2123:20;2161:79;2236:3;2228:6;2221:4;2213:6;2209:17;2161:79;:::i;:::-;2152:88;;2035:211;;;;;:::o;2252:139::-;;2336:6;2323:20;2314:29;;2352:33;2379:5;2352:33;:::i;:::-;2304:87;;;;:::o;2397:262::-;;2505:2;2493:9;2484:7;2480:23;2476:32;2473:2;;;2521:1;2518;2511:12;2473:2;2564:1;2589:53;2634:7;2625:6;2614:9;2610:22;2589:53;:::i;:::-;2579:63;;2535:117;2463:196;;;;:::o;2665:407::-;;;2790:2;2778:9;2769:7;2765:23;2761:32;2758:2;;;2806:1;2803;2796:12;2758:2;2849:1;2874:53;2919:7;2910:6;2899:9;2895:22;2874:53;:::i;:::-;2864:63;;2820:117;2976:2;3002:53;3047:7;3038:6;3027:9;3023:22;3002:53;:::i;:::-;2992:63;;2947:118;2748:324;;;;;:::o;3078:552::-;;;;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3236:1;3233;3226:12;3188:2;3279:1;3304:53;3349:7;3340:6;3329:9;3325:22;3304:53;:::i;:::-;3294:63;;3250:117;3406:2;3432:53;3477:7;3468:6;3457:9;3453:22;3432:53;:::i;:::-;3422:63;;3377:118;3534:2;3560:53;3605:7;3596:6;3585:9;3581:22;3560:53;:::i;:::-;3550:63;;3505:118;3178:452;;;;;:::o;3636:809::-;;;;;3804:3;3792:9;3783:7;3779:23;3775:33;3772:2;;;3821:1;3818;3811:12;3772:2;3864:1;3889:53;3934:7;3925:6;3914:9;3910:22;3889:53;:::i;:::-;3879:63;;3835:117;3991:2;4017:53;4062:7;4053:6;4042:9;4038:22;4017:53;:::i;:::-;4007:63;;3962:118;4119:2;4145:53;4190:7;4181:6;4170:9;4166:22;4145:53;:::i;:::-;4135:63;;4090:118;4275:2;4264:9;4260:18;4247:32;4306:18;4298:6;4295:30;4292:2;;;4338:1;4335;4328:12;4292:2;4366:62;4420:7;4411:6;4400:9;4396:22;4366:62;:::i;:::-;4356:72;;4218:220;3762:683;;;;;;;:::o;4451:401::-;;;4573:2;4561:9;4552:7;4548:23;4544:32;4541:2;;;4589:1;4586;4579:12;4541:2;4632:1;4657:53;4702:7;4693:6;4682:9;4678:22;4657:53;:::i;:::-;4647:63;;4603:117;4759:2;4785:50;4827:7;4818:6;4807:9;4803:22;4785:50;:::i;:::-;4775:60;;4730:115;4531:321;;;;;:::o;4858:407::-;;;4983:2;4971:9;4962:7;4958:23;4954:32;4951:2;;;4999:1;4996;4989:12;4951:2;5042:1;5067:53;5112:7;5103:6;5092:9;5088:22;5067:53;:::i;:::-;5057:63;;5013:117;5169:2;5195:53;5240:7;5231:6;5220:9;5216:22;5195:53;:::i;:::-;5185:63;;5140:118;4941:324;;;;;:::o;5271:425::-;;;5414:2;5402:9;5393:7;5389:23;5385:32;5382:2;;;5430:1;5427;5420:12;5382:2;5501:1;5490:9;5486:17;5473:31;5531:18;5523:6;5520:30;5517:2;;;5563:1;5560;5553:12;5517:2;5599:80;5671:7;5662:6;5651:9;5647:22;5599:80;:::i;:::-;5581:98;;;;5444:245;5372:324;;;;;:::o;5702:256::-;;5807:2;5795:9;5786:7;5782:23;5778:32;5775:2;;;5823:1;5820;5813:12;5775:2;5866:1;5891:50;5933:7;5924:6;5913:9;5909:22;5891:50;:::i;:::-;5881:60;;5837:114;5765:193;;;;:::o;5964:260::-;;6071:2;6059:9;6050:7;6046:23;6042:32;6039:2;;;6087:1;6084;6077:12;6039:2;6130:1;6155:52;6199:7;6190:6;6179:9;6175:22;6155:52;:::i;:::-;6145:62;;6101:116;6029:195;;;;:::o;6230:282::-;;6348:2;6336:9;6327:7;6323:23;6319:32;6316:2;;;6364:1;6361;6354:12;6316:2;6407:1;6432:63;6487:7;6478:6;6467:9;6463:22;6432:63;:::i;:::-;6422:73;;6378:127;6306:206;;;;:::o;6518:375::-;;6636:2;6624:9;6615:7;6611:23;6607:32;6604:2;;;6652:1;6649;6642:12;6604:2;6723:1;6712:9;6708:17;6695:31;6753:18;6745:6;6742:30;6739:2;;;6785:1;6782;6775:12;6739:2;6813:63;6868:7;6859:6;6848:9;6844:22;6813:63;:::i;:::-;6803:73;;6666:220;6594:299;;;;:::o;6899:262::-;;7007:2;6995:9;6986:7;6982:23;6978:32;6975:2;;;7023:1;7020;7013:12;6975:2;7066:1;7091:53;7136:7;7127:6;7116:9;7112:22;7091:53;:::i;:::-;7081:63;;7037:117;6965:196;;;;:::o;7167:179::-;;7257:46;7299:3;7291:6;7257:46;:::i;:::-;7335:4;7330:3;7326:14;7312:28;;7247:99;;;;:::o;7352:118::-;7439:24;7457:5;7439:24;:::i;:::-;7434:3;7427:37;7417:53;;:::o;7506:732::-;;7654:54;7702:5;7654:54;:::i;:::-;7724:86;7803:6;7798:3;7724:86;:::i;:::-;7717:93;;7834:56;7884:5;7834:56;:::i;:::-;7913:7;7944:1;7929:284;7954:6;7951:1;7948:13;7929:284;;;8030:6;8024:13;8057:63;8116:3;8101:13;8057:63;:::i;:::-;8050:70;;8143:60;8196:6;8143:60;:::i;:::-;8133:70;;7989:224;7976:1;7973;7969:9;7964:14;;7929:284;;;7933:14;8229:3;8222:10;;7630:608;;;;;;;:::o;8244:109::-;8325:21;8340:5;8325:21;:::i;:::-;8320:3;8313:34;8303:50;;:::o;8359:360::-;;8473:38;8505:5;8473:38;:::i;:::-;8527:70;8590:6;8585:3;8527:70;:::i;:::-;8520:77;;8606:52;8651:6;8646:3;8639:4;8632:5;8628:16;8606:52;:::i;:::-;8683:29;8705:6;8683:29;:::i;:::-;8678:3;8674:39;8667:46;;8449:270;;;;;:::o;8725:364::-;;8841:39;8874:5;8841:39;:::i;:::-;8896:71;8960:6;8955:3;8896:71;:::i;:::-;8889:78;;8976:52;9021:6;9016:3;9009:4;9002:5;8998:16;8976:52;:::i;:::-;9053:29;9075:6;9053:29;:::i;:::-;9048:3;9044:39;9037:46;;8817:272;;;;;:::o;9095:377::-;;9229:39;9262:5;9229:39;:::i;:::-;9284:89;9366:6;9361:3;9284:89;:::i;:::-;9277:96;;9382:52;9427:6;9422:3;9415:4;9408:5;9404:16;9382:52;:::i;:::-;9459:6;9454:3;9450:16;9443:23;;9205:267;;;;;:::o;9478:325::-;;9641:67;9705:2;9700:3;9641:67;:::i;:::-;9634:74;;9738:29;9734:1;9729:3;9725:11;9718:50;9794:2;9789:3;9785:12;9778:19;;9624:179;;;:::o;9809:327::-;;9972:67;10036:2;10031:3;9972:67;:::i;:::-;9965:74;;10069:31;10065:1;10060:3;10056:11;10049:52;10127:2;10122:3;10118:12;10111:19;;9955:181;;;:::o;10142:327::-;;10305:67;10369:2;10364:3;10305:67;:::i;:::-;10298:74;;10402:31;10398:1;10393:3;10389:11;10382:52;10460:2;10455:3;10451:12;10444:19;;10288:181;;;:::o;10475:375::-;;10638:67;10702:2;10697:3;10638:67;:::i;:::-;10631:74;;10735:34;10731:1;10726:3;10722:11;10715:55;10801:13;10796:2;10791:3;10787:12;10780:35;10841:2;10836:3;10832:12;10825:19;;10621:229;;;:::o;10856:382::-;;11019:67;11083:2;11078:3;11019:67;:::i;:::-;11012:74;;11116:34;11112:1;11107:3;11103:11;11096:55;11182:20;11177:2;11172:3;11168:12;11161:42;11229:2;11224:3;11220:12;11213:19;;11002:236;;;:::o;11244:370::-;;11407:67;11471:2;11466:3;11407:67;:::i;:::-;11400:74;;11504:34;11500:1;11495:3;11491:11;11484:55;11570:8;11565:2;11560:3;11556:12;11549:30;11605:2;11600:3;11596:12;11589:19;;11390:224;;;:::o;11620:326::-;;11783:67;11847:2;11842:3;11783:67;:::i;:::-;11776:74;;11880:30;11876:1;11871:3;11867:11;11860:51;11937:2;11932:3;11928:12;11921:19;;11766:180;;;:::o;11952:317::-;;12115:67;12179:2;12174:3;12115:67;:::i;:::-;12108:74;;12212:21;12208:1;12203:3;12199:11;12192:42;12260:2;12255:3;12251:12;12244:19;;12098:171;;;:::o;12275:322::-;;12438:67;12502:2;12497:3;12438:67;:::i;:::-;12431:74;;12535:26;12531:1;12526:3;12522:11;12515:47;12588:2;12583:3;12579:12;12572:19;;12421:176;;;:::o;12603:313::-;;12766:67;12830:2;12825:3;12766:67;:::i;:::-;12759:74;;12863:17;12859:1;12854:3;12850:11;12843:38;12907:2;12902:3;12898:12;12891:19;;12749:167;;;:::o;12922:368::-;;13085:67;13149:2;13144:3;13085:67;:::i;:::-;13078:74;;13182:34;13178:1;13173:3;13169:11;13162:55;13248:6;13243:2;13238:3;13234:12;13227:28;13281:2;13276:3;13272:12;13265:19;;13068:222;;;:::o;13296:323::-;;13459:67;13523:2;13518:3;13459:67;:::i;:::-;13452:74;;13556:27;13552:1;13547:3;13543:11;13536:48;13610:2;13605:3;13601:12;13594:19;;13442:177;;;:::o;13625:376::-;;13788:67;13852:2;13847:3;13788:67;:::i;:::-;13781:74;;13885:34;13881:1;13876:3;13872:11;13865:55;13951:14;13946:2;13941:3;13937:12;13930:36;13992:2;13987:3;13983:12;13976:19;;13771:230;;;:::o;14007:388::-;;14170:67;14234:2;14229:3;14170:67;:::i;:::-;14163:74;;14267:34;14263:1;14258:3;14254:11;14247:55;14333:26;14328:2;14323:3;14319:12;14312:48;14386:2;14381:3;14377:12;14370:19;;14153:242;;;:::o;14401:374::-;;14564:67;14628:2;14623:3;14564:67;:::i;:::-;14557:74;;14661:34;14657:1;14652:3;14648:11;14641:55;14727:12;14722:2;14717:3;14713:12;14706:34;14766:2;14761:3;14757:12;14750:19;;14547:228;;;:::o;14781:373::-;;14944:67;15008:2;15003:3;14944:67;:::i;:::-;14937:74;;15041:34;15037:1;15032:3;15028:11;15021:55;15107:11;15102:2;15097:3;15093:12;15086:33;15145:2;15140:3;15136:12;15129:19;;14927:227;;;:::o;15160:330::-;;15323:67;15387:2;15382:3;15323:67;:::i;:::-;15316:74;;15420:34;15416:1;15411:3;15407:11;15400:55;15481:2;15476:3;15472:12;15465:19;;15306:184;;;:::o;15496:376::-;;15659:67;15723:2;15718:3;15659:67;:::i;:::-;15652:74;;15756:34;15752:1;15747:3;15743:11;15736:55;15822:14;15817:2;15812:3;15808:12;15801:36;15863:2;15858:3;15854:12;15847:19;;15642:230;;;:::o;15878:322::-;;16041:67;16105:2;16100:3;16041:67;:::i;:::-;16034:74;;16138:26;16134:1;16129:3;16125:11;16118:47;16191:2;16186:3;16182:12;16175:19;;16024:176;;;:::o;16206:330::-;;16369:67;16433:2;16428:3;16369:67;:::i;:::-;16362:74;;16466:34;16462:1;16457:3;16453:11;16446:55;16527:2;16522:3;16518:12;16511:19;;16352:184;;;:::o;16542:328::-;;16705:67;16769:2;16764:3;16705:67;:::i;:::-;16698:74;;16802:32;16798:1;16793:3;16789:11;16782:53;16861:2;16856:3;16852:12;16845:19;;16688:182;;;:::o;16876:373::-;;17039:67;17103:2;17098:3;17039:67;:::i;:::-;17032:74;;17136:34;17132:1;17127:3;17123:11;17116:55;17202:11;17197:2;17192:3;17188:12;17181:33;17240:2;17235:3;17231:12;17224:19;;17022:227;;;:::o;17255:379::-;;17418:67;17482:2;17477:3;17418:67;:::i;:::-;17411:74;;17515:34;17511:1;17506:3;17502:11;17495:55;17581:17;17576:2;17571:3;17567:12;17560:39;17625:2;17620:3;17616:12;17609:19;;17401:233;;;:::o;17640:328::-;;17803:67;17867:2;17862:3;17803:67;:::i;:::-;17796:74;;17900:32;17896:1;17891:3;17887:11;17880:53;17959:2;17954:3;17950:12;17943:19;;17786:182;;;:::o;17974:365::-;;18137:67;18201:2;18196:3;18137:67;:::i;:::-;18130:74;;18234:34;18230:1;18225:3;18221:11;18214:55;18300:3;18295:2;18290:3;18286:12;18279:25;18330:2;18325:3;18321:12;18314:19;;18120:219;;;:::o;18345:320::-;;18508:67;18572:2;18567:3;18508:67;:::i;:::-;18501:74;;18605:24;18601:1;18596:3;18592:11;18585:45;18656:2;18651:3;18647:12;18640:19;;18491:174;;;:::o;18671:381::-;;18834:67;18898:2;18893:3;18834:67;:::i;:::-;18827:74;;18931:34;18927:1;18922:3;18918:11;18911:55;18997:19;18992:2;18987:3;18983:12;18976:41;19043:2;19038:3;19034:12;19027:19;;18817:235;;;:::o;19058:376::-;;19221:67;19285:2;19280:3;19221:67;:::i;:::-;19214:74;;19318:34;19314:1;19309:3;19305:11;19298:55;19384:14;19379:2;19374:3;19370:12;19363:36;19425:2;19420:3;19416:12;19409:19;;19204:230;;;:::o;19440:325::-;;19603:67;19667:2;19662:3;19603:67;:::i;:::-;19596:74;;19700:29;19696:1;19691:3;19687:11;19680:50;19756:2;19751:3;19747:12;19740:19;;19586:179;;;:::o;19771:317::-;;19934:67;19998:2;19993:3;19934:67;:::i;:::-;19927:74;;20031:21;20027:1;20022:3;20018:11;20011:42;20079:2;20074:3;20070:12;20063:19;;19917:171;;;:::o;20094:326::-;;20257:67;20321:2;20316:3;20257:67;:::i;:::-;20250:74;;20354:30;20350:1;20345:3;20341:11;20334:51;20411:2;20406:3;20402:12;20395:19;;20240:180;;;:::o;20426:325::-;;20589:67;20653:2;20648:3;20589:67;:::i;:::-;20582:74;;20686:29;20682:1;20677:3;20673:11;20666:50;20742:2;20737:3;20733:12;20726:19;;20572:179;;;:::o;20757:327::-;;20920:67;20984:2;20979:3;20920:67;:::i;:::-;20913:74;;21017:31;21013:1;21008:3;21004:11;20997:52;21075:2;21070:3;21066:12;21059:19;;20903:181;;;:::o;21090:330::-;;21253:67;21317:2;21312:3;21253:67;:::i;:::-;21246:74;;21350:34;21346:1;21341:3;21337:11;21330:55;21411:2;21406:3;21402:12;21395:19;;21236:184;;;:::o;21426:108::-;21503:24;21521:5;21503:24;:::i;:::-;21498:3;21491:37;21481:53;;:::o;21540:118::-;21627:24;21645:5;21627:24;:::i;:::-;21622:3;21615:37;21605:53;;:::o;21664:435::-;;21866:95;21957:3;21948:6;21866:95;:::i;:::-;21859:102;;21978:95;22069:3;22060:6;21978:95;:::i;:::-;21971:102;;22090:3;22083:10;;21848:251;;;;;:::o;22105:222::-;;22236:2;22225:9;22221:18;22213:26;;22249:71;22317:1;22306:9;22302:17;22293:6;22249:71;:::i;:::-;22203:124;;;;:::o;22333:640::-;;22566:3;22555:9;22551:19;22543:27;;22580:71;22648:1;22637:9;22633:17;22624:6;22580:71;:::i;:::-;22661:72;22729:2;22718:9;22714:18;22705:6;22661:72;:::i;:::-;22743;22811:2;22800:9;22796:18;22787:6;22743:72;:::i;:::-;22862:9;22856:4;22852:20;22847:2;22836:9;22832:18;22825:48;22890:76;22961:4;22952:6;22890:76;:::i;:::-;22882:84;;22533:440;;;;;;;:::o;22979:373::-;;23160:2;23149:9;23145:18;23137:26;;23209:9;23203:4;23199:20;23195:1;23184:9;23180:17;23173:47;23237:108;23340:4;23331:6;23237:108;:::i;:::-;23229:116;;23127:225;;;;:::o;23358:210::-;;23483:2;23472:9;23468:18;23460:26;;23496:65;23558:1;23547:9;23543:17;23534:6;23496:65;:::i;:::-;23450:118;;;;:::o;23574:313::-;;23725:2;23714:9;23710:18;23702:26;;23774:9;23768:4;23764:20;23760:1;23749:9;23745:17;23738:47;23802:78;23875:4;23866:6;23802:78;:::i;:::-;23794:86;;23692:195;;;;:::o;23893:419::-;;24097:2;24086:9;24082:18;24074:26;;24146:9;24140:4;24136:20;24132:1;24121:9;24117:17;24110:47;24174:131;24300:4;24174:131;:::i;:::-;24166:139;;24064:248;;;:::o;24318:419::-;;24522:2;24511:9;24507:18;24499:26;;24571:9;24565:4;24561:20;24557:1;24546:9;24542:17;24535:47;24599:131;24725:4;24599:131;:::i;:::-;24591:139;;24489:248;;;:::o;24743:419::-;;24947:2;24936:9;24932:18;24924:26;;24996:9;24990:4;24986:20;24982:1;24971:9;24967:17;24960:47;25024:131;25150:4;25024:131;:::i;:::-;25016:139;;24914:248;;;:::o;25168:419::-;;25372:2;25361:9;25357:18;25349:26;;25421:9;25415:4;25411:20;25407:1;25396:9;25392:17;25385:47;25449:131;25575:4;25449:131;:::i;:::-;25441:139;;25339:248;;;:::o;25593:419::-;;25797:2;25786:9;25782:18;25774:26;;25846:9;25840:4;25836:20;25832:1;25821:9;25817:17;25810:47;25874:131;26000:4;25874:131;:::i;:::-;25866:139;;25764:248;;;:::o;26018:419::-;;26222:2;26211:9;26207:18;26199:26;;26271:9;26265:4;26261:20;26257:1;26246:9;26242:17;26235:47;26299:131;26425:4;26299:131;:::i;:::-;26291:139;;26189:248;;;:::o;26443:419::-;;26647:2;26636:9;26632:18;26624:26;;26696:9;26690:4;26686:20;26682:1;26671:9;26667:17;26660:47;26724:131;26850:4;26724:131;:::i;:::-;26716:139;;26614:248;;;:::o;26868:419::-;;27072:2;27061:9;27057:18;27049:26;;27121:9;27115:4;27111:20;27107:1;27096:9;27092:17;27085:47;27149:131;27275:4;27149:131;:::i;:::-;27141:139;;27039:248;;;:::o;27293:419::-;;27497:2;27486:9;27482:18;27474:26;;27546:9;27540:4;27536:20;27532:1;27521:9;27517:17;27510:47;27574:131;27700:4;27574:131;:::i;:::-;27566:139;;27464:248;;;:::o;27718:419::-;;27922:2;27911:9;27907:18;27899:26;;27971:9;27965:4;27961:20;27957:1;27946:9;27942:17;27935:47;27999:131;28125:4;27999:131;:::i;:::-;27991:139;;27889:248;;;:::o;28143:419::-;;28347:2;28336:9;28332:18;28324:26;;28396:9;28390:4;28386:20;28382:1;28371:9;28367:17;28360:47;28424:131;28550:4;28424:131;:::i;:::-;28416:139;;28314:248;;;:::o;28568:419::-;;28772:2;28761:9;28757:18;28749:26;;28821:9;28815:4;28811:20;28807:1;28796:9;28792:17;28785:47;28849:131;28975:4;28849:131;:::i;:::-;28841:139;;28739:248;;;:::o;28993:419::-;;29197:2;29186:9;29182:18;29174:26;;29246:9;29240:4;29236:20;29232:1;29221:9;29217:17;29210:47;29274:131;29400:4;29274:131;:::i;:::-;29266:139;;29164:248;;;:::o;29418:419::-;;29622:2;29611:9;29607:18;29599:26;;29671:9;29665:4;29661:20;29657:1;29646:9;29642:17;29635:47;29699:131;29825:4;29699:131;:::i;:::-;29691:139;;29589:248;;;:::o;29843:419::-;;30047:2;30036:9;30032:18;30024:26;;30096:9;30090:4;30086:20;30082:1;30071:9;30067:17;30060:47;30124:131;30250:4;30124:131;:::i;:::-;30116:139;;30014:248;;;:::o;30268:419::-;;30472:2;30461:9;30457:18;30449:26;;30521:9;30515:4;30511:20;30507:1;30496:9;30492:17;30485:47;30549:131;30675:4;30549:131;:::i;:::-;30541:139;;30439:248;;;:::o;30693:419::-;;30897:2;30886:9;30882:18;30874:26;;30946:9;30940:4;30936:20;30932:1;30921:9;30917:17;30910:47;30974:131;31100:4;30974:131;:::i;:::-;30966:139;;30864:248;;;:::o;31118:419::-;;31322:2;31311:9;31307:18;31299:26;;31371:9;31365:4;31361:20;31357:1;31346:9;31342:17;31335:47;31399:131;31525:4;31399:131;:::i;:::-;31391:139;;31289:248;;;:::o;31543:419::-;;31747:2;31736:9;31732:18;31724:26;;31796:9;31790:4;31786:20;31782:1;31771:9;31767:17;31760:47;31824:131;31950:4;31824:131;:::i;:::-;31816:139;;31714:248;;;:::o;31968:419::-;;32172:2;32161:9;32157:18;32149:26;;32221:9;32215:4;32211:20;32207:1;32196:9;32192:17;32185:47;32249:131;32375:4;32249:131;:::i;:::-;32241:139;;32139:248;;;:::o;32393:419::-;;32597:2;32586:9;32582:18;32574:26;;32646:9;32640:4;32636:20;32632:1;32621:9;32617:17;32610:47;32674:131;32800:4;32674:131;:::i;:::-;32666:139;;32564:248;;;:::o;32818:419::-;;33022:2;33011:9;33007:18;32999:26;;33071:9;33065:4;33061:20;33057:1;33046:9;33042:17;33035:47;33099:131;33225:4;33099:131;:::i;:::-;33091:139;;32989:248;;;:::o;33243:419::-;;33447:2;33436:9;33432:18;33424:26;;33496:9;33490:4;33486:20;33482:1;33471:9;33467:17;33460:47;33524:131;33650:4;33524:131;:::i;:::-;33516:139;;33414:248;;;:::o;33668:419::-;;33872:2;33861:9;33857:18;33849:26;;33921:9;33915:4;33911:20;33907:1;33896:9;33892:17;33885:47;33949:131;34075:4;33949:131;:::i;:::-;33941:139;;33839:248;;;:::o;34093:419::-;;34297:2;34286:9;34282:18;34274:26;;34346:9;34340:4;34336:20;34332:1;34321:9;34317:17;34310:47;34374:131;34500:4;34374:131;:::i;:::-;34366:139;;34264:248;;;:::o;34518:419::-;;34722:2;34711:9;34707:18;34699:26;;34771:9;34765:4;34761:20;34757:1;34746:9;34742:17;34735:47;34799:131;34925:4;34799:131;:::i;:::-;34791:139;;34689:248;;;:::o;34943:419::-;;35147:2;35136:9;35132:18;35124:26;;35196:9;35190:4;35186:20;35182:1;35171:9;35167:17;35160:47;35224:131;35350:4;35224:131;:::i;:::-;35216:139;;35114:248;;;:::o;35368:419::-;;35572:2;35561:9;35557:18;35549:26;;35621:9;35615:4;35611:20;35607:1;35596:9;35592:17;35585:47;35649:131;35775:4;35649:131;:::i;:::-;35641:139;;35539:248;;;:::o;35793:419::-;;35997:2;35986:9;35982:18;35974:26;;36046:9;36040:4;36036:20;36032:1;36021:9;36017:17;36010:47;36074:131;36200:4;36074:131;:::i;:::-;36066:139;;35964:248;;;:::o;36218:419::-;;36422:2;36411:9;36407:18;36399:26;;36471:9;36465:4;36461:20;36457:1;36446:9;36442:17;36435:47;36499:131;36625:4;36499:131;:::i;:::-;36491:139;;36389:248;;;:::o;36643:419::-;;36847:2;36836:9;36832:18;36824:26;;36896:9;36890:4;36886:20;36882:1;36871:9;36867:17;36860:47;36924:131;37050:4;36924:131;:::i;:::-;36916:139;;36814:248;;;:::o;37068:419::-;;37272:2;37261:9;37257:18;37249:26;;37321:9;37315:4;37311:20;37307:1;37296:9;37292:17;37285:47;37349:131;37475:4;37349:131;:::i;:::-;37341:139;;37239:248;;;:::o;37493:419::-;;37697:2;37686:9;37682:18;37674:26;;37746:9;37740:4;37736:20;37732:1;37721:9;37717:17;37710:47;37774:131;37900:4;37774:131;:::i;:::-;37766:139;;37664:248;;;:::o;37918:419::-;;38122:2;38111:9;38107:18;38099:26;;38171:9;38165:4;38161:20;38157:1;38146:9;38142:17;38135:47;38199:131;38325:4;38199:131;:::i;:::-;38191:139;;38089:248;;;:::o;38343:222::-;;38474:2;38463:9;38459:18;38451:26;;38487:71;38555:1;38544:9;38540:17;38531:6;38487:71;:::i;:::-;38441:124;;;;:::o;38571:332::-;;38730:2;38719:9;38715:18;38707:26;;38743:71;38811:1;38800:9;38796:17;38787:6;38743:71;:::i;:::-;38824:72;38892:2;38881:9;38877:18;38868:6;38824:72;:::i;:::-;38697:206;;;;;:::o;38909:283::-;;38975:2;38969:9;38959:19;;39017:4;39009:6;39005:17;39124:6;39112:10;39109:22;39088:18;39076:10;39073:34;39070:62;39067:2;;;39135:18;;:::i;:::-;39067:2;39175:10;39171:2;39164:22;38949:243;;;;:::o;39198:331::-;;39349:18;39341:6;39338:30;39335:2;;;39371:18;;:::i;:::-;39335:2;39456:4;39452:9;39445:4;39437:6;39433:17;39429:33;39421:41;;39517:4;39511;39507:15;39499:23;;39264:265;;;:::o;39535:332::-;;39687:18;39679:6;39676:30;39673:2;;;39709:18;;:::i;:::-;39673:2;39794:4;39790:9;39783:4;39775:6;39771:17;39767:33;39759:41;;39855:4;39849;39845:15;39837:23;;39602:265;;;:::o;39873:132::-;;39963:3;39955:11;;39993:4;39988:3;39984:14;39976:22;;39945:60;;;:::o;40011:114::-;;40112:5;40106:12;40096:22;;40085:40;;;:::o;40131:98::-;;40216:5;40210:12;40200:22;;40189:40;;;:::o;40235:99::-;;40321:5;40315:12;40305:22;;40294:40;;;:::o;40340:113::-;;40442:4;40437:3;40433:14;40425:22;;40415:38;;;:::o;40459:184::-;;40592:6;40587:3;40580:19;40632:4;40627:3;40623:14;40608:29;;40570:73;;;;:::o;40649:168::-;;40766:6;40761:3;40754:19;40806:4;40801:3;40797:14;40782:29;;40744:73;;;;:::o;40823:169::-;;40941:6;40936:3;40929:19;40981:4;40976:3;40972:14;40957:29;;40919:73;;;;:::o;40998:148::-;;41137:3;41122:18;;41112:34;;;;:::o;41152:305::-;;41211:20;41229:1;41211:20;:::i;:::-;41206:25;;41245:20;41263:1;41245:20;:::i;:::-;41240:25;;41399:1;41331:66;41327:74;41324:1;41321:81;41318:2;;;41405:18;;:::i;:::-;41318:2;41449:1;41446;41442:9;41435:16;;41196:261;;;;:::o;41463:185::-;;41520:20;41538:1;41520:20;:::i;:::-;41515:25;;41554:20;41572:1;41554:20;:::i;:::-;41549:25;;41593:1;41583:2;;41598:18;;:::i;:::-;41583:2;41640:1;41637;41633:9;41628:14;;41505:143;;;;:::o;41654:348::-;;41717:20;41735:1;41717:20;:::i;:::-;41712:25;;41751:20;41769:1;41751:20;:::i;:::-;41746:25;;41939:1;41871:66;41867:74;41864:1;41861:81;41856:1;41849:9;41842:17;41838:105;41835:2;;;41946:18;;:::i;:::-;41835:2;41994:1;41991;41987:9;41976:20;;41702:300;;;;:::o;42008:191::-;;42068:20;42086:1;42068:20;:::i;:::-;42063:25;;42102:20;42120:1;42102:20;:::i;:::-;42097:25;;42141:1;42138;42135:8;42132:2;;;42146:18;;:::i;:::-;42132:2;42191:1;42188;42184:9;42176:17;;42053:146;;;;:::o;42205:96::-;;42271:24;42289:5;42271:24;:::i;:::-;42260:35;;42250:51;;;:::o;42307:90::-;;42384:5;42377:13;42370:21;42359:32;;42349:48;;;:::o;42403:149::-;;42479:66;42472:5;42468:78;42457:89;;42447:105;;;:::o;42558:126::-;;42635:42;42628:5;42624:54;42613:65;;42603:81;;;:::o;42690:77::-;;42756:5;42745:16;;42735:32;;;:::o;42773:154::-;42857:6;42852:3;42847;42834:30;42919:1;42910:6;42905:3;42901:16;42894:27;42824:103;;;:::o;42933:307::-;43001:1;43011:113;43025:6;43022:1;43019:13;43011:113;;;43110:1;43105:3;43101:11;43095:18;43091:1;43086:3;43082:11;43075:39;43047:2;43044:1;43040:10;43035:15;;43011:113;;;43142:6;43139:1;43136:13;43133:2;;;43222:1;43213:6;43208:3;43204:16;43197:27;43133:2;42982:258;;;;:::o;43246:320::-;;43327:1;43321:4;43317:12;43307:22;;43374:1;43368:4;43364:12;43395:18;43385:2;;43451:4;43443:6;43439:17;43429:27;;43385:2;43513;43505:6;43502:14;43482:18;43479:38;43476:2;;;43532:18;;:::i;:::-;43476:2;43297:269;;;;:::o;43572:233::-;;43634:24;43652:5;43634:24;:::i;:::-;43625:33;;43680:66;43673:5;43670:77;43667:2;;;43750:18;;:::i;:::-;43667:2;43797:1;43790:5;43786:13;43779:20;;43615:190;;;:::o;43811:176::-;;43860:20;43878:1;43860:20;:::i;:::-;43855:25;;43894:20;43912:1;43894:20;:::i;:::-;43889:25;;43933:1;43923:2;;43938:18;;:::i;:::-;43923:2;43979:1;43976;43972:9;43967:14;;43845:142;;;;:::o;43993:180::-;44041:77;44038:1;44031:88;44138:4;44135:1;44128:15;44162:4;44159:1;44152:15;44179:180;44227:77;44224:1;44217:88;44324:4;44321:1;44314:15;44348:4;44345:1;44338:15;44365:180;44413:77;44410:1;44403:88;44510:4;44507:1;44500:15;44534:4;44531:1;44524:15;44551:180;44599:77;44596:1;44589:88;44696:4;44693:1;44686:15;44720:4;44717:1;44710:15;44737:102;;44829:2;44825:7;44820:2;44813:5;44809:14;44805:28;44795:38;;44785:54;;;:::o;44845:122::-;44918:24;44936:5;44918:24;:::i;:::-;44911:5;44908:35;44898:2;;44957:1;44954;44947:12;44898:2;44888:79;:::o;44973:116::-;45043:21;45058:5;45043:21;:::i;:::-;45036:5;45033:32;45023:2;;45079:1;45076;45069:12;45023:2;45013:76;:::o;45095:120::-;45167:23;45184:5;45167:23;:::i;:::-;45160:5;45157:34;45147:2;;45205:1;45202;45195:12;45147:2;45137:78;:::o;45221:122::-;45294:24;45312:5;45294:24;:::i;:::-;45287:5;45284:35;45274:2;;45333:1;45330;45323:12;45274:2;45264:79;:::o

Swarm Source

ipfs://42fcc47b80b0db253d3006bd0c230a8f04e8134cf58b8198643415823717f06c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.