ETH Price: $3,265.82 (+3.02%)
Gas: 2 Gwei

Token

The Blind Club (TBC)
 

Overview

Max Total Supply

0 TBC

Holders

56

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TBC
0xf9583c6f0a45d1e5160d1404cb6eeb69a1438c27
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:
TheBlindClub

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 13 of 13: TheBlindClub.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;

import "./ERC721.sol";
import "./Counters.sol";
import "./Ownable.sol";

contract TheBlindClub is ERC721, Ownable {
  
  using Counters for Counters.Counter;
  Counters.Counter private _tokenSupply;
  Counters.Counter private _nextTokenId;

  uint256 public mintPrice = 0.2 ether;
  uint256 public presalePrice = 0.15 ether;
  uint256 private reserveAtATime = 50;
  uint256 private reservedCount = 0;
  uint256 private maxReserveCount = 100;

  string _baseTokenURI;
  
  bool public isActive = false;
  bool public isPresaleActive = false;
  
  uint256 public MAX_SUPPLY = 7500;
  uint256 public maximumAllowedTokensPerPurchase = 3;
  uint256 public maximumAllowedTokensPerWallet = 5;
  uint256 public allowListMaxMint = 3;
  address private GSDAddress = 0x560204A488B709Ee1405e7A14C333652b0a8809B;
  
  mapping(address => bool) private _allowList;
  mapping(address => uint256) private _allowListClaimed;
  
  event AssetMinted(uint256 tokenId, address sender);
  event SaleActivation(bool isActive);
  
  constructor(string memory baseURI) ERC721("The Blind Club", "TBC") {
    setBaseURI(baseURI);
  }
  modifier saleIsOpen {
    require(_tokenSupply.current() <= MAX_SUPPLY, "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 setActive(bool val) public onlyAuthorized {
    isActive = val;
    emit SaleActivation(val);
  }
  function setMaxMintSupply(uint256 maxMintSupply) external  onlyAuthorized {
    MAX_SUPPLY = maxMintSupply;
  }
  function setisPresaleActive(bool _isPresaleActive) external onlyAuthorized {
    isPresaleActive = _isPresaleActive;
  }
  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 setPrice(uint256 _price) public onlyAuthorized {
    mintPrice = _price;
  }
  function setPresalePrice(uint256 _preslaePrice) public onlyAuthorized {
    presalePrice = _preslaePrice;
  }
  function setBaseURI(string memory baseURI) public onlyAuthorized {
    _baseTokenURI = baseURI;
  }
  function getMaximumAllowedTokens() public view onlyAuthorized returns (uint256) {
    return maximumAllowedTokensPerPurchase;
  }
  function getPrice() external view returns (uint256) {
    return mintPrice;
  }
  function getReserveAtATime() external view returns (uint256) {
    return reserveAtATime;
  }
  function getTotalSupply() external view returns (uint256) {
    return _tokenSupply.current();
  }
  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 i;
    for (i = 0; i < reserveAtATime; i++) {
      _tokenSupply.increment();
      _safeMint(msg.sender, _tokenSupply.current());
      reservedCount++;
    }
  }
  function reserveToCustomWallet(address _walletAddress, uint256 _count) public onlyAuthorized {
    for (uint256 i = 0; i < _count; i++) {
      _tokenSupply.increment();
      _safeMint(_walletAddress, _tokenSupply.current());
    }
  }
  function batchReserveToMultipleAddresses(uint256 _count, address[] calldata addresses) external onlyAuthorized {
    uint256 supply = _tokenSupply.current();
    require(supply + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(supply <= MAX_SUPPLY, "Total supply spent.");
    for (uint256 i = 0; i < addresses.length; i++) {
      require(addresses[i] != address(0), "Can't add a null address");
      for(uint256 j = 0; j < _count; j++) {
        _tokenSupply.increment();
        _safeMint(addresses[i], _tokenSupply.current());
      }
    }
  }
  function mint(uint256 _count) public payable saleIsOpen {
    uint256 mintIndex = _tokenSupply.current();
    if (msg.sender != owner()) {
      require(isActive, "Sale is not active currently.");
      require(balanceOf(msg.sender) + _count <= maximumAllowedTokensPerWallet, "Max holding cap reached.");
    }
    require(mintIndex + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(
      _count <= maximumAllowedTokensPerPurchase,
      "Exceeds maximum allowed tokens"
    );
    require(msg.value >= mintPrice * _count, "Insufficient ETH amount sent.");
    for (uint256 i = 0; i < _count; i++) {
      _tokenSupply.increment();
      _safeMint(msg.sender, _tokenSupply.current());
    }
  }
  function preSaleMint(uint256 _count) public payable saleIsOpen {
    uint256 mintIndex = _tokenSupply.current();
    require(isPresaleActive, 'Allow List is not active');
    require(_allowList[msg.sender], 'You are not on the Allow List');
    require(mintIndex < MAX_SUPPLY, '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 >= presalePrice * _count, 'Insuffient ETH amount sent.');
    for (uint256 i = 0; i < _count; i++) {
      _tokenSupply.increment();
      _safeMint(msg.sender, _tokenSupply.current());
    }
  }
  function withdraw() external onlyAuthorized {
    uint balance = address(this).balance;
    payable(GSDAddress).transfer(balance * 300 / 10000);
    payable(owner()).transfer(balance * 9700 / 10000);
  }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

File 3 of 13: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 4 of 13: ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "./Strings.sol";

/**
 * @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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @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 5 of 13: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 6 of 13: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

File 8 of 13: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 10 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 11 of 13: 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 12 of 13: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"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":"isActive","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"uint256","name":"_count","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"batchReserveToMultipleAddresses","outputs":[],"stateMutability":"nonpayable","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":"getMaximumAllowedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","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":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","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":[{"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":"presalePrice","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":"bool","name":"val","type":"bool"}],"name":"setActive","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":[{"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":"uint256","name":"_preslaePrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setReserveAtATime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPresaleActive","type":"bool"}],"name":"setisPresaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526702c68af0bb140000600955670214e8348c4f0000600a556032600b556000600c556064600d556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff021916908315150217905550611d4c60105560036011556005601255600360135573560204a488b709ee1405e7a14c333652b0a8809b601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d857600080fd5b50604051620056cd380380620056cd8339818101604052810190620000fe91906200057f565b6040518060400160405280600e81526020017f54686520426c696e6420436c75620000000000000000000000000000000000008152506040518060400160405280600381526020017f544243000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200018292919062000332565b5080600190805190602001906200019b92919062000332565b505050620001be620001b2620001d660201b60201c565b620001de60201b60201c565b620001cf81620002a460201b60201c565b5062000635565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16620002cb6200030860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002ec57600080fd5b80600e90805190602001906200030492919062000332565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200034090620005ff565b90600052602060002090601f016020900481019282620003645760008555620003b0565b82601f106200037f57805160ff1916838001178555620003b0565b82800160010185558215620003b0579182015b82811115620003af57825182559160200191906001019062000392565b5b509050620003bf9190620003c3565b5090565b5b80821115620003de576000816000905550600101620003c4565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200044b8262000400565b810181811067ffffffffffffffff821117156200046d576200046c62000411565b5b80604052505050565b600062000482620003e2565b905062000490828262000440565b919050565b600067ffffffffffffffff821115620004b357620004b262000411565b5b620004be8262000400565b9050602081019050919050565b60005b83811015620004eb578082015181840152602081019050620004ce565b83811115620004fb576000848401525b50505050565b600062000518620005128462000495565b62000476565b905082815260208101848484011115620005375762000536620003fb565b5b62000544848285620004cb565b509392505050565b600082601f830112620005645762000563620003f6565b5b81516200057684826020860162000501565b91505092915050565b600060208284031215620005985762000597620003ec565b5b600082015167ffffffffffffffff811115620005b957620005b8620003f1565b5b620005c7848285016200054c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200061857607f821691505b602082108114156200062f576200062e620005d0565b5b50919050565b61508880620006456000396000f3fe6080604052600436106102c75760003560e01c80637389fbb711610175578063a51312c8116100dc578063cadf881811610095578063e985e9c51161006f578063e985e9c514610a86578063ea6eb83614610ac3578063f2fde38b14610aec578063f6c9d9e314610b15576102c7565b8063cadf881814610a07578063e7b62d9614610a32578063e82b2a7114610a5d576102c7565b8063a51312c8146108f9578063acec338a14610922578063ad06d7581461094b578063b88d4fde14610976578063c4e41b221461099f578063c87b56dd146109ca576102c7565b806391b7f5ed1161012e57806391b7f5ed1461080a57806395d89b411461083357806398d5fdca1461085e5780639a3bf72814610889578063a0712d68146108b4578063a22cb465146108d0576102c7565b80637389fbb71461071d57806377b501b9146107465780637835c6351461076f5780637a6685f11461078b5780637f44ab2f146107b45780638da5cb5b146107df576102c7565b806342842e0e1161023457806360d938dc116101ed57806370a08231116101c757806370a0823114610689578063715018a6146106c657806371e3500c146106dd5780637263cfe2146106f4576102c7565b806360d938dc146105f65780636352211e146106215780636817c76c1461065e576102c7565b806342842e0e146104fe578063442890d5146105275780634dfea6271461055257806354eae7341461057b57806355f804b3146105a457806356a87caa146105cd576102c7565b806322f3e2d41161028657806322f3e2d41461040257806323b872dd1461042d5780632c1205f41461045657806332cb6b0c146104935780633549345e146104be5780633ccfd60b146104e7576102c7565b806208ffdd146102cc5780620e7fa81461030957806301ffc9a71461033457806306fdde0314610371578063081812fc1461039c578063095ea7b3146103d9575b600080fd5b3480156102d857600080fd5b506102f360048036038101906102ee91906135d5565b610b3e565b604051610300919061361b565b60405180910390f35b34801561031557600080fd5b5061031e610bf6565b60405161032b919061361b565b60405180910390f35b34801561034057600080fd5b5061035b6004803603810190610356919061368e565b610bfc565b60405161036891906136d6565b60405180910390f35b34801561037d57600080fd5b50610386610cde565b604051610393919061378a565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be91906137d8565b610d70565b6040516103d09190613814565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb919061382f565b610df5565b005b34801561040e57600080fd5b50610417610f0d565b60405161042491906136d6565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f919061386f565b610f20565b005b34801561046257600080fd5b5061047d600480360381019061047891906135d5565b610f80565b60405161048a91906136d6565b60405180910390f35b34801561049f57600080fd5b506104a8610fd6565b6040516104b5919061361b565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e091906137d8565b610fdc565b005b3480156104f357600080fd5b506104fc611025565b005b34801561050a57600080fd5b506105256004803603810190610520919061386f565b611157565b005b34801561053357600080fd5b5061053c611177565b6040516105499190613814565b60405180910390f35b34801561055e57600080fd5b50610579600480360381019061057491906137d8565b611186565b005b34801561058757600080fd5b506105a2600480360381019061059d91906138ee565b6111cf565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190613a50565b61122b565b005b3480156105d957600080fd5b506105f460048036038101906105ef91906137d8565b611284565b005b34801561060257600080fd5b5061060b6112cd565b60405161061891906136d6565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906137d8565b6112e0565b6040516106559190613814565b60405180910390f35b34801561066a57600080fd5b50610673611392565b604051610680919061361b565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab91906135d5565b611398565b6040516106bd919061361b565b60405180910390f35b3480156106d257600080fd5b506106db611450565b005b3480156106e957600080fd5b506106f26114d8565b005b34801561070057600080fd5b5061071b60048036038101906107169190613af9565b6115b6565b005b34801561072957600080fd5b50610744600480360381019061073f91906137d8565b61180f565b005b34801561075257600080fd5b5061076d6004803603810190610768919061382f565b611858565b005b610789600480360381019061078491906137d8565b6118d7565b005b34801561079757600080fd5b506107b260048036038101906107ad91906137d8565b611bb6565b005b3480156107c057600080fd5b506107c9611bff565b6040516107d6919061361b565b60405180910390f35b3480156107eb57600080fd5b506107f4611c05565b6040516108019190613814565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906137d8565b611c2f565b005b34801561083f57600080fd5b50610848611c78565b604051610855919061378a565b60405180910390f35b34801561086a57600080fd5b50610873611d0a565b604051610880919061361b565b60405180910390f35b34801561089557600080fd5b5061089e611d14565b6040516108ab919061361b565b60405180910390f35b6108ce60048036038101906108c991906137d8565b611d1a565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613b46565b611f7d565b005b34801561090557600080fd5b50610920600480360381019061091b9190613af9565b611f93565b005b34801561092e57600080fd5b50610949600480360381019061094491906138ee565b61210e565b005b34801561095757600080fd5b506109606121a1565b60405161096d919061361b565b60405180910390f35b34801561098257600080fd5b5061099d60048036038101906109989190613c27565b6121ea565b005b3480156109ab57600080fd5b506109b461224c565b6040516109c1919061361b565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906137d8565b61225d565b6040516109fe919061378a565b60405180910390f35b348015610a1357600080fd5b50610a1c612304565b604051610a29919061361b565b60405180910390f35b348015610a3e57600080fd5b50610a4761230a565b604051610a54919061361b565b60405180910390f35b348015610a6957600080fd5b50610a846004803603810190610a7f9190613caa565b612314565b005b348015610a9257600080fd5b50610aad6004803603810190610aa89190613d0a565b612518565b604051610aba91906136d6565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae591906137d8565b6125ac565b005b348015610af857600080fd5b50610b136004803603810190610b0e91906135d5565b6125f5565b005b348015610b2157600080fd5b50610b3c6004803603810190610b3791906137d8565b6126ed565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690613d96565b60405180910390fd5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cc757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cd75750610cd682612736565b5b9050919050565b606060008054610ced90613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1990613de5565b8015610d665780601f10610d3b57610100808354040283529160200191610d66565b820191906000526020600020905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b6000610d7b826127a0565b610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190613e89565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e00826112e0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613f1b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e9061280c565b73ffffffffffffffffffffffffffffffffffffffff161480610ebf5750610ebe81610eb961280c565b612518565b5b610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590613fad565b60405180910390fd5b610f088383612814565b505050565b600f60009054906101000a900460ff1681565b610f31610f2b61280c565b826128cd565b610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f679061403f565b60405180910390fd5b610f7b8383836129ab565b505050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60105481565b3373ffffffffffffffffffffffffffffffffffffffff16610ffb611c05565b73ffffffffffffffffffffffffffffffffffffffff161461101b57600080fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16611044611c05565b73ffffffffffffffffffffffffffffffffffffffff161461106457600080fd5b6000479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61271061012c846110b6919061408e565b6110c09190614117565b9081150290604051600060405180830381858888f193505050501580156110eb573d6000803e3d6000fd5b506110f4611c05565b73ffffffffffffffffffffffffffffffffffffffff166108fc6127106125e48461111e919061408e565b6111289190614117565b9081150290604051600060405180830381858888f19350505050158015611153573d6000803e3d6000fd5b5050565b611172838383604051806020016040528060008152506121ea565b505050565b6000611181611c05565b905090565b3373ffffffffffffffffffffffffffffffffffffffff166111a5611c05565b73ffffffffffffffffffffffffffffffffffffffff16146111c557600080fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff166111ee611c05565b73ffffffffffffffffffffffffffffffffffffffff161461120e57600080fd5b80600f60016101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff1661124a611c05565b73ffffffffffffffffffffffffffffffffffffffff161461126a57600080fd5b80600e90805190602001906112809291906134c0565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166112a3611c05565b73ffffffffffffffffffffffffffffffffffffffff16146112c357600080fd5b80600d8190555050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611380906141ba565b60405180910390fd5b80915050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611409576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114009061424c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61145861280c565b73ffffffffffffffffffffffffffffffffffffffff16611476611c05565b73ffffffffffffffffffffffffffffffffffffffff16146114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c3906142b8565b60405180910390fd5b6114d66000612c12565b565b3373ffffffffffffffffffffffffffffffffffffffff166114f7611c05565b73ffffffffffffffffffffffffffffffffffffffff161461151757600080fd5b600d54600c54111561155e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155590614324565b60405180910390fd5b60005b600b548110156115b3576115756007612cd8565b611588336115836007612cee565b612cfc565b600c600081548092919061159b90614344565b919050555080806115ab90614344565b915050611561565b50565b3373ffffffffffffffffffffffffffffffffffffffff166115d5611c05565b73ffffffffffffffffffffffffffffffffffffffff16146115f557600080fd5b60005b8282905081101561180a57600073ffffffffffffffffffffffffffffffffffffffff1683838381811061162e5761162d61438d565b5b905060200201602081019061164391906135d5565b73ffffffffffffffffffffffffffffffffffffffff16141561169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190614408565b60405180910390fd5b6001601560008585858181106116b3576116b261438d565b5b90506020020160208101906116c891906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601660008585858181106117325761173161438d565b5b905060200201602081019061174791906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161178e5760006117f6565b601660008484848181106117a5576117a461438d565b5b90506020020160208101906117ba91906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b50808061180290614344565b9150506115f8565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661182e611c05565b73ffffffffffffffffffffffffffffffffffffffff161461184e57600080fd5b8060108190555050565b3373ffffffffffffffffffffffffffffffffffffffff16611877611c05565b73ffffffffffffffffffffffffffffffffffffffff161461189757600080fd5b60005b818110156118d2576118ac6007612cd8565b6118bf836118ba6007612cee565b612cfc565b80806118ca90614344565b91505061189a565b505050565b6010546118e46007612cee565b1115611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614474565b60405180910390fd5b60006119316007612cee565b9050600f60019054906101000a900460ff16611982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611979906144e0565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a059061454c565b60405180910390fd5b6010548110611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906145b8565b60405180910390fd5b601354821115611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e90614624565b60405180910390fd5b60135482601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ae59190614644565b1115611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d906146e6565b60405180910390fd5b81600a54611b34919061408e565b341015611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90614752565b60405180910390fd5b60005b82811015611bb157611b8b6007612cd8565b611b9e33611b996007612cee565b612cfc565b8080611ba990614344565b915050611b79565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611bd5611c05565b73ffffffffffffffffffffffffffffffffffffffff1614611bf557600080fd5b8060138190555050565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611c4e611c05565b73ffffffffffffffffffffffffffffffffffffffff1614611c6e57600080fd5b8060098190555050565b606060018054611c8790613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390613de5565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b5050505050905090565b6000600954905090565b60115481565b601054611d276007612cee565b1115611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90614474565b60405180910390fd5b6000611d746007612cee565b9050611d7e611c05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5857600f60009054906101000a900460ff16611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df6906147be565b60405180910390fd5b60125482611e0c33611398565b611e169190614644565b1115611e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4e9061482a565b60405180910390fd5b5b6010548282611e679190614644565b1115611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f90614896565b60405180910390fd5b601154821115611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee490614902565b60405180910390fd5b81600954611efb919061408e565b341015611f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f349061496e565b60405180910390fd5b60005b82811015611f7857611f526007612cd8565b611f6533611f606007612cee565b612cfc565b8080611f7090614344565b915050611f40565b505050565b611f8f611f8861280c565b8383612d1a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611fb2611c05565b73ffffffffffffffffffffffffffffffffffffffff1614611fd257600080fd5b60005b8282905081101561210957600073ffffffffffffffffffffffffffffffffffffffff1683838381811061200b5761200a61438d565b5b905060200201602081019061202091906135d5565b73ffffffffffffffffffffffffffffffffffffffff161415612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90614408565b60405180910390fd5b6000601560008585858181106120905761208f61438d565b5b90506020020160208101906120a591906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061210190614344565b915050611fd5565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661212d611c05565b73ffffffffffffffffffffffffffffffffffffffff161461214d57600080fd5b80600f60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f8160405161219691906136d6565b60405180910390a150565b60003373ffffffffffffffffffffffffffffffffffffffff166121c2611c05565b73ffffffffffffffffffffffffffffffffffffffff16146121e257600080fd5b601154905090565b6121fb6121f561280c565b836128cd565b61223a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122319061403f565b60405180910390fd5b61224684848484612e87565b50505050565b60006122586007612cee565b905090565b6060612268826127a0565b6122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e90614a00565b60405180910390fd5b60006122b1612ee3565b905060008151116122d157604051806020016040528060008152506122fc565b806122db84612f75565b6040516020016122ec929190614a5c565b6040516020818303038152906040525b915050919050565b60125481565b6000600b54905090565b3373ffffffffffffffffffffffffffffffffffffffff16612333611c05565b73ffffffffffffffffffffffffffffffffffffffff161461235357600080fd5b600061235f6007612cee565b905060105484826123709190614644565b11156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890614896565b60405180910390fd5b6010548111156123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614acc565b60405180910390fd5b60005b8383905081101561251157600073ffffffffffffffffffffffffffffffffffffffff1684848381811061242f5761242e61438d565b5b905060200201602081019061244491906135d5565b73ffffffffffffffffffffffffffffffffffffffff16141561249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614408565b60405180910390fd5b60005b858110156124fd576124b06007612cd8565b6124ea8585848181106124c6576124c561438d565b5b90506020020160208101906124db91906135d5565b6124e56007612cee565b612cfc565b80806124f590614344565b91505061249e565b50808061250990614344565b9150506123f9565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166125cb611c05565b73ffffffffffffffffffffffffffffffffffffffff16146125eb57600080fd5b8060128190555050565b6125fd61280c565b73ffffffffffffffffffffffffffffffffffffffff1661261b611c05565b73ffffffffffffffffffffffffffffffffffffffff1614612671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612668906142b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890614b5e565b60405180910390fd5b6126ea81612c12565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661270c611c05565b73ffffffffffffffffffffffffffffffffffffffff161461272c57600080fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612887836112e0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128d8826127a0565b612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90614bf0565b60405180910390fd5b6000612922836112e0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061299157508373ffffffffffffffffffffffffffffffffffffffff1661297984610d70565b73ffffffffffffffffffffffffffffffffffffffff16145b806129a257506129a18185612518565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129cb826112e0565b73ffffffffffffffffffffffffffffffffffffffff1614612a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1890614c82565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8890614d14565b60405180910390fd5b612a9c8383836130d6565b612aa7600082612814565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af79190614d34565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b4e9190614644565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c0d8383836130db565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612d168282604051806020016040528060008152506130e0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8090614db4565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e7a91906136d6565b60405180910390a3505050565b612e928484846129ab565b612e9e8484848461313b565b612edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed490614e46565b60405180910390fd5b50505050565b6060600e8054612ef290613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1e90613de5565b8015612f6b5780601f10612f4057610100808354040283529160200191612f6b565b820191906000526020600020905b815481529060010190602001808311612f4e57829003601f168201915b5050505050905090565b60606000821415612fbd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130d1565b600082905060005b60008214612fef578080612fd890614344565b915050600a82612fe89190614117565b9150612fc5565b60008167ffffffffffffffff81111561300b5761300a613925565b5b6040519080825280601f01601f19166020018201604052801561303d5781602001600182028036833780820191505090505b5090505b600085146130ca576001826130569190614d34565b9150600a856130659190614e66565b60306130719190614644565b60f81b8183815181106130875761308661438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130c39190614117565b9450613041565b8093505050505b919050565b505050565b505050565b6130ea83836132c3565b6130f7600084848461313b565b613136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312d90614e46565b60405180910390fd5b505050565b600061315c8473ffffffffffffffffffffffffffffffffffffffff1661349d565b156132b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261318561280c565b8786866040518563ffffffff1660e01b81526004016131a79493929190614eec565b6020604051808303816000875af19250505080156131e357506040513d601f19601f820116820180604052508101906131e09190614f4d565b60015b613266573d8060008114613213576040519150601f19603f3d011682016040523d82523d6000602084013e613218565b606091505b5060008151141561325e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325590614e46565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132bb565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332a90614fc6565b60405180910390fd5b61333c816127a0565b1561337c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337390615032565b60405180910390fd5b613388600083836130d6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133d89190614644565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613499600083836130db565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546134cc90613de5565b90600052602060002090601f0160209004810192826134ee5760008555613535565b82601f1061350757805160ff1916838001178555613535565b82800160010185558215613535579182015b82811115613534578251825591602001919060010190613519565b5b5090506135429190613546565b5090565b5b8082111561355f576000816000905550600101613547565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135a282613577565b9050919050565b6135b281613597565b81146135bd57600080fd5b50565b6000813590506135cf816135a9565b92915050565b6000602082840312156135eb576135ea61356d565b5b60006135f9848285016135c0565b91505092915050565b6000819050919050565b61361581613602565b82525050565b6000602082019050613630600083018461360c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61366b81613636565b811461367657600080fd5b50565b60008135905061368881613662565b92915050565b6000602082840312156136a4576136a361356d565b5b60006136b284828501613679565b91505092915050565b60008115159050919050565b6136d0816136bb565b82525050565b60006020820190506136eb60008301846136c7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561372b578082015181840152602081019050613710565b8381111561373a576000848401525b50505050565b6000601f19601f8301169050919050565b600061375c826136f1565b61376681856136fc565b935061377681856020860161370d565b61377f81613740565b840191505092915050565b600060208201905081810360008301526137a48184613751565b905092915050565b6137b581613602565b81146137c057600080fd5b50565b6000813590506137d2816137ac565b92915050565b6000602082840312156137ee576137ed61356d565b5b60006137fc848285016137c3565b91505092915050565b61380e81613597565b82525050565b60006020820190506138296000830184613805565b92915050565b600080604083850312156138465761384561356d565b5b6000613854858286016135c0565b9250506020613865858286016137c3565b9150509250929050565b6000806000606084860312156138885761388761356d565b5b6000613896868287016135c0565b93505060206138a7868287016135c0565b92505060406138b8868287016137c3565b9150509250925092565b6138cb816136bb565b81146138d657600080fd5b50565b6000813590506138e8816138c2565b92915050565b6000602082840312156139045761390361356d565b5b6000613912848285016138d9565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61395d82613740565b810181811067ffffffffffffffff8211171561397c5761397b613925565b5b80604052505050565b600061398f613563565b905061399b8282613954565b919050565b600067ffffffffffffffff8211156139bb576139ba613925565b5b6139c482613740565b9050602081019050919050565b82818337600083830152505050565b60006139f36139ee846139a0565b613985565b905082815260208101848484011115613a0f57613a0e613920565b5b613a1a8482856139d1565b509392505050565b600082601f830112613a3757613a3661391b565b5b8135613a478482602086016139e0565b91505092915050565b600060208284031215613a6657613a6561356d565b5b600082013567ffffffffffffffff811115613a8457613a83613572565b5b613a9084828501613a22565b91505092915050565b600080fd5b600080fd5b60008083601f840112613ab957613ab861391b565b5b8235905067ffffffffffffffff811115613ad657613ad5613a99565b5b602083019150836020820283011115613af257613af1613a9e565b5b9250929050565b60008060208385031215613b1057613b0f61356d565b5b600083013567ffffffffffffffff811115613b2e57613b2d613572565b5b613b3a85828601613aa3565b92509250509250929050565b60008060408385031215613b5d57613b5c61356d565b5b6000613b6b858286016135c0565b9250506020613b7c858286016138d9565b9150509250929050565b600067ffffffffffffffff821115613ba157613ba0613925565b5b613baa82613740565b9050602081019050919050565b6000613bca613bc584613b86565b613985565b905082815260208101848484011115613be657613be5613920565b5b613bf18482856139d1565b509392505050565b600082601f830112613c0e57613c0d61391b565b5b8135613c1e848260208601613bb7565b91505092915050565b60008060008060808587031215613c4157613c4061356d565b5b6000613c4f878288016135c0565b9450506020613c60878288016135c0565b9350506040613c71878288016137c3565b925050606085013567ffffffffffffffff811115613c9257613c91613572565b5b613c9e87828801613bf9565b91505092959194509250565b600080600060408486031215613cc357613cc261356d565b5b6000613cd1868287016137c3565b935050602084013567ffffffffffffffff811115613cf257613cf1613572565b5b613cfe86828701613aa3565b92509250509250925092565b60008060408385031215613d2157613d2061356d565b5b6000613d2f858286016135c0565b9250506020613d40858286016135c0565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b6000613d80601e836136fc565b9150613d8b82613d4a565b602082019050919050565b60006020820190508181036000830152613daf81613d73565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613dfd57607f821691505b60208210811415613e1157613e10613db6565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e73602c836136fc565b9150613e7e82613e17565b604082019050919050565b60006020820190508181036000830152613ea281613e66565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f056021836136fc565b9150613f1082613ea9565b604082019050919050565b60006020820190508181036000830152613f3481613ef8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613f976038836136fc565b9150613fa282613f3b565b604082019050919050565b60006020820190508181036000830152613fc681613f8a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140296031836136fc565b915061403482613fcd565b604082019050919050565b600060208201905081810360008301526140588161401c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061409982613602565b91506140a483613602565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140dd576140dc61405f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061412282613602565b915061412d83613602565b92508261413d5761413c6140e8565b5b828204905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006141a46029836136fc565b91506141af82614148565b604082019050919050565b600060208201905081810360008301526141d381614197565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614236602a836136fc565b9150614241826141da565b604082019050919050565b6000602082019050818103600083015261426581614229565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142a26020836136fc565b91506142ad8261426c565b602082019050919050565b600060208201905081810360008301526142d181614295565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b600061430e601b836136fc565b9150614319826142d8565b602082019050919050565b6000602082019050818103600083015261433d81614301565b9050919050565b600061434f82613602565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143825761438161405f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b60006143f26018836136fc565b91506143fd826143bc565b602082019050919050565b60006020820190508181036000830152614421816143e5565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b600061445e600f836136fc565b915061446982614428565b602082019050919050565b6000602082019050818103600083015261448d81614451565b9050919050565b7f416c6c6f77204c697374206973206e6f74206163746976650000000000000000600082015250565b60006144ca6018836136fc565b91506144d582614494565b602082019050919050565b600060208201905081810360008301526144f9816144bd565b9050919050565b7f596f7520617265206e6f74206f6e2074686520416c6c6f77204c697374000000600082015250565b6000614536601d836136fc565b915061454182614500565b602082019050919050565b6000602082019050818103600083015261456581614529565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006145a2601b836136fc565b91506145ad8261456c565b602082019050919050565b600060208201905081810360008301526145d181614595565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b600061460e6020836136fc565b9150614619826145d8565b602082019050919050565b6000602082019050818103600083015261463d81614601565b9050919050565b600061464f82613602565b915061465a83613602565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561468f5761468e61405f565b5b828201905092915050565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b60006146d0601c836136fc565b91506146db8261469a565b602082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b600061473c601b836136fc565b915061474782614706565b602082019050919050565b6000602082019050818103600083015261476b8161472f565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006147a8601d836136fc565b91506147b382614772565b602082019050919050565b600060208201905081810360008301526147d78161479b565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b60006148146018836136fc565b915061481f826147de565b602082019050919050565b6000602082019050818103600083015261484381614807565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006148806016836136fc565b915061488b8261484a565b602082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b60006148ec601e836136fc565b91506148f7826148b6565b602082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b6000614958601d836136fc565b915061496382614922565b602082019050919050565b600060208201905081810360008301526149878161494b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006149ea602f836136fc565b91506149f58261498e565b604082019050919050565b60006020820190508181036000830152614a19816149dd565b9050919050565b600081905092915050565b6000614a36826136f1565b614a408185614a20565b9350614a5081856020860161370d565b80840191505092915050565b6000614a688285614a2b565b9150614a748284614a2b565b91508190509392505050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000614ab66013836136fc565b9150614ac182614a80565b602082019050919050565b60006020820190508181036000830152614ae581614aa9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b486026836136fc565b9150614b5382614aec565b604082019050919050565b60006020820190508181036000830152614b7781614b3b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bda602c836136fc565b9150614be582614b7e565b604082019050919050565b60006020820190508181036000830152614c0981614bcd565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614c6c6025836136fc565b9150614c7782614c10565b604082019050919050565b60006020820190508181036000830152614c9b81614c5f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614cfe6024836136fc565b9150614d0982614ca2565b604082019050919050565b60006020820190508181036000830152614d2d81614cf1565b9050919050565b6000614d3f82613602565b9150614d4a83613602565b925082821015614d5d57614d5c61405f565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614d9e6019836136fc565b9150614da982614d68565b602082019050919050565b60006020820190508181036000830152614dcd81614d91565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e306032836136fc565b9150614e3b82614dd4565b604082019050919050565b60006020820190508181036000830152614e5f81614e23565b9050919050565b6000614e7182613602565b9150614e7c83613602565b925082614e8c57614e8b6140e8565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614ebe82614e97565b614ec88185614ea2565b9350614ed881856020860161370d565b614ee181613740565b840191505092915050565b6000608082019050614f016000830187613805565b614f0e6020830186613805565b614f1b604083018561360c565b8181036060830152614f2d8184614eb3565b905095945050505050565b600081519050614f4781613662565b92915050565b600060208284031215614f6357614f6261356d565b5b6000614f7184828501614f38565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614fb06020836136fc565b9150614fbb82614f7a565b602082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061501c601c836136fc565b915061502782614fe6565b602082019050919050565b6000602082019050818103600083015261504b8161500f565b905091905056fea264697066735822122013dea211bc94b666234f049371fc8fe57ac8e9f130d43b61becf337d380e845464736f6c634300080b00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d595a7675507378313877514e6f75673843746966743362346f4a55704e3772527876646e3451517a71354a572f000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102c75760003560e01c80637389fbb711610175578063a51312c8116100dc578063cadf881811610095578063e985e9c51161006f578063e985e9c514610a86578063ea6eb83614610ac3578063f2fde38b14610aec578063f6c9d9e314610b15576102c7565b8063cadf881814610a07578063e7b62d9614610a32578063e82b2a7114610a5d576102c7565b8063a51312c8146108f9578063acec338a14610922578063ad06d7581461094b578063b88d4fde14610976578063c4e41b221461099f578063c87b56dd146109ca576102c7565b806391b7f5ed1161012e57806391b7f5ed1461080a57806395d89b411461083357806398d5fdca1461085e5780639a3bf72814610889578063a0712d68146108b4578063a22cb465146108d0576102c7565b80637389fbb71461071d57806377b501b9146107465780637835c6351461076f5780637a6685f11461078b5780637f44ab2f146107b45780638da5cb5b146107df576102c7565b806342842e0e1161023457806360d938dc116101ed57806370a08231116101c757806370a0823114610689578063715018a6146106c657806371e3500c146106dd5780637263cfe2146106f4576102c7565b806360d938dc146105f65780636352211e146106215780636817c76c1461065e576102c7565b806342842e0e146104fe578063442890d5146105275780634dfea6271461055257806354eae7341461057b57806355f804b3146105a457806356a87caa146105cd576102c7565b806322f3e2d41161028657806322f3e2d41461040257806323b872dd1461042d5780632c1205f41461045657806332cb6b0c146104935780633549345e146104be5780633ccfd60b146104e7576102c7565b806208ffdd146102cc5780620e7fa81461030957806301ffc9a71461033457806306fdde0314610371578063081812fc1461039c578063095ea7b3146103d9575b600080fd5b3480156102d857600080fd5b506102f360048036038101906102ee91906135d5565b610b3e565b604051610300919061361b565b60405180910390f35b34801561031557600080fd5b5061031e610bf6565b60405161032b919061361b565b60405180910390f35b34801561034057600080fd5b5061035b6004803603810190610356919061368e565b610bfc565b60405161036891906136d6565b60405180910390f35b34801561037d57600080fd5b50610386610cde565b604051610393919061378a565b60405180910390f35b3480156103a857600080fd5b506103c360048036038101906103be91906137d8565b610d70565b6040516103d09190613814565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb919061382f565b610df5565b005b34801561040e57600080fd5b50610417610f0d565b60405161042491906136d6565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f919061386f565b610f20565b005b34801561046257600080fd5b5061047d600480360381019061047891906135d5565b610f80565b60405161048a91906136d6565b60405180910390f35b34801561049f57600080fd5b506104a8610fd6565b6040516104b5919061361b565b60405180910390f35b3480156104ca57600080fd5b506104e560048036038101906104e091906137d8565b610fdc565b005b3480156104f357600080fd5b506104fc611025565b005b34801561050a57600080fd5b506105256004803603810190610520919061386f565b611157565b005b34801561053357600080fd5b5061053c611177565b6040516105499190613814565b60405180910390f35b34801561055e57600080fd5b50610579600480360381019061057491906137d8565b611186565b005b34801561058757600080fd5b506105a2600480360381019061059d91906138ee565b6111cf565b005b3480156105b057600080fd5b506105cb60048036038101906105c69190613a50565b61122b565b005b3480156105d957600080fd5b506105f460048036038101906105ef91906137d8565b611284565b005b34801561060257600080fd5b5061060b6112cd565b60405161061891906136d6565b60405180910390f35b34801561062d57600080fd5b50610648600480360381019061064391906137d8565b6112e0565b6040516106559190613814565b60405180910390f35b34801561066a57600080fd5b50610673611392565b604051610680919061361b565b60405180910390f35b34801561069557600080fd5b506106b060048036038101906106ab91906135d5565b611398565b6040516106bd919061361b565b60405180910390f35b3480156106d257600080fd5b506106db611450565b005b3480156106e957600080fd5b506106f26114d8565b005b34801561070057600080fd5b5061071b60048036038101906107169190613af9565b6115b6565b005b34801561072957600080fd5b50610744600480360381019061073f91906137d8565b61180f565b005b34801561075257600080fd5b5061076d6004803603810190610768919061382f565b611858565b005b610789600480360381019061078491906137d8565b6118d7565b005b34801561079757600080fd5b506107b260048036038101906107ad91906137d8565b611bb6565b005b3480156107c057600080fd5b506107c9611bff565b6040516107d6919061361b565b60405180910390f35b3480156107eb57600080fd5b506107f4611c05565b6040516108019190613814565b60405180910390f35b34801561081657600080fd5b50610831600480360381019061082c91906137d8565b611c2f565b005b34801561083f57600080fd5b50610848611c78565b604051610855919061378a565b60405180910390f35b34801561086a57600080fd5b50610873611d0a565b604051610880919061361b565b60405180910390f35b34801561089557600080fd5b5061089e611d14565b6040516108ab919061361b565b60405180910390f35b6108ce60048036038101906108c991906137d8565b611d1a565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613b46565b611f7d565b005b34801561090557600080fd5b50610920600480360381019061091b9190613af9565b611f93565b005b34801561092e57600080fd5b50610949600480360381019061094491906138ee565b61210e565b005b34801561095757600080fd5b506109606121a1565b60405161096d919061361b565b60405180910390f35b34801561098257600080fd5b5061099d60048036038101906109989190613c27565b6121ea565b005b3480156109ab57600080fd5b506109b461224c565b6040516109c1919061361b565b60405180910390f35b3480156109d657600080fd5b506109f160048036038101906109ec91906137d8565b61225d565b6040516109fe919061378a565b60405180910390f35b348015610a1357600080fd5b50610a1c612304565b604051610a29919061361b565b60405180910390f35b348015610a3e57600080fd5b50610a4761230a565b604051610a54919061361b565b60405180910390f35b348015610a6957600080fd5b50610a846004803603810190610a7f9190613caa565b612314565b005b348015610a9257600080fd5b50610aad6004803603810190610aa89190613d0a565b612518565b604051610aba91906136d6565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae591906137d8565b6125ac565b005b348015610af857600080fd5b50610b136004803603810190610b0e91906135d5565b6125f5565b005b348015610b2157600080fd5b50610b3c6004803603810190610b3791906137d8565b6126ed565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690613d96565b60405180910390fd5b601660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600a5481565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cc757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610cd75750610cd682612736565b5b9050919050565b606060008054610ced90613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1990613de5565b8015610d665780601f10610d3b57610100808354040283529160200191610d66565b820191906000526020600020905b815481529060010190602001808311610d4957829003601f168201915b5050505050905090565b6000610d7b826127a0565b610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190613e89565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e00826112e0565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6890613f1b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e9061280c565b73ffffffffffffffffffffffffffffffffffffffff161480610ebf5750610ebe81610eb961280c565b612518565b5b610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef590613fad565b60405180910390fd5b610f088383612814565b505050565b600f60009054906101000a900460ff1681565b610f31610f2b61280c565b826128cd565b610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f679061403f565b60405180910390fd5b610f7b8383836129ab565b505050565b6000601560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60105481565b3373ffffffffffffffffffffffffffffffffffffffff16610ffb611c05565b73ffffffffffffffffffffffffffffffffffffffff161461101b57600080fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16611044611c05565b73ffffffffffffffffffffffffffffffffffffffff161461106457600080fd5b6000479050601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc61271061012c846110b6919061408e565b6110c09190614117565b9081150290604051600060405180830381858888f193505050501580156110eb573d6000803e3d6000fd5b506110f4611c05565b73ffffffffffffffffffffffffffffffffffffffff166108fc6127106125e48461111e919061408e565b6111289190614117565b9081150290604051600060405180830381858888f19350505050158015611153573d6000803e3d6000fd5b5050565b611172838383604051806020016040528060008152506121ea565b505050565b6000611181611c05565b905090565b3373ffffffffffffffffffffffffffffffffffffffff166111a5611c05565b73ffffffffffffffffffffffffffffffffffffffff16146111c557600080fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff166111ee611c05565b73ffffffffffffffffffffffffffffffffffffffff161461120e57600080fd5b80600f60016101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff1661124a611c05565b73ffffffffffffffffffffffffffffffffffffffff161461126a57600080fd5b80600e90805190602001906112809291906134c0565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166112a3611c05565b73ffffffffffffffffffffffffffffffffffffffff16146112c357600080fd5b80600d8190555050565b600f60019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611380906141ba565b60405180910390fd5b80915050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611409576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114009061424c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61145861280c565b73ffffffffffffffffffffffffffffffffffffffff16611476611c05565b73ffffffffffffffffffffffffffffffffffffffff16146114cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c3906142b8565b60405180910390fd5b6114d66000612c12565b565b3373ffffffffffffffffffffffffffffffffffffffff166114f7611c05565b73ffffffffffffffffffffffffffffffffffffffff161461151757600080fd5b600d54600c54111561155e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155590614324565b60405180910390fd5b60005b600b548110156115b3576115756007612cd8565b611588336115836007612cee565b612cfc565b600c600081548092919061159b90614344565b919050555080806115ab90614344565b915050611561565b50565b3373ffffffffffffffffffffffffffffffffffffffff166115d5611c05565b73ffffffffffffffffffffffffffffffffffffffff16146115f557600080fd5b60005b8282905081101561180a57600073ffffffffffffffffffffffffffffffffffffffff1683838381811061162e5761162d61438d565b5b905060200201602081019061164391906135d5565b73ffffffffffffffffffffffffffffffffffffffff16141561169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190614408565b60405180910390fd5b6001601560008585858181106116b3576116b261438d565b5b90506020020160208101906116c891906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601660008585858181106117325761173161438d565b5b905060200201602081019061174791906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161178e5760006117f6565b601660008484848181106117a5576117a461438d565b5b90506020020160208101906117ba91906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b50808061180290614344565b9150506115f8565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661182e611c05565b73ffffffffffffffffffffffffffffffffffffffff161461184e57600080fd5b8060108190555050565b3373ffffffffffffffffffffffffffffffffffffffff16611877611c05565b73ffffffffffffffffffffffffffffffffffffffff161461189757600080fd5b60005b818110156118d2576118ac6007612cd8565b6118bf836118ba6007612cee565b612cfc565b80806118ca90614344565b91505061189a565b505050565b6010546118e46007612cee565b1115611925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191c90614474565b60405180910390fd5b60006119316007612cee565b9050600f60019054906101000a900460ff16611982576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611979906144e0565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a059061454c565b60405180910390fd5b6010548110611a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a49906145b8565b60405180910390fd5b601354821115611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e90614624565b60405180910390fd5b60135482601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ae59190614644565b1115611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d906146e6565b60405180910390fd5b81600a54611b34919061408e565b341015611b76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6d90614752565b60405180910390fd5b60005b82811015611bb157611b8b6007612cd8565b611b9e33611b996007612cee565b612cfc565b8080611ba990614344565b915050611b79565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611bd5611c05565b73ffffffffffffffffffffffffffffffffffffffff1614611bf557600080fd5b8060138190555050565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611c4e611c05565b73ffffffffffffffffffffffffffffffffffffffff1614611c6e57600080fd5b8060098190555050565b606060018054611c8790613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb390613de5565b8015611d005780601f10611cd557610100808354040283529160200191611d00565b820191906000526020600020905b815481529060010190602001808311611ce357829003601f168201915b5050505050905090565b6000600954905090565b60115481565b601054611d276007612cee565b1115611d68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5f90614474565b60405180910390fd5b6000611d746007612cee565b9050611d7e611c05565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5857600f60009054906101000a900460ff16611dff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df6906147be565b60405180910390fd5b60125482611e0c33611398565b611e169190614644565b1115611e57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4e9061482a565b60405180910390fd5b5b6010548282611e679190614644565b1115611ea8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9f90614896565b60405180910390fd5b601154821115611eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee490614902565b60405180910390fd5b81600954611efb919061408e565b341015611f3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f349061496e565b60405180910390fd5b60005b82811015611f7857611f526007612cd8565b611f6533611f606007612cee565b612cfc565b8080611f7090614344565b915050611f40565b505050565b611f8f611f8861280c565b8383612d1a565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611fb2611c05565b73ffffffffffffffffffffffffffffffffffffffff1614611fd257600080fd5b60005b8282905081101561210957600073ffffffffffffffffffffffffffffffffffffffff1683838381811061200b5761200a61438d565b5b905060200201602081019061202091906135d5565b73ffffffffffffffffffffffffffffffffffffffff161415612077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206e90614408565b60405180910390fd5b6000601560008585858181106120905761208f61438d565b5b90506020020160208101906120a591906135d5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061210190614344565b915050611fd5565b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661212d611c05565b73ffffffffffffffffffffffffffffffffffffffff161461214d57600080fd5b80600f60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f8160405161219691906136d6565b60405180910390a150565b60003373ffffffffffffffffffffffffffffffffffffffff166121c2611c05565b73ffffffffffffffffffffffffffffffffffffffff16146121e257600080fd5b601154905090565b6121fb6121f561280c565b836128cd565b61223a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122319061403f565b60405180910390fd5b61224684848484612e87565b50505050565b60006122586007612cee565b905090565b6060612268826127a0565b6122a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229e90614a00565b60405180910390fd5b60006122b1612ee3565b905060008151116122d157604051806020016040528060008152506122fc565b806122db84612f75565b6040516020016122ec929190614a5c565b6040516020818303038152906040525b915050919050565b60125481565b6000600b54905090565b3373ffffffffffffffffffffffffffffffffffffffff16612333611c05565b73ffffffffffffffffffffffffffffffffffffffff161461235357600080fd5b600061235f6007612cee565b905060105484826123709190614644565b11156123b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a890614896565b60405180910390fd5b6010548111156123f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ed90614acc565b60405180910390fd5b60005b8383905081101561251157600073ffffffffffffffffffffffffffffffffffffffff1684848381811061242f5761242e61438d565b5b905060200201602081019061244491906135d5565b73ffffffffffffffffffffffffffffffffffffffff16141561249b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249290614408565b60405180910390fd5b60005b858110156124fd576124b06007612cd8565b6124ea8585848181106124c6576124c561438d565b5b90506020020160208101906124db91906135d5565b6124e56007612cee565b612cfc565b80806124f590614344565b91505061249e565b50808061250990614344565b9150506123f9565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166125cb611c05565b73ffffffffffffffffffffffffffffffffffffffff16146125eb57600080fd5b8060128190555050565b6125fd61280c565b73ffffffffffffffffffffffffffffffffffffffff1661261b611c05565b73ffffffffffffffffffffffffffffffffffffffff1614612671576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612668906142b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156126e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d890614b5e565b60405180910390fd5b6126ea81612c12565b50565b3373ffffffffffffffffffffffffffffffffffffffff1661270c611c05565b73ffffffffffffffffffffffffffffffffffffffff161461272c57600080fd5b80600b8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612887836112e0565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006128d8826127a0565b612917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290e90614bf0565b60405180910390fd5b6000612922836112e0565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061299157508373ffffffffffffffffffffffffffffffffffffffff1661297984610d70565b73ffffffffffffffffffffffffffffffffffffffff16145b806129a257506129a18185612518565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129cb826112e0565b73ffffffffffffffffffffffffffffffffffffffff1614612a21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1890614c82565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8890614d14565b60405180910390fd5b612a9c8383836130d6565b612aa7600082612814565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af79190614d34565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b4e9190614644565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c0d8383836130db565b505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612d168282604051806020016040528060008152506130e0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8090614db4565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612e7a91906136d6565b60405180910390a3505050565b612e928484846129ab565b612e9e8484848461313b565b612edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed490614e46565b60405180910390fd5b50505050565b6060600e8054612ef290613de5565b80601f0160208091040260200160405190810160405280929190818152602001828054612f1e90613de5565b8015612f6b5780601f10612f4057610100808354040283529160200191612f6b565b820191906000526020600020905b815481529060010190602001808311612f4e57829003601f168201915b5050505050905090565b60606000821415612fbd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506130d1565b600082905060005b60008214612fef578080612fd890614344565b915050600a82612fe89190614117565b9150612fc5565b60008167ffffffffffffffff81111561300b5761300a613925565b5b6040519080825280601f01601f19166020018201604052801561303d5781602001600182028036833780820191505090505b5090505b600085146130ca576001826130569190614d34565b9150600a856130659190614e66565b60306130719190614644565b60f81b8183815181106130875761308661438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856130c39190614117565b9450613041565b8093505050505b919050565b505050565b505050565b6130ea83836132c3565b6130f7600084848461313b565b613136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161312d90614e46565b60405180910390fd5b505050565b600061315c8473ffffffffffffffffffffffffffffffffffffffff1661349d565b156132b6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261318561280c565b8786866040518563ffffffff1660e01b81526004016131a79493929190614eec565b6020604051808303816000875af19250505080156131e357506040513d601f19601f820116820180604052508101906131e09190614f4d565b60015b613266573d8060008114613213576040519150601f19603f3d011682016040523d82523d6000602084013e613218565b606091505b5060008151141561325e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325590614e46565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506132bb565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613333576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332a90614fc6565b60405180910390fd5b61333c816127a0565b1561337c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337390615032565b60405180910390fd5b613388600083836130d6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133d89190614644565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613499600083836130db565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546134cc90613de5565b90600052602060002090601f0160209004810192826134ee5760008555613535565b82601f1061350757805160ff1916838001178555613535565b82800160010185558215613535579182015b82811115613534578251825591602001919060010190613519565b5b5090506135429190613546565b5090565b5b8082111561355f576000816000905550600101613547565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135a282613577565b9050919050565b6135b281613597565b81146135bd57600080fd5b50565b6000813590506135cf816135a9565b92915050565b6000602082840312156135eb576135ea61356d565b5b60006135f9848285016135c0565b91505092915050565b6000819050919050565b61361581613602565b82525050565b6000602082019050613630600083018461360c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61366b81613636565b811461367657600080fd5b50565b60008135905061368881613662565b92915050565b6000602082840312156136a4576136a361356d565b5b60006136b284828501613679565b91505092915050565b60008115159050919050565b6136d0816136bb565b82525050565b60006020820190506136eb60008301846136c7565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561372b578082015181840152602081019050613710565b8381111561373a576000848401525b50505050565b6000601f19601f8301169050919050565b600061375c826136f1565b61376681856136fc565b935061377681856020860161370d565b61377f81613740565b840191505092915050565b600060208201905081810360008301526137a48184613751565b905092915050565b6137b581613602565b81146137c057600080fd5b50565b6000813590506137d2816137ac565b92915050565b6000602082840312156137ee576137ed61356d565b5b60006137fc848285016137c3565b91505092915050565b61380e81613597565b82525050565b60006020820190506138296000830184613805565b92915050565b600080604083850312156138465761384561356d565b5b6000613854858286016135c0565b9250506020613865858286016137c3565b9150509250929050565b6000806000606084860312156138885761388761356d565b5b6000613896868287016135c0565b93505060206138a7868287016135c0565b92505060406138b8868287016137c3565b9150509250925092565b6138cb816136bb565b81146138d657600080fd5b50565b6000813590506138e8816138c2565b92915050565b6000602082840312156139045761390361356d565b5b6000613912848285016138d9565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61395d82613740565b810181811067ffffffffffffffff8211171561397c5761397b613925565b5b80604052505050565b600061398f613563565b905061399b8282613954565b919050565b600067ffffffffffffffff8211156139bb576139ba613925565b5b6139c482613740565b9050602081019050919050565b82818337600083830152505050565b60006139f36139ee846139a0565b613985565b905082815260208101848484011115613a0f57613a0e613920565b5b613a1a8482856139d1565b509392505050565b600082601f830112613a3757613a3661391b565b5b8135613a478482602086016139e0565b91505092915050565b600060208284031215613a6657613a6561356d565b5b600082013567ffffffffffffffff811115613a8457613a83613572565b5b613a9084828501613a22565b91505092915050565b600080fd5b600080fd5b60008083601f840112613ab957613ab861391b565b5b8235905067ffffffffffffffff811115613ad657613ad5613a99565b5b602083019150836020820283011115613af257613af1613a9e565b5b9250929050565b60008060208385031215613b1057613b0f61356d565b5b600083013567ffffffffffffffff811115613b2e57613b2d613572565b5b613b3a85828601613aa3565b92509250509250929050565b60008060408385031215613b5d57613b5c61356d565b5b6000613b6b858286016135c0565b9250506020613b7c858286016138d9565b9150509250929050565b600067ffffffffffffffff821115613ba157613ba0613925565b5b613baa82613740565b9050602081019050919050565b6000613bca613bc584613b86565b613985565b905082815260208101848484011115613be657613be5613920565b5b613bf18482856139d1565b509392505050565b600082601f830112613c0e57613c0d61391b565b5b8135613c1e848260208601613bb7565b91505092915050565b60008060008060808587031215613c4157613c4061356d565b5b6000613c4f878288016135c0565b9450506020613c60878288016135c0565b9350506040613c71878288016137c3565b925050606085013567ffffffffffffffff811115613c9257613c91613572565b5b613c9e87828801613bf9565b91505092959194509250565b600080600060408486031215613cc357613cc261356d565b5b6000613cd1868287016137c3565b935050602084013567ffffffffffffffff811115613cf257613cf1613572565b5b613cfe86828701613aa3565b92509250509250925092565b60008060408385031215613d2157613d2061356d565b5b6000613d2f858286016135c0565b9250506020613d40858286016135c0565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b6000613d80601e836136fc565b9150613d8b82613d4a565b602082019050919050565b60006020820190508181036000830152613daf81613d73565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613dfd57607f821691505b60208210811415613e1157613e10613db6565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e73602c836136fc565b9150613e7e82613e17565b604082019050919050565b60006020820190508181036000830152613ea281613e66565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f056021836136fc565b9150613f1082613ea9565b604082019050919050565b60006020820190508181036000830152613f3481613ef8565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613f976038836136fc565b9150613fa282613f3b565b604082019050919050565b60006020820190508181036000830152613fc681613f8a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140296031836136fc565b915061403482613fcd565b604082019050919050565b600060208201905081810360008301526140588161401c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061409982613602565b91506140a483613602565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140dd576140dc61405f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061412282613602565b915061412d83613602565b92508261413d5761413c6140e8565b5b828204905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006141a46029836136fc565b91506141af82614148565b604082019050919050565b600060208201905081810360008301526141d381614197565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614236602a836136fc565b9150614241826141da565b604082019050919050565b6000602082019050818103600083015261426581614229565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006142a26020836136fc565b91506142ad8261426c565b602082019050919050565b600060208201905081810360008301526142d181614295565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b600061430e601b836136fc565b9150614319826142d8565b602082019050919050565b6000602082019050818103600083015261433d81614301565b9050919050565b600061434f82613602565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156143825761438161405f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b60006143f26018836136fc565b91506143fd826143bc565b602082019050919050565b60006020820190508181036000830152614421816143e5565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b600061445e600f836136fc565b915061446982614428565b602082019050919050565b6000602082019050818103600083015261448d81614451565b9050919050565b7f416c6c6f77204c697374206973206e6f74206163746976650000000000000000600082015250565b60006144ca6018836136fc565b91506144d582614494565b602082019050919050565b600060208201905081810360008301526144f9816144bd565b9050919050565b7f596f7520617265206e6f74206f6e2074686520416c6c6f77204c697374000000600082015250565b6000614536601d836136fc565b915061454182614500565b602082019050919050565b6000602082019050818103600083015261456581614529565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006145a2601b836136fc565b91506145ad8261456c565b602082019050919050565b600060208201905081810360008301526145d181614595565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b600061460e6020836136fc565b9150614619826145d8565b602082019050919050565b6000602082019050818103600083015261463d81614601565b9050919050565b600061464f82613602565b915061465a83613602565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561468f5761468e61405f565b5b828201905092915050565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b60006146d0601c836136fc565b91506146db8261469a565b602082019050919050565b600060208201905081810360008301526146ff816146c3565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b600061473c601b836136fc565b915061474782614706565b602082019050919050565b6000602082019050818103600083015261476b8161472f565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b60006147a8601d836136fc565b91506147b382614772565b602082019050919050565b600060208201905081810360008301526147d78161479b565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b60006148146018836136fc565b915061481f826147de565b602082019050919050565b6000602082019050818103600083015261484381614807565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b60006148806016836136fc565b915061488b8261484a565b602082019050919050565b600060208201905081810360008301526148af81614873565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b60006148ec601e836136fc565b91506148f7826148b6565b602082019050919050565b6000602082019050818103600083015261491b816148df565b9050919050565b7f496e73756666696369656e742045544820616d6f756e742073656e742e000000600082015250565b6000614958601d836136fc565b915061496382614922565b602082019050919050565b600060208201905081810360008301526149878161494b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006149ea602f836136fc565b91506149f58261498e565b604082019050919050565b60006020820190508181036000830152614a19816149dd565b9050919050565b600081905092915050565b6000614a36826136f1565b614a408185614a20565b9350614a5081856020860161370d565b80840191505092915050565b6000614a688285614a2b565b9150614a748284614a2b565b91508190509392505050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b6000614ab66013836136fc565b9150614ac182614a80565b602082019050919050565b60006020820190508181036000830152614ae581614aa9565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614b486026836136fc565b9150614b5382614aec565b604082019050919050565b60006020820190508181036000830152614b7781614b3b565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614bda602c836136fc565b9150614be582614b7e565b604082019050919050565b60006020820190508181036000830152614c0981614bcd565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614c6c6025836136fc565b9150614c7782614c10565b604082019050919050565b60006020820190508181036000830152614c9b81614c5f565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614cfe6024836136fc565b9150614d0982614ca2565b604082019050919050565b60006020820190508181036000830152614d2d81614cf1565b9050919050565b6000614d3f82613602565b9150614d4a83613602565b925082821015614d5d57614d5c61405f565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614d9e6019836136fc565b9150614da982614d68565b602082019050919050565b60006020820190508181036000830152614dcd81614d91565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614e306032836136fc565b9150614e3b82614dd4565b604082019050919050565b60006020820190508181036000830152614e5f81614e23565b9050919050565b6000614e7182613602565b9150614e7c83613602565b925082614e8c57614e8b6140e8565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000614ebe82614e97565b614ec88185614ea2565b9350614ed881856020860161370d565b614ee181613740565b840191505092915050565b6000608082019050614f016000830187613805565b614f0e6020830186613805565b614f1b604083018561360c565b8181036060830152614f2d8184614eb3565b905095945050505050565b600081519050614f4781613662565b92915050565b600060208284031215614f6357614f6261356d565b5b6000614f7184828501614f38565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614fb06020836136fc565b9150614fbb82614f7a565b602082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061501c601c836136fc565b915061502782614fe6565b602082019050919050565b6000602082019050818103600083015261504b8161500f565b905091905056fea264697066735822122013dea211bc94b666234f049371fc8fe57ac8e9f130d43b61becf337d380e845464736f6c634300080b0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d595a7675507378313877514e6f75673843746966743362346f4a55704e3772527876646e3451517a71354a572f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string): https://gateway.pinata.cloud/ipfs/QmYZvuPsx18wQNoug8Ctift3b4oJUpN7rRxvdn4QQzq5JW/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d595a7675507378313877514e6f75673843746966743362346f4a5570
Arg [4] : 4e3772527876646e3451517a71354a572f000000000000000000000000000000


Deployed Bytecode Sourcemap

131:6652:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2767:184;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;341:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1505:300:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2423:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3473:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;530:28:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4662:330:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2398:105:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;604:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3231:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6578:203;;;;;;;;;;;;;:::i;:::-;;5058:179:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3856:83:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1348:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1828:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3343:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3050:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;562:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2126:235:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;301:36:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:205:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:10;;;;;;;;;;;;;:::i;:::-;;4050:299:12;;;;;;;;;;;;;:::i;:::-;;2062:333;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1714:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4352:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5867:708;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1951:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;746:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3143::12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2585:102:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3577:79:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;640:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5156:708;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4219:153:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2506:258:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1605:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3445:129;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5303:320:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3755:98:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2753:329:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;694:48:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3659:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:562;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4438:162:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1473:129:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2954:93:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2767:184;2833:7;2872:1;2855:19;;:5;:19;;;;2847:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2922:17;:24;2940:5;2922:24;;;;;;;;;;;;;;;;2915:31;;2767:184;;;:::o;341:40::-;;;;:::o;1505:300:5:-;1607:4;1657:25;1642:40;;;:11;:40;;;;:104;;;;1713:33;1698:48;;;:11;:48;;;;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1642:156;1623:175;;1505:300;;;:::o;2423:98::-;2477:13;2509:5;2502:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2423:98;:::o;3935:217::-;4011:7;4038:16;4046:7;4038;:16::i;:::-;4030:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4121:15;:24;4137:7;4121:24;;;;;;;;;;;;;;;;;;;;;4114:31;;3935:217;;;:::o;3473:401::-;3553:13;3569:23;3584:7;3569:14;:23::i;:::-;3553:39;;3616:5;3610:11;;:2;:11;;;;3602:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3707:5;3691:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3716:37;3733:5;3740:12;:10;:12::i;:::-;3716:16;:37::i;:::-;3691:62;3670:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3846:21;3855:2;3859:7;3846:8;:21::i;:::-;3543:331;3473:401;;:::o;530:28:12:-;;;;;;;;;;;;;:::o;4662:330:5:-;4851:41;4870:12;:10;:12::i;:::-;4884:7;4851:18;:41::i;:::-;4843:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4957:28;4967:4;4973:2;4977:7;4957:9;:28::i;:::-;4662:330;;;:::o;2398:105:12:-;2463:4;2482:10;:16;2493:4;2482:16;;;;;;;;;;;;;;;;;;;;;;;;;2475:23;;2398:105;;;:::o;604:32::-;;;;:::o;3231:109::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;3322:13:::1;3307:12;:28;;;;3231:109:::0;:::o;6578:203::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;6628:12:::1;6643:21;6628:36;;6678:10;;;;;;;;;;;6670:28;;:51;6715:5;6709:3;6699:7;:13;;;;:::i;:::-;:21;;;;:::i;:::-;6670:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6735:7;:5;:7::i;:::-;6727:25;;:49;6770:5;6763:4;6753:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;6727:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;6622:159;6578:203::o:0;5058:179:5:-;5191:39;5208:4;5214:2;5218:7;5191:39;;;;;;;;;;;;:16;:39::i;:::-;5058:179;;;:::o;3856:83:12:-;3905:7;3927;:5;:7::i;:::-;3920:14;;3856:83;:::o;1348:122::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;1459:6:::1;1425:31;:40;;;;1348:122:::0;:::o;1828:120::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;1927:16:::1;1909:15;;:34;;;;;;;;;;;;;;;;;;1828:120:::0;:::o;3343:99::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;3430:7:::1;3414:13;:23;;;;;;;;;;;;:::i;:::-;;3343:99:::0;:::o;3050:90::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;3132:3:::1;3114:15;:21;;;;3050:90:::0;:::o;562:35::-;;;;;;;;;;;;;:::o;2126:235:5:-;2198:7;2217:13;2233:7;:16;2241:7;2233:16;;;;;;;;;;;;;;;;;;;;;2217:32;;2284:1;2267:19;;:5;:19;;;;2259:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2349:5;2342:12;;;2126:235;;;:::o;301:36:12:-;;;;:::o;1864:205:5:-;1936:7;1980:1;1963:19;;:5;:19;;;;1955:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2046:9;:16;2056:5;2046:16;;;;;;;;;;;;;;;;2039:23;;1864:205;;;:::o;1661:101:10:-;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;4050:299:12:-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;4125:15:::1;;4108:13;;:32;;4100:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4178:9;4193:152;4209:14;;4205:1;:18;4193:152;;;4238:24;:12;:22;:24::i;:::-;4270:45;4280:10;4292:22;:12;:20;:22::i;:::-;4270:9;:45::i;:::-;4323:13;;:15;;;;;;;;;:::i;:::-;;;;;;4225:3;;;;;:::i;:::-;;;;4193:152;;;4094:255;4050:299::o:0;2062:333::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;2151:9:::1;2146:245;2170:9;;:16;;2166:1;:20;2146:245;;;2233:1;2209:26;;:9;;2219:1;2209:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;2201:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2299:4;2272:10;:24;2283:9;;2293:1;2283:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2272:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2345:1;2311:17;:31;2329:9;;2339:1;2329:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2311:31;;;;;;;;;;;;;;;;:35;:73;;2383:1;2311:73;;;2349:17;:31;2367:9;;2377:1;2367:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2349:31;;;;;;;;;;;;;;;;2311:73;;2188:3;;;;;:::i;:::-;;;;2146:245;;;;2062:333:::0;;:::o;1714:111::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;1807:13:::1;1794:10;:26;;;;1714:111:::0;:::o;4352:236::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;4456:9:::1;4451:133;4475:6;4471:1;:10;4451:133;;;4496:24;:12;:22;:24::i;:::-;4528:49;4538:14;4554:22;:12;:20;:22::i;:::-;4528:9;:49::i;:::-;4483:3;;;;;:::i;:::-;;;;4451:133;;;;4352:236:::0;;:::o;5867:708::-;1226:10;;1200:22;:12;:20;:22::i;:::-;:36;;1192:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5936:17:::1;5956:22;:12;:20;:22::i;:::-;5936:42;;5992:15;;;;;;;;;;;5984:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6050:10;:22;6061:10;6050:22;;;;;;;;;;;;;;;;;;;;;;;;;6042:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;6132:10;;6120:9;:22;6112:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;6198:16;;6188:6;:26;;6180:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6307:16;;6297:6;6265:17;:29;6283:10;6265:29;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:58;;6257:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;6398:6;6383:12;;:21;;;;:::i;:::-;6370:9;:34;;6362:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;6447:9;6442:129;6466:6;6462:1;:10;6442:129;;;6487:24;:12;:22;:24::i;:::-;6519:45;6529:10;6541:22;:12;:20;:22::i;:::-;6519:9;:45::i;:::-;6474:3;;;;;:::i;:::-;;;;6442:129;;;;5930:645;5867:708:::0;:::o;1951:108::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;2047:7:::1;2028:16;:26;;;;1951:108:::0;:::o;746:35::-;;;;:::o;1029:85:10:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;3143::12:-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;3217:6:::1;3205:9;:18;;;;3143:85:::0;:::o;2585:102:5:-;2641:13;2673:7;2666:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2585:102;:::o;3577:79:12:-;3620:7;3642:9;;3635:16;;3577:79;:::o;640:50::-;;;;:::o;5156:708::-;1226:10;;1200:22;:12;:20;:22::i;:::-;:36;;1192:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5218:17:::1;5238:22;:12;:20;:22::i;:::-;5218:42;;5284:7;:5;:7::i;:::-;5270:21;;:10;:21;;;5266:200;;5309:8;;;;;;;;;;;5301:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;5401:29;;5391:6;5367:21;5377:10;5367:9;:21::i;:::-;:30;;;;:::i;:::-;:63;;5359:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5266:200;5501:10;;5491:6;5479:9;:18;;;;:::i;:::-;:32;;5471:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5569:31;;5559:6;:41;;5544:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;5685:6;5673:9;;:18;;;;:::i;:::-;5660:9;:31;;5652:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5736:9;5731:129;5755:6;5751:1;:10;5731:129;;;5776:24;:12;:22;:24::i;:::-;5808:45;5818:10;5830:22;:12;:20;:22::i;:::-;5808:9;:45::i;:::-;5763:3;;;;;:::i;:::-;;;;5731:129;;;;5212:652;5156:708:::0;:::o;4219:153:5:-;4313:52;4332:12;:10;:12::i;:::-;4346:8;4356;4313:18;:52::i;:::-;4219:153;;:::o;2506:258:12:-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;2600:9:::1;2595:165;2619:9;;:16;;2615:1;:20;2595:165;;;2682:1;2658:26;;:9;;2668:1;2658:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;2650:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2748:5;2721:10;:24;2732:9;;2742:1;2732:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2721:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;2637:3;;;;;:::i;:::-;;;;2595:165;;;;2506:258:::0;;:::o;1605:106::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;1673:3:::1;1662:8;;:14;;;;;;;;;;;;;;;;;;1687:19;1702:3;1687:19;;;;;;:::i;:::-;;;;;;;;1605:106:::0;:::o;3445:129::-;3516:7;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;3538:31:::1;;3531:38;;3445:129:::0;:::o;5303:320:5:-;5472:41;5491:12;:10;:12::i;:::-;5505:7;5472:18;:41::i;:::-;5464:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5577:39;5591:4;5597:2;5601:7;5610:5;5577:13;:39::i;:::-;5303:320;;;;:::o;3755:98:12:-;3804:7;3826:22;:12;:20;:22::i;:::-;3819:29;;3755:98;:::o;2753:329:5:-;2826:13;2859:16;2867:7;2859;:16::i;:::-;2851:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2938:21;2962:10;:8;:10::i;:::-;2938:34;;3013:1;2995:7;2989:21;:25;:86;;;;;;;;;;;;;;;;;3041:7;3050:18;:7;:16;:18::i;:::-;3024:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2989:86;2982:93;;;2753:329;;;:::o;694:48:12:-;;;;:::o;3659:93::-;3711:7;3733:14;;3726:21;;3659:93;:::o;4591:562::-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;4708:14:::1;4725:22;:12;:20;:22::i;:::-;4708:39;;4780:10;;4770:6;4761;:15;;;;:::i;:::-;:29;;4753:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;4841:10;;4831:6;:20;;4823:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4886:9;4881:268;4905:9;;:16;;4901:1;:20;4881:268;;;4968:1;4944:26;;:9;;4954:1;4944:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;4936:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5011:9;5007:136;5030:6;5026:1;:10;5007:136;;;5053:24;:12;:22;:24::i;:::-;5087:47;5097:9;;5107:1;5097:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5111:22;:12;:20;:22::i;:::-;5087:9;:47::i;:::-;5038:3;;;;;:::i;:::-;;;;5007:136;;;;4923:3;;;;;:::i;:::-;;;;4881:268;;;;4702:451;4591:562:::0;;;:::o;4438:162:5:-;4535:4;4558:18;:25;4577:5;4558:25;;;;;;;;;;;;;;;:35;4584:8;4558:35;;;;;;;;;;;;;;;;;;;;;;;;;4551:42;;4438:162;;;;:::o;1473:129:12:-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;1591:6:::1;1559:29;:38;;;;1473:129:::0;:::o;1911:198:10:-;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;2954:93:12:-;1322:10;1311:21;;:7;:5;:7::i;:::-;:21;;;1303:30;;;;;;3039:3:::1;3022:14;:20;;;;2954:93:::0;:::o;829:155:4:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;7095:125:5:-;7160:4;7211:1;7183:30;;:7;:16;7191:7;7183:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7176:37;;7095:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;11104:171:5:-;11205:2;11178:15;:24;11194:7;11178:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11260:7;11256:2;11222:46;;11231:23;11246:7;11231:14;:23::i;:::-;11222:46;;;;;;;;;;;;11104:171;;:::o;7378:344::-;7471:4;7495:16;7503:7;7495;:16::i;:::-;7487:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7570:13;7586:23;7601:7;7586:14;:23::i;:::-;7570:39;;7638:5;7627:16;;:7;:16;;;:51;;;;7671:7;7647:31;;:20;7659:7;7647:11;:20::i;:::-;:31;;;7627:51;:87;;;;7682:32;7699:5;7706:7;7682:16;:32::i;:::-;7627:87;7619:96;;;7378:344;;;;:::o;10388:605::-;10542:4;10515:31;;:23;10530:7;10515:14;:23::i;:::-;:31;;;10507:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10620:1;10606:16;;:2;:16;;;;10598:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10674:39;10695:4;10701:2;10705:7;10674:20;:39::i;:::-;10775:29;10792:1;10796:7;10775:8;:29::i;:::-;10834:1;10815:9;:15;10825:4;10815:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10862:1;10845:9;:13;10855:2;10845:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10892:2;10873:7;:16;10881:7;10873:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10929:7;10925:2;10910:27;;10919:4;10910:27;;;;;;;;;;;;10948:38;10968:4;10974:2;10978:7;10948:19;:38::i;:::-;10388:605;;;:::o;2263:187:10:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;945:123:2:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;827:112::-;892:7;918;:14;;;911:21;;827:112;;;:::o;8052:108:5:-;8127:26;8137:2;8141:7;8127:26;;;;;;;;;;;;:9;:26::i;:::-;8052:108;;:::o;11410:307::-;11560:8;11551:17;;:5;:17;;;;11543:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11646:8;11608:18;:25;11627:5;11608:25;;;;;;;;;;;;;;;:35;11634:8;11608:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11691:8;11669:41;;11684:5;11669:41;;;11701:8;11669:41;;;;;;:::i;:::-;;;;;;;;11410:307;;;:::o;6485:::-;6636:28;6646:4;6652:2;6656:7;6636:9;:28::i;:::-;6682:48;6705:4;6711:2;6715:7;6724:5;6682:22;:48::i;:::-;6674:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6485:307;;;;:::o;3942:106:12:-;4002:13;4030;4023:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3942:106;:::o;328:703:11:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;13604:122:5:-;;;;:::o;14098:121::-;;;;:::o;8381:311::-;8506:18;8512:2;8516:7;8506:5;:18::i;:::-;8555:54;8586:1;8590:2;8594:7;8603:5;8555:22;:54::i;:::-;8534:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8381:311;;;:::o;12270:778::-;12420:4;12440:15;:2;:13;;;:15::i;:::-;12436:606;;;12491:2;12475:36;;;12512:12;:10;:12::i;:::-;12526:4;12532:7;12541:5;12475:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12471:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12731:1;12714:6;:13;:18;12710:266;;;12756:60;;;;;;;;;;:::i;:::-;;;;;;;;12710:266;12928:6;12922:13;12913:6;12909:2;12905:15;12898:38;12471:519;12607:41;;;12597:51;;;:6;:51;;;;12590:58;;;;;12436:606;13027:4;13020:11;;12270:778;;;;;;;:::o;9014:427::-;9107:1;9093:16;;:2;:16;;;;9085:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9165:16;9173:7;9165;:16::i;:::-;9164:17;9156:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9225:45;9254:1;9258:2;9262:7;9225:20;:45::i;:::-;9298:1;9281:9;:13;9291:2;9281:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9328:2;9309:7;:16;9317:7;9309:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9371:7;9367:2;9346:33;;9363:1;9346:33;;;;;;;;;;;;9390:44;9418:1;9422:2;9426:7;9390:19;:44::i;:::-;9014:427;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:13:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:149::-;1647:7;1687:66;1680:5;1676:78;1665:89;;1611:149;;;:::o;1766:120::-;1838:23;1855:5;1838:23;:::i;:::-;1831:5;1828:34;1818:62;;1876:1;1873;1866:12;1818:62;1766:120;:::o;1892:137::-;1937:5;1975:6;1962:20;1953:29;;1991:32;2017:5;1991:32;:::i;:::-;1892:137;;;;:::o;2035:327::-;2093:6;2142:2;2130:9;2121:7;2117:23;2113:32;2110:119;;;2148:79;;:::i;:::-;2110:119;2268:1;2293:52;2337:7;2328:6;2317:9;2313:22;2293:52;:::i;:::-;2283:62;;2239:116;2035:327;;;;:::o;2368:90::-;2402:7;2445:5;2438:13;2431:21;2420:32;;2368:90;;;:::o;2464:109::-;2545:21;2560:5;2545:21;:::i;:::-;2540:3;2533:34;2464:109;;:::o;2579:210::-;2666:4;2704:2;2693:9;2689:18;2681:26;;2717:65;2779:1;2768:9;2764:17;2755:6;2717:65;:::i;:::-;2579:210;;;;:::o;2795:99::-;2847:6;2881:5;2875:12;2865:22;;2795:99;;;:::o;2900:169::-;2984:11;3018:6;3013:3;3006:19;3058:4;3053:3;3049:14;3034:29;;2900:169;;;;:::o;3075:307::-;3143:1;3153:113;3167:6;3164:1;3161:13;3153:113;;;3252:1;3247:3;3243:11;3237:18;3233:1;3228:3;3224:11;3217:39;3189:2;3186:1;3182:10;3177:15;;3153:113;;;3284:6;3281:1;3278:13;3275:101;;;3364:1;3355:6;3350:3;3346:16;3339:27;3275:101;3124:258;3075:307;;;:::o;3388:102::-;3429:6;3480:2;3476:7;3471:2;3464:5;3460:14;3456:28;3446:38;;3388:102;;;:::o;3496:364::-;3584:3;3612:39;3645:5;3612:39;:::i;:::-;3667:71;3731:6;3726:3;3667:71;:::i;:::-;3660:78;;3747:52;3792:6;3787:3;3780:4;3773:5;3769:16;3747:52;:::i;:::-;3824:29;3846:6;3824:29;:::i;:::-;3819:3;3815:39;3808:46;;3588:272;3496:364;;;;:::o;3866:313::-;3979:4;4017:2;4006:9;4002:18;3994:26;;4066:9;4060:4;4056:20;4052:1;4041:9;4037:17;4030:47;4094:78;4167:4;4158:6;4094:78;:::i;:::-;4086:86;;3866:313;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:329::-;4517:6;4566:2;4554:9;4545:7;4541:23;4537:32;4534:119;;;4572:79;;:::i;:::-;4534:119;4692:1;4717:53;4762:7;4753:6;4742:9;4738:22;4717:53;:::i;:::-;4707:63;;4663:117;4458:329;;;;:::o;4793:118::-;4880:24;4898:5;4880:24;:::i;:::-;4875:3;4868:37;4793:118;;:::o;4917:222::-;5010:4;5048:2;5037:9;5033:18;5025:26;;5061:71;5129:1;5118:9;5114:17;5105:6;5061:71;:::i;:::-;4917:222;;;;:::o;5145:474::-;5213:6;5221;5270:2;5258:9;5249:7;5245:23;5241:32;5238:119;;;5276:79;;:::i;:::-;5238:119;5396:1;5421:53;5466:7;5457:6;5446:9;5442:22;5421:53;:::i;:::-;5411:63;;5367:117;5523:2;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5494:118;5145:474;;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:116::-;6320:21;6335:5;6320:21;:::i;:::-;6313:5;6310:32;6300:60;;6356:1;6353;6346:12;6300:60;6250:116;:::o;6372:133::-;6415:5;6453:6;6440:20;6431:29;;6469:30;6493:5;6469:30;:::i;:::-;6372:133;;;;:::o;6511:323::-;6567:6;6616:2;6604:9;6595:7;6591:23;6587:32;6584:119;;;6622:79;;:::i;:::-;6584:119;6742:1;6767:50;6809:7;6800:6;6789:9;6785:22;6767:50;:::i;:::-;6757:60;;6713:114;6511:323;;;;:::o;6840:117::-;6949:1;6946;6939:12;6963:117;7072:1;7069;7062:12;7086:180;7134:77;7131:1;7124:88;7231:4;7228:1;7221:15;7255:4;7252:1;7245:15;7272:281;7355:27;7377:4;7355:27;:::i;:::-;7347:6;7343:40;7485:6;7473:10;7470:22;7449:18;7437:10;7434:34;7431:62;7428:88;;;7496:18;;:::i;:::-;7428:88;7536:10;7532:2;7525:22;7315:238;7272:281;;:::o;7559:129::-;7593:6;7620:20;;:::i;:::-;7610:30;;7649:33;7677:4;7669:6;7649:33;:::i;:::-;7559:129;;;:::o;7694:308::-;7756:4;7846:18;7838:6;7835:30;7832:56;;;7868:18;;:::i;:::-;7832:56;7906:29;7928:6;7906:29;:::i;:::-;7898:37;;7990:4;7984;7980:15;7972:23;;7694:308;;;:::o;8008:154::-;8092:6;8087:3;8082;8069:30;8154:1;8145:6;8140:3;8136:16;8129:27;8008:154;;;:::o;8168:412::-;8246:5;8271:66;8287:49;8329:6;8287:49;:::i;:::-;8271:66;:::i;:::-;8262:75;;8360:6;8353:5;8346:21;8398:4;8391:5;8387:16;8436:3;8427:6;8422:3;8418:16;8415:25;8412:112;;;8443:79;;:::i;:::-;8412:112;8533:41;8567:6;8562:3;8557;8533:41;:::i;:::-;8252:328;8168:412;;;;;:::o;8600:340::-;8656:5;8705:3;8698:4;8690:6;8686:17;8682:27;8672:122;;8713:79;;:::i;:::-;8672:122;8830:6;8817:20;8855:79;8930:3;8922:6;8915:4;8907:6;8903:17;8855:79;:::i;:::-;8846:88;;8662:278;8600:340;;;;:::o;8946:509::-;9015:6;9064:2;9052:9;9043:7;9039:23;9035:32;9032:119;;;9070:79;;:::i;:::-;9032:119;9218:1;9207:9;9203:17;9190:31;9248:18;9240:6;9237:30;9234:117;;;9270:79;;:::i;:::-;9234:117;9375:63;9430:7;9421:6;9410:9;9406:22;9375:63;:::i;:::-;9365:73;;9161:287;8946:509;;;;:::o;9461:117::-;9570:1;9567;9560:12;9584:117;9693:1;9690;9683:12;9724:568;9797:8;9807:6;9857:3;9850:4;9842:6;9838:17;9834:27;9824:122;;9865:79;;:::i;:::-;9824:122;9978:6;9965:20;9955:30;;10008:18;10000:6;9997:30;9994:117;;;10030:79;;:::i;:::-;9994:117;10144:4;10136:6;10132:17;10120:29;;10198:3;10190:4;10182:6;10178:17;10168:8;10164:32;10161:41;10158:128;;;10205:79;;:::i;:::-;10158:128;9724:568;;;;;:::o;10298:559::-;10384:6;10392;10441:2;10429:9;10420:7;10416:23;10412:32;10409:119;;;10447:79;;:::i;:::-;10409:119;10595:1;10584:9;10580:17;10567:31;10625:18;10617:6;10614:30;10611:117;;;10647:79;;:::i;:::-;10611:117;10760:80;10832:7;10823:6;10812:9;10808:22;10760:80;:::i;:::-;10742:98;;;;10538:312;10298:559;;;;;:::o;10863:468::-;10928:6;10936;10985:2;10973:9;10964:7;10960:23;10956:32;10953:119;;;10991:79;;:::i;:::-;10953:119;11111:1;11136:53;11181:7;11172:6;11161:9;11157:22;11136:53;:::i;:::-;11126:63;;11082:117;11238:2;11264:50;11306:7;11297:6;11286:9;11282:22;11264:50;:::i;:::-;11254:60;;11209:115;10863:468;;;;;:::o;11337:307::-;11398:4;11488:18;11480:6;11477:30;11474:56;;;11510:18;;:::i;:::-;11474:56;11548:29;11570:6;11548:29;:::i;:::-;11540:37;;11632:4;11626;11622:15;11614:23;;11337:307;;;:::o;11650:410::-;11727:5;11752:65;11768:48;11809:6;11768:48;:::i;:::-;11752:65;:::i;:::-;11743:74;;11840:6;11833:5;11826:21;11878:4;11871:5;11867:16;11916:3;11907:6;11902:3;11898:16;11895:25;11892:112;;;11923:79;;:::i;:::-;11892:112;12013:41;12047:6;12042:3;12037;12013:41;:::i;:::-;11733:327;11650:410;;;;;:::o;12079:338::-;12134:5;12183:3;12176:4;12168:6;12164:17;12160:27;12150:122;;12191:79;;:::i;:::-;12150:122;12308:6;12295:20;12333:78;12407:3;12399:6;12392:4;12384:6;12380:17;12333:78;:::i;:::-;12324:87;;12140:277;12079:338;;;;:::o;12423:943::-;12518:6;12526;12534;12542;12591:3;12579:9;12570:7;12566:23;12562:33;12559:120;;;12598:79;;:::i;:::-;12559:120;12718:1;12743:53;12788:7;12779:6;12768:9;12764:22;12743:53;:::i;:::-;12733:63;;12689:117;12845:2;12871:53;12916:7;12907:6;12896:9;12892:22;12871:53;:::i;:::-;12861:63;;12816:118;12973:2;12999:53;13044:7;13035:6;13024:9;13020:22;12999:53;:::i;:::-;12989:63;;12944:118;13129:2;13118:9;13114:18;13101:32;13160:18;13152:6;13149:30;13146:117;;;13182:79;;:::i;:::-;13146:117;13287:62;13341:7;13332:6;13321:9;13317:22;13287:62;:::i;:::-;13277:72;;13072:287;12423:943;;;;;;;:::o;13372:704::-;13467:6;13475;13483;13532:2;13520:9;13511:7;13507:23;13503:32;13500:119;;;13538:79;;:::i;:::-;13500:119;13658:1;13683:53;13728:7;13719:6;13708:9;13704:22;13683:53;:::i;:::-;13673:63;;13629:117;13813:2;13802:9;13798:18;13785:32;13844:18;13836:6;13833:30;13830:117;;;13866:79;;:::i;:::-;13830:117;13979:80;14051:7;14042:6;14031:9;14027:22;13979:80;:::i;:::-;13961:98;;;;13756:313;13372:704;;;;;:::o;14082:474::-;14150:6;14158;14207:2;14195:9;14186:7;14182:23;14178:32;14175:119;;;14213:79;;:::i;:::-;14175:119;14333:1;14358:53;14403:7;14394:6;14383:9;14379:22;14358:53;:::i;:::-;14348:63;;14304:117;14460:2;14486:53;14531:7;14522:6;14511:9;14507:22;14486:53;:::i;:::-;14476:63;;14431:118;14082:474;;;;;:::o;14562:180::-;14702:32;14698:1;14690:6;14686:14;14679:56;14562:180;:::o;14748:366::-;14890:3;14911:67;14975:2;14970:3;14911:67;:::i;:::-;14904:74;;14987:93;15076:3;14987:93;:::i;:::-;15105:2;15100:3;15096:12;15089:19;;14748:366;;;:::o;15120:419::-;15286:4;15324:2;15313:9;15309:18;15301:26;;15373:9;15367:4;15363:20;15359:1;15348:9;15344:17;15337:47;15401:131;15527:4;15401:131;:::i;:::-;15393:139;;15120:419;;;:::o;15545:180::-;15593:77;15590:1;15583:88;15690:4;15687:1;15680:15;15714:4;15711:1;15704:15;15731:320;15775:6;15812:1;15806:4;15802:12;15792:22;;15859:1;15853:4;15849:12;15880:18;15870:81;;15936:4;15928:6;15924:17;15914:27;;15870:81;15998:2;15990:6;15987:14;15967:18;15964:38;15961:84;;;16017:18;;:::i;:::-;15961:84;15782:269;15731:320;;;:::o;16057:231::-;16197:34;16193:1;16185:6;16181:14;16174:58;16266:14;16261:2;16253:6;16249:15;16242:39;16057:231;:::o;16294:366::-;16436:3;16457:67;16521:2;16516:3;16457:67;:::i;:::-;16450:74;;16533:93;16622:3;16533:93;:::i;:::-;16651:2;16646:3;16642:12;16635:19;;16294:366;;;:::o;16666:419::-;16832:4;16870:2;16859:9;16855:18;16847:26;;16919:9;16913:4;16909:20;16905:1;16894:9;16890:17;16883:47;16947:131;17073:4;16947:131;:::i;:::-;16939:139;;16666:419;;;:::o;17091:220::-;17231:34;17227:1;17219:6;17215:14;17208:58;17300:3;17295:2;17287:6;17283:15;17276:28;17091:220;:::o;17317:366::-;17459:3;17480:67;17544:2;17539:3;17480:67;:::i;:::-;17473:74;;17556:93;17645:3;17556:93;:::i;:::-;17674:2;17669:3;17665:12;17658:19;;17317:366;;;:::o;17689:419::-;17855:4;17893:2;17882:9;17878:18;17870:26;;17942:9;17936:4;17932:20;17928:1;17917:9;17913:17;17906:47;17970:131;18096:4;17970:131;:::i;:::-;17962:139;;17689:419;;;:::o;18114:243::-;18254:34;18250:1;18242:6;18238:14;18231:58;18323:26;18318:2;18310:6;18306:15;18299:51;18114:243;:::o;18363:366::-;18505:3;18526:67;18590:2;18585:3;18526:67;:::i;:::-;18519:74;;18602:93;18691:3;18602:93;:::i;:::-;18720:2;18715:3;18711:12;18704:19;;18363:366;;;:::o;18735:419::-;18901:4;18939:2;18928:9;18924:18;18916:26;;18988:9;18982:4;18978:20;18974:1;18963:9;18959:17;18952:47;19016:131;19142:4;19016:131;:::i;:::-;19008:139;;18735:419;;;:::o;19160:236::-;19300:34;19296:1;19288:6;19284:14;19277:58;19369:19;19364:2;19356:6;19352:15;19345:44;19160:236;:::o;19402:366::-;19544:3;19565:67;19629:2;19624:3;19565:67;:::i;:::-;19558:74;;19641:93;19730:3;19641:93;:::i;:::-;19759:2;19754:3;19750:12;19743:19;;19402:366;;;:::o;19774:419::-;19940:4;19978:2;19967:9;19963:18;19955:26;;20027:9;20021:4;20017:20;20013:1;20002:9;19998:17;19991:47;20055:131;20181:4;20055:131;:::i;:::-;20047:139;;19774:419;;;:::o;20199:180::-;20247:77;20244:1;20237:88;20344:4;20341:1;20334:15;20368:4;20365:1;20358:15;20385:348;20425:7;20448:20;20466:1;20448:20;:::i;:::-;20443:25;;20482:20;20500:1;20482:20;:::i;:::-;20477:25;;20670:1;20602:66;20598:74;20595:1;20592:81;20587:1;20580:9;20573:17;20569:105;20566:131;;;20677:18;;:::i;:::-;20566:131;20725:1;20722;20718:9;20707:20;;20385:348;;;;:::o;20739:180::-;20787:77;20784:1;20777:88;20884:4;20881:1;20874:15;20908:4;20905:1;20898:15;20925:185;20965:1;20982:20;21000:1;20982:20;:::i;:::-;20977:25;;21016:20;21034:1;21016:20;:::i;:::-;21011:25;;21055:1;21045:35;;21060:18;;:::i;:::-;21045:35;21102:1;21099;21095:9;21090:14;;20925:185;;;;:::o;21116:228::-;21256:34;21252:1;21244:6;21240:14;21233:58;21325:11;21320:2;21312:6;21308:15;21301:36;21116:228;:::o;21350:366::-;21492:3;21513:67;21577:2;21572:3;21513:67;:::i;:::-;21506:74;;21589:93;21678:3;21589:93;:::i;:::-;21707:2;21702:3;21698:12;21691:19;;21350:366;;;:::o;21722:419::-;21888:4;21926:2;21915:9;21911:18;21903:26;;21975:9;21969:4;21965:20;21961:1;21950:9;21946:17;21939:47;22003:131;22129:4;22003:131;:::i;:::-;21995:139;;21722:419;;;:::o;22147:229::-;22287:34;22283:1;22275:6;22271:14;22264:58;22356:12;22351:2;22343:6;22339:15;22332:37;22147:229;:::o;22382:366::-;22524:3;22545:67;22609:2;22604:3;22545:67;:::i;:::-;22538:74;;22621:93;22710:3;22621:93;:::i;:::-;22739:2;22734:3;22730:12;22723:19;;22382:366;;;:::o;22754:419::-;22920:4;22958:2;22947:9;22943:18;22935:26;;23007:9;23001:4;22997:20;22993:1;22982:9;22978:17;22971:47;23035:131;23161:4;23035:131;:::i;:::-;23027:139;;22754:419;;;:::o;23179:182::-;23319:34;23315:1;23307:6;23303:14;23296:58;23179:182;:::o;23367:366::-;23509:3;23530:67;23594:2;23589:3;23530:67;:::i;:::-;23523:74;;23606:93;23695:3;23606:93;:::i;:::-;23724:2;23719:3;23715:12;23708:19;;23367:366;;;:::o;23739:419::-;23905:4;23943:2;23932:9;23928:18;23920:26;;23992:9;23986:4;23982:20;23978:1;23967:9;23963:17;23956:47;24020:131;24146:4;24020:131;:::i;:::-;24012:139;;23739:419;;;:::o;24164:177::-;24304:29;24300:1;24292:6;24288:14;24281:53;24164:177;:::o;24347:366::-;24489:3;24510:67;24574:2;24569:3;24510:67;:::i;:::-;24503:74;;24586:93;24675:3;24586:93;:::i;:::-;24704:2;24699:3;24695:12;24688:19;;24347:366;;;:::o;24719:419::-;24885:4;24923:2;24912:9;24908:18;24900:26;;24972:9;24966:4;24962:20;24958:1;24947:9;24943:17;24936:47;25000:131;25126:4;25000:131;:::i;:::-;24992:139;;24719:419;;;:::o;25144:233::-;25183:3;25206:24;25224:5;25206:24;:::i;:::-;25197:33;;25252:66;25245:5;25242:77;25239:103;;;25322:18;;:::i;:::-;25239:103;25369:1;25362:5;25358:13;25351:20;;25144:233;;;:::o;25383:180::-;25431:77;25428:1;25421:88;25528:4;25525:1;25518:15;25552:4;25549:1;25542:15;25569:174;25709:26;25705:1;25697:6;25693:14;25686:50;25569:174;:::o;25749:366::-;25891:3;25912:67;25976:2;25971:3;25912:67;:::i;:::-;25905:74;;25988:93;26077:3;25988:93;:::i;:::-;26106:2;26101:3;26097:12;26090:19;;25749:366;;;:::o;26121:419::-;26287:4;26325:2;26314:9;26310:18;26302:26;;26374:9;26368:4;26364:20;26360:1;26349:9;26345:17;26338:47;26402:131;26528:4;26402:131;:::i;:::-;26394:139;;26121:419;;;:::o;26546:165::-;26686:17;26682:1;26674:6;26670:14;26663:41;26546:165;:::o;26717:366::-;26859:3;26880:67;26944:2;26939:3;26880:67;:::i;:::-;26873:74;;26956:93;27045:3;26956:93;:::i;:::-;27074:2;27069:3;27065:12;27058:19;;26717:366;;;:::o;27089:419::-;27255:4;27293:2;27282:9;27278:18;27270:26;;27342:9;27336:4;27332:20;27328:1;27317:9;27313:17;27306:47;27370:131;27496:4;27370:131;:::i;:::-;27362:139;;27089:419;;;:::o;27514:174::-;27654:26;27650:1;27642:6;27638:14;27631:50;27514:174;:::o;27694:366::-;27836:3;27857:67;27921:2;27916:3;27857:67;:::i;:::-;27850:74;;27933:93;28022:3;27933:93;:::i;:::-;28051:2;28046:3;28042:12;28035:19;;27694:366;;;:::o;28066:419::-;28232:4;28270:2;28259:9;28255:18;28247:26;;28319:9;28313:4;28309:20;28305:1;28294:9;28290:17;28283:47;28347:131;28473:4;28347:131;:::i;:::-;28339:139;;28066:419;;;:::o;28491:179::-;28631:31;28627:1;28619:6;28615:14;28608:55;28491:179;:::o;28676:366::-;28818:3;28839:67;28903:2;28898:3;28839:67;:::i;:::-;28832:74;;28915:93;29004:3;28915:93;:::i;:::-;29033:2;29028:3;29024:12;29017:19;;28676:366;;;:::o;29048:419::-;29214:4;29252:2;29241:9;29237:18;29229:26;;29301:9;29295:4;29291:20;29287:1;29276:9;29272:17;29265:47;29329:131;29455:4;29329:131;:::i;:::-;29321:139;;29048:419;;;:::o;29473:177::-;29613:29;29609:1;29601:6;29597:14;29590:53;29473:177;:::o;29656:366::-;29798:3;29819:67;29883:2;29878:3;29819:67;:::i;:::-;29812:74;;29895:93;29984:3;29895:93;:::i;:::-;30013:2;30008:3;30004:12;29997:19;;29656:366;;;:::o;30028:419::-;30194:4;30232:2;30221:9;30217:18;30209:26;;30281:9;30275:4;30271:20;30267:1;30256:9;30252:17;30245:47;30309:131;30435:4;30309:131;:::i;:::-;30301:139;;30028:419;;;:::o;30453:182::-;30593:34;30589:1;30581:6;30577:14;30570:58;30453:182;:::o;30641:366::-;30783:3;30804:67;30868:2;30863:3;30804:67;:::i;:::-;30797:74;;30880:93;30969:3;30880:93;:::i;:::-;30998:2;30993:3;30989:12;30982:19;;30641:366;;;:::o;31013:419::-;31179:4;31217:2;31206:9;31202:18;31194:26;;31266:9;31260:4;31256:20;31252:1;31241:9;31237:17;31230:47;31294:131;31420:4;31294:131;:::i;:::-;31286:139;;31013:419;;;:::o;31438:305::-;31478:3;31497:20;31515:1;31497:20;:::i;:::-;31492:25;;31531:20;31549:1;31531:20;:::i;:::-;31526:25;;31685:1;31617:66;31613:74;31610:1;31607:81;31604:107;;;31691:18;;:::i;:::-;31604:107;31735:1;31732;31728:9;31721:16;;31438:305;;;;:::o;31749:178::-;31889:30;31885:1;31877:6;31873:14;31866:54;31749:178;:::o;31933:366::-;32075:3;32096:67;32160:2;32155:3;32096:67;:::i;:::-;32089:74;;32172:93;32261:3;32172:93;:::i;:::-;32290:2;32285:3;32281:12;32274:19;;31933:366;;;:::o;32305:419::-;32471:4;32509:2;32498:9;32494:18;32486:26;;32558:9;32552:4;32548:20;32544:1;32533:9;32529:17;32522:47;32586:131;32712:4;32586:131;:::i;:::-;32578:139;;32305:419;;;:::o;32730:177::-;32870:29;32866:1;32858:6;32854:14;32847:53;32730:177;:::o;32913:366::-;33055:3;33076:67;33140:2;33135:3;33076:67;:::i;:::-;33069:74;;33152:93;33241:3;33152:93;:::i;:::-;33270:2;33265:3;33261:12;33254:19;;32913:366;;;:::o;33285:419::-;33451:4;33489:2;33478:9;33474:18;33466:26;;33538:9;33532:4;33528:20;33524:1;33513:9;33509:17;33502:47;33566:131;33692:4;33566:131;:::i;:::-;33558:139;;33285:419;;;:::o;33710:179::-;33850:31;33846:1;33838:6;33834:14;33827:55;33710:179;:::o;33895:366::-;34037:3;34058:67;34122:2;34117:3;34058:67;:::i;:::-;34051:74;;34134:93;34223:3;34134:93;:::i;:::-;34252:2;34247:3;34243:12;34236:19;;33895:366;;;:::o;34267:419::-;34433:4;34471:2;34460:9;34456:18;34448:26;;34520:9;34514:4;34510:20;34506:1;34495:9;34491:17;34484:47;34548:131;34674:4;34548:131;:::i;:::-;34540:139;;34267:419;;;:::o;34692:174::-;34832:26;34828:1;34820:6;34816:14;34809:50;34692:174;:::o;34872:366::-;35014:3;35035:67;35099:2;35094:3;35035:67;:::i;:::-;35028:74;;35111:93;35200:3;35111:93;:::i;:::-;35229:2;35224:3;35220:12;35213:19;;34872:366;;;:::o;35244:419::-;35410:4;35448:2;35437:9;35433:18;35425:26;;35497:9;35491:4;35487:20;35483:1;35472:9;35468:17;35461:47;35525:131;35651:4;35525:131;:::i;:::-;35517:139;;35244:419;;;:::o;35669:172::-;35809:24;35805:1;35797:6;35793:14;35786:48;35669:172;:::o;35847:366::-;35989:3;36010:67;36074:2;36069:3;36010:67;:::i;:::-;36003:74;;36086:93;36175:3;36086:93;:::i;:::-;36204:2;36199:3;36195:12;36188:19;;35847:366;;;:::o;36219:419::-;36385:4;36423:2;36412:9;36408:18;36400:26;;36472:9;36466:4;36462:20;36458:1;36447:9;36443:17;36436:47;36500:131;36626:4;36500:131;:::i;:::-;36492:139;;36219:419;;;:::o;36644:180::-;36784:32;36780:1;36772:6;36768:14;36761:56;36644:180;:::o;36830:366::-;36972:3;36993:67;37057:2;37052:3;36993:67;:::i;:::-;36986:74;;37069:93;37158:3;37069:93;:::i;:::-;37187:2;37182:3;37178:12;37171:19;;36830:366;;;:::o;37202:419::-;37368:4;37406:2;37395:9;37391:18;37383:26;;37455:9;37449:4;37445:20;37441:1;37430:9;37426:17;37419:47;37483:131;37609:4;37483:131;:::i;:::-;37475:139;;37202:419;;;:::o;37627:179::-;37767:31;37763:1;37755:6;37751:14;37744:55;37627:179;:::o;37812:366::-;37954:3;37975:67;38039:2;38034:3;37975:67;:::i;:::-;37968:74;;38051:93;38140:3;38051:93;:::i;:::-;38169:2;38164:3;38160:12;38153:19;;37812:366;;;:::o;38184:419::-;38350:4;38388:2;38377:9;38373:18;38365:26;;38437:9;38431:4;38427:20;38423:1;38412:9;38408:17;38401:47;38465:131;38591:4;38465:131;:::i;:::-;38457:139;;38184:419;;;:::o;38609:234::-;38749:34;38745:1;38737:6;38733:14;38726:58;38818:17;38813:2;38805:6;38801:15;38794:42;38609:234;:::o;38849:366::-;38991:3;39012:67;39076:2;39071:3;39012:67;:::i;:::-;39005:74;;39088:93;39177:3;39088:93;:::i;:::-;39206:2;39201:3;39197:12;39190:19;;38849:366;;;:::o;39221:419::-;39387:4;39425:2;39414:9;39410:18;39402:26;;39474:9;39468:4;39464:20;39460:1;39449:9;39445:17;39438:47;39502:131;39628:4;39502:131;:::i;:::-;39494:139;;39221:419;;;:::o;39646:148::-;39748:11;39785:3;39770:18;;39646:148;;;;:::o;39800:377::-;39906:3;39934:39;39967:5;39934:39;:::i;:::-;39989:89;40071:6;40066:3;39989:89;:::i;:::-;39982:96;;40087:52;40132:6;40127:3;40120:4;40113:5;40109:16;40087:52;:::i;:::-;40164:6;40159:3;40155:16;40148:23;;39910:267;39800:377;;;;:::o;40183:435::-;40363:3;40385:95;40476:3;40467:6;40385:95;:::i;:::-;40378:102;;40497:95;40588:3;40579:6;40497:95;:::i;:::-;40490:102;;40609:3;40602:10;;40183:435;;;;;:::o;40624:169::-;40764:21;40760:1;40752:6;40748:14;40741:45;40624:169;:::o;40799:366::-;40941:3;40962:67;41026:2;41021:3;40962:67;:::i;:::-;40955:74;;41038:93;41127:3;41038:93;:::i;:::-;41156:2;41151:3;41147:12;41140:19;;40799:366;;;:::o;41171:419::-;41337:4;41375:2;41364:9;41360:18;41352:26;;41424:9;41418:4;41414:20;41410:1;41399:9;41395:17;41388:47;41452:131;41578:4;41452:131;:::i;:::-;41444:139;;41171:419;;;:::o;41596:225::-;41736:34;41732:1;41724:6;41720:14;41713:58;41805:8;41800:2;41792:6;41788:15;41781:33;41596:225;:::o;41827:366::-;41969:3;41990:67;42054:2;42049:3;41990:67;:::i;:::-;41983:74;;42066:93;42155:3;42066:93;:::i;:::-;42184:2;42179:3;42175:12;42168:19;;41827:366;;;:::o;42199:419::-;42365:4;42403:2;42392:9;42388:18;42380:26;;42452:9;42446:4;42442:20;42438:1;42427:9;42423:17;42416:47;42480:131;42606:4;42480:131;:::i;:::-;42472:139;;42199:419;;;:::o;42624:231::-;42764:34;42760:1;42752:6;42748:14;42741:58;42833:14;42828:2;42820:6;42816:15;42809:39;42624:231;:::o;42861:366::-;43003:3;43024:67;43088:2;43083:3;43024:67;:::i;:::-;43017:74;;43100:93;43189:3;43100:93;:::i;:::-;43218:2;43213:3;43209:12;43202:19;;42861:366;;;:::o;43233:419::-;43399:4;43437:2;43426:9;43422:18;43414:26;;43486:9;43480:4;43476:20;43472:1;43461:9;43457:17;43450:47;43514:131;43640:4;43514:131;:::i;:::-;43506:139;;43233:419;;;:::o;43658:224::-;43798:34;43794:1;43786:6;43782:14;43775:58;43867:7;43862:2;43854:6;43850:15;43843:32;43658:224;:::o;43888:366::-;44030:3;44051:67;44115:2;44110:3;44051:67;:::i;:::-;44044:74;;44127:93;44216:3;44127:93;:::i;:::-;44245:2;44240:3;44236:12;44229:19;;43888:366;;;:::o;44260:419::-;44426:4;44464:2;44453:9;44449:18;44441:26;;44513:9;44507:4;44503:20;44499:1;44488:9;44484:17;44477:47;44541:131;44667:4;44541:131;:::i;:::-;44533:139;;44260:419;;;:::o;44685:223::-;44825:34;44821:1;44813:6;44809:14;44802:58;44894:6;44889:2;44881:6;44877:15;44870:31;44685:223;:::o;44914:366::-;45056:3;45077:67;45141:2;45136:3;45077:67;:::i;:::-;45070:74;;45153:93;45242:3;45153:93;:::i;:::-;45271:2;45266:3;45262:12;45255:19;;44914:366;;;:::o;45286:419::-;45452:4;45490:2;45479:9;45475:18;45467:26;;45539:9;45533:4;45529:20;45525:1;45514:9;45510:17;45503:47;45567:131;45693:4;45567:131;:::i;:::-;45559:139;;45286:419;;;:::o;45711:191::-;45751:4;45771:20;45789:1;45771:20;:::i;:::-;45766:25;;45805:20;45823:1;45805:20;:::i;:::-;45800:25;;45844:1;45841;45838:8;45835:34;;;45849:18;;:::i;:::-;45835:34;45894:1;45891;45887:9;45879:17;;45711:191;;;;:::o;45908:175::-;46048:27;46044:1;46036:6;46032:14;46025:51;45908:175;:::o;46089:366::-;46231:3;46252:67;46316:2;46311:3;46252:67;:::i;:::-;46245:74;;46328:93;46417:3;46328:93;:::i;:::-;46446:2;46441:3;46437:12;46430:19;;46089:366;;;:::o;46461:419::-;46627:4;46665:2;46654:9;46650:18;46642:26;;46714:9;46708:4;46704:20;46700:1;46689:9;46685:17;46678:47;46742:131;46868:4;46742:131;:::i;:::-;46734:139;;46461:419;;;:::o;46886:237::-;47026:34;47022:1;47014:6;47010:14;47003:58;47095:20;47090:2;47082:6;47078:15;47071:45;46886:237;:::o;47129:366::-;47271:3;47292:67;47356:2;47351:3;47292:67;:::i;:::-;47285:74;;47368:93;47457:3;47368:93;:::i;:::-;47486:2;47481:3;47477:12;47470:19;;47129:366;;;:::o;47501:419::-;47667:4;47705:2;47694:9;47690:18;47682:26;;47754:9;47748:4;47744:20;47740:1;47729:9;47725:17;47718:47;47782:131;47908:4;47782:131;:::i;:::-;47774:139;;47501:419;;;:::o;47926:176::-;47958:1;47975:20;47993:1;47975:20;:::i;:::-;47970:25;;48009:20;48027:1;48009:20;:::i;:::-;48004:25;;48048:1;48038:35;;48053:18;;:::i;:::-;48038:35;48094:1;48091;48087:9;48082:14;;47926:176;;;;:::o;48108:98::-;48159:6;48193:5;48187:12;48177:22;;48108:98;;;:::o;48212:168::-;48295:11;48329:6;48324:3;48317:19;48369:4;48364:3;48360:14;48345:29;;48212:168;;;;:::o;48386:360::-;48472:3;48500:38;48532:5;48500:38;:::i;:::-;48554:70;48617:6;48612:3;48554:70;:::i;:::-;48547:77;;48633:52;48678:6;48673:3;48666:4;48659:5;48655:16;48633:52;:::i;:::-;48710:29;48732:6;48710:29;:::i;:::-;48705:3;48701:39;48694:46;;48476:270;48386:360;;;;:::o;48752:640::-;48947:4;48985:3;48974:9;48970:19;48962:27;;48999:71;49067:1;49056:9;49052:17;49043:6;48999:71;:::i;:::-;49080:72;49148:2;49137:9;49133:18;49124:6;49080:72;:::i;:::-;49162;49230:2;49219:9;49215:18;49206:6;49162:72;:::i;:::-;49281:9;49275:4;49271:20;49266:2;49255:9;49251:18;49244:48;49309:76;49380:4;49371:6;49309:76;:::i;:::-;49301:84;;48752:640;;;;;;;:::o;49398:141::-;49454:5;49485:6;49479:13;49470:22;;49501:32;49527:5;49501:32;:::i;:::-;49398:141;;;;:::o;49545:349::-;49614:6;49663:2;49651:9;49642:7;49638:23;49634:32;49631:119;;;49669:79;;:::i;:::-;49631:119;49789:1;49814:63;49869:7;49860:6;49849:9;49845:22;49814:63;:::i;:::-;49804:73;;49760:127;49545:349;;;;:::o;49900:182::-;50040:34;50036:1;50028:6;50024:14;50017:58;49900:182;:::o;50088:366::-;50230:3;50251:67;50315:2;50310:3;50251:67;:::i;:::-;50244:74;;50327:93;50416:3;50327:93;:::i;:::-;50445:2;50440:3;50436:12;50429:19;;50088:366;;;:::o;50460:419::-;50626:4;50664:2;50653:9;50649:18;50641:26;;50713:9;50707:4;50703:20;50699:1;50688:9;50684:17;50677:47;50741:131;50867:4;50741:131;:::i;:::-;50733:139;;50460:419;;;:::o;50885:178::-;51025:30;51021:1;51013:6;51009:14;51002:54;50885:178;:::o;51069:366::-;51211:3;51232:67;51296:2;51291:3;51232:67;:::i;:::-;51225:74;;51308:93;51397:3;51308:93;:::i;:::-;51426:2;51421:3;51417:12;51410:19;;51069:366;;;:::o;51441:419::-;51607:4;51645:2;51634:9;51630:18;51622:26;;51694:9;51688:4;51684:20;51680:1;51669:9;51665:17;51658:47;51722:131;51848:4;51722:131;:::i;:::-;51714:139;;51441:419;;;:::o

Swarm Source

ipfs://13dea211bc94b666234f049371fc8fe57ac8e9f130d43b61becf337d380e8454
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.