Token Dracon Crypto Hero

Overview ERC721

Total Supply:
2,126 DCGHERO

Holders:
857 addresses

Transfers:
-

Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DragonCryptoHero

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-19
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

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 = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @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);

    /**
     * @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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @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);

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @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: DragonCryptoHero.sol


pragma solidity ^0.8.4;








contract DragonCryptoHero is ERC721Enumerable, Ownable, ReentrancyGuard {
    using ECDSA for bytes32;

    event Minted(address indexed buyer, uint256 indexed tokenId);

    address private _signerAddress = 0x07A6597abB94BD91783E992c4f469878f9544177;

    mapping(string => bool) private _usedNonces;

    using Counters for Counters.Counter;
    Counters.Counter public tokenIds;

    string _baseURIOverride;

    mapping( uint256 => uint256 ) private _roundFreeMintCount;
    mapping( uint256 => uint256 ) private _roundTotalMints;

    uint256 public constant CostInStables = 100;

    mapping( address => mapping( uint256 => uint256 ) ) private _addressRoundMintsUsed;
    mapping( address => mapping( uint256 => uint256 ) ) private _addressRoundFreeMints;

    uint256 private _currentMintRound;

    address public DCAUToken;

    address public DevWallet;

    address public OracleAddress;

    uint256 public DCAUPricePerDollar;

    mapping( uint256 => bool ) private _isRoundStarted;
    mapping( uint256 => uint256 ) private _roundStartTimestamp;
    mapping( uint256 => uint256 ) private _roundFreeMintExpirtyTimestamp;
    
    constructor( address dcau, address devWallet, address oracleAddress ) ERC721("Dracon Crypto Hero", "DCGHERO") { 
        _setBaseURI("https://heroes.dragoncrypto.io/metadata/");
        // set the initial mint id to 1
        tokenIds.increment();
        DCAUToken = dcau;
        DevWallet = devWallet;
        OracleAddress = oracleAddress;
    }

        // INTERNAL
    function _setBaseURI(string memory baseURI)
        internal
        virtual
    {
        _baseURIOverride = baseURI;
    }

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

    function setBaseURI(string memory baseURI)
        external
        onlyOwner
    {
        _setBaseURI(baseURI);
    }

    // verify whether hash matches against tampering; use of others' minting opportunity, diff mint count etc
    function hashTransaction(address sender, uint256 qty, string memory nonce) private pure returns(bytes32) {
        bytes32 hash = keccak256(abi.encodePacked(
            "\x19Ethereum Signed Message:\n32",
            keccak256(abi.encodePacked(sender, qty, nonce)))
        );
            
        return hash;
    }
        
    // match serverside private key sign to set pub key
    function matchAddresSigner(bytes32 hash, bytes memory signature) private view returns(bool) {
        return _signerAddress == hash.recover(signature);
    }

    function hasFreeMint( ) external view returns (bool){
        if (_roundFreeMintExpirtyTimestamp[_currentMintRound] > block.timestamp ) {
            return _addressRoundFreeMints[msg.sender][_currentMintRound] > 0;
        }

        return false;
    }

    function addressMintsRemaining() external view returns(uint256){
        return 2 - _addressRoundMintsUsed[msg.sender][_currentMintRound];
    }

    function addressFreeMintsRemaining() external view returns(uint256){
        if (_roundFreeMintExpirtyTimestamp[_currentMintRound] > block.timestamp ) {
            return _addressRoundFreeMints[msg.sender][_currentMintRound];
        }

        return 0;
    }

    function publicMintsRemaining() external view returns(uint256){
        if (_roundFreeMintExpirtyTimestamp[_currentMintRound] > block.timestamp ) {
            return _roundTotalMints[_currentMintRound] - _roundFreeMintCount[_currentMintRound];
        } 

        return _roundTotalMints[_currentMintRound];
    }

    function setDCAUPricePerDollar( uint256 currentPrice ) external nonReentrant {
        require( msg.sender == OracleAddress, "ORACLE_ONLY" );

        DCAUPricePerDollar = currentPrice;
    }

    function freeMint( ) external nonReentrant {
        require( _addressRoundFreeMints[msg.sender][_currentMintRound] > 0, "MINTS_USED" );
        require( _roundFreeMintExpirtyTimestamp[_currentMintRound] > block.timestamp, "FREE_CLOSED");
        require( _isRoundStarted[_currentMintRound], "MINT_NOT_OPEN" );

        uint256 newItemId = tokenIds.current();
        _safeMint(msg.sender, newItemId);

        _addressRoundFreeMints[msg.sender][_currentMintRound]--;

        _roundTotalMints[_currentMintRound]--;
        _roundFreeMintCount[_currentMintRound]--;

        tokenIds.increment();

        emit Minted(msg.sender, newItemId);
    }

    function emergencyBrake( ) external onlyOwner nonReentrant{
        _isRoundStarted[_currentMintRound] = false;
    }
    
    // not payable for snippet
    function mint(bytes memory signature, string memory nonce, uint256 tokenQuantity) external nonReentrant {
        require(matchAddresSigner(hashTransaction(msg.sender, tokenQuantity, nonce), signature), "DIRECT_MINT_DISALLOWED");
        require(!_usedNonces[nonce], "HASH_USED");
        require( _addressRoundMintsUsed[msg.sender][_currentMintRound] + tokenQuantity <= 2, "MINTS_USED" );

        if(  _roundFreeMintExpirtyTimestamp[_currentMintRound] > block.timestamp ){
            require( _roundTotalMints[_currentMintRound] - _roundFreeMintCount[_currentMintRound] >= tokenQuantity, "NO_MORE_MINTS");
        } else {
            require( _roundTotalMints[_currentMintRound] >= tokenQuantity, "NO_MORE_MINTS");
        }

        require( _isRoundStarted[_currentMintRound] && block.timestamp >= _roundStartTimestamp[_currentMintRound], "ROUND_INVALID" );
        
        _usedNonces[nonce] = true;

        IERC20(DCAUToken).transferFrom(msg.sender, DevWallet, ( DCAUPricePerDollar * CostInStables ) * tokenQuantity );
            
        for(uint256 i = 0; i < tokenQuantity; i++) {
            uint256 newItemId = tokenIds.current();
            _safeMint(msg.sender, newItemId);

            tokenIds.increment();
            _addressRoundMintsUsed[msg.sender][_currentMintRound]++;

            _roundTotalMints[_currentMintRound]--;

            emit Minted(msg.sender, newItemId);
        }
    }

    // change public key for relaunches so signatures get invalidated
    function setSignerAddress(address addr) external onlyOwner {
        _signerAddress = addr;
    }

    //add a free mint
    function addFreeMint( address addr ) external onlyOwner {
        _addressRoundFreeMints[addr][_currentMintRound]++;
        _roundFreeMintCount[_currentMintRound]++;
    }

    function startMintRound( uint256 mintRound, uint256 totalMints, uint256 startTimestamp, uint256 freeMintExpiryTimestamp ) external onlyOwner {
        _currentMintRound = mintRound;
        _isRoundStarted[mintRound] = true;
        _roundStartTimestamp[mintRound] = startTimestamp;
        _roundTotalMints[mintRound] = totalMints;
        _roundFreeMintExpirtyTimestamp[mintRound] = freeMintExpiryTimestamp;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"dcau","type":"address"},{"internalType":"address","name":"devWallet","type":"address"},{"internalType":"address","name":"oracleAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CostInStables","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DCAUPricePerDollar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DCAUToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DevWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OracleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addFreeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addressFreeMintsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressMintsRemaining","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":[],"name":"emergencyBrake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeMint","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":"hasFreeMint","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":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"string","name":"nonce","type":"string"},{"internalType":"uint256","name":"tokenQuantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"currentPrice","type":"uint256"}],"name":"setDCAUPricePerDollar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintRound","type":"uint256"},{"internalType":"uint256","name":"totalMints","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"freeMintExpiryTimestamp","type":"uint256"}],"name":"startMintRound","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":[],"name":"tokenIds","outputs":[{"internalType":"uint256","name":"_value","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"}]

60806040527307a6597abb94bd91783e992c4f469878f9544177600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b5060405162005ba038038062005ba083398181016040528101906200008c919062000428565b6040518060400160405280601281526020017f447261636f6e2043727970746f204865726f00000000000000000000000000008152506040518060400160405280600781526020017f4443474845524f0000000000000000000000000000000000000000000000000081525081600090805190602001906200011092919062000361565b5080600190805190602001906200012992919062000361565b5050506200014c620001406200026160201b60201c565b6200026960201b60201c565b6001600b819055506200017e60405180606001604052806028815260200162005b78602891396200032f60201b60201c565b62000195600e6200034b60201b620020511760201c565b82601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200053c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600f90805190602001906200034792919062000361565b5050565b6001816000016000828254019250508190555050565b8280546200036f90620004b8565b90600052602060002090601f016020900481019282620003935760008555620003df565b82601f10620003ae57805160ff1916838001178555620003df565b82800160010185558215620003df579182015b82811115620003de578251825591602001919060010190620003c1565b5b509050620003ee9190620003f2565b5090565b5b808211156200040d576000816000905550600101620003f3565b5090565b600081519050620004228162000522565b92915050565b6000806000606084860312156200044457620004436200051d565b5b6000620004548682870162000411565b9350506020620004678682870162000411565b92505060406200047a8682870162000411565b9150509250925092565b6000620004918262000498565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620004d157607f821691505b60208210811415620004e857620004e7620004ee565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200052d8162000484565b81146200053957600080fd5b50565b61562c806200054c6000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80636352211e11610130578063b115e4df116100b8578063e2e57e961161007c578063e2e57e961461061a578063e985e9c514610638578063f2fde38b14610668578063f80e4ade14610684578063fb31c35b146106a257610227565b8063b115e4df14610576578063b680bbd414610594578063b86b8637146105b0578063b88d4fde146105ce578063c87b56dd146105ea57610227565b8063715018a6116100ff578063715018a61461050a5780638da5cb5b1461051457806393b440991461053257806395d89b411461053c578063a22cb4651461055a57610227565b80636352211e146104705780636be5cb25146104a057806370a08231146104bc578063714cff56146104ec57610227565b80632f745c59116101b357806342842e0e1161018257806342842e0e146103e25780634f099a95146103fe5780634f6ccce71461041a57806355f804b31461044a5780635b70ea9f1461046657610227565b80632f745c5914610358578063373a679a146103885780633a2ac2cf146103a65780633d661933146103c457610227565b8063081812fc116101fa578063081812fc146102b4578063095ea7b3146102e4578063170127691461030057806318160ddd1461031e57806323b872dd1461033c57610227565b806301ffc9a71461022c578063038888441461025c578063046dc1661461027a57806306fdde0314610296575b600080fd5b61024660048036038101906102419190613baa565b6106be565b6040516102539190614437565b60405180910390f35b610264610738565b6040516102719190614899565b60405180910390f35b610294600480360381019061028f91906139ba565b61073d565b005b61029e6107fd565b6040516102ab9190614497565b60405180910390f35b6102ce60048036038101906102c99190613cd8565b61088f565b6040516102db9190614399565b60405180910390f35b6102fe60048036038101906102f99190613b3d565b610914565b005b610308610a2c565b6040516103159190614899565b60405180910390f35b610326610a32565b6040516103339190614899565b60405180910390f35b61035660048036038101906103519190613a27565b610a3f565b005b610372600480360381019061036d9190613b3d565b610a9f565b60405161037f9190614899565b60405180910390f35b610390610b44565b60405161039d9190614399565b60405180910390f35b6103ae610b6a565b6040516103bb9190614437565b60405180910390f35b6103cc610bee565b6040516103d99190614899565b60405180910390f35b6103fc60048036038101906103f79190613a27565b610c54565b005b61041860048036038101906104139190613c04565b610c74565b005b610434600480360381019061042f9190613cd8565b6111e2565b6040516104419190614899565b60405180910390f35b610464600480360381019061045f9190613c8f565b611253565b005b61046e6112db565b005b61048a60048036038101906104859190613cd8565b6115a6565b6040516104979190614399565b60405180910390f35b6104ba60048036038101906104b59190613cd8565b611658565b005b6104d660048036038101906104d191906139ba565b611748565b6040516104e39190614899565b60405180910390f35b6104f4611800565b6040516105019190614899565b60405180910390f35b61051261180c565b005b61051c611894565b6040516105299190614399565b60405180910390f35b61053a6118be565b005b6105446119c0565b6040516105519190614497565b60405180910390f35b610574600480360381019061056f9190613afd565b611a52565b005b61057e611a68565b60405161058b9190614399565b60405180910390f35b6105ae60048036038101906105a991906139ba565b611a8e565b005b6105b8611ba0565b6040516105c59190614899565b60405180910390f35b6105e860048036038101906105e39190613a7a565b611c21565b005b61060460048036038101906105ff9190613cd8565b611c83565b6040516106119190614497565b60405180910390f35b610622611d2a565b60405161062f9190614399565b60405180910390f35b610652600480360381019061064d91906139e7565b611d50565b60405161065f9190614437565b60405180910390f35b610682600480360381019061067d91906139ba565b611de4565b005b61068c611edc565b6040516106999190614899565b60405180910390f35b6106bc60048036038101906106b79190613d05565b611f54565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610731575061073082612067565b5b9050919050565b606481565b610745612149565b73ffffffffffffffffffffffffffffffffffffffff16610763611894565b73ffffffffffffffffffffffffffffffffffffffff16146107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b090614759565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000805461080c90614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461083890614b8a565b80156108855780601f1061085a57610100808354040283529160200191610885565b820191906000526020600020905b81548152906001019060200180831161086857829003601f168201915b5050505050905090565b600061089a82612151565b6108d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d090614739565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091f826115a6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610987906147d9565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109af612149565b73ffffffffffffffffffffffffffffffffffffffff1614806109de57506109dd816109d8612149565b611d50565b5b610a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1490614679565b60405180910390fd5b610a2783836121bd565b505050565b60185481565b6000600880549050905090565b610a50610a4a612149565b82612276565b610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690614819565b60405180910390fd5b610a9a838383612354565b505050565b6000610aaa83611748565b8210610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae290614519565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600042601b60006014548152602001908152602001600020541115610be6576000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601454815260200190815260200160002054119050610beb565b600090505b90565b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006014548152602001908152602001600020546002610c4f9190614a5f565b905090565b610c6f83838360405180602001604052806000815250611c21565b505050565b6002600b541415610cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb190614879565b60405180910390fd5b6002600b81905550610cd6610cd03383856125bb565b8461261c565b610d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0c906144d9565b60405180910390fd5b600d82604051610d259190614338565b908152602001604051809103902060009054906101000a900460ff1615610d81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d78906147f9565b60405180910390fd5b600281601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601454815260200190815260200160002054610de1919061497e565b1115610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e19906147b9565b60405180910390fd5b42601b60006014548152602001908152602001600020541115610ebc57806010600060145481526020019081526020016000205460116000601454815260200190815260200160002054610e769190614a5f565b1015610eb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eae90614619565b60405180910390fd5b610f15565b80601160006014548152602001908152602001600020541015610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90614619565b60405180910390fd5b5b60196000601454815260200190815260200160002060009054906101000a900460ff168015610f595750601a60006014548152602001908152602001600020544210155b610f98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f90614859565b60405180910390fd5b6001600d83604051610faa9190614338565b908152602001604051809103902060006101000a81548160ff021916908315150217905550601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460646018546110419190614a05565b61104b9190614a05565b6040518463ffffffff1660e01b8152600401611069939291906143b4565b602060405180830381600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bb9190613b7d565b5060005b818110156111d45760006110d3600e612689565b90506110df3382612697565b6110e9600e612051565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006014548152602001908152602001600020600081548092919061114c90614bed565b9190505550601160006014548152602001908152602001600020600081548092919061117790614b60565b9190505550803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a35080806111cc90614bed565b9150506110bf565b506001600b81905550505050565b60006111ec610a32565b821061122d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122490614839565b60405180910390fd5b6008828154811061124157611240614d8a565b5b90600052602060002001549050919050565b61125b612149565b73ffffffffffffffffffffffffffffffffffffffff16611279611894565b73ffffffffffffffffffffffffffffffffffffffff16146112cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c690614759565b60405180910390fd5b6112d8816126b5565b50565b6002600b541415611321576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131890614879565b60405180910390fd5b6002600b819055506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601454815260200190815260200160002054116113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b5906147b9565b60405180910390fd5b42601b600060145481526020019081526020016000205411611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614699565b60405180910390fd5b60196000601454815260200190815260200160002060009054906101000a900460ff16611477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146e90614779565b60405180910390fd5b6000611483600e612689565b905061148f3382612697565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000601454815260200190815260200160002060008154809291906114f290614b60565b9190505550601160006014548152602001908152602001600020600081548092919061151d90614b60565b9190505550601060006014548152602001908152602001600020600081548092919061154890614b60565b9190505550611557600e612051565b803373ffffffffffffffffffffffffffffffffffffffff167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe60405160405180910390a3506001600b81905550565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561164f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611646906146d9565b60405180910390fd5b80915050919050565b6002600b54141561169e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169590614879565b60405180910390fd5b6002600b81905550601760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d906145b9565b60405180910390fd5b806018819055506001600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b0906146b9565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600e8060000154905081565b611814612149565b73ffffffffffffffffffffffffffffffffffffffff16611832611894565b73ffffffffffffffffffffffffffffffffffffffff1614611888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187f90614759565b60405180910390fd5b61189260006126cf565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118c6612149565b73ffffffffffffffffffffffffffffffffffffffff166118e4611894565b73ffffffffffffffffffffffffffffffffffffffff161461193a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193190614759565b60405180910390fd5b6002600b541415611980576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197790614879565b60405180910390fd5b6002600b81905550600060196000601454815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b81905550565b6060600180546119cf90614b8a565b80601f01602080910402602001604051908101604052809291908181526020018280546119fb90614b8a565b8015611a485780601f10611a1d57610100808354040283529160200191611a48565b820191906000526020600020905b815481529060010190602001808311611a2b57829003601f168201915b5050505050905090565b611a64611a5d612149565b8383612795565b5050565b601660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611a96612149565b73ffffffffffffffffffffffffffffffffffffffff16611ab4611894565b73ffffffffffffffffffffffffffffffffffffffff1614611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614759565b60405180910390fd5b601360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060145481526020019081526020016000206000815480929190611b6d90614bed565b91905055506010600060145481526020019081526020016000206000815480929190611b9890614bed565b919050555050565b600042601b60006014548152602001908152602001600020541115611c1957601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006014548152602001908152602001600020549050611c1e565b600090505b90565b611c32611c2c612149565b83612276565b611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6890614819565b60405180910390fd5b611c7d84848484612902565b50505050565b6060611c8e82612151565b611ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc490614799565b60405180910390fd5b6000611cd761295e565b90506000815111611cf75760405180602001604052806000815250611d22565b80611d01846129f0565b604051602001611d1292919061434f565b6040516020818303038152906040525b915050919050565b601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611dec612149565b73ffffffffffffffffffffffffffffffffffffffff16611e0a611894565b73ffffffffffffffffffffffffffffffffffffffff1614611e60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5790614759565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec790614559565b60405180910390fd5b611ed9816126cf565b50565b600042601b60006014548152602001908152602001600020541115611f38576010600060145481526020019081526020016000205460116000601454815260200190815260200160002054611f319190614a5f565b9050611f51565b6011600060145481526020019081526020016000205490505b90565b611f5c612149565b73ffffffffffffffffffffffffffffffffffffffff16611f7a611894565b73ffffffffffffffffffffffffffffffffffffffff1614611fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc790614759565b60405180910390fd5b8360148190555060016019600086815260200190815260200160002060006101000a81548160ff02191690831515021790555081601a60008681526020019081526020016000208190555082601160008681526020019081526020016000208190555080601b60008681526020019081526020016000208190555050505050565b6001816000016000828254019250508190555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061213257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612142575061214182612b51565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612230836115a6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061228182612151565b6122c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b790614659565b60405180910390fd5b60006122cb836115a6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061233a57508373ffffffffffffffffffffffffffffffffffffffff166123228461088f565b73ffffffffffffffffffffffffffffffffffffffff16145b8061234b575061234a8185611d50565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612374826115a6565b73ffffffffffffffffffffffffffffffffffffffff16146123ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c190614579565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561243a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612431906145d9565b60405180910390fd5b612445838383612bbb565b6124506000826121bd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a09190614a5f565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f7919061497e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125b6838383612ccf565b505050565b6000808484846040516020016125d3939291906142ff565b604051602081830303815290604052805190602001206040516020016125f99190614373565b604051602081830303815290604052805190602001209050809150509392505050565b60006126318284612cd490919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600081600001549050919050565b6126b1828260405180602001604052806000815250612cfb565b5050565b80600f90805190602001906126cb9291906137b9565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb906145f9565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128f59190614437565b60405180910390a3505050565b61290d848484612354565b61291984848484612d56565b612958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294f90614539565b60405180910390fd5b50505050565b6060600f805461296d90614b8a565b80601f016020809104026020016040519081016040528092919081815260200182805461299990614b8a565b80156129e65780601f106129bb576101008083540402835291602001916129e6565b820191906000526020600020905b8154815290600101906020018083116129c957829003601f168201915b5050505050905090565b60606000821415612a38576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b4c565b600082905060005b60008214612a6a578080612a5390614bed565b915050600a82612a6391906149d4565b9150612a40565b60008167ffffffffffffffff811115612a8657612a85614db9565b5b6040519080825280601f01601f191660200182016040528015612ab85781602001600182028036833780820191505090505b5090505b60008514612b4557600182612ad19190614a5f565b9150600a85612ae09190614c6e565b6030612aec919061497e565b60f81b818381518110612b0257612b01614d8a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b3e91906149d4565b9450612abc565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bc6838383612eed565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c0957612c0481612ef2565b612c48565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c4757612c468382612f3b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c8b57612c86816130a8565b612cca565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cc957612cc88282613179565b5b5b505050565b505050565b6000806000612ce385856131f8565b91509150612cf08161327b565b819250505092915050565b612d058383613450565b612d126000848484612d56565b612d51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4890614539565b60405180910390fd5b505050565b6000612d778473ffffffffffffffffffffffffffffffffffffffff1661362a565b15612ee0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612da0612149565b8786866040518563ffffffff1660e01b8152600401612dc294939291906143eb565b602060405180830381600087803b158015612ddc57600080fd5b505af1925050508015612e0d57506040513d601f19601f82011682018060405250810190612e0a9190613bd7565b60015b612e90573d8060008114612e3d576040519150601f19603f3d011682016040523d82523d6000602084013e612e42565b606091505b50600081511415612e88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e7f90614539565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ee5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f4884611748565b612f529190614a5f565b9050600060076000848152602001908152602001600020549050818114613037576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506130bc9190614a5f565b90506000600960008481526020019081526020016000205490506000600883815481106130ec576130eb614d8a565b5b90600052602060002001549050806008838154811061310e5761310d614d8a565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061315d5761315c614d5b565b5b6001900381819060005260206000200160009055905550505050565b600061318483611748565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008060418351141561323a5760008060006020860151925060408601519150606086015160001a905061322e8782858561364d565b94509450505050613274565b60408351141561326b57600080602085015191506040850151905061326086838361375a565b935093505050613274565b60006002915091505b9250929050565b6000600481111561328f5761328e614cfd565b5b8160048111156132a2576132a1614cfd565b5b14156132ad5761344d565b600160048111156132c1576132c0614cfd565b5b8160048111156132d4576132d3614cfd565b5b1415613315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330c906144b9565b60405180910390fd5b6002600481111561332957613328614cfd565b5b81600481111561333c5761333b614cfd565b5b141561337d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613374906144f9565b60405180910390fd5b6003600481111561339157613390614cfd565b5b8160048111156133a4576133a3614cfd565b5b14156133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc90614639565b60405180910390fd5b6004808111156133f8576133f7614cfd565b5b81600481111561340b5761340a614cfd565b5b141561344c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613443906146f9565b60405180910390fd5b5b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b790614719565b60405180910390fd5b6134c981612151565b15613509576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350090614599565b60405180910390fd5b61351560008383612bbb565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613565919061497e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461362660008383612ccf565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115613688576000600391509150613751565b601b8560ff16141580156136a05750601c8560ff1614155b156136b2576000600491509150613751565b6000600187878787604051600081526020016040526040516136d79493929190614452565b6020604051602081039080840390855afa1580156136f9573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561374857600060019250925050613751565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61379d919061497e565b90506137ab8782888561364d565b935093505050935093915050565b8280546137c590614b8a565b90600052602060002090601f0160209004810192826137e7576000855561382e565b82601f1061380057805160ff191683800117855561382e565b8280016001018555821561382e579182015b8281111561382d578251825591602001919060010190613812565b5b50905061383b919061383f565b5090565b5b80821115613858576000816000905550600101613840565b5090565b600061386f61386a846148d9565b6148b4565b90508281526020810184848401111561388b5761388a614ded565b5b613896848285614b1e565b509392505050565b60006138b16138ac8461490a565b6148b4565b9050828152602081018484840111156138cd576138cc614ded565b5b6138d8848285614b1e565b509392505050565b6000813590506138ef8161559a565b92915050565b600081359050613904816155b1565b92915050565b600081519050613919816155b1565b92915050565b60008135905061392e816155c8565b92915050565b600081519050613943816155c8565b92915050565b600082601f83011261395e5761395d614de8565b5b813561396e84826020860161385c565b91505092915050565b600082601f83011261398c5761398b614de8565b5b813561399c84826020860161389e565b91505092915050565b6000813590506139b4816155df565b92915050565b6000602082840312156139d0576139cf614df7565b5b60006139de848285016138e0565b91505092915050565b600080604083850312156139fe576139fd614df7565b5b6000613a0c858286016138e0565b9250506020613a1d858286016138e0565b9150509250929050565b600080600060608486031215613a4057613a3f614df7565b5b6000613a4e868287016138e0565b9350506020613a5f868287016138e0565b9250506040613a70868287016139a5565b9150509250925092565b60008060008060808587031215613a9457613a93614df7565b5b6000613aa2878288016138e0565b9450506020613ab3878288016138e0565b9350506040613ac4878288016139a5565b925050606085013567ffffffffffffffff811115613ae557613ae4614df2565b5b613af187828801613949565b91505092959194509250565b60008060408385031215613b1457613b13614df7565b5b6000613b22858286016138e0565b9250506020613b33858286016138f5565b9150509250929050565b60008060408385031215613b5457613b53614df7565b5b6000613b62858286016138e0565b9250506020613b73858286016139a5565b9150509250929050565b600060208284031215613b9357613b92614df7565b5b6000613ba18482850161390a565b91505092915050565b600060208284031215613bc057613bbf614df7565b5b6000613bce8482850161391f565b91505092915050565b600060208284031215613bed57613bec614df7565b5b6000613bfb84828501613934565b91505092915050565b600080600060608486031215613c1d57613c1c614df7565b5b600084013567ffffffffffffffff811115613c3b57613c3a614df2565b5b613c4786828701613949565b935050602084013567ffffffffffffffff811115613c6857613c67614df2565b5b613c7486828701613977565b9250506040613c85868287016139a5565b9150509250925092565b600060208284031215613ca557613ca4614df7565b5b600082013567ffffffffffffffff811115613cc357613cc2614df2565b5b613ccf84828501613977565b91505092915050565b600060208284031215613cee57613ced614df7565b5b6000613cfc848285016139a5565b91505092915050565b60008060008060808587031215613d1f57613d1e614df7565b5b6000613d2d878288016139a5565b9450506020613d3e878288016139a5565b9350506040613d4f878288016139a5565b9250506060613d60878288016139a5565b91505092959194509250565b613d7581614a93565b82525050565b613d8c613d8782614a93565b614c36565b82525050565b613d9b81614aa5565b82525050565b613daa81614ab1565b82525050565b613dc1613dbc82614ab1565b614c48565b82525050565b6000613dd28261493b565b613ddc8185614951565b9350613dec818560208601614b2d565b613df581614dfc565b840191505092915050565b6000613e0b82614946565b613e158185614962565b9350613e25818560208601614b2d565b613e2e81614dfc565b840191505092915050565b6000613e4482614946565b613e4e8185614973565b9350613e5e818560208601614b2d565b80840191505092915050565b6000613e77601883614962565b9150613e8282614e1a565b602082019050919050565b6000613e9a601683614962565b9150613ea582614e43565b602082019050919050565b6000613ebd601f83614962565b9150613ec882614e6c565b602082019050919050565b6000613ee0601c83614973565b9150613eeb82614e95565b601c82019050919050565b6000613f03602b83614962565b9150613f0e82614ebe565b604082019050919050565b6000613f26603283614962565b9150613f3182614f0d565b604082019050919050565b6000613f49602683614962565b9150613f5482614f5c565b604082019050919050565b6000613f6c602583614962565b9150613f7782614fab565b604082019050919050565b6000613f8f601c83614962565b9150613f9a82614ffa565b602082019050919050565b6000613fb2600b83614962565b9150613fbd82615023565b602082019050919050565b6000613fd5602483614962565b9150613fe08261504c565b604082019050919050565b6000613ff8601983614962565b91506140038261509b565b602082019050919050565b600061401b600d83614962565b9150614026826150c4565b602082019050919050565b600061403e602283614962565b9150614049826150ed565b604082019050919050565b6000614061602c83614962565b915061406c8261513c565b604082019050919050565b6000614084603883614962565b915061408f8261518b565b604082019050919050565b60006140a7600b83614962565b91506140b2826151da565b602082019050919050565b60006140ca602a83614962565b91506140d582615203565b604082019050919050565b60006140ed602983614962565b91506140f882615252565b604082019050919050565b6000614110602283614962565b915061411b826152a1565b604082019050919050565b6000614133602083614962565b915061413e826152f0565b602082019050919050565b6000614156602c83614962565b915061416182615319565b604082019050919050565b6000614179602083614962565b915061418482615368565b602082019050919050565b600061419c600d83614962565b91506141a782615391565b602082019050919050565b60006141bf602f83614962565b91506141ca826153ba565b604082019050919050565b60006141e2600a83614962565b91506141ed82615409565b602082019050919050565b6000614205602183614962565b915061421082615432565b604082019050919050565b6000614228600983614962565b915061423382615481565b602082019050919050565b600061424b603183614962565b9150614256826154aa565b604082019050919050565b600061426e602c83614962565b9150614279826154f9565b604082019050919050565b6000614291600d83614962565b915061429c82615548565b602082019050919050565b60006142b4601f83614962565b91506142bf82615571565b602082019050919050565b6142d381614b07565b82525050565b6142ea6142e582614b07565b614c64565b82525050565b6142f981614b11565b82525050565b600061430b8286613d7b565b60148201915061431b82856142d9565b60208201915061432b8284613e39565b9150819050949350505050565b60006143448284613e39565b915081905092915050565b600061435b8285613e39565b91506143678284613e39565b91508190509392505050565b600061437e82613ed3565b915061438a8284613db0565b60208201915081905092915050565b60006020820190506143ae6000830184613d6c565b92915050565b60006060820190506143c96000830186613d6c565b6143d66020830185613d6c565b6143e360408301846142ca565b949350505050565b60006080820190506144006000830187613d6c565b61440d6020830186613d6c565b61441a60408301856142ca565b818103606083015261442c8184613dc7565b905095945050505050565b600060208201905061444c6000830184613d92565b92915050565b60006080820190506144676000830187613da1565b61447460208301866142f0565b6144816040830185613da1565b61448e6060830184613da1565b95945050505050565b600060208201905081810360008301526144b18184613e00565b905092915050565b600060208201905081810360008301526144d281613e6a565b9050919050565b600060208201905081810360008301526144f281613e8d565b9050919050565b6000602082019050818103600083015261451281613eb0565b9050919050565b6000602082019050818103600083015261453281613ef6565b9050919050565b6000602082019050818103600083015261455281613f19565b9050919050565b6000602082019050818103600083015261457281613f3c565b9050919050565b6000602082019050818103600083015261459281613f5f565b9050919050565b600060208201905081810360008301526145b281613f82565b9050919050565b600060208201905081810360008301526145d281613fa5565b9050919050565b600060208201905081810360008301526145f281613fc8565b9050919050565b6000602082019050818103600083015261461281613feb565b9050919050565b600060208201905081810360008301526146328161400e565b9050919050565b6000602082019050818103600083015261465281614031565b9050919050565b6000602082019050818103600083015261467281614054565b9050919050565b6000602082019050818103600083015261469281614077565b9050919050565b600060208201905081810360008301526146b28161409a565b9050919050565b600060208201905081810360008301526146d2816140bd565b9050919050565b600060208201905081810360008301526146f2816140e0565b9050919050565b6000602082019050818103600083015261471281614103565b9050919050565b6000602082019050818103600083015261473281614126565b9050919050565b6000602082019050818103600083015261475281614149565b9050919050565b600060208201905081810360008301526147728161416c565b9050919050565b600060208201905081810360008301526147928161418f565b9050919050565b600060208201905081810360008301526147b2816141b2565b9050919050565b600060208201905081810360008301526147d2816141d5565b9050919050565b600060208201905081810360008301526147f2816141f8565b9050919050565b600060208201905081810360008301526148128161421b565b9050919050565b600060208201905081810360008301526148328161423e565b9050919050565b6000602082019050818103600083015261485281614261565b9050919050565b6000602082019050818103600083015261487281614284565b9050919050565b60006020820190508181036000830152614892816142a7565b9050919050565b60006020820190506148ae60008301846142ca565b92915050565b60006148be6148cf565b90506148ca8282614bbc565b919050565b6000604051905090565b600067ffffffffffffffff8211156148f4576148f3614db9565b5b6148fd82614dfc565b9050602081019050919050565b600067ffffffffffffffff82111561492557614924614db9565b5b61492e82614dfc565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061498982614b07565b915061499483614b07565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149c9576149c8614c9f565b5b828201905092915050565b60006149df82614b07565b91506149ea83614b07565b9250826149fa576149f9614cce565b5b828204905092915050565b6000614a1082614b07565b9150614a1b83614b07565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a5457614a53614c9f565b5b828202905092915050565b6000614a6a82614b07565b9150614a7583614b07565b925082821015614a8857614a87614c9f565b5b828203905092915050565b6000614a9e82614ae7565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b4b578082015181840152602081019050614b30565b83811115614b5a576000848401525b50505050565b6000614b6b82614b07565b91506000821415614b7f57614b7e614c9f565b5b600182039050919050565b60006002820490506001821680614ba257607f821691505b60208210811415614bb657614bb5614d2c565b5b50919050565b614bc582614dfc565b810181811067ffffffffffffffff82111715614be457614be3614db9565b5b80604052505050565b6000614bf882614b07565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c2b57614c2a614c9f565b5b600182019050919050565b6000614c4182614c52565b9050919050565b6000819050919050565b6000614c5d82614e0d565b9050919050565b6000819050919050565b6000614c7982614b07565b9150614c8483614b07565b925082614c9457614c93614cce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f4449524543545f4d494e545f444953414c4c4f57454400000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4f5241434c455f4f4e4c59000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e4f5f4d4f52455f4d494e545300000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f465245455f434c4f534544000000000000000000000000000000000000000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d494e545f4e4f545f4f50454e00000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d494e54535f5553454400000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f484153485f555345440000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f524f554e445f494e56414c494400000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6155a381614a93565b81146155ae57600080fd5b50565b6155ba81614aa5565b81146155c557600080fd5b50565b6155d181614abb565b81146155dc57600080fd5b50565b6155e881614b07565b81146155f357600080fd5b5056fea2646970667358221220a4c81669865651994016a2b0f161bbb2c5bdb755c9928ceb88ea8499f46e126164736f6c6343000807003368747470733a2f2f6865726f65732e647261676f6e63727970746f2e696f2f6d657461646174612f000000000000000000000000100cc3a819dd3e8573fd2e46d1e66ee866068f30000000000000000000000000306e5f7fae63a86b3e2d88f94cca8d7614684d91000000000000000000000000306e5f7fae63a86b3e2d88f94cca8d7614684d91

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

000000000000000000000000100cc3a819dd3e8573fd2e46d1e66ee866068f30000000000000000000000000306e5f7fae63a86b3e2d88f94cca8d7614684d91000000000000000000000000306e5f7fae63a86b3e2d88f94cca8d7614684d91

-----Decoded View---------------
Arg [0] : dcau (address): 0x100cc3a819dd3e8573fd2e46d1e66ee866068f30
Arg [1] : devWallet (address): 0x306e5f7fae63a86b3e2d88f94cca8d7614684d91
Arg [2] : oracleAddress (address): 0x306e5f7fae63a86b3e2d88f94cca8d7614684d91

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000100cc3a819dd3e8573fd2e46d1e66ee866068f30
Arg [1] : 000000000000000000000000306e5f7fae63a86b3e2d88f94cca8d7614684d91
Arg [2] : 000000000000000000000000306e5f7fae63a86b3e2d88f94cca8d7614684d91


Deployed ByteCode Sourcemap

62208:6986:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55984:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62766:43;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68457:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42804:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44363:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43886:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63143:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56624:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45113:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56292:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63106:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64875:260;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65143:146;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45523:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66937:1441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56814:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64068:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66103:663;;;:::i;:::-;;42498:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65900:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42228:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62566:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21400:103;;;:::i;:::-;;20749:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66774:119;;;:::i;:::-;;42973:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44656:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63073:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68587:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65297:267;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45779:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43148:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63040:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44882:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21658:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65572:320;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68770:421;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55984:224;56086:4;56125:35;56110:50;;;:11;:50;;;;:90;;;;56164:36;56188:11;56164:23;:36::i;:::-;56110:90;56103:97;;55984:224;;;:::o;62766:43::-;62806:3;62766:43;:::o;68457:99::-;20980:12;:10;:12::i;:::-;20969:23;;:7;:5;:7::i;:::-;:23;;;20961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68544:4:::1;68527:14;;:21;;;;;;;;;;;;;;;;;;68457:99:::0;:::o;42804:100::-;42858:13;42891:5;42884:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42804:100;:::o;44363:221::-;44439:7;44467:16;44475:7;44467;:16::i;:::-;44459:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44552:15;:24;44568:7;44552:24;;;;;;;;;;;;;;;;;;;;;44545:31;;44363:221;;;:::o;43886:411::-;43967:13;43983:23;43998:7;43983:14;:23::i;:::-;43967:39;;44031:5;44025:11;;:2;:11;;;;44017:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44125:5;44109:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44134:37;44151:5;44158:12;:10;:12::i;:::-;44134:16;:37::i;:::-;44109:62;44087:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;44268:21;44277:2;44281:7;44268:8;:21::i;:::-;43956:341;43886:411;;:::o;63143:33::-;;;;:::o;56624:113::-;56685:7;56712:10;:17;;;;56705:24;;56624:113;:::o;45113:339::-;45308:41;45327:12;:10;:12::i;:::-;45341:7;45308:18;:41::i;:::-;45300:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;45416:28;45426:4;45432:2;45436:7;45416:9;:28::i;:::-;45113:339;;;:::o;56292:256::-;56389:7;56425:23;56442:5;56425:16;:23::i;:::-;56417:5;:31;56409:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;56514:12;:19;56527:5;56514:19;;;;;;;;;;;;;;;:26;56534:5;56514:26;;;;;;;;;;;;56507:33;;56292:256;;;;:::o;63106:28::-;;;;;;;;;;;;;:::o;64875:260::-;64922:4;64994:15;64942:30;:49;64973:17;;64942:49;;;;;;;;;;;;:67;64938:165;;;65090:1;65034:22;:34;65057:10;65034:34;;;;;;;;;;;;;;;:53;65069:17;;65034:53;;;;;;;;;;;;:57;65027:64;;;;64938:165;65122:5;65115:12;;64875:260;;:::o;65143:146::-;65198:7;65228:22;:34;65251:10;65228:34;;;;;;;;;;;;;;;:53;65263:17;;65228:53;;;;;;;;;;;;65224:1;:57;;;;:::i;:::-;65217:64;;65143:146;:::o;45523:185::-;45661:39;45678:4;45684:2;45688:7;45661:39;;;;;;;;;;;;:16;:39::i;:::-;45523:185;;;:::o;66937:1441::-;4724:1;5322:7;;:19;;5314:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4724:1;5455:7;:18;;;;67060:79:::1;67078:49;67094:10;67106:13;67121:5;67078:15;:49::i;:::-;67129:9;67060:17;:79::i;:::-;67052:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;67186:11;67198:5;67186:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;67185:19;67177:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;67311:1;67294:13;67238:22;:34;67261:10;67238:34;;;;;;;;;;;;;;;:53;67273:17;;67238:53;;;;;;;;;;;;:69;;;;:::i;:::-;:74;;67229:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;67398:15;67346:30;:49;67377:17;;67346:49;;;;;;;;;;;;:67;67341:333;;;67519:13;67477:19;:38;67497:17;;67477:38;;;;;;;;;;;;67439:16;:35;67456:17;;67439:35;;;;;;;;;;;;:76;;;;:::i;:::-;:93;;67430:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;67341:333;;;67631:13;67592:16;:35;67609:17;;67592:35;;;;;;;;;;;;:52;;67583:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;67341:333;67695:15;:34;67711:17;;67695:34;;;;;;;;;;;;;;;;;;;;;:96;;;;;67752:20;:39;67773:17;;67752:39;;;;;;;;;;;;67733:15;:58;;67695:96;67686:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;67852:4;67831:11;67843:5;67831:18;;;;;;:::i;:::-;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;67876:9;;;;;;;;;;;67869:30;;;67900:10;67912:9;;;;;;;;;;;67964:13;62806:3;67925:18;;:34;;;;:::i;:::-;67923:54;;;;:::i;:::-;67869:110;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68008:9;68004:367;68027:13;68023:1;:17;68004:367;;;68062:17;68082:18;:8;:16;:18::i;:::-;68062:38;;68115:32;68125:10;68137:9;68115;:32::i;:::-;68164:20;:8;:18;:20::i;:::-;68199:22;:34;68222:10;68199:34;;;;;;;;;;;;;;;:53;68234:17;;68199:53;;;;;;;;;;;;:55;;;;;;;;;:::i;:::-;;;;;;68271:16;:35;68288:17;;68271:35;;;;;;;;;;;;:37;;;;;;;;;:::i;:::-;;;;;;68349:9;68337:10;68330:29;;;;;;;;;;;;68047:324;68042:3;;;;;:::i;:::-;;;;68004:367;;;;4680:1:::0;5634:7;:22;;;;66937:1441;;;:::o;56814:233::-;56889:7;56925:30;:28;:30::i;:::-;56917:5;:38;56909:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;57022:10;57033:5;57022:17;;;;;;;;:::i;:::-;;;;;;;;;;57015:24;;56814:233;;;:::o;64068:124::-;20980:12;:10;:12::i;:::-;20969:23;;:7;:5;:7::i;:::-;:23;;;20961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64164:20:::1;64176:7;64164:11;:20::i;:::-;64068:124:::0;:::o;66103:663::-;4724:1;5322:7;;:19;;5314:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4724:1;5455:7;:18;;;;66222:1:::1;66166:22;:34;66189:10;66166:34;;;;;;;;;;;;;;;:53;66201:17;;66166:53;;;;;;;;;;;;:57;66157:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;66311:15;66259:30;:49;66290:17;;66259:49;;;;;;;;;;;;:67;66250:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;66362:15;:34;66378:17;;66362:34;;;;;;;;;;;;;;;;;;;;;66353:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;66428:17;66448:18;:8;:16;:18::i;:::-;66428:38;;66477:32;66487:10;66499:9;66477;:32::i;:::-;66522:22;:34;66545:10;66522:34;;;;;;;;;;;;;;;:53;66557:17;;66522:53;;;;;;;;;;;;:55;;;;;;;;;:::i;:::-;;;;;;66590:16;:35;66607:17;;66590:35;;;;;;;;;;;;:37;;;;;;;;;:::i;:::-;;;;;;66638:19;:38;66658:17;;66638:38;;;;;;;;;;;;:40;;;;;;;;;:::i;:::-;;;;;;66691:20;:8;:18;:20::i;:::-;66748:9;66736:10;66729:29;;;;;;;;;;;;66146:620;4680:1:::0;5634:7;:22;;;;66103:663::o;42498:239::-;42570:7;42590:13;42606:7;:16;42614:7;42606:16;;;;;;;;;;;;;;;;;;;;;42590:32;;42658:1;42641:19;;:5;:19;;;;42633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42724:5;42717:12;;;42498:239;;;:::o;65900:195::-;4724:1;5322:7;;:19;;5314:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4724:1;5455:7;:18;;;;66011:13:::1;;;;;;;;;;;65997:27;;:10;:27;;;65988:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;66075:12;66054:18;:33;;;;4680:1:::0;5634:7;:22;;;;65900:195;:::o;42228:208::-;42300:7;42345:1;42328:19;;:5;:19;;;;42320:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42412:9;:16;42422:5;42412:16;;;;;;;;;;;;;;;;42405:23;;42228:208;;;:::o;62566:32::-;;;;;;;;;:::o;21400:103::-;20980:12;:10;:12::i;:::-;20969:23;;:7;:5;:7::i;:::-;:23;;;20961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21465:30:::1;21492:1;21465:18;:30::i;:::-;21400:103::o:0;20749:87::-;20795:7;20822:6;;;;;;;;;;;20815:13;;20749:87;:::o;66774:119::-;20980:12;:10;:12::i;:::-;20969:23;;:7;:5;:7::i;:::-;:23;;;20961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4724:1:::1;5322:7;;:19;;5314:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;4724:1;5455:7;:18;;;;66880:5:::2;66843:15;:34;66859:17;;66843:34;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;4680:1:::1;5634:7;:22;;;;66774:119::o:0;42973:104::-;43029:13;43062:7;43055:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42973:104;:::o;44656:155::-;44751:52;44770:12;:10;:12::i;:::-;44784:8;44794;44751:18;:52::i;:::-;44656:155;;:::o;63073:24::-;;;;;;;;;;;;;:::o;68587:175::-;20980:12;:10;:12::i;:::-;20969:23;;:7;:5;:7::i;:::-;:23;;;20961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68654:22:::1;:28;68677:4;68654:28;;;;;;;;;;;;;;;:47;68683:17;;68654:47;;;;;;;;;;;;:49;;;;;;;;;:::i;:::-;;;;;;68714:19;:38;68734:17;;68714:38;;;;;;;;;;;;:40;;;;;;;;;:::i;:::-;;;;;;68587:175:::0;:::o;65297:267::-;65356:7;65431:15;65379:30;:49;65410:17;;65379:49;;;;;;;;;;;;:67;65375:161;;;65471:22;:34;65494:10;65471:34;;;;;;;;;;;;;;;:53;65506:17;;65471:53;;;;;;;;;;;;65464:60;;;;65375:161;65555:1;65548:8;;65297:267;;:::o;45779:328::-;45954:41;45973:12;:10;:12::i;:::-;45987:7;45954:18;:41::i;:::-;45946:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;46060:39;46074:4;46080:2;46084:7;46093:5;46060:13;:39::i;:::-;45779:328;;;;:::o;43148:334::-;43221:13;43255:16;43263:7;43255;:16::i;:::-;43247:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43336:21;43360:10;:8;:10::i;:::-;43336:34;;43412:1;43394:7;43388:21;:25;:86;;;;;;;;;;;;;;;;;43440:7;43449:18;:7;:16;:18::i;:::-;43423:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43388:86;43381:93;;;43148:334;;;:::o;63040:24::-;;;;;;;;;;;;;:::o;44882:164::-;44979:4;45003:18;:25;45022:5;45003:25;;;;;;;;;;;;;;;:35;45029:8;45003:35;;;;;;;;;;;;;;;;;;;;;;;;;44996:42;;44882:164;;;;:::o;21658:201::-;20980:12;:10;:12::i;:::-;20969:23;;:7;:5;:7::i;:::-;:23;;;20961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21767:1:::1;21747:22;;:8;:22;;;;21739:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21823:28;21842:8;21823:18;:28::i;:::-;21658:201:::0;:::o;65572:320::-;65626:7;65701:15;65649:30;:49;65680:17;;65649:49;;;;;;;;;;;;:67;65645:184;;;65779:19;:38;65799:17;;65779:38;;;;;;;;;;;;65741:16;:35;65758:17;;65741:35;;;;;;;;;;;;:76;;;;:::i;:::-;65734:83;;;;65645:184;65849:16;:35;65866:17;;65849:35;;;;;;;;;;;;65842:42;;65572:320;;:::o;68770:421::-;20980:12;:10;:12::i;:::-;20969:23;;:7;:5;:7::i;:::-;:23;;;20961:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68942:9:::1;68922:17;:29;;;;68991:4;68962:15;:26;68978:9;68962:26;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;69040:14;69006:20;:31;69027:9;69006:31;;;;;;;;;;;:48;;;;69095:10;69065:16;:27;69082:9;69065:27;;;;;;;;;;;:40;;;;69160:23;69116:30;:41;69147:9;69116:41;;;;;;;;;;;:67;;;;68770:421:::0;;;;:::o;6665:127::-;6772:1;6754:7;:14;;;:19;;;;;;;;;;;6665:127;:::o;41859:305::-;41961:4;42013:25;41998:40;;;:11;:40;;;;:105;;;;42070:33;42055:48;;;:11;:48;;;;41998:105;:158;;;;42120:36;42144:11;42120:23;:36::i;:::-;41998:158;41978:178;;41859:305;;;:::o;19473:98::-;19526:7;19553:10;19546:17;;19473:98;:::o;47617:127::-;47682:4;47734:1;47706:30;;:7;:16;47714:7;47706:16;;;;;;;;;;;;;;;;;;;;;:30;;;;47699:37;;47617:127;;;:::o;51763:174::-;51865:2;51838:15;:24;51854:7;51838:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;51921:7;51917:2;51883:46;;51892:23;51907:7;51892:14;:23::i;:::-;51883:46;;;;;;;;;;;;51763:174;;:::o;47911:348::-;48004:4;48029:16;48037:7;48029;:16::i;:::-;48021:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48105:13;48121:23;48136:7;48121:14;:23::i;:::-;48105:39;;48174:5;48163:16;;:7;:16;;;:51;;;;48207:7;48183:31;;:20;48195:7;48183:11;:20::i;:::-;:31;;;48163:51;:87;;;;48218:32;48235:5;48242:7;48218:16;:32::i;:::-;48163:87;48155:96;;;47911:348;;;;:::o;51020:625::-;51179:4;51152:31;;:23;51167:7;51152:14;:23::i;:::-;:31;;;51144:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51258:1;51244:16;;:2;:16;;;;51236:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51314:39;51335:4;51341:2;51345:7;51314:20;:39::i;:::-;51418:29;51435:1;51439:7;51418:8;:29::i;:::-;51479:1;51460:9;:15;51470:4;51460:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;51508:1;51491:9;:13;51501:2;51491:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;51539:2;51520:7;:16;51528:7;51520:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51578:7;51574:2;51559:27;;51568:4;51559:27;;;;;;;;;;;;51599:38;51619:4;51625:2;51629:7;51599:19;:38::i;:::-;51020:625;;;:::o;64311:324::-;64407:7;64427:12;64559:6;64567:3;64572:5;64542:36;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64532:47;;;;;;64452:128;;;;;;;;:::i;:::-;;;;;;;;;;;;;64442:149;;;;;;64427:164;;64623:4;64616:11;;;64311:324;;;;;:::o;64708:159::-;64794:4;64836:23;64849:9;64836:4;:12;;:23;;;;:::i;:::-;64818:41;;:14;;;;;;;;;;;:41;;;64811:48;;64708:159;;;;:::o;6543:114::-;6608:7;6635;:14;;;6628:21;;6543:114;;;:::o;48601:110::-;48677:26;48687:2;48691:7;48677:26;;;;;;;;;;;;:9;:26::i;:::-;48601:110;;:::o;63773:129::-;63887:7;63868:16;:26;;;;;;;;;;;;:::i;:::-;;63773:129;:::o;22019:191::-;22093:16;22112:6;;;;;;;;;;;22093:25;;22138:8;22129:6;;:17;;;;;;;;;;;;;;;;;;22193:8;22162:40;;22183:8;22162:40;;;;;;;;;;;;22082:128;22019:191;:::o;52079:315::-;52234:8;52225:17;;:5;:17;;;;52217:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52321:8;52283:18;:25;52302:5;52283:25;;;;;;;;;;;;;;;:35;52309:8;52283:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52367:8;52345:41;;52360:5;52345:41;;;52377:8;52345:41;;;;;;:::i;:::-;;;;;;;;52079:315;;;:::o;46989:::-;47146:28;47156:4;47162:2;47166:7;47146:9;:28::i;:::-;47193:48;47216:4;47222:2;47226:7;47235:5;47193:22;:48::i;:::-;47185:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;46989:315;;;;:::o;63910:150::-;63998:13;64036:16;64029:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63910:150;:::o;7501:723::-;7557:13;7787:1;7778:5;:10;7774:53;;;7805:10;;;;;;;;;;;;;;;;;;;;;7774:53;7837:12;7852:5;7837:20;;7868:14;7893:78;7908:1;7900:4;:9;7893:78;;7926:8;;;;;:::i;:::-;;;;7957:2;7949:10;;;;;:::i;:::-;;;7893:78;;;7981:19;8013:6;8003:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7981:39;;8031:154;8047:1;8038:5;:10;8031:154;;8075:1;8065:11;;;;;:::i;:::-;;;8142:2;8134:5;:10;;;;:::i;:::-;8121:2;:24;;;;:::i;:::-;8108:39;;8091:6;8098;8091:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8171:2;8162:11;;;;;:::i;:::-;;;8031:154;;;8209:6;8195:21;;;;;7501:723;;;;:::o;33533:157::-;33618:4;33657:25;33642:40;;;:11;:40;;;;33635:47;;33533:157;;;:::o;57660:589::-;57804:45;57831:4;57837:2;57841:7;57804:26;:45::i;:::-;57882:1;57866:18;;:4;:18;;;57862:187;;;57901:40;57933:7;57901:31;:40::i;:::-;57862:187;;;57971:2;57963:10;;:4;:10;;;57959:90;;57990:47;58023:4;58029:7;57990:32;:47::i;:::-;57959:90;57862:187;58077:1;58063:16;;:2;:16;;;58059:183;;;58096:45;58133:7;58096:36;:45::i;:::-;58059:183;;;58169:4;58163:10;;:2;:10;;;58159:83;;58190:40;58218:2;58222:7;58190:27;:40::i;:::-;58159:83;58059:183;57660:589;;;:::o;54841:125::-;;;;:::o;13677:231::-;13755:7;13776:17;13795:18;13817:27;13828:4;13834:9;13817:10;:27::i;:::-;13775:69;;;;13855:18;13867:5;13855:11;:18::i;:::-;13891:9;13884:16;;;;13677:231;;;;:::o;48938:321::-;49068:18;49074:2;49078:7;49068:5;:18::i;:::-;49119:54;49150:1;49154:2;49158:7;49167:5;49119:22;:54::i;:::-;49097:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;48938:321;;;:::o;52959:799::-;53114:4;53135:15;:2;:13;;;:15::i;:::-;53131:620;;;53187:2;53171:36;;;53208:12;:10;:12::i;:::-;53222:4;53228:7;53237:5;53171:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53167:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53430:1;53413:6;:13;:18;53409:272;;;53456:60;;;;;;;;;;:::i;:::-;;;;;;;;53409:272;53631:6;53625:13;53616:6;53612:2;53608:15;53601:38;53167:529;53304:41;;;53294:51;;;:6;:51;;;;53287:58;;;;;53131:620;53735:4;53728:11;;52959:799;;;;;;;:::o;54330:126::-;;;;:::o;58972:164::-;59076:10;:17;;;;59049:15;:24;59065:7;59049:24;;;;;;;;;;;:44;;;;59104:10;59120:7;59104:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58972:164;:::o;59763:988::-;60029:22;60079:1;60054:22;60071:4;60054:16;:22::i;:::-;:26;;;;:::i;:::-;60029:51;;60091:18;60112:17;:26;60130:7;60112:26;;;;;;;;;;;;60091:47;;60259:14;60245:10;:28;60241:328;;60290:19;60312:12;:18;60325:4;60312:18;;;;;;;;;;;;;;;:34;60331:14;60312:34;;;;;;;;;;;;60290:56;;60396:11;60363:12;:18;60376:4;60363:18;;;;;;;;;;;;;;;:30;60382:10;60363:30;;;;;;;;;;;:44;;;;60513:10;60480:17;:30;60498:11;60480:30;;;;;;;;;;;:43;;;;60275:294;60241:328;60665:17;:26;60683:7;60665:26;;;;;;;;;;;60658:33;;;60709:12;:18;60722:4;60709:18;;;;;;;;;;;;;;;:34;60728:14;60709:34;;;;;;;;;;;60702:41;;;59844:907;;59763:988;;:::o;61046:1079::-;61299:22;61344:1;61324:10;:17;;;;:21;;;;:::i;:::-;61299:46;;61356:18;61377:15;:24;61393:7;61377:24;;;;;;;;;;;;61356:45;;61728:19;61750:10;61761:14;61750:26;;;;;;;;:::i;:::-;;;;;;;;;;61728:48;;61814:11;61789:10;61800;61789:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;61925:10;61894:15;:28;61910:11;61894:28;;;;;;;;;;;:41;;;;62066:15;:24;62082:7;62066:24;;;;;;;;;;;62059:31;;;62101:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61117:1008;;;61046:1079;:::o;58550:221::-;58635:14;58652:20;58669:2;58652:16;:20::i;:::-;58635:37;;58710:7;58683:12;:16;58696:2;58683:16;;;;;;;;;;;;;;;:24;58700:6;58683:24;;;;;;;;;;;:34;;;;58757:6;58728:17;:26;58746:7;58728:26;;;;;;;;;;;:35;;;;58624:147;58550:221;;:::o;11567:1308::-;11648:7;11657:12;11902:2;11882:9;:16;:22;11878:990;;;11921:9;11945;11969:7;12178:4;12167:9;12163:20;12157:27;12152:32;;12228:4;12217:9;12213:20;12207:27;12202:32;;12286:4;12275:9;12271:20;12265:27;12262:1;12257:36;12252:41;;12329:25;12340:4;12346:1;12349;12352;12329:10;:25::i;:::-;12322:32;;;;;;;;;11878:990;12396:2;12376:9;:16;:22;12372:496;;;12415:9;12439:10;12651:4;12640:9;12636:20;12630:27;12625:32;;12702:4;12691:9;12687:20;12681:27;12675:33;;12744:23;12755:4;12761:1;12764:2;12744:10;:23::i;:::-;12737:30;;;;;;;;12372:496;12816:1;12820:35;12800:56;;;;11567:1308;;;;;;:::o;9838:643::-;9916:20;9907:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;9903:571;;;9953:7;;9903:571;10014:29;10005:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;10001:473;;;10060:34;;;;;;;;;;:::i;:::-;;;;;;;;10001:473;10125:35;10116:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;10112:362;;;10177:41;;;;;;;;;;:::i;:::-;;;;;;;;10112:362;10249:30;10240:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10236:238;;;10296:44;;;;;;;;;;:::i;:::-;;;;;;;;10236:238;10371:30;10362:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10358:116;;;10418:44;;;;;;;;;;:::i;:::-;;;;;;;;10358:116;9838:643;;:::o;49595:439::-;49689:1;49675:16;;:2;:16;;;;49667:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49748:16;49756:7;49748;:16::i;:::-;49747:17;49739:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49810:45;49839:1;49843:2;49847:7;49810:20;:45::i;:::-;49885:1;49868:9;:13;49878:2;49868:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;49916:2;49897:7;:16;49905:7;49897:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;49961:7;49957:2;49936:33;;49953:1;49936:33;;;;;;;;;;;;49982:44;50010:1;50014:2;50018:7;49982:19;:44::i;:::-;49595:439;;:::o;23450:326::-;23510:4;23767:1;23745:7;:19;;;:23;23738:30;;23450:326;;;:::o;15129:1632::-;15260:7;15269:12;16194:66;16189:1;16181:10;;:79;16177:163;;;16293:1;16297:30;16277:51;;;;;;16177:163;16359:2;16354:1;:7;;;;:18;;;;;16370:2;16365:1;:7;;;;16354:18;16350:102;;;16405:1;16409:30;16389:51;;;;;;16350:102;16549:14;16566:24;16576:4;16582:1;16585;16588;16566:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16549:41;;16623:1;16605:20;;:6;:20;;;16601:103;;;16658:1;16662:29;16642:50;;;;;;;16601:103;16724:6;16732:20;16716:37;;;;;15129:1632;;;;;;;;:::o;14171:344::-;14285:7;14294:12;14319:9;14344:66;14336:75;;14331:2;:80;14319:92;;14422:7;14461:2;14454:3;14447:2;14439:11;;:18;;14438:25;;;;:::i;:::-;14422:42;;14482:25;14493:4;14499:1;14502;14505;14482:10;:25::i;:::-;14475:32;;;;;;14171:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:345::-;5830:6;5879:2;5867:9;5858:7;5854:23;5850:32;5847:119;;;5885:79;;:::i;:::-;5847:119;6005:1;6030:61;6083:7;6074:6;6063:9;6059:22;6030:61;:::i;:::-;6020:71;;5976:125;5763:345;;;;:::o;6114:327::-;6172:6;6221:2;6209:9;6200:7;6196:23;6192:32;6189:119;;;6227:79;;:::i;:::-;6189:119;6347:1;6372:52;6416:7;6407:6;6396:9;6392:22;6372:52;:::i;:::-;6362:62;;6318:116;6114:327;;;;:::o;6447:349::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:63;6771:7;6762:6;6751:9;6747:22;6716:63;:::i;:::-;6706:73;;6662:127;6447:349;;;;:::o;6802:977::-;6898:6;6906;6914;6963:2;6951:9;6942:7;6938:23;6934:32;6931:119;;;6969:79;;:::i;:::-;6931:119;7117:1;7106:9;7102:17;7089:31;7147:18;7139:6;7136:30;7133:117;;;7169:79;;:::i;:::-;7133:117;7274:62;7328:7;7319:6;7308:9;7304:22;7274:62;:::i;:::-;7264:72;;7060:286;7413:2;7402:9;7398:18;7385:32;7444:18;7436:6;7433:30;7430:117;;;7466:79;;:::i;:::-;7430:117;7571:63;7626:7;7617:6;7606:9;7602:22;7571:63;:::i;:::-;7561:73;;7356:288;7683:2;7709:53;7754:7;7745:6;7734:9;7730:22;7709:53;:::i;:::-;7699:63;;7654:118;6802:977;;;;;:::o;7785:509::-;7854:6;7903:2;7891:9;7882:7;7878:23;7874:32;7871:119;;;7909:79;;:::i;:::-;7871:119;8057:1;8046:9;8042:17;8029:31;8087:18;8079:6;8076:30;8073:117;;;8109:79;;:::i;:::-;8073:117;8214:63;8269:7;8260:6;8249:9;8245:22;8214:63;:::i;:::-;8204:73;;8000:287;7785:509;;;;:::o;8300:329::-;8359:6;8408:2;8396:9;8387:7;8383:23;8379:32;8376:119;;;8414:79;;:::i;:::-;8376:119;8534:1;8559:53;8604:7;8595:6;8584:9;8580:22;8559:53;:::i;:::-;8549:63;;8505:117;8300:329;;;;:::o;8635:765::-;8721:6;8729;8737;8745;8794:3;8782:9;8773:7;8769:23;8765:33;8762:120;;;8801:79;;:::i;:::-;8762:120;8921:1;8946:53;8991:7;8982:6;8971:9;8967:22;8946:53;:::i;:::-;8936:63;;8892:117;9048:2;9074:53;9119:7;9110:6;9099:9;9095:22;9074:53;:::i;:::-;9064:63;;9019:118;9176:2;9202:53;9247:7;9238:6;9227:9;9223:22;9202:53;:::i;:::-;9192:63;;9147:118;9304:2;9330:53;9375:7;9366:6;9355:9;9351:22;9330:53;:::i;:::-;9320:63;;9275:118;8635:765;;;;;;;:::o;9406:118::-;9493:24;9511:5;9493:24;:::i;:::-;9488:3;9481:37;9406:118;;:::o;9530:157::-;9635:45;9655:24;9673:5;9655:24;:::i;:::-;9635:45;:::i;:::-;9630:3;9623:58;9530:157;;:::o;9693:109::-;9774:21;9789:5;9774:21;:::i;:::-;9769:3;9762:34;9693:109;;:::o;9808:118::-;9895:24;9913:5;9895:24;:::i;:::-;9890:3;9883:37;9808:118;;:::o;9932:157::-;10037:45;10057:24;10075:5;10057:24;:::i;:::-;10037:45;:::i;:::-;10032:3;10025:58;9932:157;;:::o;10095:360::-;10181:3;10209:38;10241:5;10209:38;:::i;:::-;10263:70;10326:6;10321:3;10263:70;:::i;:::-;10256:77;;10342:52;10387:6;10382:3;10375:4;10368:5;10364:16;10342:52;:::i;:::-;10419:29;10441:6;10419:29;:::i;:::-;10414:3;10410:39;10403:46;;10185:270;10095:360;;;;:::o;10461:364::-;10549:3;10577:39;10610:5;10577:39;:::i;:::-;10632:71;10696:6;10691:3;10632:71;:::i;:::-;10625:78;;10712:52;10757:6;10752:3;10745:4;10738:5;10734:16;10712:52;:::i;:::-;10789:29;10811:6;10789:29;:::i;:::-;10784:3;10780:39;10773:46;;10553:272;10461:364;;;;:::o;10831:377::-;10937:3;10965:39;10998:5;10965:39;:::i;:::-;11020:89;11102:6;11097:3;11020:89;:::i;:::-;11013:96;;11118:52;11163:6;11158:3;11151:4;11144:5;11140:16;11118:52;:::i;:::-;11195:6;11190:3;11186:16;11179:23;;10941:267;10831:377;;;;:::o;11214:366::-;11356:3;11377:67;11441:2;11436:3;11377:67;:::i;:::-;11370:74;;11453:93;11542:3;11453:93;:::i;:::-;11571:2;11566:3;11562:12;11555:19;;11214:366;;;:::o;11586:::-;11728:3;11749:67;11813:2;11808:3;11749:67;:::i;:::-;11742:74;;11825:93;11914:3;11825:93;:::i;:::-;11943:2;11938:3;11934:12;11927:19;;11586:366;;;:::o;11958:::-;12100:3;12121:67;12185:2;12180:3;12121:67;:::i;:::-;12114:74;;12197:93;12286:3;12197:93;:::i;:::-;12315:2;12310:3;12306:12;12299:19;;11958:366;;;:::o;12330:402::-;12490:3;12511:85;12593:2;12588:3;12511:85;:::i;:::-;12504:92;;12605:93;12694:3;12605:93;:::i;:::-;12723:2;12718:3;12714:12;12707:19;;12330:402;;;:::o;12738:366::-;12880:3;12901:67;12965:2;12960:3;12901:67;:::i;:::-;12894:74;;12977:93;13066:3;12977:93;:::i;:::-;13095:2;13090:3;13086:12;13079:19;;12738:366;;;:::o;13110:::-;13252:3;13273:67;13337:2;13332:3;13273:67;:::i;:::-;13266:74;;13349:93;13438:3;13349:93;:::i;:::-;13467:2;13462:3;13458:12;13451:19;;13110:366;;;:::o;13482:::-;13624:3;13645:67;13709:2;13704:3;13645:67;:::i;:::-;13638:74;;13721:93;13810:3;13721:93;:::i;:::-;13839:2;13834:3;13830:12;13823:19;;13482:366;;;:::o;13854:::-;13996:3;14017:67;14081:2;14076:3;14017:67;:::i;:::-;14010:74;;14093:93;14182:3;14093:93;:::i;:::-;14211:2;14206:3;14202:12;14195:19;;13854:366;;;:::o;14226:::-;14368:3;14389:67;14453:2;14448:3;14389:67;:::i;:::-;14382:74;;14465:93;14554:3;14465:93;:::i;:::-;14583:2;14578:3;14574:12;14567:19;;14226:366;;;:::o;14598:::-;14740:3;14761:67;14825:2;14820:3;14761:67;:::i;:::-;14754:74;;14837:93;14926:3;14837:93;:::i;:::-;14955:2;14950:3;14946:12;14939:19;;14598:366;;;:::o;14970:::-;15112:3;15133:67;15197:2;15192:3;15133:67;:::i;:::-;15126:74;;15209:93;15298:3;15209:93;:::i;:::-;15327:2;15322:3;15318:12;15311:19;;14970:366;;;:::o;15342:::-;15484:3;15505:67;15569:2;15564:3;15505:67;:::i;:::-;15498:74;;15581:93;15670:3;15581:93;:::i;:::-;15699:2;15694:3;15690:12;15683:19;;15342:366;;;:::o;15714:::-;15856:3;15877:67;15941:2;15936:3;15877:67;:::i;:::-;15870:74;;15953:93;16042:3;15953:93;:::i;:::-;16071:2;16066:3;16062:12;16055:19;;15714:366;;;:::o;16086:::-;16228:3;16249:67;16313:2;16308:3;16249:67;:::i;:::-;16242:74;;16325:93;16414:3;16325:93;:::i;:::-;16443:2;16438:3;16434:12;16427:19;;16086:366;;;:::o;16458:::-;16600:3;16621:67;16685:2;16680:3;16621:67;:::i;:::-;16614:74;;16697:93;16786:3;16697:93;:::i;:::-;16815:2;16810:3;16806:12;16799:19;;16458:366;;;:::o;16830:::-;16972:3;16993:67;17057:2;17052:3;16993:67;:::i;:::-;16986:74;;17069:93;17158:3;17069:93;:::i;:::-;17187:2;17182:3;17178:12;17171:19;;16830:366;;;:::o;17202:::-;17344:3;17365:67;17429:2;17424:3;17365:67;:::i;:::-;17358:74;;17441:93;17530:3;17441:93;:::i;:::-;17559:2;17554:3;17550:12;17543:19;;17202:366;;;:::o;17574:::-;17716:3;17737:67;17801:2;17796:3;17737:67;:::i;:::-;17730:74;;17813:93;17902:3;17813:93;:::i;:::-;17931:2;17926:3;17922:12;17915:19;;17574:366;;;:::o;17946:::-;18088:3;18109:67;18173:2;18168:3;18109:67;:::i;:::-;18102:74;;18185:93;18274:3;18185:93;:::i;:::-;18303:2;18298:3;18294:12;18287:19;;17946:366;;;:::o;18318:::-;18460:3;18481:67;18545:2;18540:3;18481:67;:::i;:::-;18474:74;;18557:93;18646:3;18557:93;:::i;:::-;18675:2;18670:3;18666:12;18659:19;;18318:366;;;:::o;18690:::-;18832:3;18853:67;18917:2;18912:3;18853:67;:::i;:::-;18846:74;;18929:93;19018:3;18929:93;:::i;:::-;19047:2;19042:3;19038:12;19031:19;;18690:366;;;:::o;19062:::-;19204:3;19225:67;19289:2;19284:3;19225:67;:::i;:::-;19218:74;;19301:93;19390:3;19301:93;:::i;:::-;19419:2;19414:3;19410:12;19403:19;;19062:366;;;:::o;19434:::-;19576:3;19597:67;19661:2;19656:3;19597:67;:::i;:::-;19590:74;;19673:93;19762:3;19673:93;:::i;:::-;19791:2;19786:3;19782:12;19775:19;;19434:366;;;:::o;19806:::-;19948:3;19969:67;20033:2;20028:3;19969:67;:::i;:::-;19962:74;;20045:93;20134:3;20045:93;:::i;:::-;20163:2;20158:3;20154:12;20147:19;;19806:366;;;:::o;20178:::-;20320:3;20341:67;20405:2;20400:3;20341:67;:::i;:::-;20334:74;;20417:93;20506:3;20417:93;:::i;:::-;20535:2;20530:3;20526:12;20519:19;;20178:366;;;:::o;20550:::-;20692:3;20713:67;20777:2;20772:3;20713:67;:::i;:::-;20706:74;;20789:93;20878:3;20789:93;:::i;:::-;20907:2;20902:3;20898:12;20891:19;;20550:366;;;:::o;20922:::-;21064:3;21085:67;21149:2;21144:3;21085:67;:::i;:::-;21078:74;;21161:93;21250:3;21161:93;:::i;:::-;21279:2;21274:3;21270:12;21263:19;;20922:366;;;:::o;21294:365::-;21436:3;21457:66;21521:1;21516:3;21457:66;:::i;:::-;21450:73;;21532:93;21621:3;21532:93;:::i;:::-;21650:2;21645:3;21641:12;21634:19;;21294:365;;;:::o;21665:366::-;21807:3;21828:67;21892:2;21887:3;21828:67;:::i;:::-;21821:74;;21904:93;21993:3;21904:93;:::i;:::-;22022:2;22017:3;22013:12;22006:19;;21665:366;;;:::o;22037:::-;22179:3;22200:67;22264:2;22259:3;22200:67;:::i;:::-;22193:74;;22276:93;22365:3;22276:93;:::i;:::-;22394:2;22389:3;22385:12;22378:19;;22037:366;;;:::o;22409:::-;22551:3;22572:67;22636:2;22631:3;22572:67;:::i;:::-;22565:74;;22648:93;22737:3;22648:93;:::i;:::-;22766:2;22761:3;22757:12;22750:19;;22409:366;;;:::o;22781:::-;22923:3;22944:67;23008:2;23003:3;22944:67;:::i;:::-;22937:74;;23020:93;23109:3;23020:93;:::i;:::-;23138:2;23133:3;23129:12;23122:19;;22781:366;;;:::o;23153:118::-;23240:24;23258:5;23240:24;:::i;:::-;23235:3;23228:37;23153:118;;:::o;23277:157::-;23382:45;23402:24;23420:5;23402:24;:::i;:::-;23382:45;:::i;:::-;23377:3;23370:58;23277:157;;:::o;23440:112::-;23523:22;23539:5;23523:22;:::i;:::-;23518:3;23511:35;23440:112;;:::o;23558:557::-;23746:3;23761:75;23832:3;23823:6;23761:75;:::i;:::-;23861:2;23856:3;23852:12;23845:19;;23874:75;23945:3;23936:6;23874:75;:::i;:::-;23974:2;23969:3;23965:12;23958:19;;23994:95;24085:3;24076:6;23994:95;:::i;:::-;23987:102;;24106:3;24099:10;;23558:557;;;;;;:::o;24121:275::-;24253:3;24275:95;24366:3;24357:6;24275:95;:::i;:::-;24268:102;;24387:3;24380:10;;24121:275;;;;:::o;24402:435::-;24582:3;24604:95;24695:3;24686:6;24604:95;:::i;:::-;24597:102;;24716:95;24807:3;24798:6;24716:95;:::i;:::-;24709:102;;24828:3;24821:10;;24402:435;;;;;:::o;24843:522::-;25056:3;25078:148;25222:3;25078:148;:::i;:::-;25071:155;;25236:75;25307:3;25298:6;25236:75;:::i;:::-;25336:2;25331:3;25327:12;25320:19;;25356:3;25349:10;;24843:522;;;;:::o;25371:222::-;25464:4;25502:2;25491:9;25487:18;25479:26;;25515:71;25583:1;25572:9;25568:17;25559:6;25515:71;:::i;:::-;25371:222;;;;:::o;25599:442::-;25748:4;25786:2;25775:9;25771:18;25763:26;;25799:71;25867:1;25856:9;25852:17;25843:6;25799:71;:::i;:::-;25880:72;25948:2;25937:9;25933:18;25924:6;25880:72;:::i;:::-;25962;26030:2;26019:9;26015:18;26006:6;25962:72;:::i;:::-;25599:442;;;;;;:::o;26047:640::-;26242:4;26280:3;26269:9;26265:19;26257:27;;26294:71;26362:1;26351:9;26347:17;26338:6;26294:71;:::i;:::-;26375:72;26443:2;26432:9;26428:18;26419:6;26375:72;:::i;:::-;26457;26525:2;26514:9;26510:18;26501:6;26457:72;:::i;:::-;26576:9;26570:4;26566:20;26561:2;26550:9;26546:18;26539:48;26604:76;26675:4;26666:6;26604:76;:::i;:::-;26596:84;;26047:640;;;;;;;:::o;26693:210::-;26780:4;26818:2;26807:9;26803:18;26795:26;;26831:65;26893:1;26882:9;26878:17;26869:6;26831:65;:::i;:::-;26693:210;;;;:::o;26909:545::-;27082:4;27120:3;27109:9;27105:19;27097:27;;27134:71;27202:1;27191:9;27187:17;27178:6;27134:71;:::i;:::-;27215:68;27279:2;27268:9;27264:18;27255:6;27215:68;:::i;:::-;27293:72;27361:2;27350:9;27346:18;27337:6;27293:72;:::i;:::-;27375;27443:2;27432:9;27428:18;27419:6;27375:72;:::i;:::-;26909:545;;;;;;;:::o;27460:313::-;27573:4;27611:2;27600:9;27596:18;27588:26;;27660:9;27654:4;27650:20;27646:1;27635:9;27631:17;27624:47;27688:78;27761:4;27752:6;27688:78;:::i;:::-;27680:86;;27460:313;;;;:::o;27779:419::-;27945:4;27983:2;27972:9;27968:18;27960:26;;28032:9;28026:4;28022:20;28018:1;28007:9;28003:17;27996:47;28060:131;28186:4;28060:131;:::i;:::-;28052:139;;27779:419;;;:::o;28204:::-;28370:4;28408:2;28397:9;28393:18;28385:26;;28457:9;28451:4;28447:20;28443:1;28432:9;28428:17;28421:47;28485:131;28611:4;28485:131;:::i;:::-;28477:139;;28204:419;;;:::o;28629:::-;28795:4;28833:2;28822:9;28818:18;28810:26;;28882:9;28876:4;28872:20;28868:1;28857:9;28853:17;28846:47;28910:131;29036:4;28910:131;:::i;:::-;28902:139;;28629:419;;;:::o;29054:::-;29220:4;29258:2;29247:9;29243:18;29235:26;;29307:9;29301:4;29297:20;29293:1;29282:9;29278:17;29271:47;29335:131;29461:4;29335:131;:::i;:::-;29327:139;;29054:419;;;:::o;29479:::-;29645:4;29683:2;29672:9;29668:18;29660:26;;29732:9;29726:4;29722:20;29718:1;29707:9;29703:17;29696:47;29760:131;29886:4;29760:131;:::i;:::-;29752:139;;29479:419;;;:::o;29904:::-;30070:4;30108:2;30097:9;30093:18;30085:26;;30157:9;30151:4;30147:20;30143:1;30132:9;30128:17;30121:47;30185:131;30311:4;30185:131;:::i;:::-;30177:139;;29904:419;;;:::o;30329:::-;30495:4;30533:2;30522:9;30518:18;30510:26;;30582:9;30576:4;30572:20;30568:1;30557:9;30553:17;30546:47;30610:131;30736:4;30610:131;:::i;:::-;30602:139;;30329:419;;;:::o;30754:::-;30920:4;30958:2;30947:9;30943:18;30935:26;;31007:9;31001:4;30997:20;30993:1;30982:9;30978:17;30971:47;31035:131;31161:4;31035:131;:::i;:::-;31027:139;;30754:419;;;:::o;31179:::-;31345:4;31383:2;31372:9;31368:18;31360:26;;31432:9;31426:4;31422:20;31418:1;31407:9;31403:17;31396:47;31460:131;31586:4;31460:131;:::i;:::-;31452:139;;31179:419;;;:::o;31604:::-;31770:4;31808:2;31797:9;31793:18;31785:26;;31857:9;31851:4;31847:20;31843:1;31832:9;31828:17;31821:47;31885:131;32011:4;31885:131;:::i;:::-;31877:139;;31604:419;;;:::o;32029:::-;32195:4;32233:2;32222:9;32218:18;32210:26;;32282:9;32276:4;32272:20;32268:1;32257:9;32253:17;32246:47;32310:131;32436:4;32310:131;:::i;:::-;32302:139;;32029:419;;;:::o;32454:::-;32620:4;32658:2;32647:9;32643:18;32635:26;;32707:9;32701:4;32697:20;32693:1;32682:9;32678:17;32671:47;32735:131;32861:4;32735:131;:::i;:::-;32727:139;;32454:419;;;:::o;32879:::-;33045:4;33083:2;33072:9;33068:18;33060:26;;33132:9;33126:4;33122:20;33118:1;33107:9;33103:17;33096:47;33160:131;33286:4;33160:131;:::i;:::-;33152:139;;32879:419;;;:::o;33304:::-;33470:4;33508:2;33497:9;33493:18;33485:26;;33557:9;33551:4;33547:20;33543:1;33532:9;33528:17;33521:47;33585:131;33711:4;33585:131;:::i;:::-;33577:139;;33304:419;;;:::o;33729:::-;33895:4;33933:2;33922:9;33918:18;33910:26;;33982:9;33976:4;33972:20;33968:1;33957:9;33953:17;33946:47;34010:131;34136:4;34010:131;:::i;:::-;34002:139;;33729:419;;;:::o;34154:::-;34320:4;34358:2;34347:9;34343:18;34335:26;;34407:9;34401:4;34397:20;34393:1;34382:9;34378:17;34371:47;34435:131;34561:4;34435:131;:::i;:::-;34427:139;;34154:419;;;:::o;34579:::-;34745:4;34783:2;34772:9;34768:18;34760:26;;34832:9;34826:4;34822:20;34818:1;34807:9;34803:17;34796:47;34860:131;34986:4;34860:131;:::i;:::-;34852:139;;34579:419;;;:::o;35004:::-;35170:4;35208:2;35197:9;35193:18;35185:26;;35257:9;35251:4;35247:20;35243:1;35232:9;35228:17;35221:47;35285:131;35411:4;35285:131;:::i;:::-;35277:139;;35004:419;;;:::o;35429:::-;35595:4;35633:2;35622:9;35618:18;35610:26;;35682:9;35676:4;35672:20;35668:1;35657:9;35653:17;35646:47;35710:131;35836:4;35710:131;:::i;:::-;35702:139;;35429:419;;;:::o;35854:::-;36020:4;36058:2;36047:9;36043:18;36035:26;;36107:9;36101:4;36097:20;36093:1;36082:9;36078:17;36071:47;36135:131;36261:4;36135:131;:::i;:::-;36127:139;;35854:419;;;:::o;36279:::-;36445:4;36483:2;36472:9;36468:18;36460:26;;36532:9;36526:4;36522:20;36518:1;36507:9;36503:17;36496:47;36560:131;36686:4;36560:131;:::i;:::-;36552:139;;36279:419;;;:::o;36704:::-;36870:4;36908:2;36897:9;36893:18;36885:26;;36957:9;36951:4;36947:20;36943:1;36932:9;36928:17;36921:47;36985:131;37111:4;36985:131;:::i;:::-;36977:139;;36704:419;;;:::o;37129:::-;37295:4;37333:2;37322:9;37318:18;37310:26;;37382:9;37376:4;37372:20;37368:1;37357:9;37353:17;37346:47;37410:131;37536:4;37410:131;:::i;:::-;37402:139;;37129:419;;;:::o;37554:::-;37720:4;37758:2;37747:9;37743:18;37735:26;;37807:9;37801:4;37797:20;37793:1;37782:9;37778:17;37771:47;37835:131;37961:4;37835:131;:::i;:::-;37827:139;;37554:419;;;:::o;37979:::-;38145:4;38183:2;38172:9;38168:18;38160:26;;38232:9;38226:4;38222:20;38218:1;38207:9;38203:17;38196:47;38260:131;38386:4;38260:131;:::i;:::-;38252:139;;37979:419;;;:::o;38404:::-;38570:4;38608:2;38597:9;38593:18;38585:26;;38657:9;38651:4;38647:20;38643:1;38632:9;38628:17;38621:47;38685:131;38811:4;38685:131;:::i;:::-;38677:139;;38404:419;;;:::o;38829:::-;38995:4;39033:2;39022:9;39018:18;39010:26;;39082:9;39076:4;39072:20;39068:1;39057:9;39053:17;39046:47;39110:131;39236:4;39110:131;:::i;:::-;39102:139;;38829:419;;;:::o;39254:::-;39420:4;39458:2;39447:9;39443:18;39435:26;;39507:9;39501:4;39497:20;39493:1;39482:9;39478:17;39471:47;39535:131;39661:4;39535:131;:::i;:::-;39527:139;;39254:419;;;:::o;39679:::-;39845:4;39883:2;39872:9;39868:18;39860:26;;39932:9;39926:4;39922:20;39918:1;39907:9;39903:17;39896:47;39960:131;40086:4;39960:131;:::i;:::-;39952:139;;39679:419;;;:::o;40104:::-;40270:4;40308:2;40297:9;40293:18;40285:26;;40357:9;40351:4;40347:20;40343:1;40332:9;40328:17;40321:47;40385:131;40511:4;40385:131;:::i;:::-;40377:139;;40104:419;;;:::o;40529:::-;40695:4;40733:2;40722:9;40718:18;40710:26;;40782:9;40776:4;40772:20;40768:1;40757:9;40753:17;40746:47;40810:131;40936:4;40810:131;:::i;:::-;40802:139;;40529:419;;;:::o;40954:222::-;41047:4;41085:2;41074:9;41070:18;41062:26;;41098:71;41166:1;41155:9;41151:17;41142:6;41098:71;:::i;:::-;40954:222;;;;:::o;41182:129::-;41216:6;41243:20;;:::i;:::-;41233:30;;41272:33;41300:4;41292:6;41272:33;:::i;:::-;41182:129;;;:::o;41317:75::-;41350:6;41383:2;41377:9;41367:19;;41317:75;:::o;41398:307::-;41459:4;41549:18;41541:6;41538:30;41535:56;;;41571:18;;:::i;:::-;41535:56;41609:29;41631:6;41609:29;:::i;:::-;41601:37;;41693:4;41687;41683:15;41675:23;;41398:307;;;:::o;41711:308::-;41773:4;41863:18;41855:6;41852:30;41849:56;;;41885:18;;:::i;:::-;41849:56;41923:29;41945:6;41923:29;:::i;:::-;41915:37;;42007:4;42001;41997:15;41989:23;;41711:308;;;:::o;42025:98::-;42076:6;42110:5;42104:12;42094:22;;42025:98;;;:::o;42129:99::-;42181:6;42215:5;42209:12;42199:22;;42129:99;;;:::o;42234:168::-;42317:11;42351:6;42346:3;42339:19;42391:4;42386:3;42382:14;42367:29;;42234:168;;;;:::o;42408:169::-;42492:11;42526:6;42521:3;42514:19;42566:4;42561:3;42557:14;42542:29;;42408:169;;;;:::o;42583:148::-;42685:11;42722:3;42707:18;;42583:148;;;;:::o;42737:305::-;42777:3;42796:20;42814:1;42796:20;:::i;:::-;42791:25;;42830:20;42848:1;42830:20;:::i;:::-;42825:25;;42984:1;42916:66;42912:74;42909:1;42906:81;42903:107;;;42990:18;;:::i;:::-;42903:107;43034:1;43031;43027:9;43020:16;;42737:305;;;;:::o;43048:185::-;43088:1;43105:20;43123:1;43105:20;:::i;:::-;43100:25;;43139:20;43157:1;43139:20;:::i;:::-;43134:25;;43178:1;43168:35;;43183:18;;:::i;:::-;43168:35;43225:1;43222;43218:9;43213:14;;43048:185;;;;:::o;43239:348::-;43279:7;43302:20;43320:1;43302:20;:::i;:::-;43297:25;;43336:20;43354:1;43336:20;:::i;:::-;43331:25;;43524:1;43456:66;43452:74;43449:1;43446:81;43441:1;43434:9;43427:17;43423:105;43420:131;;;43531:18;;:::i;:::-;43420:131;43579:1;43576;43572:9;43561:20;;43239:348;;;;:::o;43593:191::-;43633:4;43653:20;43671:1;43653:20;:::i;:::-;43648:25;;43687:20;43705:1;43687:20;:::i;:::-;43682:25;;43726:1;43723;43720:8;43717:34;;;43731:18;;:::i;:::-;43717:34;43776:1;43773;43769:9;43761:17;;43593:191;;;;:::o;43790:96::-;43827:7;43856:24;43874:5;43856:24;:::i;:::-;43845:35;;43790:96;;;:::o;43892:90::-;43926:7;43969:5;43962:13;43955:21;43944:32;;43892:90;;;:::o;43988:77::-;44025:7;44054:5;44043:16;;43988:77;;;:::o;44071:149::-;44107:7;44147:66;44140:5;44136:78;44125:89;;44071:149;;;:::o;44226:126::-;44263:7;44303:42;44296:5;44292:54;44281:65;;44226:126;;;:::o;44358:77::-;44395:7;44424:5;44413:16;;44358:77;;;:::o;44441:86::-;44476:7;44516:4;44509:5;44505:16;44494:27;;44441:86;;;:::o;44533:154::-;44617:6;44612:3;44607;44594:30;44679:1;44670:6;44665:3;44661:16;44654:27;44533:154;;;:::o;44693:307::-;44761:1;44771:113;44785:6;44782:1;44779:13;44771:113;;;44870:1;44865:3;44861:11;44855:18;44851:1;44846:3;44842:11;44835:39;44807:2;44804:1;44800:10;44795:15;;44771:113;;;44902:6;44899:1;44896:13;44893:101;;;44982:1;44973:6;44968:3;44964:16;44957:27;44893:101;44742:258;44693:307;;;:::o;45006:171::-;45045:3;45068:24;45086:5;45068:24;:::i;:::-;45059:33;;45114:4;45107:5;45104:15;45101:41;;;45122:18;;:::i;:::-;45101:41;45169:1;45162:5;45158:13;45151:20;;45006:171;;;:::o;45183:320::-;45227:6;45264:1;45258:4;45254:12;45244:22;;45311:1;45305:4;45301:12;45332:18;45322:81;;45388:4;45380:6;45376:17;45366:27;;45322:81;45450:2;45442:6;45439:14;45419:18;45416:38;45413:84;;;45469:18;;:::i;:::-;45413:84;45234:269;45183:320;;;:::o;45509:281::-;45592:27;45614:4;45592:27;:::i;:::-;45584:6;45580:40;45722:6;45710:10;45707:22;45686:18;45674:10;45671:34;45668:62;45665:88;;;45733:18;;:::i;:::-;45665:88;45773:10;45769:2;45762:22;45552:238;45509:281;;:::o;45796:233::-;45835:3;45858:24;45876:5;45858:24;:::i;:::-;45849:33;;45904:66;45897:5;45894:77;45891:103;;;45974:18;;:::i;:::-;45891:103;46021:1;46014:5;46010:13;46003:20;;45796:233;;;:::o;46035:100::-;46074:7;46103:26;46123:5;46103:26;:::i;:::-;46092:37;;46035:100;;;:::o;46141:79::-;46180:7;46209:5;46198:16;;46141:79;;;:::o;46226:94::-;46265:7;46294:20;46308:5;46294:20;:::i;:::-;46283:31;;46226:94;;;:::o;46326:79::-;46365:7;46394:5;46383:16;;46326:79;;;:::o;46411:176::-;46443:1;46460:20;46478:1;46460:20;:::i;:::-;46455:25;;46494:20;46512:1;46494:20;:::i;:::-;46489:25;;46533:1;46523:35;;46538:18;;:::i;:::-;46523:35;46579:1;46576;46572:9;46567:14;;46411:176;;;;:::o;46593:180::-;46641:77;46638:1;46631:88;46738:4;46735:1;46728:15;46762:4;46759:1;46752:15;46779:180;46827:77;46824:1;46817:88;46924:4;46921:1;46914:15;46948:4;46945:1;46938:15;46965:180;47013:77;47010:1;47003:88;47110:4;47107:1;47100:15;47134:4;47131:1;47124:15;47151:180;47199:77;47196:1;47189:88;47296:4;47293:1;47286:15;47320:4;47317:1;47310:15;47337:180;47385:77;47382:1;47375:88;47482:4;47479:1;47472:15;47506:4;47503:1;47496:15;47523:180;47571:77;47568:1;47561:88;47668:4;47665:1;47658:15;47692:4;47689:1;47682:15;47709:180;47757:77;47754:1;47747:88;47854:4;47851:1;47844:15;47878:4;47875:1;47868:15;47895:117;48004:1;48001;47994:12;48018:117;48127:1;48124;48117:12;48141:117;48250:1;48247;48240:12;48264:117;48373:1;48370;48363:12;48387:102;48428:6;48479:2;48475:7;48470:2;48463:5;48459:14;48455:28;48445:38;;48387:102;;;:::o;48495:94::-;48528:8;48576:5;48572:2;48568:14;48547:35;;48495:94;;;:::o;48595:174::-;48735:26;48731:1;48723:6;48719:14;48712:50;48595:174;:::o;48775:172::-;48915:24;48911:1;48903:6;48899:14;48892:48;48775:172;:::o;48953:181::-;49093:33;49089:1;49081:6;49077:14;49070:57;48953:181;:::o;49140:214::-;49280:66;49276:1;49268:6;49264:14;49257:90;49140:214;:::o;49360:230::-;49500:34;49496:1;49488:6;49484:14;49477:58;49569:13;49564:2;49556:6;49552:15;49545:38;49360:230;:::o;49596:237::-;49736:34;49732:1;49724:6;49720:14;49713:58;49805:20;49800:2;49792:6;49788:15;49781:45;49596:237;:::o;49839:225::-;49979:34;49975:1;49967:6;49963:14;49956:58;50048:8;50043:2;50035:6;50031:15;50024:33;49839:225;:::o;50070:224::-;50210:34;50206:1;50198:6;50194:14;50187:58;50279:7;50274:2;50266:6;50262:15;50255:32;50070:224;:::o;50300:178::-;50440:30;50436:1;50428:6;50424:14;50417:54;50300:178;:::o;50484:161::-;50624:13;50620:1;50612:6;50608:14;50601:37;50484:161;:::o;50651:223::-;50791:34;50787:1;50779:6;50775:14;50768:58;50860:6;50855:2;50847:6;50843:15;50836:31;50651:223;:::o;50880:175::-;51020:27;51016:1;51008:6;51004:14;50997:51;50880:175;:::o;51061:163::-;51201:15;51197:1;51189:6;51185:14;51178:39;51061:163;:::o;51230:221::-;51370:34;51366:1;51358:6;51354:14;51347:58;51439:4;51434:2;51426:6;51422:15;51415:29;51230:221;:::o;51457:231::-;51597:34;51593:1;51585:6;51581:14;51574:58;51666:14;51661:2;51653:6;51649:15;51642:39;51457:231;:::o;51694:243::-;51834:34;51830:1;51822:6;51818:14;51811:58;51903:26;51898:2;51890:6;51886:15;51879:51;51694:243;:::o;51943:161::-;52083:13;52079:1;52071:6;52067:14;52060:37;51943:161;:::o;52110:229::-;52250:34;52246:1;52238:6;52234:14;52227:58;52319:12;52314:2;52306:6;52302:15;52295:37;52110:229;:::o;52345:228::-;52485:34;52481:1;52473:6;52469:14;52462:58;52554:11;52549:2;52541:6;52537:15;52530:36;52345:228;:::o;52579:221::-;52719:34;52715:1;52707:6;52703:14;52696:58;52788:4;52783:2;52775:6;52771:15;52764:29;52579:221;:::o;52806:182::-;52946:34;52942:1;52934:6;52930:14;52923:58;52806:182;:::o;52994:231::-;53134:34;53130:1;53122:6;53118:14;53111:58;53203:14;53198:2;53190:6;53186:15;53179:39;52994:231;:::o;53231:182::-;53371:34;53367:1;53359:6;53355:14;53348:58;53231:182;:::o;53419:163::-;53559:15;53555:1;53547:6;53543:14;53536:39;53419:163;:::o;53588:234::-;53728:34;53724:1;53716:6;53712:14;53705:58;53797:17;53792:2;53784:6;53780:15;53773:42;53588:234;:::o;53828:160::-;53968:12;53964:1;53956:6;53952:14;53945:36;53828:160;:::o;53994:220::-;54134:34;54130:1;54122:6;54118:14;54111:58;54203:3;54198:2;54190:6;54186:15;54179:28;53994:220;:::o;54220:159::-;54360:11;54356:1;54348:6;54344:14;54337:35;54220:159;:::o;54385:236::-;54525:34;54521:1;54513:6;54509:14;54502:58;54594:19;54589:2;54581:6;54577:15;54570:44;54385:236;:::o;54627:231::-;54767:34;54763:1;54755:6;54751:14;54744:58;54836:14;54831:2;54823:6;54819:15;54812:39;54627:231;:::o;54864:163::-;55004:15;55000:1;54992:6;54988:14;54981:39;54864:163;:::o;55033:181::-;55173:33;55169:1;55161:6;55157:14;55150:57;55033:181;:::o;55220:122::-;55293:24;55311:5;55293:24;:::i;:::-;55286:5;55283:35;55273:63;;55332:1;55329;55322:12;55273:63;55220:122;:::o;55348:116::-;55418:21;55433:5;55418:21;:::i;:::-;55411:5;55408:32;55398:60;;55454:1;55451;55444:12;55398:60;55348:116;:::o;55470:120::-;55542:23;55559:5;55542:23;:::i;:::-;55535:5;55532:34;55522:62;;55580:1;55577;55570:12;55522:62;55470:120;:::o;55596:122::-;55669:24;55687:5;55669:24;:::i;:::-;55662:5;55659:35;55649:63;;55708:1;55705;55698:12;55649:63;55596:122;:::o

Swarm Source

ipfs://a4c81669865651994016a2b0f161bbb2c5bdb755c9928ceb88ea8499f46e1261
Loading