ETH Price: $3,321.56 (-4.05%)

Token

Perilous Petz (PP)
 

Overview

Max Total Supply

2,555 PP

Holders

905

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 PP
0x08A8B8927EE18B93361f2AAf1f45A913e2DAf472
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:
PerilousPetz

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

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

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

contract PerilousPetz is ERC721Enumerable, Ownable {
  uint256 public mintPrice = 0.1 ether;

  uint256 private reserveAtATime = 46;
  uint256 private reservedCount = 0;
  uint256 private maxReserveCount = 276;

  string _baseTokenURI;

  bool public isActive = false;
  bool public isPresaleActive = false;

  uint256 public MAX_SUPPLY = 7777;
  
  uint256 public maximumAllowedTokensPerPurchase = 10;
  uint256 public maximumAllowedTokensPerWallet = 13;

  uint256 public presaleMaximumAllowedTokensPerPurchase = 3;
  uint256 public presaleMaximumAllowedTokensPerWallet = 3;

  address private Address1 = 0x11DCfdE283595A7A44a065e125E3d52Dc2b36C53;
  address private Address2 = 0x5E4997D9a50703D4A9ddDe45A92f18571B2eaB1F;
  address private Address3 = 0x40BF1eE0a55806bef48C42508BD84743af5298b4;
  address private Address4 = 0xD59e926bF0919c25D2F6be530371d682636493b0;
  address private ReservationAddress = 0x3D0b7B7B5712572b4cB8b7D31c513A810b35DeaE;

  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("Perilous Petz", "PP") {
    setBaseURI(baseURI);
  }

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

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

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

  function setPresaleMaximumAllowedTokensPerPurchase(uint256 _count) public onlyAuthorized {
    presaleMaximumAllowedTokensPerPurchase = _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 setPresaleAllowedTokensPerWallet(uint256 maxMint) external  onlyAuthorized {
    presaleMaximumAllowedTokensPerWallet = maxMint;
  }

  function addToWhiteList(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 checkIfOnWhiteList(address addr) external view returns (bool) {
    return _allowList[addr];
  }

  function removeFromWhiteList(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 setBaseURI(string memory baseURI) public onlyAuthorized {
    _baseTokenURI = baseURI;
  }


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

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

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

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

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

  function mint(uint256 _count) public payable saleIsOpen {
    if (msg.sender != owner()) {
      require(isActive, "Sale is not active currently.");
      require(balanceOf(msg.sender) + _count <= maximumAllowedTokensPerWallet, "Max holding cap reached.");
    }


    require(totalSupply() + _count <= MAX_SUPPLY, "Total supply exceeded.");
    require(totalSupply() <= MAX_SUPPLY, "Total supply spent.");
    require(
      _count <= maximumAllowedTokensPerPurchase,
      "Exceeds maximum allowed tokens"
    );

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

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

  function batchReserveToMultipleAddresses(uint256 _count, address[] calldata addresses) external onlyAuthorized {
    uint256 supply = totalSupply();

    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++) {
        emit AssetMinted(totalSupply(), addresses[i]);
        _safeMint(addresses[i], totalSupply());
      }
    }
  }

  function preSaleMint(uint256 _count) public payable saleIsOpen {
    require(isPresaleActive, 'Allow List is not active');
    require(_allowList[msg.sender], 'You are not on the Allow List');
    require(totalSupply() < MAX_SUPPLY, 'All tokens have been minted');
    
    require(_count <= presaleMaximumAllowedTokensPerPurchase, 'Cannot purchase this many tokens');
    
    require(_allowListClaimed[msg.sender] + _count <= presaleMaximumAllowedTokensPerWallet, 'Purchase exceeds max allowed');
    
    require(msg.value >= mintPrice * _count, 'Insuffient ETH amount sent.');

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

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

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

  function withdraw() external onlyAuthorized {
    uint balance = address(this).balance;

    payable(Address1).transfer(balance * 2500 / 10000);
    payable(Address2).transfer(balance * 2500 / 10000);
    payable(Address3).transfer(balance * 2500 / 10000);
    payable(Address4).transfer(balance * 2500 / 10000);
    
  }

  function emergencePartialWithdraw() external onlyAuthorized {
      uint balance = address(this).balance;
      payable(Address1).transfer(balance * 1250 / 10000);
      payable(Address2).transfer(balance * 1250 / 10000);
      payable(Address3).transfer(balance * 1250 / 10000);
      payable(Address4).transfer(balance * 1250 / 10000);
  }

}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"}],"name":"AssetMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"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":"addToWhiteList","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":[{"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":"checkIfOnWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencePartialWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserveAtATime","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":"presaleMaximumAllowedTokensPerPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleMaximumAllowedTokensPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromWhiteList","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":"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":"setMaximumAllowedTokensPerPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaximumAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"setPresaleAllowedTokensPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setPresaleMaximumAllowedTokensPerPurchase","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600b55602e600c556000600d55610114600e556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550611e61601155600a601255600d601355600360145560036015557311dcfde283595a7a44a065e125e3d52dc2b36c53601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735e4997d9a50703d4a9ddde45a92f18571b2eab1f601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507340bf1ee0a55806bef48c42508bd84743af5298b4601860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073d59e926bf0919c25d2f6be530371d682636493b0601960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550733d0b7b7b5712572b4cb8b7d31c513a810b35deae601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200022657600080fd5b506040516200659b3803806200659b83398181016040528101906200024c9190620006cd565b6040518060400160405280600d81526020017f506572696c6f7573205065747a000000000000000000000000000000000000008152506040518060400160405280600281526020017f50500000000000000000000000000000000000000000000000000000000000008152508160009080519060200190620002d092919062000480565b508060019080519060200190620002e992919062000480565b5050506200030c620003006200032460201b60201c565b6200032c60201b60201c565b6200031d81620003f260201b60201c565b5062000783565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b3373ffffffffffffffffffffffffffffffffffffffff16620004196200045660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200043a57600080fd5b80600f90805190602001906200045292919062000480565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200048e906200074d565b90600052602060002090601f016020900481019282620004b25760008555620004fe565b82601f10620004cd57805160ff1916838001178555620004fe565b82800160010185558215620004fe579182015b82811115620004fd578251825591602001919060010190620004e0565b5b5090506200050d919062000511565b5090565b5b808211156200052c57600081600090555060010162000512565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000599826200054e565b810181811067ffffffffffffffff82111715620005bb57620005ba6200055f565b5b80604052505050565b6000620005d062000530565b9050620005de82826200058e565b919050565b600067ffffffffffffffff8211156200060157620006006200055f565b5b6200060c826200054e565b9050602081019050919050565b60005b83811015620006395780820151818401526020810190506200061c565b8381111562000649576000848401525b50505050565b6000620006666200066084620005e3565b620005c4565b90508281526020810184848401111562000685576200068462000549565b5b6200069284828562000619565b509392505050565b600082601f830112620006b257620006b162000544565b5b8151620006c48482602086016200064f565b91505092915050565b600060208284031215620006e657620006e56200053a565b5b600082015167ffffffffffffffff8111156200070757620007066200053f565b5b62000715848285016200069a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200076657607f821691505b602082108114156200077d576200077c6200071e565b5b50919050565b615e0880620007936000396000f3fe6080604052600436106102e35760003560e01c8063740d73f311610190578063b88d4fde116100dc578063e82b2a7111610095578063f2fde38b1161006f578063f2fde38b14610b15578063f384ef7414610b3e578063f5b7da9b14610b55578063f6c9d9e314610b7e576102e3565b8063e82b2a7114610a86578063e985e9c514610aaf578063ea6eb83614610aec576102e3565b8063b88d4fde14610974578063c87b56dd1461099d578063cadf8818146109da578063d084679c14610a05578063d9ff2c5f14610a30578063e7b62d9614610a5b576102e3565b806395d89b4111610149578063a22cb46511610123578063a22cb465146108d0578063acec338a146108f9578063b11560c514610922578063b601be431461094b576102e3565b806395d89b411461085e5780639a3bf72814610889578063a0712d68146108b4576102e3565b8063740d73f31461075f57806377b501b9146107885780637835c635146107b15780637cc07589146107cd5780638da5cb5b1461080a57806391b7f5ed14610835576102e3565b8063438b63001161024f5780636352211e11610208578063715018a6116101e2578063715018a6146106df57806371e3500c146106f657806372d07eed1461070d5780637389fbb714610736576102e3565b80636352211e1461063a5780636817c76c1461067757806370a08231146106a2576102e3565b8063438b63001461051a5780634f6ccce71461055757806354eae7341461059457806355f804b3146105bd57806356a87caa146105e657806360d938dc1461060f576102e3565b806322f3e2d4116102a157806322f3e2d41461041e57806323b872dd146104495780632f745c591461047257806332cb6b0c146104af5780633ccfd60b146104da57806342842e0e146104f1576102e3565b806208ffdd146102e857806301ffc9a71461032557806306fdde0314610362578063081812fc1461038d578063095ea7b3146103ca57806318160ddd146103f3575b600080fd5b3480156102f457600080fd5b5061030f600480360381019061030a9190614165565b610ba7565b60405161031c91906141ab565b60405180910390f35b34801561033157600080fd5b5061034c6004803603810190610347919061421e565b610c5f565b6040516103599190614266565b60405180910390f35b34801561036e57600080fd5b50610377610cd9565b604051610384919061431a565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190614368565b610d6b565b6040516103c191906143a4565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906143bf565b610df0565b005b3480156103ff57600080fd5b50610408610f08565b60405161041591906141ab565b60405180910390f35b34801561042a57600080fd5b50610433610f15565b6040516104409190614266565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906143ff565b610f28565b005b34801561047e57600080fd5b50610499600480360381019061049491906143bf565b610f88565b6040516104a691906141ab565b60405180910390f35b3480156104bb57600080fd5b506104c461102d565b6040516104d191906141ab565b60405180910390f35b3480156104e657600080fd5b506104ef611033565b005b3480156104fd57600080fd5b50610518600480360381019061051391906143ff565b611286565b005b34801561052657600080fd5b50610541600480360381019061053c9190614165565b6112a6565b60405161054e9190614510565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190614368565b611354565b60405161058b91906141ab565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b6919061455e565b6113c5565b005b3480156105c957600080fd5b506105e460048036038101906105df91906146c0565b611421565b005b3480156105f257600080fd5b5061060d60048036038101906106089190614368565b61147a565b005b34801561061b57600080fd5b506106246114c3565b6040516106319190614266565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190614368565b6114d6565b60405161066e91906143a4565b60405180910390f35b34801561068357600080fd5b5061068c611588565b60405161069991906141ab565b60405180910390f35b3480156106ae57600080fd5b506106c960048036038101906106c49190614165565b61158e565b6040516106d691906141ab565b60405180910390f35b3480156106eb57600080fd5b506106f4611646565b005b34801561070257600080fd5b5061070b6116ce565b005b34801561071957600080fd5b50610734600480360381019061072f9190614368565b611839565b005b34801561074257600080fd5b5061075d60048036038101906107589190614368565b611882565b005b34801561076b57600080fd5b5061078660048036038101906107819190614769565b6118cb565b005b34801561079457600080fd5b506107af60048036038101906107aa91906143bf565b611b24565b005b6107cb60048036038101906107c69190614368565b611bd7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190614165565b611f37565b6040516108019190614266565b60405180910390f35b34801561081657600080fd5b5061081f611f8d565b60405161082c91906143a4565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190614368565b611fb7565b005b34801561086a57600080fd5b50610873612000565b604051610880919061431a565b60405180910390f35b34801561089557600080fd5b5061089e612092565b6040516108ab91906141ab565b60405180910390f35b6108ce60048036038101906108c99190614368565b612098565b005b3480156108dc57600080fd5b506108f760048036038101906108f291906147b6565b612371565b005b34801561090557600080fd5b50610920600480360381019061091b919061455e565b612387565b005b34801561092e57600080fd5b5061094960048036038101906109449190614769565b61241a565b005b34801561095757600080fd5b50610972600480360381019061096d9190614368565b612595565b005b34801561098057600080fd5b5061099b60048036038101906109969190614897565b6125de565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190614368565b612640565b6040516109d1919061431a565b60405180910390f35b3480156109e657600080fd5b506109ef6126e7565b6040516109fc91906141ab565b60405180910390f35b348015610a1157600080fd5b50610a1a6126ed565b604051610a2791906141ab565b60405180910390f35b348015610a3c57600080fd5b50610a456126f3565b604051610a5291906141ab565b60405180910390f35b348015610a6757600080fd5b50610a706126f9565b604051610a7d91906141ab565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa8919061491a565b612703565b005b348015610abb57600080fd5b50610ad66004803603810190610ad1919061497a565b612960565b604051610ae39190614266565b60405180910390f35b348015610af857600080fd5b50610b136004803603810190610b0e9190614368565b6129f4565b005b348015610b2157600080fd5b50610b3c6004803603810190610b379190614165565b612a3d565b005b348015610b4a57600080fd5b50610b53612b35565b005b348015610b6157600080fd5b50610b7c6004803603810190610b779190614368565b612d88565b005b348015610b8a57600080fd5b50610ba56004803603810190610ba09190614368565b612dd1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0f90614a06565b60405180910390fd5b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cd25750610cd182612e1a565b5b9050919050565b606060008054610ce890614a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1490614a55565b8015610d615780601f10610d3657610100808354040283529160200191610d61565b820191906000526020600020905b815481529060010190602001808311610d4457829003601f168201915b5050505050905090565b6000610d7682612efc565b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614af9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dfb826114d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614b8b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e8b612f68565b73ffffffffffffffffffffffffffffffffffffffff161480610eba5750610eb981610eb4612f68565b612960565b5b610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090614c1d565b60405180910390fd5b610f038383612f70565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610f39610f33612f68565b82613029565b610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f90614caf565b60405180910390fd5b610f83838383613107565b505050565b6000610f938361158e565b8210610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90614d41565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b3373ffffffffffffffffffffffffffffffffffffffff16611052611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461107257600080fd5b6000479050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4846110c49190614d90565b6110ce9190614e19565b9081150290604051600060405180830381858888f193505050501580156110f9573d6000803e3d6000fd5b50601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4846111479190614d90565b6111519190614e19565b9081150290604051600060405180830381858888f1935050505015801561117c573d6000803e3d6000fd5b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4846111ca9190614d90565b6111d49190614e19565b9081150290604051600060405180830381858888f193505050501580156111ff573d6000803e3d6000fd5b50601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c48461124d9190614d90565b6112579190614e19565b9081150290604051600060405180830381858888f19350505050158015611282573d6000803e3d6000fd5b5050565b6112a1838383604051806020016040528060008152506125de565b505050565b606060006112b38361158e565b905060008167ffffffffffffffff8111156112d1576112d0614595565b5b6040519080825280602002602001820160405280156112ff5781602001602082028036833780820191505090505b50905060005b82811015611349576113178582610f88565b82828151811061132a57611329614e4a565b5b602002602001018181525050808061134190614e79565b915050611305565b508092505050919050565b600061135e610f08565b821061139f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139690614f34565b60405180910390fd5b600882815481106113b3576113b2614e4a565b5b90600052602060002001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff166113e4611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461140457600080fd5b80601060016101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16611440611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461146057600080fd5b80600f9080519060200190611476929190614050565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611499611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146114b957600080fd5b80600e8190555050565b601060019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614fc6565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690615058565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164e612f68565b73ffffffffffffffffffffffffffffffffffffffff1661166c611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906150c4565b60405180910390fd5b6116cc6000613363565b565b3373ffffffffffffffffffffffffffffffffffffffff166116ed611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461170d57600080fd5b600e54600d541115611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90615130565b60405180910390fd5b600061175e610f08565b905060005b600c54811015611835577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355818361179a9190615150565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516117cb9291906151a6565b60405180910390a161180a601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682846118059190615150565b613429565b600d600081548092919061181d90614e79565b9190505550808061182d90614e79565b915050611763565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611858611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461187857600080fd5b8060148190555050565b3373ffffffffffffffffffffffffffffffffffffffff166118a1611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146118c157600080fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff166118ea611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461190a57600080fd5b60005b82829050811015611b1f57600073ffffffffffffffffffffffffffffffffffffffff1683838381811061194357611942614e4a565b5b90506020020160208101906119589190614165565b73ffffffffffffffffffffffffffffffffffffffff1614156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a69061521b565b60405180910390fd5b6001601b60008585858181106119c8576119c7614e4a565b5b90506020020160208101906119dd9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c6000858585818110611a4757611a46614e4a565b5b9050602002016020810190611a5c9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611aa3576000611b0b565b601c6000848484818110611aba57611ab9614e4a565b5b9050602002016020810190611acf9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611b1790614e79565b91505061190d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b43611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614611b6357600080fd5b60005b81811015611bd2577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355611b97610f08565b84604051611ba69291906151a6565b60405180910390a1611bbf83611bba610f08565b613429565b8080611bca90614e79565b915050611b66565b505050565b601154611be2610f08565b1115611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90615287565b60405180910390fd5b601060019054906101000a900460ff16611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c69906152f3565b60405180910390fd5b601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf59061535f565b60405180910390fd5b601154611d09610f08565b10611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d40906153cb565b60405180910390fd5b601454811115611d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8590615437565b60405180910390fd5b60155481601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ddc9190615150565b1115611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e14906154a3565b60405180910390fd5b80600b54611e2b9190614d90565b341015611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e649061550f565b60405180910390fd5b60005b81811015611f33576001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec89190615150565b925050819055507f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355611ef8610f08565b33604051611f079291906151a6565b60405180910390a1611f2033611f1b610f08565b613429565b8080611f2b90614e79565b915050611e70565b5050565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611fd6611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614611ff657600080fd5b80600b8190555050565b60606001805461200f90614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461203b90614a55565b80156120885780601f1061205d57610100808354040283529160200191612088565b820191906000526020600020905b81548152906001019060200180831161206b57829003601f168201915b5050505050905090565b60125481565b6011546120a3610f08565b11156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90615287565b60405180910390fd5b6120ec611f8d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121c657601060009054906101000a900460ff1661216d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121649061557b565b60405180910390fd5b6013548161217a3361158e565b6121849190615150565b11156121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc906155e7565b60405180910390fd5b5b601154816121d2610f08565b6121dc9190615150565b111561221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490615653565b60405180910390fd5b601154612228610f08565b1115612269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612260906156bf565b60405180910390fd5b6012548111156122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a59061572b565b60405180910390fd5b80600b546122bc9190614d90565b3410156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f59061550f565b60405180910390fd5b60005b8181101561236d577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355612332610f08565b336040516123419291906151a6565b60405180910390a161235a33612355610f08565b613429565b808061236590614e79565b915050612301565b5050565b61238361237c612f68565b8383613447565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166123a6611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146123c657600080fd5b80601060006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f8160405161240f9190614266565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff16612439611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461245957600080fd5b60005b8282905081101561259057600073ffffffffffffffffffffffffffffffffffffffff1683838381811061249257612491614e4a565b5b90506020020160208101906124a79190614165565b73ffffffffffffffffffffffffffffffffffffffff1614156124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f59061521b565b60405180910390fd5b6000601b600085858581811061251757612516614e4a565b5b905060200201602081019061252c9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061258890614e79565b91505061245c565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166125b4611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146125d457600080fd5b8060128190555050565b6125ef6125e9612f68565b83613029565b61262e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262590614caf565b60405180910390fd5b61263a848484846135b4565b50505050565b606061264b82612efc565b61268a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612681906157bd565b60405180910390fd5b6000612694613610565b905060008151116126b457604051806020016040528060008152506126df565b806126be846136a2565b6040516020016126cf929190615819565b6040516020818303038152906040525b915050919050565b60135481565b60145481565b60155481565b6000600c54905090565b3373ffffffffffffffffffffffffffffffffffffffff16612722611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461274257600080fd5b600061274c610f08565b9050601154848261275d9190615150565b111561279e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279590615653565b60405180910390fd5b6011548111156127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da906156bf565b60405180910390fd5b60005b8383905081101561295957600073ffffffffffffffffffffffffffffffffffffffff1684848381811061281c5761281b614e4a565b5b90506020020160208101906128319190614165565b73ffffffffffffffffffffffffffffffffffffffff161415612888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287f9061521b565b60405180910390fd5b60005b85811015612945577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556128bc610f08565b8686858181106128cf576128ce614e4a565b5b90506020020160208101906128e49190614165565b6040516128f29291906151a6565b60405180910390a16129328585848181106129105761290f614e4a565b5b90506020020160208101906129259190614165565b61292d610f08565b613429565b808061293d90614e79565b91505061288b565b50808061295190614e79565b9150506127e6565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16612a13611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612a3357600080fd5b8060138190555050565b612a45612f68565b73ffffffffffffffffffffffffffffffffffffffff16612a63611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab0906150c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b20906158af565b60405180910390fd5b612b3281613363565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612b54611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612b7457600080fd5b6000479050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612bc69190614d90565b612bd09190614e19565b9081150290604051600060405180830381858888f19350505050158015612bfb573d6000803e3d6000fd5b50601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612c499190614d90565b612c539190614e19565b9081150290604051600060405180830381858888f19350505050158015612c7e573d6000803e3d6000fd5b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612ccc9190614d90565b612cd69190614e19565b9081150290604051600060405180830381858888f19350505050158015612d01573d6000803e3d6000fd5b50601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612d4f9190614d90565b612d599190614e19565b9081150290604051600060405180830381858888f19350505050158015612d84573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff16612da7611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612dc757600080fd5b8060158190555050565b3373ffffffffffffffffffffffffffffffffffffffff16612df0611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612e1057600080fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ee557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ef55750612ef482613803565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612fe3836114d6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061303482612efc565b613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a90615941565b60405180910390fd5b600061307e836114d6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806130ed57508373ffffffffffffffffffffffffffffffffffffffff166130d584610d6b565b73ffffffffffffffffffffffffffffffffffffffff16145b806130fe57506130fd8185612960565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16613127826114d6565b73ffffffffffffffffffffffffffffffffffffffff161461317d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613174906159d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e490615a65565b60405180910390fd5b6131f883838361386d565b613203600082612f70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132539190615a85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132aa9190615150565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613443828260405180602001604052806000815250613981565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ad90615b05565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135a79190614266565b60405180910390a3505050565b6135bf848484613107565b6135cb848484846139dc565b61360a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360190615b97565b60405180910390fd5b50505050565b6060600f805461361f90614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461364b90614a55565b80156136985780601f1061366d57610100808354040283529160200191613698565b820191906000526020600020905b81548152906001019060200180831161367b57829003601f168201915b5050505050905090565b606060008214156136ea576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506137fe565b600082905060005b6000821461371c57808061370590614e79565b915050600a826137159190614e19565b91506136f2565b60008167ffffffffffffffff81111561373857613737614595565b5b6040519080825280601f01601f19166020018201604052801561376a5781602001600182028036833780820191505090505b5090505b600085146137f7576001826137839190615a85565b9150600a856137929190615bb7565b603061379e9190615150565b60f81b8183815181106137b4576137b3614e4a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137f09190614e19565b945061376e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613878838383613b64565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138bb576138b681613b69565b6138fa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138f9576138f88382613bb2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393d5761393881613d1f565b61397c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461397b5761397a8282613df0565b5b5b505050565b61398b8383613e6f565b61399860008484846139dc565b6139d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ce90615b97565b60405180910390fd5b505050565b60006139fd8473ffffffffffffffffffffffffffffffffffffffff1661403d565b15613b57578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a26612f68565b8786866040518563ffffffff1660e01b8152600401613a489493929190615c3d565b6020604051808303816000875af1925050508015613a8457506040513d601f19601f82011682018060405250810190613a819190615c9e565b60015b613b07573d8060008114613ab4576040519150601f19603f3d011682016040523d82523d6000602084013e613ab9565b606091505b50600081511415613aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613af690615b97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b5c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613bbf8461158e565b613bc99190615a85565b9050600060076000848152602001908152602001600020549050818114613cae576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d339190615a85565b9050600060096000848152602001908152602001600020549050600060088381548110613d6357613d62614e4a565b5b906000526020600020015490508060088381548110613d8557613d84614e4a565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613dd457613dd3615ccb565b5b6001900381819060005260206000200160009055905550505050565b6000613dfb8361158e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ed690615d46565b60405180910390fd5b613ee881612efc565b15613f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f1f90615db2565b60405180910390fd5b613f346000838361386d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f849190615150565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461405c90614a55565b90600052602060002090601f01602090048101928261407e57600085556140c5565b82601f1061409757805160ff19168380011785556140c5565b828001600101855582156140c5579182015b828111156140c45782518255916020019190600101906140a9565b5b5090506140d291906140d6565b5090565b5b808211156140ef5760008160009055506001016140d7565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061413282614107565b9050919050565b61414281614127565b811461414d57600080fd5b50565b60008135905061415f81614139565b92915050565b60006020828403121561417b5761417a6140fd565b5b600061418984828501614150565b91505092915050565b6000819050919050565b6141a581614192565b82525050565b60006020820190506141c0600083018461419c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141fb816141c6565b811461420657600080fd5b50565b600081359050614218816141f2565b92915050565b600060208284031215614234576142336140fd565b5b600061424284828501614209565b91505092915050565b60008115159050919050565b6142608161424b565b82525050565b600060208201905061427b6000830184614257565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142bb5780820151818401526020810190506142a0565b838111156142ca576000848401525b50505050565b6000601f19601f8301169050919050565b60006142ec82614281565b6142f6818561428c565b935061430681856020860161429d565b61430f816142d0565b840191505092915050565b6000602082019050818103600083015261433481846142e1565b905092915050565b61434581614192565b811461435057600080fd5b50565b6000813590506143628161433c565b92915050565b60006020828403121561437e5761437d6140fd565b5b600061438c84828501614353565b91505092915050565b61439e81614127565b82525050565b60006020820190506143b96000830184614395565b92915050565b600080604083850312156143d6576143d56140fd565b5b60006143e485828601614150565b92505060206143f585828601614353565b9150509250929050565b600080600060608486031215614418576144176140fd565b5b600061442686828701614150565b935050602061443786828701614150565b925050604061444886828701614353565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61448781614192565b82525050565b6000614499838361447e565b60208301905092915050565b6000602082019050919050565b60006144bd82614452565b6144c7818561445d565b93506144d28361446e565b8060005b838110156145035781516144ea888261448d565b97506144f5836144a5565b9250506001810190506144d6565b5085935050505092915050565b6000602082019050818103600083015261452a81846144b2565b905092915050565b61453b8161424b565b811461454657600080fd5b50565b60008135905061455881614532565b92915050565b600060208284031215614574576145736140fd565b5b600061458284828501614549565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145cd826142d0565b810181811067ffffffffffffffff821117156145ec576145eb614595565b5b80604052505050565b60006145ff6140f3565b905061460b82826145c4565b919050565b600067ffffffffffffffff82111561462b5761462a614595565b5b614634826142d0565b9050602081019050919050565b82818337600083830152505050565b600061466361465e84614610565b6145f5565b90508281526020810184848401111561467f5761467e614590565b5b61468a848285614641565b509392505050565b600082601f8301126146a7576146a661458b565b5b81356146b7848260208601614650565b91505092915050565b6000602082840312156146d6576146d56140fd565b5b600082013567ffffffffffffffff8111156146f4576146f3614102565b5b61470084828501614692565b91505092915050565b600080fd5b600080fd5b60008083601f8401126147295761472861458b565b5b8235905067ffffffffffffffff81111561474657614745614709565b5b6020830191508360208202830111156147625761476161470e565b5b9250929050565b600080602083850312156147805761477f6140fd565b5b600083013567ffffffffffffffff81111561479e5761479d614102565b5b6147aa85828601614713565b92509250509250929050565b600080604083850312156147cd576147cc6140fd565b5b60006147db85828601614150565b92505060206147ec85828601614549565b9150509250929050565b600067ffffffffffffffff82111561481157614810614595565b5b61481a826142d0565b9050602081019050919050565b600061483a614835846147f6565b6145f5565b90508281526020810184848401111561485657614855614590565b5b614861848285614641565b509392505050565b600082601f83011261487e5761487d61458b565b5b813561488e848260208601614827565b91505092915050565b600080600080608085870312156148b1576148b06140fd565b5b60006148bf87828801614150565b94505060206148d087828801614150565b93505060406148e187828801614353565b925050606085013567ffffffffffffffff81111561490257614901614102565b5b61490e87828801614869565b91505092959194509250565b600080600060408486031215614933576149326140fd565b5b600061494186828701614353565b935050602084013567ffffffffffffffff81111561496257614961614102565b5b61496e86828701614713565b92509250509250925092565b60008060408385031215614991576149906140fd565b5b600061499f85828601614150565b92505060206149b085828601614150565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b60006149f0601e8361428c565b91506149fb826149ba565b602082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a6d57607f821691505b60208210811415614a8157614a80614a26565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614ae3602c8361428c565b9150614aee82614a87565b604082019050919050565b60006020820190508181036000830152614b1281614ad6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b7560218361428c565b9150614b8082614b19565b604082019050919050565b60006020820190508181036000830152614ba481614b68565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614c0760388361428c565b9150614c1282614bab565b604082019050919050565b60006020820190508181036000830152614c3681614bfa565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614c9960318361428c565b9150614ca482614c3d565b604082019050919050565b60006020820190508181036000830152614cc881614c8c565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614d2b602b8361428c565b9150614d3682614ccf565b604082019050919050565b60006020820190508181036000830152614d5a81614d1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d9b82614192565b9150614da683614192565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ddf57614dde614d61565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e2482614192565b9150614e2f83614192565b925082614e3f57614e3e614dea565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e8482614192565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eb757614eb6614d61565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614f1e602c8361428c565b9150614f2982614ec2565b604082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614fb060298361428c565b9150614fbb82614f54565b604082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615042602a8361428c565b915061504d82614fe6565b604082019050919050565b6000602082019050818103600083015261507181615035565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150ae60208361428c565b91506150b982615078565b602082019050919050565b600060208201905081810360008301526150dd816150a1565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b600061511a601b8361428c565b9150615125826150e4565b602082019050919050565b600060208201905081810360008301526151498161510d565b9050919050565b600061515b82614192565b915061516683614192565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561519b5761519a614d61565b5b828201905092915050565b60006040820190506151bb600083018561419c565b6151c86020830184614395565b9392505050565b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b600061520560188361428c565b9150615210826151cf565b602082019050919050565b60006020820190508181036000830152615234816151f8565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000615271600f8361428c565b915061527c8261523b565b602082019050919050565b600060208201905081810360008301526152a081615264565b9050919050565b7f416c6c6f77204c697374206973206e6f74206163746976650000000000000000600082015250565b60006152dd60188361428c565b91506152e8826152a7565b602082019050919050565b6000602082019050818103600083015261530c816152d0565b9050919050565b7f596f7520617265206e6f74206f6e2074686520416c6c6f77204c697374000000600082015250565b6000615349601d8361428c565b915061535482615313565b602082019050919050565b600060208201905081810360008301526153788161533c565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006153b5601b8361428c565b91506153c08261537f565b602082019050919050565b600060208201905081810360008301526153e4816153a8565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b600061542160208361428c565b915061542c826153eb565b602082019050919050565b6000602082019050818103600083015261545081615414565b9050919050565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b600061548d601c8361428c565b915061549882615457565b602082019050919050565b600060208201905081810360008301526154bc81615480565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b60006154f9601b8361428c565b9150615504826154c3565b602082019050919050565b60006020820190508181036000830152615528816154ec565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b6000615565601d8361428c565b91506155708261552f565b602082019050919050565b6000602082019050818103600083015261559481615558565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b60006155d160188361428c565b91506155dc8261559b565b602082019050919050565b60006020820190508181036000830152615600816155c4565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b600061563d60168361428c565b915061564882615607565b602082019050919050565b6000602082019050818103600083015261566c81615630565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b60006156a960138361428c565b91506156b482615673565b602082019050919050565b600060208201905081810360008301526156d88161569c565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000615715601e8361428c565b9150615720826156df565b602082019050919050565b6000602082019050818103600083015261574481615708565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006157a7602f8361428c565b91506157b28261574b565b604082019050919050565b600060208201905081810360008301526157d68161579a565b9050919050565b600081905092915050565b60006157f382614281565b6157fd81856157dd565b935061580d81856020860161429d565b80840191505092915050565b600061582582856157e8565b915061583182846157e8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061589960268361428c565b91506158a48261583d565b604082019050919050565b600060208201905081810360008301526158c88161588c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061592b602c8361428c565b9150615936826158cf565b604082019050919050565b6000602082019050818103600083015261595a8161591e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006159bd60298361428c565b91506159c882615961565b604082019050919050565b600060208201905081810360008301526159ec816159b0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615a4f60248361428c565b9150615a5a826159f3565b604082019050919050565b60006020820190508181036000830152615a7e81615a42565b9050919050565b6000615a9082614192565b9150615a9b83614192565b925082821015615aae57615aad614d61565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615aef60198361428c565b9150615afa82615ab9565b602082019050919050565b60006020820190508181036000830152615b1e81615ae2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b8160328361428c565b9150615b8c82615b25565b604082019050919050565b60006020820190508181036000830152615bb081615b74565b9050919050565b6000615bc282614192565b9150615bcd83614192565b925082615bdd57615bdc614dea565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000615c0f82615be8565b615c198185615bf3565b9350615c2981856020860161429d565b615c32816142d0565b840191505092915050565b6000608082019050615c526000830187614395565b615c5f6020830186614395565b615c6c604083018561419c565b8181036060830152615c7e8184615c04565b905095945050505050565b600081519050615c98816141f2565b92915050565b600060208284031215615cb457615cb36140fd565b5b6000615cc284828501615c89565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d3060208361428c565b9150615d3b82615cfa565b602082019050919050565b60006020820190508181036000830152615d5f81615d23565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d9c601c8361428c565b9150615da782615d66565b602082019050919050565b60006020820190508181036000830152615dcb81615d8f565b905091905056fea26469706673582212203fab91cff578928b6268f77605553c023a95c316ed6eca38a265d71048de59dd64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102e35760003560e01c8063740d73f311610190578063b88d4fde116100dc578063e82b2a7111610095578063f2fde38b1161006f578063f2fde38b14610b15578063f384ef7414610b3e578063f5b7da9b14610b55578063f6c9d9e314610b7e576102e3565b8063e82b2a7114610a86578063e985e9c514610aaf578063ea6eb83614610aec576102e3565b8063b88d4fde14610974578063c87b56dd1461099d578063cadf8818146109da578063d084679c14610a05578063d9ff2c5f14610a30578063e7b62d9614610a5b576102e3565b806395d89b4111610149578063a22cb46511610123578063a22cb465146108d0578063acec338a146108f9578063b11560c514610922578063b601be431461094b576102e3565b806395d89b411461085e5780639a3bf72814610889578063a0712d68146108b4576102e3565b8063740d73f31461075f57806377b501b9146107885780637835c635146107b15780637cc07589146107cd5780638da5cb5b1461080a57806391b7f5ed14610835576102e3565b8063438b63001161024f5780636352211e11610208578063715018a6116101e2578063715018a6146106df57806371e3500c146106f657806372d07eed1461070d5780637389fbb714610736576102e3565b80636352211e1461063a5780636817c76c1461067757806370a08231146106a2576102e3565b8063438b63001461051a5780634f6ccce71461055757806354eae7341461059457806355f804b3146105bd57806356a87caa146105e657806360d938dc1461060f576102e3565b806322f3e2d4116102a157806322f3e2d41461041e57806323b872dd146104495780632f745c591461047257806332cb6b0c146104af5780633ccfd60b146104da57806342842e0e146104f1576102e3565b806208ffdd146102e857806301ffc9a71461032557806306fdde0314610362578063081812fc1461038d578063095ea7b3146103ca57806318160ddd146103f3575b600080fd5b3480156102f457600080fd5b5061030f600480360381019061030a9190614165565b610ba7565b60405161031c91906141ab565b60405180910390f35b34801561033157600080fd5b5061034c6004803603810190610347919061421e565b610c5f565b6040516103599190614266565b60405180910390f35b34801561036e57600080fd5b50610377610cd9565b604051610384919061431a565b60405180910390f35b34801561039957600080fd5b506103b460048036038101906103af9190614368565b610d6b565b6040516103c191906143a4565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec91906143bf565b610df0565b005b3480156103ff57600080fd5b50610408610f08565b60405161041591906141ab565b60405180910390f35b34801561042a57600080fd5b50610433610f15565b6040516104409190614266565b60405180910390f35b34801561045557600080fd5b50610470600480360381019061046b91906143ff565b610f28565b005b34801561047e57600080fd5b50610499600480360381019061049491906143bf565b610f88565b6040516104a691906141ab565b60405180910390f35b3480156104bb57600080fd5b506104c461102d565b6040516104d191906141ab565b60405180910390f35b3480156104e657600080fd5b506104ef611033565b005b3480156104fd57600080fd5b50610518600480360381019061051391906143ff565b611286565b005b34801561052657600080fd5b50610541600480360381019061053c9190614165565b6112a6565b60405161054e9190614510565b60405180910390f35b34801561056357600080fd5b5061057e60048036038101906105799190614368565b611354565b60405161058b91906141ab565b60405180910390f35b3480156105a057600080fd5b506105bb60048036038101906105b6919061455e565b6113c5565b005b3480156105c957600080fd5b506105e460048036038101906105df91906146c0565b611421565b005b3480156105f257600080fd5b5061060d60048036038101906106089190614368565b61147a565b005b34801561061b57600080fd5b506106246114c3565b6040516106319190614266565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190614368565b6114d6565b60405161066e91906143a4565b60405180910390f35b34801561068357600080fd5b5061068c611588565b60405161069991906141ab565b60405180910390f35b3480156106ae57600080fd5b506106c960048036038101906106c49190614165565b61158e565b6040516106d691906141ab565b60405180910390f35b3480156106eb57600080fd5b506106f4611646565b005b34801561070257600080fd5b5061070b6116ce565b005b34801561071957600080fd5b50610734600480360381019061072f9190614368565b611839565b005b34801561074257600080fd5b5061075d60048036038101906107589190614368565b611882565b005b34801561076b57600080fd5b5061078660048036038101906107819190614769565b6118cb565b005b34801561079457600080fd5b506107af60048036038101906107aa91906143bf565b611b24565b005b6107cb60048036038101906107c69190614368565b611bd7565b005b3480156107d957600080fd5b506107f460048036038101906107ef9190614165565b611f37565b6040516108019190614266565b60405180910390f35b34801561081657600080fd5b5061081f611f8d565b60405161082c91906143a4565b60405180910390f35b34801561084157600080fd5b5061085c60048036038101906108579190614368565b611fb7565b005b34801561086a57600080fd5b50610873612000565b604051610880919061431a565b60405180910390f35b34801561089557600080fd5b5061089e612092565b6040516108ab91906141ab565b60405180910390f35b6108ce60048036038101906108c99190614368565b612098565b005b3480156108dc57600080fd5b506108f760048036038101906108f291906147b6565b612371565b005b34801561090557600080fd5b50610920600480360381019061091b919061455e565b612387565b005b34801561092e57600080fd5b5061094960048036038101906109449190614769565b61241a565b005b34801561095757600080fd5b50610972600480360381019061096d9190614368565b612595565b005b34801561098057600080fd5b5061099b60048036038101906109969190614897565b6125de565b005b3480156109a957600080fd5b506109c460048036038101906109bf9190614368565b612640565b6040516109d1919061431a565b60405180910390f35b3480156109e657600080fd5b506109ef6126e7565b6040516109fc91906141ab565b60405180910390f35b348015610a1157600080fd5b50610a1a6126ed565b604051610a2791906141ab565b60405180910390f35b348015610a3c57600080fd5b50610a456126f3565b604051610a5291906141ab565b60405180910390f35b348015610a6757600080fd5b50610a706126f9565b604051610a7d91906141ab565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa8919061491a565b612703565b005b348015610abb57600080fd5b50610ad66004803603810190610ad1919061497a565b612960565b604051610ae39190614266565b60405180910390f35b348015610af857600080fd5b50610b136004803603810190610b0e9190614368565b6129f4565b005b348015610b2157600080fd5b50610b3c6004803603810190610b379190614165565b612a3d565b005b348015610b4a57600080fd5b50610b53612b35565b005b348015610b6157600080fd5b50610b7c6004803603810190610b779190614368565b612d88565b005b348015610b8a57600080fd5b50610ba56004803603810190610ba09190614368565b612dd1565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0f90614a06565b60405180910390fd5b601c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610cd25750610cd182612e1a565b5b9050919050565b606060008054610ce890614a55565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1490614a55565b8015610d615780601f10610d3657610100808354040283529160200191610d61565b820191906000526020600020905b815481529060010190602001808311610d4457829003601f168201915b5050505050905090565b6000610d7682612efc565b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614af9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610dfb826114d6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6390614b8b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e8b612f68565b73ffffffffffffffffffffffffffffffffffffffff161480610eba5750610eb981610eb4612f68565b612960565b5b610ef9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef090614c1d565b60405180910390fd5b610f038383612f70565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610f39610f33612f68565b82613029565b610f78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6f90614caf565b60405180910390fd5b610f83838383613107565b505050565b6000610f938361158e565b8210610fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcb90614d41565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b3373ffffffffffffffffffffffffffffffffffffffff16611052611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461107257600080fd5b6000479050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4846110c49190614d90565b6110ce9190614e19565b9081150290604051600060405180830381858888f193505050501580156110f9573d6000803e3d6000fd5b50601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4846111479190614d90565b6111519190614e19565b9081150290604051600060405180830381858888f1935050505015801561117c573d6000803e3d6000fd5b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c4846111ca9190614d90565b6111d49190614e19565b9081150290604051600060405180830381858888f193505050501580156111ff573d6000803e3d6000fd5b50601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106109c48461124d9190614d90565b6112579190614e19565b9081150290604051600060405180830381858888f19350505050158015611282573d6000803e3d6000fd5b5050565b6112a1838383604051806020016040528060008152506125de565b505050565b606060006112b38361158e565b905060008167ffffffffffffffff8111156112d1576112d0614595565b5b6040519080825280602002602001820160405280156112ff5781602001602082028036833780820191505090505b50905060005b82811015611349576113178582610f88565b82828151811061132a57611329614e4a565b5b602002602001018181525050808061134190614e79565b915050611305565b508092505050919050565b600061135e610f08565b821061139f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139690614f34565b60405180910390fd5b600882815481106113b3576113b2614e4a565b5b90600052602060002001549050919050565b3373ffffffffffffffffffffffffffffffffffffffff166113e4611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461140457600080fd5b80601060016101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff16611440611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461146057600080fd5b80600f9080519060200190611476929190614050565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611499611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146114b957600080fd5b80600e8190555050565b601060019054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561157f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157690614fc6565b60405180910390fd5b80915050919050565b600b5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f690615058565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164e612f68565b73ffffffffffffffffffffffffffffffffffffffff1661166c611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906150c4565b60405180910390fd5b6116cc6000613363565b565b3373ffffffffffffffffffffffffffffffffffffffff166116ed611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461170d57600080fd5b600e54600d541115611754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174b90615130565b60405180910390fd5b600061175e610f08565b905060005b600c54811015611835577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355818361179a9190615150565b601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516117cb9291906151a6565b60405180910390a161180a601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682846118059190615150565b613429565b600d600081548092919061181d90614e79565b9190505550808061182d90614e79565b915050611763565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16611858611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461187857600080fd5b8060148190555050565b3373ffffffffffffffffffffffffffffffffffffffff166118a1611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146118c157600080fd5b8060118190555050565b3373ffffffffffffffffffffffffffffffffffffffff166118ea611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461190a57600080fd5b60005b82829050811015611b1f57600073ffffffffffffffffffffffffffffffffffffffff1683838381811061194357611942614e4a565b5b90506020020160208101906119589190614165565b73ffffffffffffffffffffffffffffffffffffffff1614156119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a69061521b565b60405180910390fd5b6001601b60008585858181106119c8576119c7614e4a565b5b90506020020160208101906119dd9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601c6000858585818110611a4757611a46614e4a565b5b9050602002016020810190611a5c9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611aa3576000611b0b565b601c6000848484818110611aba57611ab9614e4a565b5b9050602002016020810190611acf9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611b1790614e79565b91505061190d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff16611b43611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614611b6357600080fd5b60005b81811015611bd2577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355611b97610f08565b84604051611ba69291906151a6565b60405180910390a1611bbf83611bba610f08565b613429565b8080611bca90614e79565b915050611b66565b505050565b601154611be2610f08565b1115611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90615287565b60405180910390fd5b601060019054906101000a900460ff16611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c69906152f3565b60405180910390fd5b601b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf59061535f565b60405180910390fd5b601154611d09610f08565b10611d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d40906153cb565b60405180910390fd5b601454811115611d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8590615437565b60405180910390fd5b60155481601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ddc9190615150565b1115611e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e14906154a3565b60405180910390fd5b80600b54611e2b9190614d90565b341015611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e649061550f565b60405180910390fd5b60005b81811015611f33576001601c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ec89190615150565b925050819055507f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355611ef8610f08565b33604051611f079291906151a6565b60405180910390a1611f2033611f1b610f08565b613429565b8080611f2b90614e79565b915050611e70565b5050565b6000601b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b3373ffffffffffffffffffffffffffffffffffffffff16611fd6611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614611ff657600080fd5b80600b8190555050565b60606001805461200f90614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461203b90614a55565b80156120885780601f1061205d57610100808354040283529160200191612088565b820191906000526020600020905b81548152906001019060200180831161206b57829003601f168201915b5050505050905090565b60125481565b6011546120a3610f08565b11156120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90615287565b60405180910390fd5b6120ec611f8d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121c657601060009054906101000a900460ff1661216d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121649061557b565b60405180910390fd5b6013548161217a3361158e565b6121849190615150565b11156121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc906155e7565b60405180910390fd5b5b601154816121d2610f08565b6121dc9190615150565b111561221d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221490615653565b60405180910390fd5b601154612228610f08565b1115612269576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612260906156bf565b60405180910390fd5b6012548111156122ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a59061572b565b60405180910390fd5b80600b546122bc9190614d90565b3410156122fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f59061550f565b60405180910390fd5b60005b8181101561236d577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd355612332610f08565b336040516123419291906151a6565b60405180910390a161235a33612355610f08565b613429565b808061236590614e79565b915050612301565b5050565b61238361237c612f68565b8383613447565b5050565b3373ffffffffffffffffffffffffffffffffffffffff166123a6611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146123c657600080fd5b80601060006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f8160405161240f9190614266565b60405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff16612439611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461245957600080fd5b60005b8282905081101561259057600073ffffffffffffffffffffffffffffffffffffffff1683838381811061249257612491614e4a565b5b90506020020160208101906124a79190614165565b73ffffffffffffffffffffffffffffffffffffffff1614156124fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f59061521b565b60405180910390fd5b6000601b600085858581811061251757612516614e4a565b5b905060200201602081019061252c9190614165565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061258890614e79565b91505061245c565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166125b4611f8d565b73ffffffffffffffffffffffffffffffffffffffff16146125d457600080fd5b8060128190555050565b6125ef6125e9612f68565b83613029565b61262e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262590614caf565b60405180910390fd5b61263a848484846135b4565b50505050565b606061264b82612efc565b61268a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612681906157bd565b60405180910390fd5b6000612694613610565b905060008151116126b457604051806020016040528060008152506126df565b806126be846136a2565b6040516020016126cf929190615819565b6040516020818303038152906040525b915050919050565b60135481565b60145481565b60155481565b6000600c54905090565b3373ffffffffffffffffffffffffffffffffffffffff16612722611f8d565b73ffffffffffffffffffffffffffffffffffffffff161461274257600080fd5b600061274c610f08565b9050601154848261275d9190615150565b111561279e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279590615653565b60405180910390fd5b6011548111156127e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127da906156bf565b60405180910390fd5b60005b8383905081101561295957600073ffffffffffffffffffffffffffffffffffffffff1684848381811061281c5761281b614e4a565b5b90506020020160208101906128319190614165565b73ffffffffffffffffffffffffffffffffffffffff161415612888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287f9061521b565b60405180910390fd5b60005b85811015612945577f55f284809f4c5b7377fbe62f2feeb9686e3834dcae5f3ca955140fe6547cd3556128bc610f08565b8686858181106128cf576128ce614e4a565b5b90506020020160208101906128e49190614165565b6040516128f29291906151a6565b60405180910390a16129328585848181106129105761290f614e4a565b5b90506020020160208101906129259190614165565b61292d610f08565b613429565b808061293d90614e79565b91505061288b565b50808061295190614e79565b9150506127e6565b5050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16612a13611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612a3357600080fd5b8060138190555050565b612a45612f68565b73ffffffffffffffffffffffffffffffffffffffff16612a63611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612ab9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab0906150c4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b20906158af565b60405180910390fd5b612b3281613363565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612b54611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612b7457600080fd5b6000479050601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612bc69190614d90565b612bd09190614e19565b9081150290604051600060405180830381858888f19350505050158015612bfb573d6000803e3d6000fd5b50601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612c499190614d90565b612c539190614e19565b9081150290604051600060405180830381858888f19350505050158015612c7e573d6000803e3d6000fd5b50601860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612ccc9190614d90565b612cd69190614e19565b9081150290604051600060405180830381858888f19350505050158015612d01573d6000803e3d6000fd5b50601960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6127106104e284612d4f9190614d90565b612d599190614e19565b9081150290604051600060405180830381858888f19350505050158015612d84573d6000803e3d6000fd5b5050565b3373ffffffffffffffffffffffffffffffffffffffff16612da7611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612dc757600080fd5b8060158190555050565b3373ffffffffffffffffffffffffffffffffffffffff16612df0611f8d565b73ffffffffffffffffffffffffffffffffffffffff1614612e1057600080fd5b80600c8190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612ee557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ef55750612ef482613803565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612fe3836114d6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061303482612efc565b613073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306a90615941565b60405180910390fd5b600061307e836114d6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806130ed57508373ffffffffffffffffffffffffffffffffffffffff166130d584610d6b565b73ffffffffffffffffffffffffffffffffffffffff16145b806130fe57506130fd8185612960565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16613127826114d6565b73ffffffffffffffffffffffffffffffffffffffff161461317d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613174906159d3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131e490615a65565b60405180910390fd5b6131f883838361386d565b613203600082612f70565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132539190615a85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546132aa9190615150565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613443828260405180602001604052806000815250613981565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134ad90615b05565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516135a79190614266565b60405180910390a3505050565b6135bf848484613107565b6135cb848484846139dc565b61360a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161360190615b97565b60405180910390fd5b50505050565b6060600f805461361f90614a55565b80601f016020809104026020016040519081016040528092919081815260200182805461364b90614a55565b80156136985780601f1061366d57610100808354040283529160200191613698565b820191906000526020600020905b81548152906001019060200180831161367b57829003601f168201915b5050505050905090565b606060008214156136ea576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506137fe565b600082905060005b6000821461371c57808061370590614e79565b915050600a826137159190614e19565b91506136f2565b60008167ffffffffffffffff81111561373857613737614595565b5b6040519080825280601f01601f19166020018201604052801561376a5781602001600182028036833780820191505090505b5090505b600085146137f7576001826137839190615a85565b9150600a856137929190615bb7565b603061379e9190615150565b60f81b8183815181106137b4576137b3614e4a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856137f09190614e19565b945061376e565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b613878838383613b64565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156138bb576138b681613b69565b6138fa565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146138f9576138f88382613bb2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561393d5761393881613d1f565b61397c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461397b5761397a8282613df0565b5b5b505050565b61398b8383613e6f565b61399860008484846139dc565b6139d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139ce90615b97565b60405180910390fd5b505050565b60006139fd8473ffffffffffffffffffffffffffffffffffffffff1661403d565b15613b57578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613a26612f68565b8786866040518563ffffffff1660e01b8152600401613a489493929190615c3d565b6020604051808303816000875af1925050508015613a8457506040513d601f19601f82011682018060405250810190613a819190615c9e565b60015b613b07573d8060008114613ab4576040519150601f19603f3d011682016040523d82523d6000602084013e613ab9565b606091505b50600081511415613aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613af690615b97565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613b5c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613bbf8461158e565b613bc99190615a85565b9050600060076000848152602001908152602001600020549050818114613cae576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613d339190615a85565b9050600060096000848152602001908152602001600020549050600060088381548110613d6357613d62614e4a565b5b906000526020600020015490508060088381548110613d8557613d84614e4a565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613dd457613dd3615ccb565b5b6001900381819060005260206000200160009055905550505050565b6000613dfb8361158e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ed690615d46565b60405180910390fd5b613ee881612efc565b15613f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f1f90615db2565b60405180910390fd5b613f346000838361386d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613f849190615150565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461405c90614a55565b90600052602060002090601f01602090048101928261407e57600085556140c5565b82601f1061409757805160ff19168380011785556140c5565b828001600101855582156140c5579182015b828111156140c45782518255916020019190600101906140a9565b5b5090506140d291906140d6565b5090565b5b808211156140ef5760008160009055506001016140d7565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061413282614107565b9050919050565b61414281614127565b811461414d57600080fd5b50565b60008135905061415f81614139565b92915050565b60006020828403121561417b5761417a6140fd565b5b600061418984828501614150565b91505092915050565b6000819050919050565b6141a581614192565b82525050565b60006020820190506141c0600083018461419c565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141fb816141c6565b811461420657600080fd5b50565b600081359050614218816141f2565b92915050565b600060208284031215614234576142336140fd565b5b600061424284828501614209565b91505092915050565b60008115159050919050565b6142608161424b565b82525050565b600060208201905061427b6000830184614257565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142bb5780820151818401526020810190506142a0565b838111156142ca576000848401525b50505050565b6000601f19601f8301169050919050565b60006142ec82614281565b6142f6818561428c565b935061430681856020860161429d565b61430f816142d0565b840191505092915050565b6000602082019050818103600083015261433481846142e1565b905092915050565b61434581614192565b811461435057600080fd5b50565b6000813590506143628161433c565b92915050565b60006020828403121561437e5761437d6140fd565b5b600061438c84828501614353565b91505092915050565b61439e81614127565b82525050565b60006020820190506143b96000830184614395565b92915050565b600080604083850312156143d6576143d56140fd565b5b60006143e485828601614150565b92505060206143f585828601614353565b9150509250929050565b600080600060608486031215614418576144176140fd565b5b600061442686828701614150565b935050602061443786828701614150565b925050604061444886828701614353565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61448781614192565b82525050565b6000614499838361447e565b60208301905092915050565b6000602082019050919050565b60006144bd82614452565b6144c7818561445d565b93506144d28361446e565b8060005b838110156145035781516144ea888261448d565b97506144f5836144a5565b9250506001810190506144d6565b5085935050505092915050565b6000602082019050818103600083015261452a81846144b2565b905092915050565b61453b8161424b565b811461454657600080fd5b50565b60008135905061455881614532565b92915050565b600060208284031215614574576145736140fd565b5b600061458284828501614549565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145cd826142d0565b810181811067ffffffffffffffff821117156145ec576145eb614595565b5b80604052505050565b60006145ff6140f3565b905061460b82826145c4565b919050565b600067ffffffffffffffff82111561462b5761462a614595565b5b614634826142d0565b9050602081019050919050565b82818337600083830152505050565b600061466361465e84614610565b6145f5565b90508281526020810184848401111561467f5761467e614590565b5b61468a848285614641565b509392505050565b600082601f8301126146a7576146a661458b565b5b81356146b7848260208601614650565b91505092915050565b6000602082840312156146d6576146d56140fd565b5b600082013567ffffffffffffffff8111156146f4576146f3614102565b5b61470084828501614692565b91505092915050565b600080fd5b600080fd5b60008083601f8401126147295761472861458b565b5b8235905067ffffffffffffffff81111561474657614745614709565b5b6020830191508360208202830111156147625761476161470e565b5b9250929050565b600080602083850312156147805761477f6140fd565b5b600083013567ffffffffffffffff81111561479e5761479d614102565b5b6147aa85828601614713565b92509250509250929050565b600080604083850312156147cd576147cc6140fd565b5b60006147db85828601614150565b92505060206147ec85828601614549565b9150509250929050565b600067ffffffffffffffff82111561481157614810614595565b5b61481a826142d0565b9050602081019050919050565b600061483a614835846147f6565b6145f5565b90508281526020810184848401111561485657614855614590565b5b614861848285614641565b509392505050565b600082601f83011261487e5761487d61458b565b5b813561488e848260208601614827565b91505092915050565b600080600080608085870312156148b1576148b06140fd565b5b60006148bf87828801614150565b94505060206148d087828801614150565b93505060406148e187828801614353565b925050606085013567ffffffffffffffff81111561490257614901614102565b5b61490e87828801614869565b91505092959194509250565b600080600060408486031215614933576149326140fd565b5b600061494186828701614353565b935050602084013567ffffffffffffffff81111561496257614961614102565b5b61496e86828701614713565b92509250509250925092565b60008060408385031215614991576149906140fd565b5b600061499f85828601614150565b92505060206149b085828601614150565b9150509250929050565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b60006149f0601e8361428c565b91506149fb826149ba565b602082019050919050565b60006020820190508181036000830152614a1f816149e3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a6d57607f821691505b60208210811415614a8157614a80614a26565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614ae3602c8361428c565b9150614aee82614a87565b604082019050919050565b60006020820190508181036000830152614b1281614ad6565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b7560218361428c565b9150614b8082614b19565b604082019050919050565b60006020820190508181036000830152614ba481614b68565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000614c0760388361428c565b9150614c1282614bab565b604082019050919050565b60006020820190508181036000830152614c3681614bfa565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000614c9960318361428c565b9150614ca482614c3d565b604082019050919050565b60006020820190508181036000830152614cc881614c8c565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614d2b602b8361428c565b9150614d3682614ccf565b604082019050919050565b60006020820190508181036000830152614d5a81614d1e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d9b82614192565b9150614da683614192565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ddf57614dde614d61565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614e2482614192565b9150614e2f83614192565b925082614e3f57614e3e614dea565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614e8482614192565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614eb757614eb6614d61565b5b600182019050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614f1e602c8361428c565b9150614f2982614ec2565b604082019050919050565b60006020820190508181036000830152614f4d81614f11565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000614fb060298361428c565b9150614fbb82614f54565b604082019050919050565b60006020820190508181036000830152614fdf81614fa3565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000615042602a8361428c565b915061504d82614fe6565b604082019050919050565b6000602082019050818103600083015261507181615035565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006150ae60208361428c565b91506150b982615078565b602082019050919050565b600060208201905081810360008301526150dd816150a1565b9050919050565b7f4d61782052657365727665732074616b656e20616c7265616479210000000000600082015250565b600061511a601b8361428c565b9150615125826150e4565b602082019050919050565b600060208201905081810360008301526151498161510d565b9050919050565b600061515b82614192565b915061516683614192565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561519b5761519a614d61565b5b828201905092915050565b60006040820190506151bb600083018561419c565b6151c86020830184614395565b9392505050565b7f43616e2774206164642061206e756c6c20616464726573730000000000000000600082015250565b600061520560188361428c565b9150615210826151cf565b602082019050919050565b60006020820190508181036000830152615234816151f8565b9050919050565b7f53616c652068617320656e6465642e0000000000000000000000000000000000600082015250565b6000615271600f8361428c565b915061527c8261523b565b602082019050919050565b600060208201905081810360008301526152a081615264565b9050919050565b7f416c6c6f77204c697374206973206e6f74206163746976650000000000000000600082015250565b60006152dd60188361428c565b91506152e8826152a7565b602082019050919050565b6000602082019050818103600083015261530c816152d0565b9050919050565b7f596f7520617265206e6f74206f6e2074686520416c6c6f77204c697374000000600082015250565b6000615349601d8361428c565b915061535482615313565b602082019050919050565b600060208201905081810360008301526153788161533c565b9050919050565b7f416c6c20746f6b656e732068617665206265656e206d696e7465640000000000600082015250565b60006153b5601b8361428c565b91506153c08261537f565b602082019050919050565b600060208201905081810360008301526153e4816153a8565b9050919050565b7f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e73600082015250565b600061542160208361428c565b915061542c826153eb565b602082019050919050565b6000602082019050818103600083015261545081615414565b9050919050565b7f50757263686173652065786365656473206d617820616c6c6f77656400000000600082015250565b600061548d601c8361428c565b915061549882615457565b602082019050919050565b600060208201905081810360008301526154bc81615480565b9050919050565b7f496e7375666669656e742045544820616d6f756e742073656e742e0000000000600082015250565b60006154f9601b8361428c565b9150615504826154c3565b602082019050919050565b60006020820190508181036000830152615528816154ec565b9050919050565b7f53616c65206973206e6f74206163746976652063757272656e746c792e000000600082015250565b6000615565601d8361428c565b91506155708261552f565b602082019050919050565b6000602082019050818103600083015261559481615558565b9050919050565b7f4d617820686f6c64696e672063617020726561636865642e0000000000000000600082015250565b60006155d160188361428c565b91506155dc8261559b565b602082019050919050565b60006020820190508181036000830152615600816155c4565b9050919050565b7f546f74616c20737570706c792065786365656465642e00000000000000000000600082015250565b600061563d60168361428c565b915061564882615607565b602082019050919050565b6000602082019050818103600083015261566c81615630565b9050919050565b7f546f74616c20737570706c79207370656e742e00000000000000000000000000600082015250565b60006156a960138361428c565b91506156b482615673565b602082019050919050565b600060208201905081810360008301526156d88161569c565b9050919050565b7f45786365656473206d6178696d756d20616c6c6f77656420746f6b656e730000600082015250565b6000615715601e8361428c565b9150615720826156df565b602082019050919050565b6000602082019050818103600083015261574481615708565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006157a7602f8361428c565b91506157b28261574b565b604082019050919050565b600060208201905081810360008301526157d68161579a565b9050919050565b600081905092915050565b60006157f382614281565b6157fd81856157dd565b935061580d81856020860161429d565b80840191505092915050565b600061582582856157e8565b915061583182846157e8565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061589960268361428c565b91506158a48261583d565b604082019050919050565b600060208201905081810360008301526158c88161588c565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061592b602c8361428c565b9150615936826158cf565b604082019050919050565b6000602082019050818103600083015261595a8161591e565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b60006159bd60298361428c565b91506159c882615961565b604082019050919050565b600060208201905081810360008301526159ec816159b0565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000615a4f60248361428c565b9150615a5a826159f3565b604082019050919050565b60006020820190508181036000830152615a7e81615a42565b9050919050565b6000615a9082614192565b9150615a9b83614192565b925082821015615aae57615aad614d61565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000615aef60198361428c565b9150615afa82615ab9565b602082019050919050565b60006020820190508181036000830152615b1e81615ae2565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000615b8160328361428c565b9150615b8c82615b25565b604082019050919050565b60006020820190508181036000830152615bb081615b74565b9050919050565b6000615bc282614192565b9150615bcd83614192565b925082615bdd57615bdc614dea565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000615c0f82615be8565b615c198185615bf3565b9350615c2981856020860161429d565b615c32816142d0565b840191505092915050565b6000608082019050615c526000830187614395565b615c5f6020830186614395565b615c6c604083018561419c565b8181036060830152615c7e8184615c04565b905095945050505050565b600081519050615c98816141f2565b92915050565b600060208284031215615cb457615cb36140fd565b5b6000615cc284828501615c89565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000615d3060208361428c565b9150615d3b82615cfa565b602082019050919050565b60006020820190508181036000830152615d5f81615d23565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615d9c601c8361428c565b9150615da782615d66565b602082019050919050565b60006020820190508181036000830152615dcb81615d8f565b905091905056fea26469706673582212203fab91cff578928b6268f77605553c023a95c316ed6eca38a265d71048de59dd64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

122:7748:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3272:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;989:222:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1614:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;370:28:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4646:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;445:32:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7183:329;;;;;;;;;;;;;:::i;:::-;;5042:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6863:314:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1797:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2268:122:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3757:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3566:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;403:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2111:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;178:36:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1849:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:11;;;;;;;;;;;;;:::i;:::-;;4081:366:12;;;;;;;;;;;;;:::i;:::-;;1738:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2149:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2545:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4453:255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6070:787;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2890:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3664:87:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2570:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;486:51:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4714:762;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4203:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2034:109:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3003:263;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1597:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5287:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2738:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;542:49:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;598:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;660:55;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3866:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5482:582;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4422:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1895:131:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1911:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7518:347:12;;;;;;;;;;;;;:::i;:::-;;2396:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3465:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3272:187;3338:7;3378:1;3361:19;;:5;:19;;;;3353:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;3429:17;:24;3447:5;3429:24;;;;;;;;;;;;;;;;3422:31;;3272:187;;;:::o;989:222:5:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;2408:98:4:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;1614:111:5:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;370:28:12:-;;;;;;;;;;;;;:::o;4646:330:4:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;:::-;4646:330;;;:::o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;445:32:12:-;;;;:::o;7183:329::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;7234:12:::1;7249:21;7234:36;;7287:8;;;;;;;;;;;7279:26;;:50;7323:5;7316:4;7306:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7279:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7344:8;;;;;;;;;;;7336:26;;:50;7380:5;7373:4;7363:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7336:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7401:8;;;;;;;;;;;7393:26;;:50;7437:5;7430:4;7420:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7393:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7458:8;;;;;;;;;;;7450:26;;:50;7494:5;7487:4;7477:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7450:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7227:285;7183:329::o:0;5042:179:4:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;:::-;5042:179;;;:::o;6863:314:12:-;6924:16;6949:15;6967:17;6977:6;6967:9;:17::i;:::-;6949:35;;6991:25;7033:10;7019:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6991:53;;7057:6;7053:97;7073:10;7069:1;:14;7053:97;;;7112:30;7132:6;7140:1;7112:19;:30::i;:::-;7098:8;7107:1;7098:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;7085:3;;;;;:::i;:::-;;;;7053:97;;;;7163:8;7156:15;;;;6863:314;;;:::o;1797:230:5:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;;1996:24;;1797:230;;;:::o;2268:122:12:-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;2368:16:::1;2350:15;;:34;;;;;;;;;;;;;;;;;;2268:122:::0;:::o;3757:101::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;3845:7:::1;3829:13;:23;;;;;;;;;;;;:::i;:::-;;3757:101:::0;:::o;3566:92::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;3649:3:::1;3631:15;:21;;;;3566:92:::0;:::o;403:35::-;;;;;;;;;;;;;:::o;2111:235:4:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;178:36:12:-;;;;:::o;1849:205:4:-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;1661:101:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4081:366:12:-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;4157:15:::1;;4140:13;;:32;;4132:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;4211:14;4228:13;:11;:13::i;:::-;4211:30;;4248:9;4266:176;4282:14;;4278:1;:18;4266:176;;;4317:43;4338:1;4329:6;:10;;;;:::i;:::-;4341:18;;;;;;;;;;;4317:43;;;;;;;:::i;:::-;;;;;;;;4369:41;4379:18;;;;;;;;;;;4408:1;4399:6;:10;;;;:::i;:::-;4369:9;:41::i;:::-;4419:13;;:15;;;;;;;;;:::i;:::-;;;;;;4298:3;;;;;:::i;:::-;;;;4266:176;;;4125:322;;4081:366::o:0;1738:149::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;1875:6:::1;1834:38;:47;;;;1738:149:::0;:::o;2149:113::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;2243:13:::1;2230:10;:26;;;;2149:113:::0;:::o;2545:339::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;2635:9:::1;2630:249;2654:9;;:16;;2650:1;:20;2630:249;;;2718:1;2694:26;;:9;;2704:1;2694:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;2686:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2785:4;2758:10;:24;2769:9;;2779:1;2769:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2758:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;2832:1;2798:17;:31;2816:9;;2826:1;2816:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2798:31;;;;;;;;;;;;;;;;:35;:73;;2870:1;2798:73;;;2836:17;:31;2854:9;;2864:1;2854:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;2836:31;;;;;;;;;;;;;;;;2798:73;;2672:3;;;;;:::i;:::-;;;;2630:249;;;;2545:339:::0;;:::o;4453:255::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;4558:9:::1;4553:150;4577:6;4573:1;:10;4553:150;;;4604:42;4616:13;:11;:13::i;:::-;4631:14;4604:42;;;;;;;:::i;:::-;;;;;;;;4655:40;4665:14;4681:13;:11;:13::i;:::-;4655:9;:40::i;:::-;4585:3;;;;;:::i;:::-;;;;4553:150;;;;4453:255:::0;;:::o;6070:787::-;1464:10;;1447:13;:11;:13::i;:::-;:27;;1439:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6148:15:::1;;;;;;;;;;;6140:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6207:10;:22;6218:10;6207:22;;;;;;;;;;;;;;;;;;;;;;;;;6199:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;6294:10;;6278:13;:11;:13::i;:::-;:26;6270:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;6367:38;;6357:6;:48;;6349:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;6505:36;;6495:6;6463:17;:29;6481:10;6463:29;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:78;;6455:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;6620:6;6608:9;;:18;;;;:::i;:::-;6595:9;:31;;6587:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;6672:9;6667:185;6691:6;6687:1;:10;6667:185;;;6746:1;6713:17;:29;6731:10;6713:29;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;6761:38;6773:13;:11;:13::i;:::-;6788:10;6761:38;;;;;;;:::i;:::-;;;;;;;;6808:36;6818:10;6830:13;:11;:13::i;:::-;6808:9;:36::i;:::-;6699:3;;;;;:::i;:::-;;;;6667:185;;;;6070:787:::0;:::o;2890:107::-;2955:4;2975:10;:16;2986:4;2975:16;;;;;;;;;;;;;;;;;;;;;;;;;2968:23;;2890:107;;;:::o;1029:85:11:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;3664:87:12:-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;3739:6:::1;3727:9;:18;;;;3664:87:::0;:::o;2570:102:4:-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;486:51:12:-;;;;:::o;4714:762::-;1464:10;;1447:13;:11;:13::i;:::-;:27;;1439:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;4795:7:::1;:5;:7::i;:::-;4781:21;;:10;:21;;;4777:203;;4821:8;;;;;;;;;;;4813:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;4914:29;;4904:6;4880:21;4890:10;4880:9;:21::i;:::-;:30;;;;:::i;:::-;:63;;4872:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4777:203;5024:10;;5014:6;4998:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;4990:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5093:10;;5076:13;:11;:13::i;:::-;:27;;5068:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;5160:31;;5150:6;:41;;5134:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;5281:6;5269:9;;:18;;;;:::i;:::-;5256:9;:31;;5248:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5333:9;5328:143;5352:6;5348:1;:10;5328:143;;;5379:39;5391:14;:11;:14::i;:::-;5407:10;5379:39;;;;;;;:::i;:::-;;;;;;;;5427:36;5437:10;5449:13;:11;:13::i;:::-;5427:9;:36::i;:::-;5360:3;;;;;:::i;:::-;;;;5328:143;;;;4714:762:::0;:::o;4203:153:4:-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;2034:109:12:-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;2103:3:::1;2092:8;;:14;;;;;;;;;;;;;;;;;;2118:19;2133:3;2118:19;;;;;;:::i;:::-;;;;;;;;2034:109:::0;:::o;3003:263::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;3098:9:::1;3093:168;3117:9;;:16;;3113:1;:20;3093:168;;;3181:1;3157:26;;:9;;3167:1;3157:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;3149:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3248:5;3221:10;:24;3232:9;;3242:1;3232:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3221:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;3135:3;;;;;:::i;:::-;;;;3093:168;;;;3003:263:::0;;:::o;1597:135::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;1720:6:::1;1686:31;:40;;;;1597:135:::0;:::o;5287:320:4:-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;2738:329::-;2811:13;2844:16;2852:7;2844;:16::i;:::-;2836:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;;;2738:329;;;:::o;542:49:12:-;;;;:::o;598:57::-;;;;:::o;660:55::-;;;;:::o;3866:95::-;3918:7;3941:14;;3934:21;;3866:95;:::o;5482:582::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;5600:14:::1;5617:13;:11;:13::i;:::-;5600:30;;5666:10;;5656:6;5647;:15;;;;:::i;:::-;:29;;5639:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;5728:10;;5718:6;:20;;5710:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;5776:9;5771:288;5795:9;;:16;;5791:1;:20;5771:288;;;5859:1;5835:26;;:9;;5845:1;5835:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;5827:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;5905:9;5901:151;5924:6;5920:1;:10;5901:151;;;5953:40;5965:13;:11;:13::i;:::-;5980:9;;5990:1;5980:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;5953:40;;;;;;;:::i;:::-;;;;;;;;6004:38;6014:9;;6024:1;6014:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;6028:13;:11;:13::i;:::-;6004:9;:38::i;:::-;5932:3;;;;;:::i;:::-;;;;5901:151;;;;5813:3;;;;;:::i;:::-;;;;5771:288;;;;5593:471;5482:582:::0;;;:::o;4422:162:4:-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;1895:131:12:-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;2014:6:::1;1982:29;:38;;;;1895:131:::0;:::o;1911:198:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;7518:347:12:-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;7587:12:::1;7602:21;7587:36;;7640:8;;;;;;;;;;;7632:26;;:50;7676:5;7669:4;7659:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7632:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7699:8;;;;;;;;;;;7691:26;;:50;7735:5;7728:4;7718:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7691:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7758:8;;;;;;;;;;;7750:26;;:50;7794:5;7787:4;7777:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7750:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7817:8;;;;;;;;;;;7809:26;;:50;7853:5;7846:4;7836:7;:14;;;;:::i;:::-;:22;;;;:::i;:::-;7809:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;7578:287;7518:347::o:0;2396:143::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;2526:7:::1;2487:36;:46;;;;2396:143:::0;:::o;3465:95::-;1566:10;1555:21;;:7;:5;:7::i;:::-;:21;;;1547:30;;;;;;3551:3:::1;3534:14;:20;;;;3465:95:::0;:::o;1490:300:4:-;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;7079:125::-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10930:171:4:-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;2263:187:11:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;8036:108:4:-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;:::-;8036:108;;:::o;11236:307::-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;3967:108:12:-;4027:13;4056;4049:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3967:108;:::o;328:703:13:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::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;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2623:572:5:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;8365:311:4:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8365:311;;;:::o;12096:778::-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;13430:122::-;;;;:::o;3901:161:5:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5183:289;5149:323;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4760:889;;4679:970;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;:::i;:::-;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3563:143;3489:217;;:::o;8998:372:4:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;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:114::-;6317:6;6351:5;6345:12;6335:22;;6250:114;;;:::o;6370:184::-;6469:11;6503:6;6498:3;6491:19;6543:4;6538:3;6534:14;6519:29;;6370:184;;;;:::o;6560:132::-;6627:4;6650:3;6642:11;;6680:4;6675:3;6671:14;6663:22;;6560:132;;;:::o;6698:108::-;6775:24;6793:5;6775:24;:::i;:::-;6770:3;6763:37;6698:108;;:::o;6812:179::-;6881:10;6902:46;6944:3;6936:6;6902:46;:::i;:::-;6980:4;6975:3;6971:14;6957:28;;6812:179;;;;:::o;6997:113::-;7067:4;7099;7094:3;7090:14;7082:22;;6997:113;;;:::o;7146:732::-;7265:3;7294:54;7342:5;7294:54;:::i;:::-;7364:86;7443:6;7438:3;7364:86;:::i;:::-;7357:93;;7474:56;7524:5;7474:56;:::i;:::-;7553:7;7584:1;7569:284;7594:6;7591:1;7588:13;7569:284;;;7670:6;7664:13;7697:63;7756:3;7741:13;7697:63;:::i;:::-;7690:70;;7783:60;7836:6;7783:60;:::i;:::-;7773:70;;7629:224;7616:1;7613;7609:9;7604:14;;7569:284;;;7573:14;7869:3;7862:10;;7270:608;;;7146:732;;;;:::o;7884:373::-;8027:4;8065:2;8054:9;8050:18;8042:26;;8114:9;8108:4;8104:20;8100:1;8089:9;8085:17;8078:47;8142:108;8245:4;8236:6;8142:108;:::i;:::-;8134:116;;7884:373;;;;:::o;8263:116::-;8333:21;8348:5;8333:21;:::i;:::-;8326:5;8323:32;8313:60;;8369:1;8366;8359:12;8313:60;8263:116;:::o;8385:133::-;8428:5;8466:6;8453:20;8444:29;;8482:30;8506:5;8482:30;:::i;:::-;8385:133;;;;:::o;8524:323::-;8580:6;8629:2;8617:9;8608:7;8604:23;8600:32;8597:119;;;8635:79;;:::i;:::-;8597:119;8755:1;8780:50;8822:7;8813:6;8802:9;8798:22;8780:50;:::i;:::-;8770:60;;8726:114;8524:323;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:117::-;11583:1;11580;11573:12;11597:117;11706:1;11703;11696:12;11737:568;11810:8;11820:6;11870:3;11863:4;11855:6;11851:17;11847:27;11837:122;;11878:79;;:::i;:::-;11837:122;11991:6;11978:20;11968:30;;12021:18;12013:6;12010:30;12007:117;;;12043:79;;:::i;:::-;12007:117;12157:4;12149:6;12145:17;12133:29;;12211:3;12203:4;12195:6;12191:17;12181:8;12177:32;12174:41;12171:128;;;12218:79;;:::i;:::-;12171:128;11737:568;;;;;:::o;12311:559::-;12397:6;12405;12454:2;12442:9;12433:7;12429:23;12425:32;12422:119;;;12460:79;;:::i;:::-;12422:119;12608:1;12597:9;12593:17;12580:31;12638:18;12630:6;12627:30;12624:117;;;12660:79;;:::i;:::-;12624:117;12773:80;12845:7;12836:6;12825:9;12821:22;12773:80;:::i;:::-;12755:98;;;;12551:312;12311:559;;;;;:::o;12876:468::-;12941:6;12949;12998:2;12986:9;12977:7;12973:23;12969:32;12966:119;;;13004:79;;:::i;:::-;12966:119;13124:1;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13095:117;13251:2;13277:50;13319:7;13310:6;13299:9;13295:22;13277:50;:::i;:::-;13267:60;;13222:115;12876:468;;;;;:::o;13350:307::-;13411:4;13501:18;13493:6;13490:30;13487:56;;;13523:18;;:::i;:::-;13487:56;13561:29;13583:6;13561:29;:::i;:::-;13553:37;;13645:4;13639;13635:15;13627:23;;13350:307;;;:::o;13663:410::-;13740:5;13765:65;13781:48;13822:6;13781:48;:::i;:::-;13765:65;:::i;:::-;13756:74;;13853:6;13846:5;13839:21;13891:4;13884:5;13880:16;13929:3;13920:6;13915:3;13911:16;13908:25;13905:112;;;13936:79;;:::i;:::-;13905:112;14026:41;14060:6;14055:3;14050;14026:41;:::i;:::-;13746:327;13663:410;;;;;:::o;14092:338::-;14147:5;14196:3;14189:4;14181:6;14177:17;14173:27;14163:122;;14204:79;;:::i;:::-;14163:122;14321:6;14308:20;14346:78;14420:3;14412:6;14405:4;14397:6;14393:17;14346:78;:::i;:::-;14337:87;;14153:277;14092:338;;;;:::o;14436:943::-;14531:6;14539;14547;14555;14604:3;14592:9;14583:7;14579:23;14575:33;14572:120;;;14611:79;;:::i;:::-;14572:120;14731:1;14756:53;14801:7;14792:6;14781:9;14777:22;14756:53;:::i;:::-;14746:63;;14702:117;14858:2;14884:53;14929:7;14920:6;14909:9;14905:22;14884:53;:::i;:::-;14874:63;;14829:118;14986:2;15012:53;15057:7;15048:6;15037:9;15033:22;15012:53;:::i;:::-;15002:63;;14957:118;15142:2;15131:9;15127:18;15114:32;15173:18;15165:6;15162:30;15159:117;;;15195:79;;:::i;:::-;15159:117;15300:62;15354:7;15345:6;15334:9;15330:22;15300:62;:::i;:::-;15290:72;;15085:287;14436:943;;;;;;;:::o;15385:704::-;15480:6;15488;15496;15545:2;15533:9;15524:7;15520:23;15516:32;15513:119;;;15551:79;;:::i;:::-;15513:119;15671:1;15696:53;15741:7;15732:6;15721:9;15717:22;15696:53;:::i;:::-;15686:63;;15642:117;15826:2;15815:9;15811:18;15798:32;15857:18;15849:6;15846:30;15843:117;;;15879:79;;:::i;:::-;15843:117;15992:80;16064:7;16055:6;16044:9;16040:22;15992:80;:::i;:::-;15974:98;;;;15769:313;15385:704;;;;;:::o;16095:474::-;16163:6;16171;16220:2;16208:9;16199:7;16195:23;16191:32;16188:119;;;16226:79;;:::i;:::-;16188:119;16346:1;16371:53;16416:7;16407:6;16396:9;16392:22;16371:53;:::i;:::-;16361:63;;16317:117;16473:2;16499:53;16544:7;16535:6;16524:9;16520:22;16499:53;:::i;:::-;16489:63;;16444:118;16095:474;;;;;:::o;16575:180::-;16715:32;16711:1;16703:6;16699:14;16692:56;16575:180;:::o;16761:366::-;16903:3;16924:67;16988:2;16983:3;16924:67;:::i;:::-;16917:74;;17000:93;17089:3;17000:93;:::i;:::-;17118:2;17113:3;17109:12;17102:19;;16761:366;;;:::o;17133:419::-;17299:4;17337:2;17326:9;17322:18;17314:26;;17386:9;17380:4;17376:20;17372:1;17361:9;17357:17;17350:47;17414:131;17540:4;17414:131;:::i;:::-;17406:139;;17133:419;;;:::o;17558:180::-;17606:77;17603:1;17596:88;17703:4;17700:1;17693:15;17727:4;17724:1;17717:15;17744:320;17788:6;17825:1;17819:4;17815:12;17805:22;;17872:1;17866:4;17862:12;17893:18;17883:81;;17949:4;17941:6;17937:17;17927:27;;17883:81;18011:2;18003:6;18000:14;17980:18;17977:38;17974:84;;;18030:18;;:::i;:::-;17974:84;17795:269;17744:320;;;:::o;18070:231::-;18210:34;18206:1;18198:6;18194:14;18187:58;18279:14;18274:2;18266:6;18262:15;18255:39;18070:231;:::o;18307:366::-;18449:3;18470:67;18534:2;18529:3;18470:67;:::i;:::-;18463:74;;18546:93;18635:3;18546:93;:::i;:::-;18664:2;18659:3;18655:12;18648:19;;18307:366;;;:::o;18679:419::-;18845:4;18883:2;18872:9;18868:18;18860:26;;18932:9;18926:4;18922:20;18918:1;18907:9;18903:17;18896:47;18960:131;19086:4;18960:131;:::i;:::-;18952:139;;18679:419;;;:::o;19104:220::-;19244:34;19240:1;19232:6;19228:14;19221:58;19313:3;19308:2;19300:6;19296:15;19289:28;19104:220;:::o;19330:366::-;19472:3;19493:67;19557:2;19552:3;19493:67;:::i;:::-;19486:74;;19569:93;19658:3;19569:93;:::i;:::-;19687:2;19682:3;19678:12;19671:19;;19330:366;;;:::o;19702:419::-;19868:4;19906:2;19895:9;19891:18;19883:26;;19955:9;19949:4;19945:20;19941:1;19930:9;19926:17;19919:47;19983:131;20109:4;19983:131;:::i;:::-;19975:139;;19702:419;;;:::o;20127:243::-;20267:34;20263:1;20255:6;20251:14;20244:58;20336:26;20331:2;20323:6;20319:15;20312:51;20127:243;:::o;20376:366::-;20518:3;20539:67;20603:2;20598:3;20539:67;:::i;:::-;20532:74;;20615:93;20704:3;20615:93;:::i;:::-;20733:2;20728:3;20724:12;20717:19;;20376:366;;;:::o;20748:419::-;20914:4;20952:2;20941:9;20937:18;20929:26;;21001:9;20995:4;20991:20;20987:1;20976:9;20972:17;20965:47;21029:131;21155:4;21029:131;:::i;:::-;21021:139;;20748:419;;;:::o;21173:236::-;21313:34;21309:1;21301:6;21297:14;21290:58;21382:19;21377:2;21369:6;21365:15;21358:44;21173:236;:::o;21415:366::-;21557:3;21578:67;21642:2;21637:3;21578:67;:::i;:::-;21571:74;;21654:93;21743:3;21654:93;:::i;:::-;21772:2;21767:3;21763:12;21756:19;;21415:366;;;:::o;21787:419::-;21953:4;21991:2;21980:9;21976:18;21968:26;;22040:9;22034:4;22030:20;22026:1;22015:9;22011:17;22004:47;22068:131;22194:4;22068:131;:::i;:::-;22060:139;;21787:419;;;:::o;22212:230::-;22352:34;22348:1;22340:6;22336:14;22329:58;22421:13;22416:2;22408:6;22404:15;22397:38;22212:230;:::o;22448:366::-;22590:3;22611:67;22675:2;22670:3;22611:67;:::i;:::-;22604:74;;22687:93;22776:3;22687:93;:::i;:::-;22805:2;22800:3;22796:12;22789:19;;22448:366;;;:::o;22820:419::-;22986:4;23024:2;23013:9;23009:18;23001:26;;23073:9;23067:4;23063:20;23059:1;23048:9;23044:17;23037:47;23101:131;23227:4;23101:131;:::i;:::-;23093:139;;22820:419;;;:::o;23245:180::-;23293:77;23290:1;23283:88;23390:4;23387:1;23380:15;23414:4;23411:1;23404:15;23431:348;23471:7;23494:20;23512:1;23494:20;:::i;:::-;23489:25;;23528:20;23546:1;23528:20;:::i;:::-;23523:25;;23716:1;23648:66;23644:74;23641:1;23638:81;23633:1;23626:9;23619:17;23615:105;23612:131;;;23723:18;;:::i;:::-;23612:131;23771:1;23768;23764:9;23753:20;;23431:348;;;;:::o;23785:180::-;23833:77;23830:1;23823:88;23930:4;23927:1;23920:15;23954:4;23951:1;23944:15;23971:185;24011:1;24028:20;24046:1;24028:20;:::i;:::-;24023:25;;24062:20;24080:1;24062:20;:::i;:::-;24057:25;;24101:1;24091:35;;24106:18;;:::i;:::-;24091:35;24148:1;24145;24141:9;24136:14;;23971:185;;;;:::o;24162:180::-;24210:77;24207:1;24200:88;24307:4;24304:1;24297:15;24331:4;24328:1;24321:15;24348:233;24387:3;24410:24;24428:5;24410:24;:::i;:::-;24401:33;;24456:66;24449:5;24446:77;24443:103;;;24526:18;;:::i;:::-;24443:103;24573:1;24566:5;24562:13;24555:20;;24348:233;;;:::o;24587:231::-;24727:34;24723:1;24715:6;24711:14;24704:58;24796:14;24791:2;24783:6;24779:15;24772:39;24587:231;:::o;24824:366::-;24966:3;24987:67;25051:2;25046:3;24987:67;:::i;:::-;24980:74;;25063:93;25152:3;25063:93;:::i;:::-;25181:2;25176:3;25172:12;25165:19;;24824:366;;;:::o;25196:419::-;25362:4;25400:2;25389:9;25385:18;25377:26;;25449:9;25443:4;25439:20;25435:1;25424:9;25420:17;25413:47;25477:131;25603:4;25477:131;:::i;:::-;25469:139;;25196:419;;;:::o;25621:228::-;25761:34;25757:1;25749:6;25745:14;25738:58;25830:11;25825:2;25817:6;25813:15;25806:36;25621:228;:::o;25855:366::-;25997:3;26018:67;26082:2;26077:3;26018:67;:::i;:::-;26011:74;;26094:93;26183:3;26094:93;:::i;:::-;26212:2;26207:3;26203:12;26196:19;;25855:366;;;:::o;26227:419::-;26393:4;26431:2;26420:9;26416:18;26408:26;;26480:9;26474:4;26470:20;26466:1;26455:9;26451:17;26444:47;26508:131;26634:4;26508:131;:::i;:::-;26500:139;;26227:419;;;:::o;26652:229::-;26792:34;26788:1;26780:6;26776:14;26769:58;26861:12;26856:2;26848:6;26844:15;26837:37;26652:229;:::o;26887:366::-;27029:3;27050:67;27114:2;27109:3;27050:67;:::i;:::-;27043:74;;27126:93;27215:3;27126:93;:::i;:::-;27244:2;27239:3;27235:12;27228:19;;26887:366;;;:::o;27259:419::-;27425:4;27463:2;27452:9;27448:18;27440:26;;27512:9;27506:4;27502:20;27498:1;27487:9;27483:17;27476:47;27540:131;27666:4;27540:131;:::i;:::-;27532:139;;27259:419;;;:::o;27684:182::-;27824:34;27820:1;27812:6;27808:14;27801:58;27684:182;:::o;27872:366::-;28014:3;28035:67;28099:2;28094:3;28035:67;:::i;:::-;28028:74;;28111:93;28200:3;28111:93;:::i;:::-;28229:2;28224:3;28220:12;28213:19;;27872:366;;;:::o;28244:419::-;28410:4;28448:2;28437:9;28433:18;28425:26;;28497:9;28491:4;28487:20;28483:1;28472:9;28468:17;28461:47;28525:131;28651:4;28525:131;:::i;:::-;28517:139;;28244:419;;;:::o;28669:177::-;28809:29;28805:1;28797:6;28793:14;28786:53;28669:177;:::o;28852:366::-;28994:3;29015:67;29079:2;29074:3;29015:67;:::i;:::-;29008:74;;29091:93;29180:3;29091:93;:::i;:::-;29209:2;29204:3;29200:12;29193:19;;28852:366;;;:::o;29224:419::-;29390:4;29428:2;29417:9;29413:18;29405:26;;29477:9;29471:4;29467:20;29463:1;29452:9;29448:17;29441:47;29505:131;29631:4;29505:131;:::i;:::-;29497:139;;29224:419;;;:::o;29649:305::-;29689:3;29708:20;29726:1;29708:20;:::i;:::-;29703:25;;29742:20;29760:1;29742:20;:::i;:::-;29737:25;;29896:1;29828:66;29824:74;29821:1;29818:81;29815:107;;;29902:18;;:::i;:::-;29815:107;29946:1;29943;29939:9;29932:16;;29649:305;;;;:::o;29960:332::-;30081:4;30119:2;30108:9;30104:18;30096:26;;30132:71;30200:1;30189:9;30185:17;30176:6;30132:71;:::i;:::-;30213:72;30281:2;30270:9;30266:18;30257:6;30213:72;:::i;:::-;29960:332;;;;;:::o;30298:174::-;30438:26;30434:1;30426:6;30422:14;30415:50;30298:174;:::o;30478:366::-;30620:3;30641:67;30705:2;30700:3;30641:67;:::i;:::-;30634:74;;30717:93;30806:3;30717:93;:::i;:::-;30835:2;30830:3;30826:12;30819:19;;30478:366;;;:::o;30850:419::-;31016:4;31054:2;31043:9;31039:18;31031:26;;31103:9;31097:4;31093:20;31089:1;31078:9;31074:17;31067:47;31131:131;31257:4;31131:131;:::i;:::-;31123:139;;30850:419;;;:::o;31275:165::-;31415:17;31411:1;31403:6;31399:14;31392:41;31275:165;:::o;31446:366::-;31588:3;31609:67;31673:2;31668:3;31609:67;:::i;:::-;31602:74;;31685:93;31774:3;31685:93;:::i;:::-;31803:2;31798:3;31794:12;31787:19;;31446:366;;;:::o;31818:419::-;31984:4;32022:2;32011:9;32007:18;31999:26;;32071:9;32065:4;32061:20;32057:1;32046:9;32042:17;32035:47;32099:131;32225:4;32099:131;:::i;:::-;32091:139;;31818:419;;;:::o;32243:174::-;32383:26;32379:1;32371:6;32367:14;32360:50;32243:174;:::o;32423:366::-;32565:3;32586:67;32650:2;32645:3;32586:67;:::i;:::-;32579:74;;32662:93;32751:3;32662:93;:::i;:::-;32780:2;32775:3;32771:12;32764:19;;32423:366;;;:::o;32795:419::-;32961:4;32999:2;32988:9;32984:18;32976:26;;33048:9;33042:4;33038:20;33034:1;33023:9;33019:17;33012:47;33076:131;33202:4;33076:131;:::i;:::-;33068:139;;32795:419;;;:::o;33220:179::-;33360:31;33356:1;33348:6;33344:14;33337:55;33220:179;:::o;33405:366::-;33547:3;33568:67;33632:2;33627:3;33568:67;:::i;:::-;33561:74;;33644:93;33733:3;33644:93;:::i;:::-;33762:2;33757:3;33753:12;33746:19;;33405:366;;;:::o;33777:419::-;33943:4;33981:2;33970:9;33966:18;33958:26;;34030:9;34024:4;34020:20;34016:1;34005:9;34001:17;33994:47;34058:131;34184:4;34058:131;:::i;:::-;34050:139;;33777:419;;;:::o;34202:177::-;34342:29;34338:1;34330:6;34326:14;34319:53;34202:177;:::o;34385:366::-;34527:3;34548:67;34612:2;34607:3;34548:67;:::i;:::-;34541:74;;34624:93;34713:3;34624:93;:::i;:::-;34742:2;34737:3;34733:12;34726:19;;34385:366;;;:::o;34757:419::-;34923:4;34961:2;34950:9;34946:18;34938:26;;35010:9;35004:4;35000:20;34996:1;34985:9;34981:17;34974:47;35038:131;35164:4;35038:131;:::i;:::-;35030:139;;34757:419;;;:::o;35182:182::-;35322:34;35318:1;35310:6;35306:14;35299:58;35182:182;:::o;35370:366::-;35512:3;35533:67;35597:2;35592:3;35533:67;:::i;:::-;35526:74;;35609:93;35698:3;35609:93;:::i;:::-;35727:2;35722:3;35718:12;35711:19;;35370:366;;;:::o;35742:419::-;35908:4;35946:2;35935:9;35931:18;35923:26;;35995:9;35989:4;35985:20;35981:1;35970:9;35966:17;35959:47;36023:131;36149:4;36023:131;:::i;:::-;36015:139;;35742:419;;;:::o;36167:178::-;36307:30;36303:1;36295:6;36291:14;36284:54;36167:178;:::o;36351:366::-;36493:3;36514:67;36578:2;36573:3;36514:67;:::i;:::-;36507:74;;36590:93;36679:3;36590:93;:::i;:::-;36708:2;36703:3;36699:12;36692:19;;36351:366;;;:::o;36723:419::-;36889:4;36927:2;36916:9;36912:18;36904:26;;36976:9;36970:4;36966:20;36962:1;36951:9;36947:17;36940:47;37004:131;37130:4;37004:131;:::i;:::-;36996:139;;36723:419;;;:::o;37148:177::-;37288:29;37284:1;37276:6;37272:14;37265:53;37148:177;:::o;37331:366::-;37473:3;37494:67;37558:2;37553:3;37494:67;:::i;:::-;37487:74;;37570:93;37659:3;37570:93;:::i;:::-;37688:2;37683:3;37679:12;37672:19;;37331:366;;;:::o;37703:419::-;37869:4;37907:2;37896:9;37892:18;37884:26;;37956:9;37950:4;37946:20;37942:1;37931:9;37927:17;37920:47;37984:131;38110:4;37984:131;:::i;:::-;37976:139;;37703:419;;;:::o;38128:179::-;38268:31;38264:1;38256:6;38252:14;38245:55;38128:179;:::o;38313:366::-;38455:3;38476:67;38540:2;38535:3;38476:67;:::i;:::-;38469:74;;38552:93;38641:3;38552:93;:::i;:::-;38670:2;38665:3;38661:12;38654:19;;38313:366;;;:::o;38685:419::-;38851:4;38889:2;38878:9;38874:18;38866:26;;38938:9;38932:4;38928:20;38924:1;38913:9;38909:17;38902:47;38966:131;39092:4;38966:131;:::i;:::-;38958:139;;38685:419;;;:::o;39110:174::-;39250:26;39246:1;39238:6;39234:14;39227:50;39110:174;:::o;39290:366::-;39432:3;39453:67;39517:2;39512:3;39453:67;:::i;:::-;39446:74;;39529:93;39618:3;39529:93;:::i;:::-;39647:2;39642:3;39638:12;39631:19;;39290:366;;;:::o;39662:419::-;39828:4;39866:2;39855:9;39851:18;39843:26;;39915:9;39909:4;39905:20;39901:1;39890:9;39886:17;39879:47;39943:131;40069:4;39943:131;:::i;:::-;39935:139;;39662:419;;;:::o;40087:172::-;40227:24;40223:1;40215:6;40211:14;40204:48;40087:172;:::o;40265:366::-;40407:3;40428:67;40492:2;40487:3;40428:67;:::i;:::-;40421:74;;40504:93;40593:3;40504:93;:::i;:::-;40622:2;40617:3;40613:12;40606:19;;40265:366;;;:::o;40637:419::-;40803:4;40841:2;40830:9;40826:18;40818:26;;40890:9;40884:4;40880:20;40876:1;40865:9;40861:17;40854:47;40918:131;41044:4;40918:131;:::i;:::-;40910:139;;40637:419;;;:::o;41062:169::-;41202:21;41198:1;41190:6;41186:14;41179:45;41062:169;:::o;41237:366::-;41379:3;41400:67;41464:2;41459:3;41400:67;:::i;:::-;41393:74;;41476:93;41565:3;41476:93;:::i;:::-;41594:2;41589:3;41585:12;41578:19;;41237:366;;;:::o;41609:419::-;41775:4;41813:2;41802:9;41798:18;41790:26;;41862:9;41856:4;41852:20;41848:1;41837:9;41833:17;41826:47;41890:131;42016:4;41890:131;:::i;:::-;41882:139;;41609:419;;;:::o;42034:180::-;42174:32;42170:1;42162:6;42158:14;42151:56;42034:180;:::o;42220:366::-;42362:3;42383:67;42447:2;42442:3;42383:67;:::i;:::-;42376:74;;42459:93;42548:3;42459:93;:::i;:::-;42577:2;42572:3;42568:12;42561:19;;42220:366;;;:::o;42592:419::-;42758:4;42796:2;42785:9;42781:18;42773:26;;42845:9;42839:4;42835:20;42831:1;42820:9;42816:17;42809:47;42873:131;42999:4;42873:131;:::i;:::-;42865:139;;42592:419;;;:::o;43017:234::-;43157:34;43153:1;43145:6;43141:14;43134:58;43226:17;43221:2;43213:6;43209:15;43202:42;43017:234;:::o;43257:366::-;43399:3;43420:67;43484:2;43479:3;43420:67;:::i;:::-;43413:74;;43496:93;43585:3;43496:93;:::i;:::-;43614:2;43609:3;43605:12;43598:19;;43257:366;;;:::o;43629:419::-;43795:4;43833:2;43822:9;43818:18;43810:26;;43882:9;43876:4;43872:20;43868:1;43857:9;43853:17;43846:47;43910:131;44036:4;43910:131;:::i;:::-;43902:139;;43629:419;;;:::o;44054:148::-;44156:11;44193:3;44178:18;;44054:148;;;;:::o;44208:377::-;44314:3;44342:39;44375:5;44342:39;:::i;:::-;44397:89;44479:6;44474:3;44397:89;:::i;:::-;44390:96;;44495:52;44540:6;44535:3;44528:4;44521:5;44517:16;44495:52;:::i;:::-;44572:6;44567:3;44563:16;44556:23;;44318:267;44208:377;;;;:::o;44591:435::-;44771:3;44793:95;44884:3;44875:6;44793:95;:::i;:::-;44786:102;;44905:95;44996:3;44987:6;44905:95;:::i;:::-;44898:102;;45017:3;45010:10;;44591:435;;;;;:::o;45032:225::-;45172:34;45168:1;45160:6;45156:14;45149:58;45241:8;45236:2;45228:6;45224:15;45217:33;45032:225;:::o;45263:366::-;45405:3;45426:67;45490:2;45485:3;45426:67;:::i;:::-;45419:74;;45502:93;45591:3;45502:93;:::i;:::-;45620:2;45615:3;45611:12;45604:19;;45263:366;;;:::o;45635:419::-;45801:4;45839:2;45828:9;45824:18;45816:26;;45888:9;45882:4;45878:20;45874:1;45863:9;45859:17;45852:47;45916:131;46042:4;45916:131;:::i;:::-;45908:139;;45635:419;;;:::o;46060:231::-;46200:34;46196:1;46188:6;46184:14;46177:58;46269:14;46264:2;46256:6;46252:15;46245:39;46060:231;:::o;46297:366::-;46439:3;46460:67;46524:2;46519:3;46460:67;:::i;:::-;46453:74;;46536:93;46625:3;46536:93;:::i;:::-;46654:2;46649:3;46645:12;46638:19;;46297:366;;;:::o;46669:419::-;46835:4;46873:2;46862:9;46858:18;46850:26;;46922:9;46916:4;46912:20;46908:1;46897:9;46893:17;46886:47;46950:131;47076:4;46950:131;:::i;:::-;46942:139;;46669:419;;;:::o;47094:228::-;47234:34;47230:1;47222:6;47218:14;47211:58;47303:11;47298:2;47290:6;47286:15;47279:36;47094:228;:::o;47328:366::-;47470:3;47491:67;47555:2;47550:3;47491:67;:::i;:::-;47484:74;;47567:93;47656:3;47567:93;:::i;:::-;47685:2;47680:3;47676:12;47669:19;;47328:366;;;:::o;47700:419::-;47866:4;47904:2;47893:9;47889:18;47881:26;;47953:9;47947:4;47943:20;47939:1;47928:9;47924:17;47917:47;47981:131;48107:4;47981:131;:::i;:::-;47973:139;;47700:419;;;:::o;48125:223::-;48265:34;48261:1;48253:6;48249:14;48242:58;48334:6;48329:2;48321:6;48317:15;48310:31;48125:223;:::o;48354:366::-;48496:3;48517:67;48581:2;48576:3;48517:67;:::i;:::-;48510:74;;48593:93;48682:3;48593:93;:::i;:::-;48711:2;48706:3;48702:12;48695:19;;48354:366;;;:::o;48726:419::-;48892:4;48930:2;48919:9;48915:18;48907:26;;48979:9;48973:4;48969:20;48965:1;48954:9;48950:17;48943:47;49007:131;49133:4;49007:131;:::i;:::-;48999:139;;48726:419;;;:::o;49151:191::-;49191:4;49211:20;49229:1;49211:20;:::i;:::-;49206:25;;49245:20;49263:1;49245:20;:::i;:::-;49240:25;;49284:1;49281;49278:8;49275:34;;;49289:18;;:::i;:::-;49275:34;49334:1;49331;49327:9;49319:17;;49151:191;;;;:::o;49348:175::-;49488:27;49484:1;49476:6;49472:14;49465:51;49348:175;:::o;49529:366::-;49671:3;49692:67;49756:2;49751:3;49692:67;:::i;:::-;49685:74;;49768:93;49857:3;49768:93;:::i;:::-;49886:2;49881:3;49877:12;49870:19;;49529:366;;;:::o;49901:419::-;50067:4;50105:2;50094:9;50090:18;50082:26;;50154:9;50148:4;50144:20;50140:1;50129:9;50125:17;50118:47;50182:131;50308:4;50182:131;:::i;:::-;50174:139;;49901:419;;;:::o;50326:237::-;50466:34;50462:1;50454:6;50450:14;50443:58;50535:20;50530:2;50522:6;50518:15;50511:45;50326:237;:::o;50569:366::-;50711:3;50732:67;50796:2;50791:3;50732:67;:::i;:::-;50725:74;;50808:93;50897:3;50808:93;:::i;:::-;50926:2;50921:3;50917:12;50910:19;;50569:366;;;:::o;50941:419::-;51107:4;51145:2;51134:9;51130:18;51122:26;;51194:9;51188:4;51184:20;51180:1;51169:9;51165:17;51158:47;51222:131;51348:4;51222:131;:::i;:::-;51214:139;;50941:419;;;:::o;51366:176::-;51398:1;51415:20;51433:1;51415:20;:::i;:::-;51410:25;;51449:20;51467:1;51449:20;:::i;:::-;51444:25;;51488:1;51478:35;;51493:18;;:::i;:::-;51478:35;51534:1;51531;51527:9;51522:14;;51366:176;;;;:::o;51548:98::-;51599:6;51633:5;51627:12;51617:22;;51548:98;;;:::o;51652:168::-;51735:11;51769:6;51764:3;51757:19;51809:4;51804:3;51800:14;51785:29;;51652:168;;;;:::o;51826:360::-;51912:3;51940:38;51972:5;51940:38;:::i;:::-;51994:70;52057:6;52052:3;51994:70;:::i;:::-;51987:77;;52073:52;52118:6;52113:3;52106:4;52099:5;52095:16;52073:52;:::i;:::-;52150:29;52172:6;52150:29;:::i;:::-;52145:3;52141:39;52134:46;;51916:270;51826:360;;;;:::o;52192:640::-;52387:4;52425:3;52414:9;52410:19;52402:27;;52439:71;52507:1;52496:9;52492:17;52483:6;52439:71;:::i;:::-;52520:72;52588:2;52577:9;52573:18;52564:6;52520:72;:::i;:::-;52602;52670:2;52659:9;52655:18;52646:6;52602:72;:::i;:::-;52721:9;52715:4;52711:20;52706:2;52695:9;52691:18;52684:48;52749:76;52820:4;52811:6;52749:76;:::i;:::-;52741:84;;52192:640;;;;;;;:::o;52838:141::-;52894:5;52925:6;52919:13;52910:22;;52941:32;52967:5;52941:32;:::i;:::-;52838:141;;;;:::o;52985:349::-;53054:6;53103:2;53091:9;53082:7;53078:23;53074:32;53071:119;;;53109:79;;:::i;:::-;53071:119;53229:1;53254:63;53309:7;53300:6;53289:9;53285:22;53254:63;:::i;:::-;53244:73;;53200:127;52985:349;;;;:::o;53340:180::-;53388:77;53385:1;53378:88;53485:4;53482:1;53475:15;53509:4;53506:1;53499:15;53526:182;53666:34;53662:1;53654:6;53650:14;53643:58;53526:182;:::o;53714:366::-;53856:3;53877:67;53941:2;53936:3;53877:67;:::i;:::-;53870:74;;53953:93;54042:3;53953:93;:::i;:::-;54071:2;54066:3;54062:12;54055:19;;53714:366;;;:::o;54086:419::-;54252:4;54290:2;54279:9;54275:18;54267:26;;54339:9;54333:4;54329:20;54325:1;54314:9;54310:17;54303:47;54367:131;54493:4;54367:131;:::i;:::-;54359:139;;54086:419;;;:::o;54511:178::-;54651:30;54647:1;54639:6;54635:14;54628:54;54511:178;:::o;54695:366::-;54837:3;54858:67;54922:2;54917:3;54858:67;:::i;:::-;54851:74;;54934:93;55023:3;54934:93;:::i;:::-;55052:2;55047:3;55043:12;55036:19;;54695:366;;;:::o;55067:419::-;55233:4;55271:2;55260:9;55256:18;55248:26;;55320:9;55314:4;55310:20;55306:1;55295:9;55291:17;55284:47;55348:131;55474:4;55348:131;:::i;:::-;55340:139;;55067:419;;;:::o

Swarm Source

ipfs://3fab91cff578928b6268f77605553c023a95c316ed6eca38a265d71048de59dd
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.