ETH Price: $3,981.23 (+3.04%)

Token

CRYPTINIES (CRYPTINIES)
 

Overview

Max Total Supply

1,615 CRYPTINIES

Holders

580

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 CRYPTINIES
0x42884b0a68aa475d0a9247819f61924a53f3d984
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CRYPTINIES

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-20
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableMap.sol




pragma solidity ^0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

    /**
     * @dev Removes a key-value pair from a map. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the key was removed from the map, that is if it was present.
     */
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }

    /**
     * @dev Returns true if the key is in the map. O(1).
     */
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }

    /**
     * @dev Returns the number of elements in the map. O(1).
     */
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }

   /**
    * @dev Returns the element stored at position `index` in the set. O(1).
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableSet.sol




pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/Address.sol




pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/ERC165.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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(type(IERC165).interfaceId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.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;
}


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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/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 tokenId);

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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/IERC165.sol



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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 GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol




pragma solidity ^0.8.0;











/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;

    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(type(IERC721).interfaceId);
        _registerInterface(type(IERC721Metadata).interfaceId);
        _registerInterface(type(IERC721Enumerable).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 _holderTokens[owner].length();
    }
    

    
    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

    /**
     * @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 _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

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

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

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



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/math/SafeMath.sol




pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

pragma solidity ^0.8.0;





contract CRYPTINIES is ERC721, Ownable {
    using SafeMath for uint256;
    uint public constant MAX_CRYPTINIES = 9999;
    bool public hasSaleStarted = false;
    address public constant DEVELOPER_ADDRESS = 0x16eFE37c0c557D4B1D8EB76d11E13616d2b52eAF;
    address public constant CHARITY_ADDRESS = 0x2a408eB3538e54fE60E6bb591826B16575537faF;
    uint public DEVELOPER_FEE = 5;
    uint public CHARITY_FEE = 10;
    uint constant SHARE_SUM = 100;
    
    
    // The IPFS Hash of all tokens will be added here when all of them are minted.
    string public METADATA_PROVENANCE_HASH = "";
    
    
    constructor() ERC721("CRYPTINIES","CRYPTINIES")  {
        setBaseURI("https://cryptinies.com/api/");
        
        //Token 0 goes to Cryptinies team.
        _safeMint(address(0xB2d376a5a1665c692D306c1f784CA6E96c497702), 0);
        //Token 1 goes to Developer(kodbilen.eth)
        _safeMint(address(0x16eFE37c0c557D4B1D8EB76d11E13616d2b52eAF), 1);
    }
    
    function getNFTPrice() public view returns (uint256) {
        require(hasSaleStarted == true, "Sale hasn't started yet");
        require(totalSupply() < MAX_CRYPTINIES, "Sale has already ended");


        return 40000000000000000;

    }
   
    function mintCRYPTINIES(uint256 numCryptinies) public payable{
        require(hasSaleStarted == true, "Sale hasn't started yet");
        require(totalSupply() < MAX_CRYPTINIES, "Sale has already ended");
        require(numCryptinies > 0 && numCryptinies <= 20, "You can adopt minimum 1, maximum 20 Cryptinies");
        require(totalSupply().add(numCryptinies) <= MAX_CRYPTINIES, "Exceeds MAX_CRYPTINIES");
        require(getNFTPrice().mul(numCryptinies) == msg.value, "Ether value sent is not correct");
      
        for (uint i = 0; i < numCryptinies; i++){
            uint mintIndex = totalSupply();
            _safeMint(msg.sender, mintIndex);
        }
    }

    
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    
    function setProvenanceHash(string memory _hash) public onlyOwner {
        METADATA_PROVENANCE_HASH = _hash;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    
    function startDrop() public onlyOwner {
        hasSaleStarted = true;
    }
    
    function pauseDrop() public onlyOwner {
        hasSaleStarted = false;
    }
    
    
    
    // %10 Charity
    // %5 DevDeveloper
    // %85 Owner
    
    function withdrawAll() public payable onlyOwner {
        
        uint256 balance = address(this).balance;

        uint toDeveloper = (balance * DEVELOPER_FEE) / SHARE_SUM;
        uint toCharity = (balance * CHARITY_FEE) / SHARE_SUM;
        uint toOwner = balance - (toDeveloper + toCharity);

        payable(DEVELOPER_ADDRESS).transfer(toDeveloper);
        payable(CHARITY_ADDRESS).transfer(toCharity);
        payable(msg.sender).transfer(toOwner);
        assert(address(this).balance == 0);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"CHARITY_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CHARITY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPER_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPER_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_CRYPTINIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasSaleStarted","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":"uint256","name":"numCryptinies","type":"uint256"}],"name":"mintCRYPTINIES","outputs":[],"stateMutability":"payable","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":"pauseDrop","outputs":[],"stateMutability":"nonpayable","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":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60146101000a81548160ff0219169083151502179055506005600b55600a600c5560405180602001604052806000815250600d90805190602001906200005092919062000b6b565b503480156200005e57600080fd5b506040518060400160405280600a81526020017f4352595054494e494553000000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4352595054494e49455300000000000000000000000000000000000000000000815250620000fc7f01ffc9a7000000000000000000000000000000000000000000000000000000006200030e60201b60201c565b81600690805190602001906200011492919062000b6b565b5080600790805190602001906200012d92919062000b6b565b506200015f7f80ac58cd000000000000000000000000000000000000000000000000000000006200030e60201b60201c565b620001907f5b5e139f000000000000000000000000000000000000000000000000000000006200030e60201b60201c565b620001c17f780e9d63000000000000000000000000000000000000000000000000000000006200030e60201b60201c565b50506000620001d5620003e660201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002ba6040518060400160405280601b81526020017f68747470733a2f2f6372797074696e6965732e636f6d2f6170692f0000000000815250620003ee60201b60201c565b620002e173b2d376a5a1665c692d306c1f784ca6e96c49770260006200049160201b60201c565b620003087316efe37c0c557d4b1d8eb76d11e13616d2b52eaf60016200049160201b60201c565b6200113c565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156200037a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003719062000dfa565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b620003fe620003e660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000424620004b760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200047d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004749062000e60565b60405180910390fd5b6200048e81620004e160201b60201c565b50565b620004b3828260405180602001604052806000815250620004fd60201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060099080519060200190620004f992919062000b6b565b5050565b6200050f83836200056b60201b60201c565b6200052460008484846200071d60201b60201c565b62000566576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200055d9062000dd8565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005de576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d59062000e3e565b60405180910390fd5b620005ef81620008d760201b60201c565b1562000632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006299062000e1c565b60405180910390fd5b6200064660008383620008fb60201b60201c565b6200069e81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200090060201b62001e201790919060201c565b50620006bc818360026200092260201b62001e3a179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60006200074b8473ffffffffffffffffffffffffffffffffffffffff166200095f60201b62001e6f1760201c565b15620008ca578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200077d620003e660201b60201c565b8786866040518563ffffffff1660e01b8152600401620007a1949392919062000d84565b602060405180830381600087803b158015620007bc57600080fd5b505af1925050508015620007f057506040513d601f19601f82011682018060405250810190620007ed919062000c32565b60015b62000879573d806000811462000823576040519150601f19603f3d011682016040523d82523d6000602084013e62000828565b606091505b5060008151141562000871576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008689062000dd8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620008cf565b600190505b949350505050565b6000620008f48260026200097260201b62001e821790919060201c565b9050919050565b505050565b60006200091a836000018360001b6200099460201b60201c565b905092915050565b600062000956846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b62000a0e60201b60201c565b90509392505050565b600080823b905060008111915050919050565b60006200098c836000018360001b62000b2560201b60201c565b905092915050565b6000620009a8838362000b4860201b60201c565b62000a0357826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000a08565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000ab75784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000b1e565b828560000160018362000acb919062000eaf565b8154811062000b03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805462000b799062000f8a565b90600052602060002090601f01602090048101928262000b9d576000855562000be9565b82601f1062000bb857805160ff191683800117855562000be9565b8280016001018555821562000be9579182015b8281111562000be857825182559160200191906001019062000bcb565b5b50905062000bf8919062000bfc565b5090565b5b8082111562000c1757600081600090555060010162000bfd565b5090565b60008151905062000c2c8162001122565b92915050565b60006020828403121562000c4557600080fd5b600062000c558482850162000c1b565b91505092915050565b62000c698162000eea565b82525050565b600062000c7c8262000e82565b62000c88818562000e8d565b935062000c9a81856020860162000f54565b62000ca5816200101e565b840191505092915050565b600062000cbf60328362000e9e565b915062000ccc826200102f565b604082019050919050565b600062000ce6601c8362000e9e565b915062000cf3826200107e565b602082019050919050565b600062000d0d601c8362000e9e565b915062000d1a82620010a7565b602082019050919050565b600062000d3460208362000e9e565b915062000d4182620010d0565b602082019050919050565b600062000d5b60208362000e9e565b915062000d6882620010f9565b602082019050919050565b62000d7e8162000f4a565b82525050565b600060808201905062000d9b600083018762000c5e565b62000daa602083018662000c5e565b62000db9604083018562000d73565b818103606083015262000dcd818462000c6f565b905095945050505050565b6000602082019050818103600083015262000df38162000cb0565b9050919050565b6000602082019050818103600083015262000e158162000cd7565b9050919050565b6000602082019050818103600083015262000e378162000cfe565b9050919050565b6000602082019050818103600083015262000e598162000d25565b9050919050565b6000602082019050818103600083015262000e7b8162000d4c565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000ebc8262000f4a565b915062000ec98362000f4a565b92508282101562000edf5762000ede62000fc0565b5b828203905092915050565b600062000ef78262000f2a565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000f7457808201518184015260208101905062000f57565b8381111562000f84576000848401525b50505050565b6000600282049050600182168062000fa357607f821691505b6020821081141562000fba5762000fb962000fef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200112d8162000efe565b81146200113957600080fd5b50565b6145b7806200114c6000396000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063b88d4fde116100a0578063d56b75461161006f578063d56b754614610729578063e985e9c514610754578063f0c9dc6014610791578063f2fde38b146107bc578063fb107a4f146107e557610204565b8063b88d4fde1461067c578063c5cc0762146106a5578063c87b56dd146106c1578063c9330fdc146106fe57610204565b80638da5cb5b116100e75780638da5cb5b146105a757806395d89b41146105d2578063a22cb465146105fd578063ab0046ab14610626578063aba943281461065157610204565b806370a082311461050c578063715018a6146105495780638462151c14610560578063853828b61461059d57610204565b80632808c92c1161019b578063454e66c81161016a578063454e66c8146104135780634f6ccce71461043e57806355f804b31461047b5780636352211e146104a45780636c0360eb146104e157610204565b80632808c92c1461037f5780632f745c591461039657806334d84c7b146103d357806342842e0e146103ea57610204565b806310969523116101d757806310969523146102d757806318160ddd146103005780631c8b232d1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613212565b610810565b60405161023d91906137d2565b60405180910390f35b34801561025257600080fd5b5061025b610877565b60405161026891906137ed565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906132a5565b610909565b6040516102a59190613749565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131d6565b61098e565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613264565b610aa6565b005b34801561030c57600080fd5b50610315610b3c565b6040516103229190613acf565b60405180910390f35b34801561033757600080fd5b50610340610b4d565b60405161034d91906137d2565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906130d0565b610b60565b005b34801561038b57600080fd5b50610394610bc0565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906131d6565b610c59565b6040516103ca9190613acf565b60405180910390f35b3480156103df57600080fd5b506103e8610cb4565b005b3480156103f657600080fd5b50610411600480360381019061040c91906130d0565b610d4d565b005b34801561041f57600080fd5b50610428610d6d565b6040516104359190613749565b60405180910390f35b34801561044a57600080fd5b50610465600480360381019061046091906132a5565b610d85565b6040516104729190613acf565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613264565b610da8565b005b3480156104b057600080fd5b506104cb60048036038101906104c691906132a5565b610e30565b6040516104d89190613749565b60405180910390f35b3480156104ed57600080fd5b506104f6610e67565b60405161050391906137ed565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e919061306b565b610ef9565b6040516105409190613acf565b60405180910390f35b34801561055557600080fd5b5061055e610fb8565b005b34801561056c57600080fd5b506105876004803603810190610582919061306b565b6110f5565b60405161059491906137b0565b60405180910390f35b6105a5611271565b005b3480156105b357600080fd5b506105bc611483565b6040516105c99190613749565b60405180910390f35b3480156105de57600080fd5b506105e76114ad565b6040516105f491906137ed565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f919061319a565b61153f565b005b34801561063257600080fd5b5061063b6116c0565b6040516106489190613acf565b60405180910390f35b34801561065d57600080fd5b506106666116c6565b6040516106739190613acf565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e919061311f565b6116cc565b005b6106bf60048036038101906106ba91906132a5565b61172e565b005b3480156106cd57600080fd5b506106e860048036038101906106e391906132a5565b611911565b6040516106f591906137ed565b60405180910390f35b34801561070a57600080fd5b50610713611a84565b6040516107209190613749565b60405180910390f35b34801561073557600080fd5b5061073e611a9c565b60405161074b9190613acf565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190613094565b611aa2565b60405161078891906137d2565b60405180910390f35b34801561079d57600080fd5b506107a6611b36565b6040516107b391906137ed565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de919061306b565b611bc4565b005b3480156107f157600080fd5b506107fa611d70565b6040516108079190613acf565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606006805461088690613db8565b80601f01602080910402602001604051908101604052809291908181526020018280546108b290613db8565b80156108ff5780601f106108d4576101008083540402835291602001916108ff565b820191906000526020600020905b8154815290600101906020018083116108e257829003601f168201915b5050505050905090565b600061091482611e9c565b610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094a9061398f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099982610e30565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0190613a4f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a29611eb9565b73ffffffffffffffffffffffffffffffffffffffff161480610a585750610a5781610a52611eb9565b611aa2565b5b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e9061390f565b60405180910390fd5b610aa18383611ec1565b505050565b610aae611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610acc611483565b73ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906139af565b60405180910390fd5b80600d9080519060200190610b38929190612e8f565b5050565b6000610b486002611f7a565b905090565b600a60149054906101000a900460ff1681565b610b71610b6b611eb9565b82611f8f565b610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613a8f565b60405180910390fd5b610bbb83838361206d565b505050565b610bc8611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610be6611483565b73ffffffffffffffffffffffffffffffffffffffff1614610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c33906139af565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b6000610cac82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061228490919063ffffffff16565b905092915050565b610cbc611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610cda611483565b73ffffffffffffffffffffffffffffffffffffffff1614610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906139af565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610d68838383604051806020016040528060008152506116cc565b505050565b7316efe37c0c557d4b1d8eb76d11e13616d2b52eaf81565b600080610d9c83600261229e90919063ffffffff16565b50905080915050919050565b610db0611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610dce611483565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906139af565b60405180910390fd5b610e2d816122ca565b50565b6000610e60826040518060600160405280602981526020016145596029913960026122e49092919063ffffffff16565b9050919050565b606060098054610e7690613db8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea290613db8565b8015610eef5780601f10610ec457610100808354040283529160200191610eef565b820191906000526020600020905b815481529060010190602001808311610ed257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f619061392f565b60405180910390fd5b610fb1600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612303565b9050919050565b610fc0611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610fde611483565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b906139af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061110283610ef9565b9050600081141561118557600067ffffffffffffffff81111561114e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561117c5781602001602082028036833780820191505090505b5091505061126c565b60008167ffffffffffffffff8111156111c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111f55781602001602082028036833780820191505090505b50905060005b828110156112655761120d8582610c59565b828281518110611246577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061125d90613e1b565b9150506111fb565b8193505050505b919050565b611279611eb9565b73ffffffffffffffffffffffffffffffffffffffff16611297611483565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e4906139af565b60405180910390fd5b600047905060006064600b54836113049190613c74565b61130e9190613c43565b905060006064600c54846113229190613c74565b61132c9190613c43565b90506000818361133c9190613bed565b846113479190613cce565b90507316efe37c0c557d4b1d8eb76d11e13616d2b52eaf73ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156113a3573d6000803e3d6000fd5b50732a408eb3538e54fe60e6bb591826b16575537faf73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156113fe573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611445573d6000803e3d6000fd5b506000471461147d577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546114bc90613db8565b80601f01602080910402602001604051908101604052809291908181526020018280546114e890613db8565b80156115355780601f1061150a57610100808354040283529160200191611535565b820191906000526020600020905b81548152906001019060200180831161151857829003601f168201915b5050505050905090565b611547611eb9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac906138af565b60405180910390fd5b80600560006115c2611eb9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661166f611eb9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b491906137d2565b60405180910390a35050565b600c5481565b61270f81565b6116dd6116d7611eb9565b83611f8f565b61171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390613a8f565b60405180910390fd5b61172884848484612318565b50505050565b60011515600a60149054906101000a900460ff16151514611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90613a2f565b60405180910390fd5b61270f61178f610b3c565b106117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c690613a6f565b60405180910390fd5b6000811180156117e0575060148111155b61181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613aaf565b60405180910390fd5b61270f61183c8261182e610b3c565b61237490919063ffffffff16565b111561187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906139cf565b60405180910390fd5b346118988261188a611d70565b61238a90919063ffffffff16565b146118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf906138cf565b60405180910390fd5b60005b8181101561190d5760006118ed610b3c565b90506118f933826123a0565b50808061190590613e1b565b9150506118db565b5050565b606061191c82611e9c565b61195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290613a0f565b60405180910390fd5b600060086000848152602001908152602001600020805461197b90613db8565b80601f01602080910402602001604051908101604052809291908181526020018280546119a790613db8565b80156119f45780601f106119c9576101008083540402835291602001916119f4565b820191906000526020600020905b8154815290600101906020018083116119d757829003601f168201915b505050505090506000611a05610e67565b9050600081511415611a1b578192505050611a7f565b600082511115611a50578082604051602001611a38929190613725565b60405160208183030381529060405292505050611a7f565b80611a5a856123be565b604051602001611a6b929190613725565b604051602081830303815290604052925050505b919050565b732a408eb3538e54fe60e6bb591826b16575537faf81565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d8054611b4390613db8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6f90613db8565b8015611bbc5780601f10611b9157610100808354040283529160200191611bbc565b820191906000526020600020905b815481529060010190602001808311611b9f57829003601f168201915b505050505081565b611bcc611eb9565b73ffffffffffffffffffffffffffffffffffffffff16611bea611483565b73ffffffffffffffffffffffffffffffffffffffff1614611c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c37906139af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca79061384f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060011515600a60149054906101000a900460ff16151514611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf90613a2f565b60405180910390fd5b61270f611dd3610b3c565b10611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90613a6f565b60405180910390fd5b668e1bc9bf040000905090565b6000611e32836000018360001b61256b565b905092915050565b6000611e66846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6125db565b90509392505050565b600080823b905060008111915050919050565b6000611e94836000018360001b6126ed565b905092915050565b6000611eb2826002611e8290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f3483610e30565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8882600001612710565b9050919050565b6000611f9a82611e9c565b611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906138ef565b60405180910390fd5b6000611fe483610e30565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061205357508373ffffffffffffffffffffffffffffffffffffffff1661203b84610909565b73ffffffffffffffffffffffffffffffffffffffff16145b8061206457506120638185611aa2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661208d82610e30565b73ffffffffffffffffffffffffffffffffffffffff16146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da906139ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a9061388f565b60405180910390fd5b61215e838383612721565b612169600082611ec1565b6121ba81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061272690919063ffffffff16565b5061220c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611e2090919063ffffffff16565b5061222381836002611e3a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006122938360000183612740565b60001c905092915050565b6000806000806122b186600001866127da565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906122e0929190612e8f565b5050565b60006122f7846000018460001b8461288a565b60001c90509392505050565b600061231182600001612951565b9050919050565b61232384848461206d565b61232f84848484612962565b61236e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123659061382f565b60405180910390fd5b50505050565b600081836123829190613bed565b905092915050565b600081836123989190613c74565b905092915050565b6123ba828260405180602001604052806000815250612af9565b5050565b60606000821415612406576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612566565b600082905060005b6000821461243857808061242190613e1b565b915050600a826124319190613c43565b915061240e565b60008167ffffffffffffffff81111561247a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124ac5781602001600182028036833780820191505090505b5090505b6000851461255f576001826124c59190613cce565b9150600a856124d49190613e64565b60306124e09190613bed565b60f81b81838151811061251c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125589190613c43565b94506124b0565b8093505050505b919050565b60006125778383612b54565b6125d05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506125d5565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612682578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506126e6565b82856000016001836126949190613cce565b815481106126cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000612738836000018360001b612b77565b905092915050565b60008183600001805490501161278b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127829061380f565b60405180910390fd5b8260000182815481106127c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d9061394f565b60405180910390fd5b6000846000018481548110612864577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e391906137ed565b60405180910390fd5b50846000016001826128fe9190613cce565b81548110612935577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006129838473ffffffffffffffffffffffffffffffffffffffff16611e6f565b15612aec578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129ac611eb9565b8786866040518563ffffffff1660e01b81526004016129ce9493929190613764565b602060405180830381600087803b1580156129e857600080fd5b505af1925050508015612a1957506040513d601f19601f82011682018060405250810190612a16919061323b565b60015b612a9c573d8060008114612a49576040519150601f19603f3d011682016040523d82523d6000602084013e612a4e565b606091505b50600081511415612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b9061382f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612af1565b600190505b949350505050565b612b038383612d01565b612b106000848484612962565b612b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b469061382f565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612cf5576000600182612ba99190613cce565b9050600060018660000180549050612bc19190613cce565b90506000866000018281548110612c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612c4b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612c669190613bed565b8760010160008381526020019081526020016000208190555086600001805480612cb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612cfb565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d689061396f565b60405180910390fd5b612d7a81611e9c565b15612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db19061386f565b60405180910390fd5b612dc660008383612721565b612e1781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611e2090919063ffffffff16565b50612e2e81836002611e3a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e9b90613db8565b90600052602060002090601f016020900481019282612ebd5760008555612f04565b82601f10612ed657805160ff1916838001178555612f04565b82800160010185558215612f04579182015b82811115612f03578251825591602001919060010190612ee8565b5b509050612f119190612f15565b5090565b5b80821115612f2e576000816000905550600101612f16565b5090565b6000612f45612f4084613b0f565b613aea565b905082815260208101848484011115612f5d57600080fd5b612f68848285613d76565b509392505050565b6000612f83612f7e84613b40565b613aea565b905082815260208101848484011115612f9b57600080fd5b612fa6848285613d76565b509392505050565b600081359050612fbd816144fc565b92915050565b600081359050612fd281614513565b92915050565b600081359050612fe78161452a565b92915050565b600081519050612ffc8161452a565b92915050565b600082601f83011261301357600080fd5b8135613023848260208601612f32565b91505092915050565b600082601f83011261303d57600080fd5b813561304d848260208601612f70565b91505092915050565b60008135905061306581614541565b92915050565b60006020828403121561307d57600080fd5b600061308b84828501612fae565b91505092915050565b600080604083850312156130a757600080fd5b60006130b585828601612fae565b92505060206130c685828601612fae565b9150509250929050565b6000806000606084860312156130e557600080fd5b60006130f386828701612fae565b935050602061310486828701612fae565b925050604061311586828701613056565b9150509250925092565b6000806000806080858703121561313557600080fd5b600061314387828801612fae565b945050602061315487828801612fae565b935050604061316587828801613056565b925050606085013567ffffffffffffffff81111561318257600080fd5b61318e87828801613002565b91505092959194509250565b600080604083850312156131ad57600080fd5b60006131bb85828601612fae565b92505060206131cc85828601612fc3565b9150509250929050565b600080604083850312156131e957600080fd5b60006131f785828601612fae565b925050602061320885828601613056565b9150509250929050565b60006020828403121561322457600080fd5b600061323284828501612fd8565b91505092915050565b60006020828403121561324d57600080fd5b600061325b84828501612fed565b91505092915050565b60006020828403121561327657600080fd5b600082013567ffffffffffffffff81111561329057600080fd5b61329c8482850161302c565b91505092915050565b6000602082840312156132b757600080fd5b60006132c584828501613056565b91505092915050565b60006132da8383613707565b60208301905092915050565b6132ef81613d02565b82525050565b600061330082613b81565b61330a8185613baf565b935061331583613b71565b8060005b8381101561334657815161332d88826132ce565b975061333883613ba2565b925050600181019050613319565b5085935050505092915050565b61335c81613d14565b82525050565b600061336d82613b8c565b6133778185613bc0565b9350613387818560208601613d85565b61339081613f51565b840191505092915050565b60006133a682613b97565b6133b08185613bd1565b93506133c0818560208601613d85565b6133c981613f51565b840191505092915050565b60006133df82613b97565b6133e98185613be2565b93506133f9818560208601613d85565b80840191505092915050565b6000613412602283613bd1565b915061341d82613f62565b604082019050919050565b6000613435603283613bd1565b915061344082613fb1565b604082019050919050565b6000613458602683613bd1565b915061346382614000565b604082019050919050565b600061347b601c83613bd1565b91506134868261404f565b602082019050919050565b600061349e602483613bd1565b91506134a982614078565b604082019050919050565b60006134c1601983613bd1565b91506134cc826140c7565b602082019050919050565b60006134e4601f83613bd1565b91506134ef826140f0565b602082019050919050565b6000613507602c83613bd1565b915061351282614119565b604082019050919050565b600061352a603883613bd1565b915061353582614168565b604082019050919050565b600061354d602a83613bd1565b9150613558826141b7565b604082019050919050565b6000613570602283613bd1565b915061357b82614206565b604082019050919050565b6000613593602083613bd1565b915061359e82614255565b602082019050919050565b60006135b6602c83613bd1565b91506135c18261427e565b604082019050919050565b60006135d9602083613bd1565b91506135e4826142cd565b602082019050919050565b60006135fc601683613bd1565b9150613607826142f6565b602082019050919050565b600061361f602983613bd1565b915061362a8261431f565b604082019050919050565b6000613642602f83613bd1565b915061364d8261436e565b604082019050919050565b6000613665601783613bd1565b9150613670826143bd565b602082019050919050565b6000613688602183613bd1565b9150613693826143e6565b604082019050919050565b60006136ab601683613bd1565b91506136b682614435565b602082019050919050565b60006136ce603183613bd1565b91506136d98261445e565b604082019050919050565b60006136f1602e83613bd1565b91506136fc826144ad565b604082019050919050565b61371081613d6c565b82525050565b61371f81613d6c565b82525050565b600061373182856133d4565b915061373d82846133d4565b91508190509392505050565b600060208201905061375e60008301846132e6565b92915050565b600060808201905061377960008301876132e6565b61378660208301866132e6565b6137936040830185613716565b81810360608301526137a58184613362565b905095945050505050565b600060208201905081810360008301526137ca81846132f5565b905092915050565b60006020820190506137e76000830184613353565b92915050565b60006020820190508181036000830152613807818461339b565b905092915050565b6000602082019050818103600083015261382881613405565b9050919050565b6000602082019050818103600083015261384881613428565b9050919050565b600060208201905081810360008301526138688161344b565b9050919050565b600060208201905081810360008301526138888161346e565b9050919050565b600060208201905081810360008301526138a881613491565b9050919050565b600060208201905081810360008301526138c8816134b4565b9050919050565b600060208201905081810360008301526138e8816134d7565b9050919050565b60006020820190508181036000830152613908816134fa565b9050919050565b600060208201905081810360008301526139288161351d565b9050919050565b6000602082019050818103600083015261394881613540565b9050919050565b6000602082019050818103600083015261396881613563565b9050919050565b6000602082019050818103600083015261398881613586565b9050919050565b600060208201905081810360008301526139a8816135a9565b9050919050565b600060208201905081810360008301526139c8816135cc565b9050919050565b600060208201905081810360008301526139e8816135ef565b9050919050565b60006020820190508181036000830152613a0881613612565b9050919050565b60006020820190508181036000830152613a2881613635565b9050919050565b60006020820190508181036000830152613a4881613658565b9050919050565b60006020820190508181036000830152613a688161367b565b9050919050565b60006020820190508181036000830152613a888161369e565b9050919050565b60006020820190508181036000830152613aa8816136c1565b9050919050565b60006020820190508181036000830152613ac8816136e4565b9050919050565b6000602082019050613ae46000830184613716565b92915050565b6000613af4613b05565b9050613b008282613dea565b919050565b6000604051905090565b600067ffffffffffffffff821115613b2a57613b29613f22565b5b613b3382613f51565b9050602081019050919050565b600067ffffffffffffffff821115613b5b57613b5a613f22565b5b613b6482613f51565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bf882613d6c565b9150613c0383613d6c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c3857613c37613e95565b5b828201905092915050565b6000613c4e82613d6c565b9150613c5983613d6c565b925082613c6957613c68613ec4565b5b828204905092915050565b6000613c7f82613d6c565b9150613c8a83613d6c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cc357613cc2613e95565b5b828202905092915050565b6000613cd982613d6c565b9150613ce483613d6c565b925082821015613cf757613cf6613e95565b5b828203905092915050565b6000613d0d82613d4c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613da3578082015181840152602081019050613d88565b83811115613db2576000848401525b50505050565b60006002820490506001821680613dd057607f821691505b60208210811415613de457613de3613ef3565b5b50919050565b613df382613f51565b810181811067ffffffffffffffff82111715613e1257613e11613f22565b5b80604052505050565b6000613e2682613d6c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e5957613e58613e95565b5b600182019050919050565b6000613e6f82613d6c565b9150613e7a83613d6c565b925082613e8a57613e89613ec4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473204d41585f4352595054494e49455300000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206861736e2774207374617274656420796574000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f596f752063616e2061646f7074206d696e696d756d20312c206d6178696d756d60008201527f203230204372797074696e696573000000000000000000000000000000000000602082015250565b61450581613d02565b811461451057600080fd5b50565b61451c81613d14565b811461452757600080fd5b50565b61453381613d20565b811461453e57600080fd5b50565b61454a81613d6c565b811461455557600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220895d625bb4d4035873b049c9a2a4931a5283574c7d78517757011a35ef028e4364736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102045760003560e01c806370a0823111610118578063b88d4fde116100a0578063d56b75461161006f578063d56b754614610729578063e985e9c514610754578063f0c9dc6014610791578063f2fde38b146107bc578063fb107a4f146107e557610204565b8063b88d4fde1461067c578063c5cc0762146106a5578063c87b56dd146106c1578063c9330fdc146106fe57610204565b80638da5cb5b116100e75780638da5cb5b146105a757806395d89b41146105d2578063a22cb465146105fd578063ab0046ab14610626578063aba943281461065157610204565b806370a082311461050c578063715018a6146105495780638462151c14610560578063853828b61461059d57610204565b80632808c92c1161019b578063454e66c81161016a578063454e66c8146104135780634f6ccce71461043e57806355f804b31461047b5780636352211e146104a45780636c0360eb146104e157610204565b80632808c92c1461037f5780632f745c591461039657806334d84c7b146103d357806342842e0e146103ea57610204565b806310969523116101d757806310969523146102d757806318160ddd146103005780631c8b232d1461032b57806323b872dd1461035657610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613212565b610810565b60405161023d91906137d2565b60405180910390f35b34801561025257600080fd5b5061025b610877565b60405161026891906137ed565b60405180910390f35b34801561027d57600080fd5b50610298600480360381019061029391906132a5565b610909565b6040516102a59190613749565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d091906131d6565b61098e565b005b3480156102e357600080fd5b506102fe60048036038101906102f99190613264565b610aa6565b005b34801561030c57600080fd5b50610315610b3c565b6040516103229190613acf565b60405180910390f35b34801561033757600080fd5b50610340610b4d565b60405161034d91906137d2565b60405180910390f35b34801561036257600080fd5b5061037d600480360381019061037891906130d0565b610b60565b005b34801561038b57600080fd5b50610394610bc0565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906131d6565b610c59565b6040516103ca9190613acf565b60405180910390f35b3480156103df57600080fd5b506103e8610cb4565b005b3480156103f657600080fd5b50610411600480360381019061040c91906130d0565b610d4d565b005b34801561041f57600080fd5b50610428610d6d565b6040516104359190613749565b60405180910390f35b34801561044a57600080fd5b50610465600480360381019061046091906132a5565b610d85565b6040516104729190613acf565b60405180910390f35b34801561048757600080fd5b506104a2600480360381019061049d9190613264565b610da8565b005b3480156104b057600080fd5b506104cb60048036038101906104c691906132a5565b610e30565b6040516104d89190613749565b60405180910390f35b3480156104ed57600080fd5b506104f6610e67565b60405161050391906137ed565b60405180910390f35b34801561051857600080fd5b50610533600480360381019061052e919061306b565b610ef9565b6040516105409190613acf565b60405180910390f35b34801561055557600080fd5b5061055e610fb8565b005b34801561056c57600080fd5b506105876004803603810190610582919061306b565b6110f5565b60405161059491906137b0565b60405180910390f35b6105a5611271565b005b3480156105b357600080fd5b506105bc611483565b6040516105c99190613749565b60405180910390f35b3480156105de57600080fd5b506105e76114ad565b6040516105f491906137ed565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f919061319a565b61153f565b005b34801561063257600080fd5b5061063b6116c0565b6040516106489190613acf565b60405180910390f35b34801561065d57600080fd5b506106666116c6565b6040516106739190613acf565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e919061311f565b6116cc565b005b6106bf60048036038101906106ba91906132a5565b61172e565b005b3480156106cd57600080fd5b506106e860048036038101906106e391906132a5565b611911565b6040516106f591906137ed565b60405180910390f35b34801561070a57600080fd5b50610713611a84565b6040516107209190613749565b60405180910390f35b34801561073557600080fd5b5061073e611a9c565b60405161074b9190613acf565b60405180910390f35b34801561076057600080fd5b5061077b60048036038101906107769190613094565b611aa2565b60405161078891906137d2565b60405180910390f35b34801561079d57600080fd5b506107a6611b36565b6040516107b391906137ed565b60405180910390f35b3480156107c857600080fd5b506107e360048036038101906107de919061306b565b611bc4565b005b3480156107f157600080fd5b506107fa611d70565b6040516108079190613acf565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b60606006805461088690613db8565b80601f01602080910402602001604051908101604052809291908181526020018280546108b290613db8565b80156108ff5780601f106108d4576101008083540402835291602001916108ff565b820191906000526020600020905b8154815290600101906020018083116108e257829003601f168201915b5050505050905090565b600061091482611e9c565b610953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094a9061398f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099982610e30565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0190613a4f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a29611eb9565b73ffffffffffffffffffffffffffffffffffffffff161480610a585750610a5781610a52611eb9565b611aa2565b5b610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e9061390f565b60405180910390fd5b610aa18383611ec1565b505050565b610aae611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610acc611483565b73ffffffffffffffffffffffffffffffffffffffff1614610b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b19906139af565b60405180910390fd5b80600d9080519060200190610b38929190612e8f565b5050565b6000610b486002611f7a565b905090565b600a60149054906101000a900460ff1681565b610b71610b6b611eb9565b82611f8f565b610bb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba790613a8f565b60405180910390fd5b610bbb83838361206d565b505050565b610bc8611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610be6611483565b73ffffffffffffffffffffffffffffffffffffffff1614610c3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c33906139af565b60405180910390fd5b6000600a60146101000a81548160ff021916908315150217905550565b6000610cac82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061228490919063ffffffff16565b905092915050565b610cbc611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610cda611483565b73ffffffffffffffffffffffffffffffffffffffff1614610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906139af565b60405180910390fd5b6001600a60146101000a81548160ff021916908315150217905550565b610d68838383604051806020016040528060008152506116cc565b505050565b7316efe37c0c557d4b1d8eb76d11e13616d2b52eaf81565b600080610d9c83600261229e90919063ffffffff16565b50905080915050919050565b610db0611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610dce611483565b73ffffffffffffffffffffffffffffffffffffffff1614610e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1b906139af565b60405180910390fd5b610e2d816122ca565b50565b6000610e60826040518060600160405280602981526020016145596029913960026122e49092919063ffffffff16565b9050919050565b606060098054610e7690613db8565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea290613db8565b8015610eef5780601f10610ec457610100808354040283529160200191610eef565b820191906000526020600020905b815481529060010190602001808311610ed257829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f619061392f565b60405180910390fd5b610fb1600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612303565b9050919050565b610fc0611eb9565b73ffffffffffffffffffffffffffffffffffffffff16610fde611483565b73ffffffffffffffffffffffffffffffffffffffff1614611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b906139af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6060600061110283610ef9565b9050600081141561118557600067ffffffffffffffff81111561114e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561117c5781602001602082028036833780820191505090505b5091505061126c565b60008167ffffffffffffffff8111156111c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156111f55781602001602082028036833780820191505090505b50905060005b828110156112655761120d8582610c59565b828281518110611246577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061125d90613e1b565b9150506111fb565b8193505050505b919050565b611279611eb9565b73ffffffffffffffffffffffffffffffffffffffff16611297611483565b73ffffffffffffffffffffffffffffffffffffffff16146112ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e4906139af565b60405180910390fd5b600047905060006064600b54836113049190613c74565b61130e9190613c43565b905060006064600c54846113229190613c74565b61132c9190613c43565b90506000818361133c9190613bed565b846113479190613cce565b90507316efe37c0c557d4b1d8eb76d11e13616d2b52eaf73ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f193505050501580156113a3573d6000803e3d6000fd5b50732a408eb3538e54fe60e6bb591826b16575537faf73ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f193505050501580156113fe573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611445573d6000803e3d6000fd5b506000471461147d577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600780546114bc90613db8565b80601f01602080910402602001604051908101604052809291908181526020018280546114e890613db8565b80156115355780601f1061150a57610100808354040283529160200191611535565b820191906000526020600020905b81548152906001019060200180831161151857829003601f168201915b5050505050905090565b611547611eb9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac906138af565b60405180910390fd5b80600560006115c2611eb9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661166f611eb9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b491906137d2565b60405180910390a35050565b600c5481565b61270f81565b6116dd6116d7611eb9565b83611f8f565b61171c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171390613a8f565b60405180910390fd5b61172884848484612318565b50505050565b60011515600a60149054906101000a900460ff16151514611784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177b90613a2f565b60405180910390fd5b61270f61178f610b3c565b106117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c690613a6f565b60405180910390fd5b6000811180156117e0575060148111155b61181f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181690613aaf565b60405180910390fd5b61270f61183c8261182e610b3c565b61237490919063ffffffff16565b111561187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906139cf565b60405180910390fd5b346118988261188a611d70565b61238a90919063ffffffff16565b146118d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118cf906138cf565b60405180910390fd5b60005b8181101561190d5760006118ed610b3c565b90506118f933826123a0565b50808061190590613e1b565b9150506118db565b5050565b606061191c82611e9c565b61195b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195290613a0f565b60405180910390fd5b600060086000848152602001908152602001600020805461197b90613db8565b80601f01602080910402602001604051908101604052809291908181526020018280546119a790613db8565b80156119f45780601f106119c9576101008083540402835291602001916119f4565b820191906000526020600020905b8154815290600101906020018083116119d757829003601f168201915b505050505090506000611a05610e67565b9050600081511415611a1b578192505050611a7f565b600082511115611a50578082604051602001611a38929190613725565b60405160208183030381529060405292505050611a7f565b80611a5a856123be565b604051602001611a6b929190613725565b604051602081830303815290604052925050505b919050565b732a408eb3538e54fe60e6bb591826b16575537faf81565b600b5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d8054611b4390613db8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b6f90613db8565b8015611bbc5780601f10611b9157610100808354040283529160200191611bbc565b820191906000526020600020905b815481529060010190602001808311611b9f57829003601f168201915b505050505081565b611bcc611eb9565b73ffffffffffffffffffffffffffffffffffffffff16611bea611483565b73ffffffffffffffffffffffffffffffffffffffff1614611c40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c37906139af565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca79061384f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060011515600a60149054906101000a900460ff16151514611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf90613a2f565b60405180910390fd5b61270f611dd3610b3c565b10611e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0a90613a6f565b60405180910390fd5b668e1bc9bf040000905090565b6000611e32836000018360001b61256b565b905092915050565b6000611e66846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b6125db565b90509392505050565b600080823b905060008111915050919050565b6000611e94836000018360001b6126ed565b905092915050565b6000611eb2826002611e8290919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f3483610e30565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f8882600001612710565b9050919050565b6000611f9a82611e9c565b611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd0906138ef565b60405180910390fd5b6000611fe483610e30565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061205357508373ffffffffffffffffffffffffffffffffffffffff1661203b84610909565b73ffffffffffffffffffffffffffffffffffffffff16145b8061206457506120638185611aa2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661208d82610e30565b73ffffffffffffffffffffffffffffffffffffffff16146120e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120da906139ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612153576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214a9061388f565b60405180910390fd5b61215e838383612721565b612169600082611ec1565b6121ba81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061272690919063ffffffff16565b5061220c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611e2090919063ffffffff16565b5061222381836002611e3a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006122938360000183612740565b60001c905092915050565b6000806000806122b186600001866127da565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906122e0929190612e8f565b5050565b60006122f7846000018460001b8461288a565b60001c90509392505050565b600061231182600001612951565b9050919050565b61232384848461206d565b61232f84848484612962565b61236e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123659061382f565b60405180910390fd5b50505050565b600081836123829190613bed565b905092915050565b600081836123989190613c74565b905092915050565b6123ba828260405180602001604052806000815250612af9565b5050565b60606000821415612406576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612566565b600082905060005b6000821461243857808061242190613e1b565b915050600a826124319190613c43565b915061240e565b60008167ffffffffffffffff81111561247a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124ac5781602001600182028036833780820191505090505b5090505b6000851461255f576001826124c59190613cce565b9150600a856124d49190613e64565b60306124e09190613bed565b60f81b81838151811061251c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125589190613c43565b94506124b0565b8093505050505b919050565b60006125778383612b54565b6125d05782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506125d5565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415612682578460000160405180604001604052808681526020018581525090806001815401808255809150506001900390600052602060002090600202016000909190919091506000820151816000015560208201518160010155505084600001805490508560010160008681526020019081526020016000208190555060019150506126e6565b82856000016001836126949190613cce565b815481106126cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000612738836000018360001b612b77565b905092915050565b60008183600001805490501161278b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127829061380f565b60405180910390fd5b8260000182815481106127c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011612826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281d9061394f565b60405180910390fd5b6000846000018481548110612864577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b600080846001016000858152602001908152602001600020549050600081141583906128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e391906137ed565b60405180910390fd5b50846000016001826128fe9190613cce565b81548110612935577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b60006129838473ffffffffffffffffffffffffffffffffffffffff16611e6f565b15612aec578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129ac611eb9565b8786866040518563ffffffff1660e01b81526004016129ce9493929190613764565b602060405180830381600087803b1580156129e857600080fd5b505af1925050508015612a1957506040513d601f19601f82011682018060405250810190612a16919061323b565b60015b612a9c573d8060008114612a49576040519150601f19603f3d011682016040523d82523d6000602084013e612a4e565b606091505b50600081511415612a94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8b9061382f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612af1565b600190505b949350505050565b612b038383612d01565b612b106000848484612962565b612b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b469061382f565b60405180910390fd5b505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114612cf5576000600182612ba99190613cce565b9050600060018660000180549050612bc19190613cce565b90506000866000018281548110612c01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110612c4b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183612c669190613bed565b8760010160008381526020019081526020016000208190555086600001805480612cb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050612cfb565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d689061396f565b60405180910390fd5b612d7a81611e9c565b15612dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612db19061386f565b60405180910390fd5b612dc660008383612721565b612e1781600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611e2090919063ffffffff16565b50612e2e81836002611e3a9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612e9b90613db8565b90600052602060002090601f016020900481019282612ebd5760008555612f04565b82601f10612ed657805160ff1916838001178555612f04565b82800160010185558215612f04579182015b82811115612f03578251825591602001919060010190612ee8565b5b509050612f119190612f15565b5090565b5b80821115612f2e576000816000905550600101612f16565b5090565b6000612f45612f4084613b0f565b613aea565b905082815260208101848484011115612f5d57600080fd5b612f68848285613d76565b509392505050565b6000612f83612f7e84613b40565b613aea565b905082815260208101848484011115612f9b57600080fd5b612fa6848285613d76565b509392505050565b600081359050612fbd816144fc565b92915050565b600081359050612fd281614513565b92915050565b600081359050612fe78161452a565b92915050565b600081519050612ffc8161452a565b92915050565b600082601f83011261301357600080fd5b8135613023848260208601612f32565b91505092915050565b600082601f83011261303d57600080fd5b813561304d848260208601612f70565b91505092915050565b60008135905061306581614541565b92915050565b60006020828403121561307d57600080fd5b600061308b84828501612fae565b91505092915050565b600080604083850312156130a757600080fd5b60006130b585828601612fae565b92505060206130c685828601612fae565b9150509250929050565b6000806000606084860312156130e557600080fd5b60006130f386828701612fae565b935050602061310486828701612fae565b925050604061311586828701613056565b9150509250925092565b6000806000806080858703121561313557600080fd5b600061314387828801612fae565b945050602061315487828801612fae565b935050604061316587828801613056565b925050606085013567ffffffffffffffff81111561318257600080fd5b61318e87828801613002565b91505092959194509250565b600080604083850312156131ad57600080fd5b60006131bb85828601612fae565b92505060206131cc85828601612fc3565b9150509250929050565b600080604083850312156131e957600080fd5b60006131f785828601612fae565b925050602061320885828601613056565b9150509250929050565b60006020828403121561322457600080fd5b600061323284828501612fd8565b91505092915050565b60006020828403121561324d57600080fd5b600061325b84828501612fed565b91505092915050565b60006020828403121561327657600080fd5b600082013567ffffffffffffffff81111561329057600080fd5b61329c8482850161302c565b91505092915050565b6000602082840312156132b757600080fd5b60006132c584828501613056565b91505092915050565b60006132da8383613707565b60208301905092915050565b6132ef81613d02565b82525050565b600061330082613b81565b61330a8185613baf565b935061331583613b71565b8060005b8381101561334657815161332d88826132ce565b975061333883613ba2565b925050600181019050613319565b5085935050505092915050565b61335c81613d14565b82525050565b600061336d82613b8c565b6133778185613bc0565b9350613387818560208601613d85565b61339081613f51565b840191505092915050565b60006133a682613b97565b6133b08185613bd1565b93506133c0818560208601613d85565b6133c981613f51565b840191505092915050565b60006133df82613b97565b6133e98185613be2565b93506133f9818560208601613d85565b80840191505092915050565b6000613412602283613bd1565b915061341d82613f62565b604082019050919050565b6000613435603283613bd1565b915061344082613fb1565b604082019050919050565b6000613458602683613bd1565b915061346382614000565b604082019050919050565b600061347b601c83613bd1565b91506134868261404f565b602082019050919050565b600061349e602483613bd1565b91506134a982614078565b604082019050919050565b60006134c1601983613bd1565b91506134cc826140c7565b602082019050919050565b60006134e4601f83613bd1565b91506134ef826140f0565b602082019050919050565b6000613507602c83613bd1565b915061351282614119565b604082019050919050565b600061352a603883613bd1565b915061353582614168565b604082019050919050565b600061354d602a83613bd1565b9150613558826141b7565b604082019050919050565b6000613570602283613bd1565b915061357b82614206565b604082019050919050565b6000613593602083613bd1565b915061359e82614255565b602082019050919050565b60006135b6602c83613bd1565b91506135c18261427e565b604082019050919050565b60006135d9602083613bd1565b91506135e4826142cd565b602082019050919050565b60006135fc601683613bd1565b9150613607826142f6565b602082019050919050565b600061361f602983613bd1565b915061362a8261431f565b604082019050919050565b6000613642602f83613bd1565b915061364d8261436e565b604082019050919050565b6000613665601783613bd1565b9150613670826143bd565b602082019050919050565b6000613688602183613bd1565b9150613693826143e6565b604082019050919050565b60006136ab601683613bd1565b91506136b682614435565b602082019050919050565b60006136ce603183613bd1565b91506136d98261445e565b604082019050919050565b60006136f1602e83613bd1565b91506136fc826144ad565b604082019050919050565b61371081613d6c565b82525050565b61371f81613d6c565b82525050565b600061373182856133d4565b915061373d82846133d4565b91508190509392505050565b600060208201905061375e60008301846132e6565b92915050565b600060808201905061377960008301876132e6565b61378660208301866132e6565b6137936040830185613716565b81810360608301526137a58184613362565b905095945050505050565b600060208201905081810360008301526137ca81846132f5565b905092915050565b60006020820190506137e76000830184613353565b92915050565b60006020820190508181036000830152613807818461339b565b905092915050565b6000602082019050818103600083015261382881613405565b9050919050565b6000602082019050818103600083015261384881613428565b9050919050565b600060208201905081810360008301526138688161344b565b9050919050565b600060208201905081810360008301526138888161346e565b9050919050565b600060208201905081810360008301526138a881613491565b9050919050565b600060208201905081810360008301526138c8816134b4565b9050919050565b600060208201905081810360008301526138e8816134d7565b9050919050565b60006020820190508181036000830152613908816134fa565b9050919050565b600060208201905081810360008301526139288161351d565b9050919050565b6000602082019050818103600083015261394881613540565b9050919050565b6000602082019050818103600083015261396881613563565b9050919050565b6000602082019050818103600083015261398881613586565b9050919050565b600060208201905081810360008301526139a8816135a9565b9050919050565b600060208201905081810360008301526139c8816135cc565b9050919050565b600060208201905081810360008301526139e8816135ef565b9050919050565b60006020820190508181036000830152613a0881613612565b9050919050565b60006020820190508181036000830152613a2881613635565b9050919050565b60006020820190508181036000830152613a4881613658565b9050919050565b60006020820190508181036000830152613a688161367b565b9050919050565b60006020820190508181036000830152613a888161369e565b9050919050565b60006020820190508181036000830152613aa8816136c1565b9050919050565b60006020820190508181036000830152613ac8816136e4565b9050919050565b6000602082019050613ae46000830184613716565b92915050565b6000613af4613b05565b9050613b008282613dea565b919050565b6000604051905090565b600067ffffffffffffffff821115613b2a57613b29613f22565b5b613b3382613f51565b9050602081019050919050565b600067ffffffffffffffff821115613b5b57613b5a613f22565b5b613b6482613f51565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bf882613d6c565b9150613c0383613d6c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c3857613c37613e95565b5b828201905092915050565b6000613c4e82613d6c565b9150613c5983613d6c565b925082613c6957613c68613ec4565b5b828204905092915050565b6000613c7f82613d6c565b9150613c8a83613d6c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613cc357613cc2613e95565b5b828202905092915050565b6000613cd982613d6c565b9150613ce483613d6c565b925082821015613cf757613cf6613e95565b5b828203905092915050565b6000613d0d82613d4c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613da3578082015181840152602081019050613d88565b83811115613db2576000848401525b50505050565b60006002820490506001821680613dd057607f821691505b60208210811415613de457613de3613ef3565b5b50919050565b613df382613f51565b810181811067ffffffffffffffff82111715613e1257613e11613f22565b5b80604052505050565b6000613e2682613d6c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e5957613e58613e95565b5b600182019050919050565b6000613e6f82613d6c565b9150613e7a83613d6c565b925082613e8a57613e89613ec4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473204d41585f4352595054494e49455300000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206861736e2774207374617274656420796574000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f596f752063616e2061646f7074206d696e696d756d20312c206d6178696d756d60008201527f203230204372797074696e696573000000000000000000000000000000000000602082015250565b61450581613d02565b811461451057600080fd5b50565b61451c81613d14565b811461452757600080fd5b50565b61453381613d20565b811461453e57600080fd5b50565b61454a81613d6c565b811461455557600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220895d625bb4d4035873b049c9a2a4931a5283574c7d78517757011a35ef028e4364736f6c63430008040033

Deployed Bytecode Sourcemap

65944:3535:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31683:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43371:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46157:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45687:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68458:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45165:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66072:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47047:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68787:79;;;;;;;;;;;;;:::i;:::-;;44927:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68697:78;;;;;;;;;;;;;:::i;:::-;;47423:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66113:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45453:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68586:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43127:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44746:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42832:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58230:148;;;;;;;;;;;;;:::i;:::-;;67900:540;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68958:518;;;:::i;:::-;;57579:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43540:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46450:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66333:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66023:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47645:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67198:682;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43715:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66206:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66297:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46816:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66500:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58533:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66940:247;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31683:150;31768:4;31792:20;:33;31813:11;31792:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31785:40;;31683:150;;;:::o;43371:100::-;43425:13;43458:5;43451:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43371:100;:::o;46157:221::-;46233:7;46261:16;46269:7;46261;:16::i;:::-;46253:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46346:15;:24;46362:7;46346:24;;;;;;;;;;;;;;;;;;;;;46339:31;;46157:221;;;:::o;45687:404::-;45768:13;45784:23;45799:7;45784:14;:23::i;:::-;45768:39;;45832:5;45826:11;;:2;:11;;;;45818:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45912:5;45896:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;45921:44;45945:5;45952:12;:10;:12::i;:::-;45921:23;:44::i;:::-;45896:69;45888:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;46062:21;46071:2;46075:7;46062:8;:21::i;:::-;45687:404;;;:::o;68458:116::-;57810:12;:10;:12::i;:::-;57799:23;;:7;:5;:7::i;:::-;:23;;;57791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68561:5:::1;68534:24;:32;;;;;;;;;;;;:::i;:::-;;68458:116:::0;:::o;45165:211::-;45226:7;45347:21;:12;:19;:21::i;:::-;45340:28;;45165:211;:::o;66072:34::-;;;;;;;;;;;;;:::o;47047:305::-;47208:41;47227:12;:10;:12::i;:::-;47241:7;47208:18;:41::i;:::-;47200:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47316:28;47326:4;47332:2;47336:7;47316:9;:28::i;:::-;47047:305;;;:::o;68787:79::-;57810:12;:10;:12::i;:::-;57799:23;;:7;:5;:7::i;:::-;:23;;;57791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68853:5:::1;68836:14;;:22;;;;;;;;;;;;;;;;;;68787:79::o:0;44927:162::-;45024:7;45051:30;45075:5;45051:13;:20;45065:5;45051:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;45044:37;;44927:162;;;;:::o;68697:78::-;57810:12;:10;:12::i;:::-;57799:23;;:7;:5;:7::i;:::-;:23;;;57791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68763:4:::1;68746:14;;:21;;;;;;;;;;;;;;;;;;68697:78::o:0;47423:151::-;47527:39;47544:4;47550:2;47554:7;47527:39;;;;;;;;;;;;:16;:39::i;:::-;47423:151;;;:::o;66113:86::-;66157:42;66113:86;:::o;45453:172::-;45528:7;45549:15;45570:22;45586:5;45570:12;:15;;:22;;;;:::i;:::-;45548:44;;;45610:7;45603:14;;;45453:172;;;:::o;68586:99::-;57810:12;:10;:12::i;:::-;57799:23;;:7;:5;:7::i;:::-;:23;;;57791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68657:20:::1;68669:7;68657:11;:20::i;:::-;68586:99:::0;:::o;43127:177::-;43199:7;43226:70;43243:7;43226:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43219:77;;43127:177;;;:::o;44746:97::-;44794:13;44827:8;44820:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44746:97;:::o;42832:221::-;42904:7;42949:1;42932:19;;:5;:19;;;;42924:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;43016:29;:13;:20;43030:5;43016:20;;;;;;;;;;;;;;;:27;:29::i;:::-;43009:36;;42832:221;;;:::o;58230:148::-;57810:12;:10;:12::i;:::-;57799:23;;:7;:5;:7::i;:::-;:23;;;57791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58337:1:::1;58300:40;;58321:6;;;;;;;;;;;58300:40;;;;;;;;;;;;58368:1;58351:6;;:19;;;;;;;;;;;;;;;;;;58230:148::o:0;67900:540::-;67961:16;67991:18;68012:17;68022:6;68012:9;:17::i;:::-;67991:38;;68058:1;68044:10;:15;68040:393;;;68135:1;68121:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68114:23;;;;;68040:393;68170:23;68210:10;68196:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68170:51;;68236:13;68264:130;68288:10;68280:5;:18;68264:130;;;68344:34;68364:6;68372:5;68344:19;:34::i;:::-;68328:6;68335:5;68328:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;68300:7;;;;;:::i;:::-;;;;68264:130;;;68415:6;68408:13;;;;;67900:540;;;;:::o;68958:518::-;57810:12;:10;:12::i;:::-;57799:23;;:7;:5;:7::i;:::-;:23;;;57791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;69027:15:::1;69045:21;69027:39;;69079:16;66394:3;69109:13;;69099:7;:23;;;;:::i;:::-;69098:37;;;;:::i;:::-;69079:56;;69146:14;66394:3;69174:11;;69164:7;:21;;;;:::i;:::-;69163:35;;;;:::i;:::-;69146:52;;69209:12;69249:9;69235:11;:23;;;;:::i;:::-;69224:7;:35;;;;:::i;:::-;69209:50;;66157:42;69272:35;;:48;69308:11;69272:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66248:42;69331:33;;:44;69365:9;69331:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;69394:10;69386:28;;:37;69415:7;69386:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;69466:1;69441:21;:26;69434:34;;;;;;;;;;;;57870:1;;;;68958:518::o:0;57579:87::-;57625:7;57652:6;;;;;;;;;;;57645:13;;57579:87;:::o;43540:104::-;43596:13;43629:7;43622:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43540:104;:::o;46450:295::-;46565:12;:10;:12::i;:::-;46553:24;;:8;:24;;;;46545:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46665:8;46620:18;:32;46639:12;:10;:12::i;:::-;46620:32;;;;;;;;;;;;;;;:42;46653:8;46620:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46718:8;46689:48;;46704:12;:10;:12::i;:::-;46689:48;;;46728:8;46689:48;;;;;;:::i;:::-;;;;;;;;46450:295;;:::o;66333:28::-;;;;:::o;66023:42::-;66061:4;66023:42;:::o;47645:285::-;47777:41;47796:12;:10;:12::i;:::-;47810:7;47777:18;:41::i;:::-;47769:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47883:39;47897:4;47903:2;47907:7;47916:5;47883:13;:39::i;:::-;47645:285;;;;:::o;67198:682::-;67296:4;67278:22;;:14;;;;;;;;;;;:22;;;67270:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66061:4;67347:13;:11;:13::i;:::-;:30;67339:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67439:1;67423:13;:17;:40;;;;;67461:2;67444:13;:19;;67423:40;67415:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;66061:4;67533:32;67551:13;67533;:11;:13::i;:::-;:17;;:32;;;;:::i;:::-;:50;;67525:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;67665:9;67629:32;67647:13;67629;:11;:13::i;:::-;:17;;:32;;;;:::i;:::-;:45;67621:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;67734:6;67729:144;67750:13;67746:1;:17;67729:144;;;67784:14;67801:13;:11;:13::i;:::-;67784:30;;67829:32;67839:10;67851:9;67829;:32::i;:::-;67729:144;67765:3;;;;;:::i;:::-;;;;67729:144;;;;67198:682;:::o;43715:792::-;43788:13;43822:16;43830:7;43822;:16::i;:::-;43814:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43903:23;43929:10;:19;43940:7;43929:19;;;;;;;;;;;43903:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43959:18;43980:9;:7;:9::i;:::-;43959:30;;44087:1;44071:4;44065:18;:23;44061:72;;;44112:9;44105:16;;;;;;44061:72;44263:1;44243:9;44237:23;:27;44233:108;;;44312:4;44318:9;44295:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44281:48;;;;;;44233:108;44473:4;44479:18;:7;:16;:18::i;:::-;44456:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44442:57;;;;43715:792;;;;:::o;66206:84::-;66248:42;66206:84;:::o;66297:29::-;;;;:::o;46816:164::-;46913:4;46937:18;:25;46956:5;46937:25;;;;;;;;;;;;;;;:35;46963:8;46937:35;;;;;;;;;;;;;;;;;;;;;;;;;46930:42;;46816:164;;;;:::o;66500:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58533:244::-;57810:12;:10;:12::i;:::-;57799:23;;:7;:5;:7::i;:::-;:23;;;57791:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58642:1:::1;58622:22;;:8;:22;;;;58614:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58732:8;58703:38;;58724:6;;;;;;;;;;;58703:38;;;;;;;;;;;;58761:8;58752:6;;:17;;;;;;;;;;;;;;;;;;58533:244:::0;:::o;66940:247::-;66984:7;67030:4;67012:22;;:14;;;;;;;;;;;:22;;;67004:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;66061:4;67081:13;:11;:13::i;:::-;:30;67073:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;67160:17;67153:24;;66940:247;:::o;20494:131::-;20561:4;20585:32;20590:3;:10;;20610:5;20602:14;;20585:4;:32::i;:::-;20578:39;;20494:131;;;;:::o;9324:185::-;9413:4;9437:64;9442:3;:10;;9462:3;9454:12;;9492:5;9476:23;;9468:32;;9437:4;:64::i;:::-;9430:71;;9324:185;;;;;:::o;22666:422::-;22726:4;22934:12;23045:7;23033:20;23025:28;;23079:1;23072:4;:8;23065:15;;;22666:422;;;:::o;9901:151::-;9985:4;10009:35;10019:3;:10;;10039:3;10031:12;;10009:9;:35::i;:::-;10002:42;;9901:151;;;;:::o;49397:127::-;49462:4;49486:30;49508:7;49486:12;:21;;:30;;;;:::i;:::-;49479:37;;49397:127;;;:::o;40614:98::-;40667:7;40694:10;40687:17;;40614:98;:::o;55543:183::-;55636:2;55609:15;:24;55625:7;55609:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55692:7;55688:2;55654:46;;55663:23;55678:7;55663:14;:23::i;:::-;55654:46;;;;;;;;;;;;55543:183;;:::o;10140:123::-;10209:7;10236:19;10244:3;:10;;10236:7;:19::i;:::-;10229:26;;10140:123;;;:::o;49691:355::-;49784:4;49809:16;49817:7;49809;:16::i;:::-;49801:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49885:13;49901:23;49916:7;49901:14;:23::i;:::-;49885:39;;49954:5;49943:16;;:7;:16;;;:51;;;;49987:7;49963:31;;:20;49975:7;49963:11;:20::i;:::-;:31;;;49943:51;:94;;;;49998:39;50022:5;50029:7;49998:23;:39::i;:::-;49943:94;49935:103;;;49691:355;;;;:::o;52827:599::-;52952:4;52925:31;;:23;52940:7;52925:14;:23::i;:::-;:31;;;52917:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;53053:1;53039:16;;:2;:16;;;;53031:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53109:39;53130:4;53136:2;53140:7;53109:20;:39::i;:::-;53213:29;53230:1;53234:7;53213:8;:29::i;:::-;53255:35;53282:7;53255:13;:19;53269:4;53255:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;53301:30;53323:7;53301:13;:17;53315:2;53301:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;53344:29;53361:7;53370:2;53344:12;:16;;:29;;;;;:::i;:::-;;53410:7;53406:2;53391:27;;53400:4;53391:27;;;;;;;;;;;;52827:599;;;:::o;21714:137::-;21785:7;21820:22;21824:3;:10;;21836:5;21820:3;:22::i;:::-;21812:31;;21805:38;;21714:137;;;;:::o;10602:236::-;10682:7;10691;10712:11;10725:13;10742:22;10746:3;:10;;10758:5;10742:3;:22::i;:::-;10711:53;;;;10791:3;10783:12;;10821:5;10813:14;;10775:55;;;;;;10602:236;;;;;:::o;54027:100::-;54111:8;54100;:19;;;;;;;;;;;;:::i;:::-;;54027:100;:::o;11888:213::-;11995:7;12046:44;12051:3;:10;;12071:3;12063:12;;12077;12046:4;:44::i;:::-;12038:53;;12015:78;;11888:213;;;;;:::o;21256:114::-;21316:7;21343:19;21351:3;:10;;21343:7;:19::i;:::-;21336:26;;21256:114;;;:::o;48812:272::-;48926:28;48936:4;48942:2;48946:7;48926:9;:28::i;:::-;48973:48;48996:4;49002:2;49006:7;49015:5;48973:22;:48::i;:::-;48965:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;48812:272;;;;:::o;61619:98::-;61677:7;61708:1;61704;:5;;;;:::i;:::-;61697:12;;61619:98;;;;:::o;62357:::-;62415:7;62446:1;62442;:5;;;;:::i;:::-;62435:12;;62357:98;;;;:::o;50389:110::-;50465:26;50475:2;50479:7;50465:26;;;;;;;;;;;;:9;:26::i;:::-;50389:110;;:::o;284:723::-;340:13;570:1;561:5;:10;557:53;;;588:10;;;;;;;;;;;;;;;;;;;;;557:53;620:12;635:5;620:20;;651:14;676:78;691:1;683:4;:9;676:78;;709:8;;;;;:::i;:::-;;;;740:2;732:10;;;;;:::i;:::-;;;676:78;;;764:19;796:6;786:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;764:39;;814:154;830:1;821:5;:10;814:154;;858:1;848:11;;;;;:::i;:::-;;;925:2;917:5;:10;;;;:::i;:::-;904:2;:24;;;;:::i;:::-;891:39;;874:6;881;874:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;954:2;945:11;;;;;:::i;:::-;;;814:154;;;992:6;978:21;;;;;284:723;;;;:::o;13864:414::-;13927:4;13949:21;13959:3;13964:5;13949:9;:21::i;:::-;13944:327;;13987:3;:11;;14004:5;13987:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14170:3;:11;;:18;;;;14148:3;:12;;:19;14161:5;14148:19;;;;;;;;;;;:40;;;;14210:4;14203:11;;;;13944:327;14254:5;14247:12;;13864:414;;;;;:::o;3999:692::-;4075:4;4191:16;4210:3;:12;;:17;4223:3;4210:17;;;;;;;;;;;;4191:36;;4256:1;4244:8;:13;4240:444;;;4311:3;:12;;4329:38;;;;;;;;4346:3;4329:38;;;;4359:5;4329:38;;;4311:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4526:3;:12;;:19;;;;4506:3;:12;;:17;4519:3;4506:17;;;;;;;;;;;:39;;;;4567:4;4560:11;;;;;4240:444;4640:5;4604:3;:12;;4628:1;4617:8;:12;;;;:::i;:::-;4604:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:41;;;;4667:5;4660:12;;;3999:692;;;;;;:::o;6499:125::-;6570:4;6615:1;6594:3;:12;;:17;6607:3;6594:17;;;;;;;;;;;;:22;;6587:29;;6499:125;;;;:::o;6719:110::-;6775:7;6802:3;:12;;:19;;;;6795:26;;6719:110;;;:::o;56339:93::-;;;;:::o;20801:137::-;20871:4;20895:35;20903:3;:10;;20923:5;20915:14;;20895:7;:35::i;:::-;20888:42;;20801:137;;;;:::o;16752:204::-;16819:7;16868:5;16847:3;:11;;:18;;;;:26;16839:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16930:3;:11;;16942:5;16930:18;;;;;;;;;;;;;;;;;;;;;;;;16923:25;;16752:204;;;;:::o;7184:279::-;7251:7;7260;7310:5;7288:3;:12;;:19;;;;:27;7280:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7367:22;7392:3;:12;;7405:5;7392:19;;;;;;;;;;;;;;;;;;;;;;;;;;7367:44;;7430:5;:10;;;7442:5;:12;;;7422:33;;;;;7184:279;;;;;:::o;8681:319::-;8775:7;8795:16;8814:3;:12;;:17;8827:3;8814:17;;;;;;;;;;;;8795:36;;8862:1;8850:8;:13;;8865:12;8842:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8932:3;:12;;8956:1;8945:8;:12;;;;:::i;:::-;8932:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;8925:40;;;8681:319;;;;;:::o;16299:109::-;16355:7;16382:3;:11;;:18;;;;16375:25;;16299:109;;;:::o;54692:843::-;54813:4;54839:15;:2;:13;;;:15::i;:::-;54835:693;;;54891:2;54875:36;;;54912:12;:10;:12::i;:::-;54926:4;54932:7;54941:5;54875:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54871:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55138:1;55121:6;:13;:18;55117:341;;;55164:60;;;;;;;;;;:::i;:::-;;;;;;;;55117:341;55408:6;55402:13;55393:6;55389:2;55385:15;55378:38;54871:602;55008:45;;;54998:55;;;:6;:55;;;;54991:62;;;;;54835:693;55512:4;55505:11;;54692:843;;;;;;;:::o;50726:250::-;50822:18;50828:2;50832:7;50822:5;:18::i;:::-;50859:54;50890:1;50894:2;50898:7;50907:5;50859:22;:54::i;:::-;50851:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50726:250;;;:::o;16084:129::-;16157:4;16204:1;16181:3;:12;;:19;16194:5;16181:19;;;;;;;;;;;;:24;;16174:31;;16084:129;;;;:::o;14454:1544::-;14520:4;14638:18;14659:3;:12;;:19;14672:5;14659:19;;;;;;;;;;;;14638:40;;14709:1;14695:10;:15;14691:1300;;15057:21;15094:1;15081:10;:14;;;;:::i;:::-;15057:38;;15110:17;15151:1;15130:3;:11;;:18;;;;:22;;;;:::i;:::-;15110:42;;15397:17;15417:3;:11;;15429:9;15417:22;;;;;;;;;;;;;;;;;;;;;;;;15397:42;;15563:9;15534:3;:11;;15546:13;15534:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15682:1;15666:13;:17;;;;:::i;:::-;15640:3;:12;;:23;15653:9;15640:23;;;;;;;;;;;:43;;;;15792:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15887:3;:12;;:19;15900:5;15887:19;;;;;;;;;;;15880:26;;;15930:4;15923:11;;;;;;;;14691:1300;15974:5;15967:12;;;14454:1544;;;;;:::o;51312:404::-;51406:1;51392:16;;:2;:16;;;;51384:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51465:16;51473:7;51465;:16::i;:::-;51464:17;51456:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51527:45;51556:1;51560:2;51564:7;51527:20;:45::i;:::-;51585:30;51607:7;51585:13;:17;51599:2;51585:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;51628:29;51645:7;51654:2;51628:12;:16;;:29;;;;;:::i;:::-;;51700:7;51696:2;51675:33;;51692:1;51675:33;;;;;;;;;;;;51312:404;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343: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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:179::-;6155:10;6176:46;6218:3;6210:6;6176:46;:::i;:::-;6254:4;6249:3;6245:14;6231:28;;6166:99;;;;:::o;6271:118::-;6358:24;6376:5;6358:24;:::i;:::-;6353:3;6346:37;6336:53;;:::o;6425:732::-;6544:3;6573:54;6621:5;6573:54;:::i;:::-;6643:86;6722:6;6717:3;6643:86;:::i;:::-;6636:93;;6753:56;6803:5;6753:56;:::i;:::-;6832:7;6863:1;6848:284;6873:6;6870:1;6867:13;6848:284;;;6949:6;6943:13;6976:63;7035:3;7020:13;6976:63;:::i;:::-;6969:70;;7062:60;7115:6;7062:60;:::i;:::-;7052:70;;6908:224;6895:1;6892;6888:9;6883:14;;6848:284;;;6852:14;7148:3;7141:10;;6549:608;;;;;;;:::o;7163:109::-;7244:21;7259:5;7244:21;:::i;:::-;7239:3;7232:34;7222:50;;:::o;7278:360::-;7364:3;7392:38;7424:5;7392:38;:::i;:::-;7446:70;7509:6;7504:3;7446:70;:::i;:::-;7439:77;;7525:52;7570:6;7565:3;7558:4;7551:5;7547:16;7525:52;:::i;:::-;7602:29;7624:6;7602:29;:::i;:::-;7597:3;7593:39;7586:46;;7368:270;;;;;:::o;7644:364::-;7732:3;7760:39;7793:5;7760:39;:::i;:::-;7815:71;7879:6;7874:3;7815:71;:::i;:::-;7808:78;;7895:52;7940:6;7935:3;7928:4;7921:5;7917:16;7895:52;:::i;:::-;7972:29;7994:6;7972:29;:::i;:::-;7967:3;7963:39;7956:46;;7736:272;;;;;:::o;8014:377::-;8120:3;8148:39;8181:5;8148:39;:::i;:::-;8203:89;8285:6;8280:3;8203:89;:::i;:::-;8196:96;;8301:52;8346:6;8341:3;8334:4;8327:5;8323:16;8301:52;:::i;:::-;8378:6;8373:3;8369:16;8362:23;;8124:267;;;;;:::o;8397:366::-;8539:3;8560:67;8624:2;8619:3;8560:67;:::i;:::-;8553:74;;8636:93;8725:3;8636:93;:::i;:::-;8754:2;8749:3;8745:12;8738:19;;8543:220;;;:::o;8769:366::-;8911:3;8932:67;8996:2;8991:3;8932:67;:::i;:::-;8925:74;;9008:93;9097:3;9008:93;:::i;:::-;9126:2;9121:3;9117:12;9110:19;;8915:220;;;:::o;9141:366::-;9283:3;9304:67;9368:2;9363:3;9304:67;:::i;:::-;9297:74;;9380:93;9469:3;9380:93;:::i;:::-;9498:2;9493:3;9489:12;9482:19;;9287:220;;;:::o;9513:366::-;9655:3;9676:67;9740:2;9735:3;9676:67;:::i;:::-;9669:74;;9752:93;9841:3;9752:93;:::i;:::-;9870:2;9865:3;9861:12;9854:19;;9659:220;;;:::o;9885:366::-;10027:3;10048:67;10112:2;10107:3;10048:67;:::i;:::-;10041:74;;10124:93;10213:3;10124:93;:::i;:::-;10242:2;10237:3;10233:12;10226:19;;10031:220;;;:::o;10257:366::-;10399:3;10420:67;10484:2;10479:3;10420:67;:::i;:::-;10413:74;;10496:93;10585:3;10496:93;:::i;:::-;10614:2;10609:3;10605:12;10598:19;;10403:220;;;:::o;10629:366::-;10771:3;10792:67;10856:2;10851:3;10792:67;:::i;:::-;10785:74;;10868:93;10957:3;10868:93;:::i;:::-;10986:2;10981:3;10977:12;10970:19;;10775:220;;;:::o;11001:366::-;11143:3;11164:67;11228:2;11223:3;11164:67;:::i;:::-;11157:74;;11240:93;11329:3;11240:93;:::i;:::-;11358:2;11353:3;11349:12;11342:19;;11147:220;;;:::o;11373:366::-;11515:3;11536:67;11600:2;11595:3;11536:67;:::i;:::-;11529:74;;11612:93;11701:3;11612:93;:::i;:::-;11730:2;11725:3;11721:12;11714:19;;11519:220;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11891:220;;;:::o;12117:366::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12263:220;;;:::o;12489:366::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12635:220;;;:::o;12861:366::-;13003:3;13024:67;13088:2;13083:3;13024:67;:::i;:::-;13017:74;;13100:93;13189:3;13100:93;:::i;:::-;13218:2;13213:3;13209:12;13202:19;;13007:220;;;:::o;13233:366::-;13375:3;13396:67;13460:2;13455:3;13396:67;:::i;:::-;13389:74;;13472:93;13561:3;13472:93;:::i;:::-;13590:2;13585:3;13581:12;13574:19;;13379:220;;;:::o;13605:366::-;13747:3;13768:67;13832:2;13827:3;13768:67;:::i;:::-;13761:74;;13844:93;13933:3;13844:93;:::i;:::-;13962:2;13957:3;13953:12;13946:19;;13751:220;;;:::o;13977:366::-;14119:3;14140:67;14204:2;14199:3;14140:67;:::i;:::-;14133:74;;14216:93;14305:3;14216:93;:::i;:::-;14334:2;14329:3;14325:12;14318:19;;14123:220;;;:::o;14349:366::-;14491:3;14512:67;14576:2;14571:3;14512:67;:::i;:::-;14505:74;;14588:93;14677:3;14588:93;:::i;:::-;14706:2;14701:3;14697:12;14690:19;;14495:220;;;:::o;14721:366::-;14863:3;14884:67;14948:2;14943:3;14884:67;:::i;:::-;14877:74;;14960:93;15049:3;14960:93;:::i;:::-;15078:2;15073:3;15069:12;15062:19;;14867:220;;;:::o;15093:366::-;15235:3;15256:67;15320:2;15315:3;15256:67;:::i;:::-;15249:74;;15332:93;15421:3;15332:93;:::i;:::-;15450:2;15445:3;15441:12;15434:19;;15239:220;;;:::o;15465:366::-;15607:3;15628:67;15692:2;15687:3;15628:67;:::i;:::-;15621:74;;15704:93;15793:3;15704:93;:::i;:::-;15822:2;15817:3;15813:12;15806:19;;15611:220;;;:::o;15837:366::-;15979:3;16000:67;16064:2;16059:3;16000:67;:::i;:::-;15993:74;;16076:93;16165:3;16076:93;:::i;:::-;16194:2;16189:3;16185:12;16178:19;;15983:220;;;:::o;16209:366::-;16351:3;16372:67;16436:2;16431:3;16372:67;:::i;:::-;16365:74;;16448:93;16537:3;16448:93;:::i;:::-;16566:2;16561:3;16557:12;16550:19;;16355:220;;;:::o;16581:108::-;16658:24;16676:5;16658:24;:::i;:::-;16653:3;16646:37;16636:53;;:::o;16695:118::-;16782:24;16800:5;16782:24;:::i;:::-;16777:3;16770:37;16760:53;;:::o;16819:435::-;16999:3;17021:95;17112:3;17103:6;17021:95;:::i;:::-;17014:102;;17133:95;17224:3;17215:6;17133:95;:::i;:::-;17126:102;;17245:3;17238:10;;17003:251;;;;;:::o;17260:222::-;17353:4;17391:2;17380:9;17376:18;17368:26;;17404:71;17472:1;17461:9;17457:17;17448:6;17404:71;:::i;:::-;17358:124;;;;:::o;17488:640::-;17683:4;17721:3;17710:9;17706:19;17698:27;;17735:71;17803:1;17792:9;17788:17;17779:6;17735:71;:::i;:::-;17816:72;17884:2;17873:9;17869:18;17860:6;17816:72;:::i;:::-;17898;17966:2;17955:9;17951:18;17942:6;17898:72;:::i;:::-;18017:9;18011:4;18007:20;18002:2;17991:9;17987:18;17980:48;18045:76;18116:4;18107:6;18045:76;:::i;:::-;18037:84;;17688:440;;;;;;;:::o;18134:373::-;18277:4;18315:2;18304:9;18300:18;18292:26;;18364:9;18358:4;18354:20;18350:1;18339:9;18335:17;18328:47;18392:108;18495:4;18486:6;18392:108;:::i;:::-;18384:116;;18282:225;;;;:::o;18513:210::-;18600:4;18638:2;18627:9;18623:18;18615:26;;18651:65;18713:1;18702:9;18698:17;18689:6;18651:65;:::i;:::-;18605:118;;;;:::o;18729:313::-;18842:4;18880:2;18869:9;18865:18;18857:26;;18929:9;18923:4;18919:20;18915:1;18904:9;18900:17;18893:47;18957:78;19030:4;19021:6;18957:78;:::i;:::-;18949:86;;18847:195;;;;:::o;19048:419::-;19214:4;19252:2;19241:9;19237:18;19229:26;;19301:9;19295:4;19291:20;19287:1;19276:9;19272:17;19265:47;19329:131;19455:4;19329:131;:::i;:::-;19321:139;;19219:248;;;:::o;19473:419::-;19639:4;19677:2;19666:9;19662:18;19654:26;;19726:9;19720:4;19716:20;19712:1;19701:9;19697:17;19690:47;19754:131;19880:4;19754:131;:::i;:::-;19746:139;;19644:248;;;:::o;19898:419::-;20064:4;20102:2;20091:9;20087:18;20079:26;;20151:9;20145:4;20141:20;20137:1;20126:9;20122:17;20115:47;20179:131;20305:4;20179:131;:::i;:::-;20171:139;;20069:248;;;:::o;20323:419::-;20489:4;20527:2;20516:9;20512:18;20504:26;;20576:9;20570:4;20566:20;20562:1;20551:9;20547:17;20540:47;20604:131;20730:4;20604:131;:::i;:::-;20596:139;;20494:248;;;:::o;20748:419::-;20914:4;20952:2;20941:9;20937:18;20929:26;;21001:9;20995:4;20991:20;20987:1;20976:9;20972:17;20965:47;21029:131;21155:4;21029:131;:::i;:::-;21021:139;;20919:248;;;:::o;21173:419::-;21339:4;21377:2;21366:9;21362:18;21354:26;;21426:9;21420:4;21416:20;21412:1;21401:9;21397:17;21390:47;21454:131;21580:4;21454:131;:::i;:::-;21446:139;;21344:248;;;:::o;21598:419::-;21764:4;21802:2;21791:9;21787:18;21779:26;;21851:9;21845:4;21841:20;21837:1;21826:9;21822:17;21815:47;21879:131;22005:4;21879:131;:::i;:::-;21871:139;;21769:248;;;:::o;22023:419::-;22189:4;22227:2;22216:9;22212:18;22204:26;;22276:9;22270:4;22266:20;22262:1;22251:9;22247:17;22240:47;22304:131;22430:4;22304:131;:::i;:::-;22296:139;;22194:248;;;:::o;22448:419::-;22614:4;22652:2;22641:9;22637:18;22629:26;;22701:9;22695:4;22691:20;22687:1;22676:9;22672:17;22665:47;22729:131;22855:4;22729:131;:::i;:::-;22721:139;;22619:248;;;:::o;22873:419::-;23039:4;23077:2;23066:9;23062:18;23054:26;;23126:9;23120:4;23116:20;23112:1;23101:9;23097:17;23090:47;23154:131;23280:4;23154:131;:::i;:::-;23146:139;;23044:248;;;:::o;23298:419::-;23464:4;23502:2;23491:9;23487:18;23479:26;;23551:9;23545:4;23541:20;23537:1;23526:9;23522:17;23515:47;23579:131;23705:4;23579:131;:::i;:::-;23571:139;;23469:248;;;:::o;23723:419::-;23889:4;23927:2;23916:9;23912:18;23904:26;;23976:9;23970:4;23966:20;23962:1;23951:9;23947:17;23940:47;24004:131;24130:4;24004:131;:::i;:::-;23996:139;;23894:248;;;:::o;24148:419::-;24314:4;24352:2;24341:9;24337:18;24329:26;;24401:9;24395:4;24391:20;24387:1;24376:9;24372:17;24365:47;24429:131;24555:4;24429:131;:::i;:::-;24421:139;;24319:248;;;:::o;24573:419::-;24739:4;24777:2;24766:9;24762:18;24754:26;;24826:9;24820:4;24816:20;24812:1;24801:9;24797:17;24790:47;24854:131;24980:4;24854:131;:::i;:::-;24846:139;;24744:248;;;:::o;24998:419::-;25164:4;25202:2;25191:9;25187:18;25179:26;;25251:9;25245:4;25241:20;25237:1;25226:9;25222:17;25215:47;25279:131;25405:4;25279:131;:::i;:::-;25271:139;;25169:248;;;:::o;25423:419::-;25589:4;25627:2;25616:9;25612:18;25604:26;;25676:9;25670:4;25666:20;25662:1;25651:9;25647:17;25640:47;25704:131;25830:4;25704:131;:::i;:::-;25696:139;;25594:248;;;:::o;25848:419::-;26014:4;26052:2;26041:9;26037:18;26029:26;;26101:9;26095:4;26091:20;26087:1;26076:9;26072:17;26065:47;26129:131;26255:4;26129:131;:::i;:::-;26121:139;;26019:248;;;:::o;26273:419::-;26439:4;26477:2;26466:9;26462:18;26454:26;;26526:9;26520:4;26516:20;26512:1;26501:9;26497:17;26490:47;26554:131;26680:4;26554:131;:::i;:::-;26546:139;;26444:248;;;:::o;26698:419::-;26864:4;26902:2;26891:9;26887:18;26879:26;;26951:9;26945:4;26941:20;26937:1;26926:9;26922:17;26915:47;26979:131;27105:4;26979:131;:::i;:::-;26971:139;;26869:248;;;:::o;27123:419::-;27289:4;27327:2;27316:9;27312:18;27304:26;;27376:9;27370:4;27366:20;27362:1;27351:9;27347:17;27340:47;27404:131;27530:4;27404:131;:::i;:::-;27396:139;;27294:248;;;:::o;27548:419::-;27714:4;27752:2;27741:9;27737:18;27729:26;;27801:9;27795:4;27791:20;27787:1;27776:9;27772:17;27765:47;27829:131;27955:4;27829:131;:::i;:::-;27821:139;;27719:248;;;:::o;27973:419::-;28139:4;28177:2;28166:9;28162:18;28154:26;;28226:9;28220:4;28216:20;28212:1;28201:9;28197:17;28190:47;28254:131;28380:4;28254:131;:::i;:::-;28246:139;;28144:248;;;:::o;28398:222::-;28491:4;28529:2;28518:9;28514:18;28506:26;;28542:71;28610:1;28599:9;28595:17;28586:6;28542:71;:::i;:::-;28496:124;;;;:::o;28626:129::-;28660:6;28687:20;;:::i;:::-;28677:30;;28716:33;28744:4;28736:6;28716:33;:::i;:::-;28667:88;;;:::o;28761:75::-;28794:6;28827:2;28821:9;28811:19;;28801:35;:::o;28842:307::-;28903:4;28993:18;28985:6;28982:30;28979:2;;;29015:18;;:::i;:::-;28979:2;29053:29;29075:6;29053:29;:::i;:::-;29045:37;;29137:4;29131;29127:15;29119:23;;28908:241;;;:::o;29155:308::-;29217:4;29307:18;29299:6;29296:30;29293:2;;;29329:18;;:::i;:::-;29293:2;29367:29;29389:6;29367:29;:::i;:::-;29359:37;;29451:4;29445;29441:15;29433:23;;29222:241;;;:::o;29469:132::-;29536:4;29559:3;29551:11;;29589:4;29584:3;29580:14;29572:22;;29541:60;;;:::o;29607:114::-;29674:6;29708:5;29702:12;29692:22;;29681:40;;;:::o;29727:98::-;29778:6;29812:5;29806:12;29796:22;;29785:40;;;:::o;29831:99::-;29883:6;29917:5;29911:12;29901:22;;29890:40;;;:::o;29936:113::-;30006:4;30038;30033:3;30029:14;30021:22;;30011:38;;;:::o;30055:184::-;30154:11;30188:6;30183:3;30176:19;30228:4;30223:3;30219:14;30204:29;;30166:73;;;;:::o;30245:168::-;30328:11;30362:6;30357:3;30350:19;30402:4;30397:3;30393:14;30378:29;;30340:73;;;;:::o;30419:169::-;30503:11;30537:6;30532:3;30525:19;30577:4;30572:3;30568:14;30553:29;;30515:73;;;;:::o;30594:148::-;30696:11;30733:3;30718:18;;30708:34;;;;:::o;30748:305::-;30788:3;30807:20;30825:1;30807:20;:::i;:::-;30802:25;;30841:20;30859:1;30841:20;:::i;:::-;30836:25;;30995:1;30927:66;30923:74;30920:1;30917:81;30914:2;;;31001:18;;:::i;:::-;30914:2;31045:1;31042;31038:9;31031:16;;30792:261;;;;:::o;31059:185::-;31099:1;31116:20;31134:1;31116:20;:::i;:::-;31111:25;;31150:20;31168:1;31150:20;:::i;:::-;31145:25;;31189:1;31179:2;;31194:18;;:::i;:::-;31179:2;31236:1;31233;31229:9;31224:14;;31101:143;;;;:::o;31250:348::-;31290:7;31313:20;31331:1;31313:20;:::i;:::-;31308:25;;31347:20;31365:1;31347:20;:::i;:::-;31342:25;;31535:1;31467:66;31463:74;31460:1;31457:81;31452:1;31445:9;31438:17;31434:105;31431:2;;;31542:18;;:::i;:::-;31431:2;31590:1;31587;31583:9;31572:20;;31298:300;;;;:::o;31604:191::-;31644:4;31664:20;31682:1;31664:20;:::i;:::-;31659:25;;31698:20;31716:1;31698:20;:::i;:::-;31693:25;;31737:1;31734;31731:8;31728:2;;;31742:18;;:::i;:::-;31728:2;31787:1;31784;31780:9;31772:17;;31649:146;;;;:::o;31801:96::-;31838:7;31867:24;31885:5;31867:24;:::i;:::-;31856:35;;31846:51;;;:::o;31903:90::-;31937:7;31980:5;31973:13;31966:21;31955:32;;31945:48;;;:::o;31999:149::-;32035:7;32075:66;32068:5;32064:78;32053:89;;32043:105;;;:::o;32154:126::-;32191:7;32231:42;32224:5;32220:54;32209:65;;32199:81;;;:::o;32286:77::-;32323:7;32352:5;32341:16;;32331:32;;;:::o;32369:154::-;32453:6;32448:3;32443;32430:30;32515:1;32506:6;32501:3;32497:16;32490:27;32420:103;;;:::o;32529:307::-;32597:1;32607:113;32621:6;32618:1;32615:13;32607:113;;;32706:1;32701:3;32697:11;32691:18;32687:1;32682:3;32678:11;32671:39;32643:2;32640:1;32636:10;32631:15;;32607:113;;;32738:6;32735:1;32732:13;32729:2;;;32818:1;32809:6;32804:3;32800:16;32793:27;32729:2;32578:258;;;;:::o;32842:320::-;32886:6;32923:1;32917:4;32913:12;32903:22;;32970:1;32964:4;32960:12;32991:18;32981:2;;33047:4;33039:6;33035:17;33025:27;;32981:2;33109;33101:6;33098:14;33078:18;33075:38;33072:2;;;33128:18;;:::i;:::-;33072:2;32893:269;;;;:::o;33168:281::-;33251:27;33273:4;33251:27;:::i;:::-;33243:6;33239:40;33381:6;33369:10;33366:22;33345:18;33333:10;33330:34;33327:62;33324:2;;;33392:18;;:::i;:::-;33324:2;33432:10;33428:2;33421:22;33211:238;;;:::o;33455:233::-;33494:3;33517:24;33535:5;33517:24;:::i;:::-;33508:33;;33563:66;33556:5;33553:77;33550:2;;;33633:18;;:::i;:::-;33550:2;33680:1;33673:5;33669:13;33662:20;;33498:190;;;:::o;33694:176::-;33726:1;33743:20;33761:1;33743:20;:::i;:::-;33738:25;;33777:20;33795:1;33777:20;:::i;:::-;33772:25;;33816:1;33806:2;;33821:18;;:::i;:::-;33806:2;33862:1;33859;33855:9;33850:14;;33728:142;;;;:::o;33876:180::-;33924:77;33921:1;33914:88;34021:4;34018:1;34011:15;34045:4;34042:1;34035:15;34062:180;34110:77;34107:1;34100:88;34207:4;34204:1;34197:15;34231:4;34228:1;34221:15;34248:180;34296:77;34293:1;34286:88;34393:4;34390:1;34383:15;34417:4;34414:1;34407:15;34434:180;34482:77;34479:1;34472:88;34579:4;34576:1;34569:15;34603:4;34600:1;34593:15;34620:102;34661:6;34712:2;34708:7;34703:2;34696:5;34692:14;34688:28;34678:38;;34668:54;;;:::o;34728:221::-;34868:34;34864:1;34856:6;34852:14;34845:58;34937:4;34932:2;34924:6;34920:15;34913:29;34834:115;:::o;34955:237::-;35095:34;35091:1;35083:6;35079:14;35072:58;35164:20;35159:2;35151:6;35147:15;35140:45;35061:131;:::o;35198:225::-;35338:34;35334:1;35326:6;35322:14;35315:58;35407:8;35402:2;35394:6;35390:15;35383:33;35304:119;:::o;35429:178::-;35569:30;35565:1;35557:6;35553:14;35546:54;35535:72;:::o;35613:223::-;35753:34;35749:1;35741:6;35737:14;35730:58;35822:6;35817:2;35809:6;35805:15;35798:31;35719:117;:::o;35842:175::-;35982:27;35978:1;35970:6;35966:14;35959:51;35948:69;:::o;36023:181::-;36163:33;36159:1;36151:6;36147:14;36140:57;36129:75;:::o;36210:231::-;36350:34;36346:1;36338:6;36334:14;36327:58;36419:14;36414:2;36406:6;36402:15;36395:39;36316:125;:::o;36447:243::-;36587:34;36583:1;36575:6;36571:14;36564:58;36656:26;36651:2;36643:6;36639:15;36632:51;36553:137;:::o;36696:229::-;36836:34;36832:1;36824:6;36820:14;36813:58;36905:12;36900:2;36892:6;36888:15;36881:37;36802:123;:::o;36931:221::-;37071:34;37067:1;37059:6;37055:14;37048:58;37140:4;37135:2;37127:6;37123:15;37116:29;37037:115;:::o;37158:182::-;37298:34;37294:1;37286:6;37282:14;37275:58;37264:76;:::o;37346:231::-;37486:34;37482:1;37474:6;37470:14;37463:58;37555:14;37550:2;37542:6;37538:15;37531:39;37452:125;:::o;37583:182::-;37723:34;37719:1;37711:6;37707:14;37700:58;37689:76;:::o;37771:172::-;37911:24;37907:1;37899:6;37895:14;37888:48;37877:66;:::o;37949:228::-;38089:34;38085:1;38077:6;38073:14;38066:58;38158:11;38153:2;38145:6;38141:15;38134:36;38055:122;:::o;38183:234::-;38323:34;38319:1;38311:6;38307:14;38300:58;38392:17;38387:2;38379:6;38375:15;38368:42;38289:128;:::o;38423:173::-;38563:25;38559:1;38551:6;38547:14;38540:49;38529:67;:::o;38602:220::-;38742:34;38738:1;38730:6;38726:14;38719:58;38811:3;38806:2;38798:6;38794:15;38787:28;38708:114;:::o;38828:172::-;38968:24;38964:1;38956:6;38952:14;38945:48;38934:66;:::o;39006:236::-;39146:34;39142:1;39134:6;39130:14;39123:58;39215:19;39210:2;39202:6;39198:15;39191:44;39112:130;:::o;39248:233::-;39388:34;39384:1;39376:6;39372:14;39365:58;39457:16;39452:2;39444:6;39440:15;39433:41;39354:127;:::o;39487:122::-;39560:24;39578:5;39560:24;:::i;:::-;39553:5;39550:35;39540:2;;39599:1;39596;39589:12;39540:2;39530:79;:::o;39615:116::-;39685:21;39700:5;39685:21;:::i;:::-;39678:5;39675:32;39665:2;;39721:1;39718;39711:12;39665:2;39655:76;:::o;39737:120::-;39809:23;39826:5;39809:23;:::i;:::-;39802:5;39799:34;39789:2;;39847:1;39844;39837:12;39789:2;39779:78;:::o;39863:122::-;39936:24;39954:5;39936:24;:::i;:::-;39929:5;39926:35;39916:2;;39975:1;39972;39965:12;39916:2;39906:79;:::o

Swarm Source

ipfs://895d625bb4d4035873b049c9a2a4931a5283574c7d78517757011a35ef028e43
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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