ETH Price: $3,157.38 (-8.76%)
Gas: 3 Gwei

Token

Omnis (OMNIS)
 

Overview

Max Total Supply

140 OMNIS

Holders

107

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
goatwith3horns.eth
Balance
1 OMNIS
0xdb0df63435a64132ddf7c626011cb3bb370150cb
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:
Omnis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-27
*/

// Omnis - Generative NFT Collection

/**
                                ___                                                 
                               /\  \                                                
      ___         ___          \:\  \         ___                                   
     /\__\       /\__\          \:\  \       /|  |                                  
    /:/  /      /:/__/      _____\:\  \     |:|  |                                  
   /:/__/      /::\  \     /::::::::\__\    |:|  |                                  
  /::\  \      \/\:\  \__  \:\~~\~~\/__/  __|:|__|                                  
 /:/\:\  \        \:\/\__\  \:\  \       /::::\  \                                  
 \/__\:\  \        \::/  /   \:\  \      ~~~~\:\  \                                 
      \:\__\       /:/  /     \:\__\          \:\__\                                
       \/__/       \/__/       \/____          \___/          ___           ___     
     _____                       /\  \         /\__\         /|  |         /\__\    
    /::\  \                     /::\  \       /:/  /        |:|  |        /:/ _/_   
   /:/\:\  \                   /:/\:\  \     /:/  /         |:|  |       /:/ /\  \  
  /:/ /::\__\   ___     ___   /:/  \:\  \   /:/  /  ___   __|:|  |      /:/ /::\  \ 
 /:/_/:/\:|__| /\  \   /\__\ /:/__/ \:\__\ /:/__/  /\__\ /\ |:|__|____ /:/_/:/\:\__\
 \:\/:/ /:/  / \:\  \ /:/  / \:\  \ /:/  / \:\  \ /:/  / \:\/:::::/__/ \:\/:/ /:/  /
  \::/_/:/  /   \:\  /:/  /   \:\  /:/  /   \:\  /:/  /   \::/~~/~      \::/ /:/  / 
   \:\/:/  /     \:\/:/  /     \:\/:/  /     \:\/:/  /     \:\~~\        \/_/:/  /  
    \::/  /       \::/  /       \::/  /       \::/  /       \:\__\         /:/  /   
     \/__/         \/__/         \/__/         \/__/         \/__/         \/__/    
*/    



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

pragma solidity 0.8.7;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: UNLICENSED

contract Omnis is ERC721, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    uint256 public constant MAX_OMNIS = 578;
    uint256 public OMNI_PRICE = 60000000000000000;
    bool public isSaleActive = false;
    bool public isPreSaleActive = true;
    mapping(uint256 => uint256) public creationDates;
    mapping(uint256 => address) public creators; 
    mapping(address => bool) whiteList;
    mapping(address => uint) whiteListMints;
    mapping(uint256 => string) public idToPositionData;
    bool public isPositionUpdateActive = false;

    // these will be set in future
    string public METADATA_PROVENANCE_HASH = "";
    string public GENERATOR_ADDRESS =
        "https://api.tinyblocks.art/omnis/view/";
    string public IPFS_GENERATOR_ADDRESS = "";
    string public SCRIPT = "";

    // e.s added minter address to hash algorithm
    constructor() ERC721("Omnis", "OMNIS") {
        setBaseURI("https://api.tinyblocks.art/omnis/token/");
        _safeMint(msg.sender, 1);
        creationDates[1] = block.number;
        creators[1] = msg.sender;
        idToPositionData[1] = "0,0,0";
    }

    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 getMintPrice() public view returns (uint256) {
        return OMNI_PRICE;
    }
    function getMaxSupply() public pure returns (uint256) {
        return MAX_OMNIS;
    }

    function mint(uint256 numberOfTokens) public payable {
        require(isSaleActive, "Minting is not opened yet...");
        require(totalSupply() < MAX_OMNIS, "Max Omnis have been minted");
         if (isPreSaleActive) {
            require(whiteList[msg.sender], "Address not whitelisted for this presale");
            require(numberOfTokens > 0 && numberOfTokens <= 1, "Only 1 mint per wallet during presale");
            require(whiteListMints[msg.sender] < 1, "Already minted 1 during presale");
            whiteListMints[msg.sender] = 1; 
        }
        require(
            totalSupply().add(numberOfTokens) <= MAX_OMNIS,
            "Exceeds MAX_OMNIS"
        );
        require(
            numberOfTokens > 0 && numberOfTokens <= 5,
            "You can claim minimum 1, maximum 5 per transaction"
        );
        require(
            msg.value >= getMintPrice().mul(numberOfTokens),
            "Ether value sent is below the price"
        );

        for (uint256 i = 0; i < numberOfTokens; i++) {
            uint256 mintIndex = totalSupply() + 1;
            _safeMint(msg.sender, mintIndex);
            creationDates[mintIndex] = block.number;
            creators[mintIndex] = msg.sender;
            idToPositionData[mintIndex] = "0,0,0";
        }
    }
    
    // Set position
    
    function setPositionOfToken( uint256 _tokenId, string memory _position) public {
        require(msg.sender == creators[_tokenId], 'Only the owner of this token can update the position.');
        require(isPositionUpdateActive, 'Updating positions is disabled.');
        idToPositionData[_tokenId] = _position;
    }

    function getPositionOfToken(uint256 _tokenId)  public view returns (string memory) {
        return idToPositionData[_tokenId];
    }

    // Utility Functions
    
    function enablePositionUpdate() public onlyOwner {
        isPositionUpdateActive = true;
    }
    
    function disablePositionUpdate() public onlyOwner {
        isPositionUpdateActive = false;
    }
    
    function setScript(string memory _script) public onlyOwner {
        SCRIPT = _script;
    }

    function setProvenanceHash(string memory _hash) public onlyOwner {
        METADATA_PROVENANCE_HASH = _hash;
    }

    function setGeneratorIPFSHash(string memory _hash) public onlyOwner {
        IPFS_GENERATOR_ADDRESS = _hash;
    }

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

    function startSale() public onlyOwner {
        isSaleActive = true;
    }

    function pauseSale() public onlyOwner {
        isSaleActive = false;
    }
    
    function startPreSale() public onlyOwner {
        isPreSaleActive = true;
    }

    function endPreSale() public onlyOwner {
        isPreSaleActive = false;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

    function tokenHash(uint256 tokenId) public view returns (bytes32) {
        require(_exists(tokenId), "DOES NOT EXIST");
        return
            bytes32(
                keccak256(
                    abi.encodePacked(
                        address(this),
                        creationDates[tokenId],
                        creators[tokenId],
                        tokenId
                    )
                )
            );
    }

    function generatorAddress(uint256 tokenId)
        public
        view
        returns (string memory)
    {
        require(_exists(tokenId), "DOES NOT EXIST");
        return string(abi.encodePacked(GENERATOR_ADDRESS, tokenId.toString()));
    }

    function IPFSgeneratorAddress(uint256 tokenId)
        public
        view
        returns (string memory)
    {
        require(_exists(tokenId), "DOES NOT EXIST");
        return
            string(
                abi.encodePacked(IPFS_GENERATOR_ADDRESS, tokenId.toString())
            );
    }
    function addToWhitelist(address[] calldata entries) onlyOwner external {
        for(uint i = 0; i < entries.length; i++){
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            require(!whiteList[entry], "DUPLICATE_ENTRY");
            whiteList[entry] = true; 
        }
    }
    function removeFromWhitelist(address[] calldata entries) external onlyOwner {
        for(uint256 i = 0; i < entries.length; i++) {
            address entry = entries[i];
            require(entry != address(0), "NULL_ADDRESS");
            delete whiteList[entry];
        }
    }
    function isOnWhitelist(address _address) public view returns (bool) {
        return whiteList[_address];
    }
    function getPresaleMintCount(address _address) public view returns (uint) {
        return whiteListMints[_address];
    }
    function setMintPrice(uint256 _newPrice) public onlyOwner {
        OMNI_PRICE = _newPrice;
    }
}

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":"GENERATOR_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IPFS_GENERATOR_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"IPFSgeneratorAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_OMNIS","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":[],"name":"OMNI_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SCRIPT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","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":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disablePositionUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePositionUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"generatorAddress","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":"getMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getPositionOfToken","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getPresaleMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idToPositionData","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"_address","type":"address"}],"name":"isOnWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPositionUpdateActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","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":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromWhitelist","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":"setGeneratorIPFSHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_position","type":"string"}],"name":"setPositionOfToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_script","type":"string"}],"name":"setScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","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":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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"}]

608060405266d529ae9e860000600b556000600c60006101000a81548160ff0219169083151502179055506001600c60016101000a81548160ff0219169083151502179055506000601260006101000a81548160ff02191690831515021790555060405180602001604052806000815250601390805190602001906200008792919062000c75565b506040518060600160405280602681526020016200723c6026913960149080519060200190620000b992919062000c75565b506040518060200160405280600081525060159080519060200190620000e192919062000c75565b5060405180602001604052806000815250601690805190602001906200010992919062000c75565b503480156200011757600080fd5b506040518060400160405280600581526020017f4f6d6e69730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4f4d4e4953000000000000000000000000000000000000000000000000000000815250620001b57f01ffc9a7000000000000000000000000000000000000000000000000000000006200043c60201b60201c565b8160069080519060200190620001cd92919062000c75565b508060079080519060200190620001e692919062000c75565b50620002187f80ac58cd000000000000000000000000000000000000000000000000000000006200043c60201b60201c565b620002497f5b5e139f000000000000000000000000000000000000000000000000000000006200043c60201b60201c565b6200027a7f780e9d63000000000000000000000000000000000000000000000000000000006200043c60201b60201c565b505060006200028e6200051460201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200035760405180606001604052806027815260200162007262602791396200051c60201b60201c565b6200036a336001620005bf60201b60201c565b43600d6000600181526020019081526020016000208190555033600e60006001815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600581526020017f302c302c30000000000000000000000000000000000000000000000000000000815250601160006001815260200190815260200160002090805190602001906200043592919062000c75565b5062001280565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620004a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049f9062000f0a565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b6200052c6200051460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000552620005e560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005ab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005a29062000f70565b60405180910390fd5b620005bc816200060f60201b60201c565b50565b620005e18282604051806020016040528060008152506200062b60201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600990805190602001906200062792919062000c75565b5050565b6200063d83836200069960201b60201c565b6200065260008484846200084b60201b60201c565b62000694576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200068b9062000ee8565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200070c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007039062000f4e565b60405180910390fd5b6200071d8162000a0560201b60201c565b1562000760576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007579062000f2c565b60405180910390fd5b620007746000838362000a2960201b60201c565b620007cc81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000a2e60201b620032151790919060201c565b50620007ea8183600262000a5060201b6200322f179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008798473ffffffffffffffffffffffffffffffffffffffff1662000a8d60201b620032641760201c565b15620009f8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620008ab6200051460201b60201c565b8786866040518563ffffffff1660e01b8152600401620008cf949392919062000e94565b602060405180830381600087803b158015620008ea57600080fd5b505af19250505080156200091e57506040513d601f19601f820116820180604052508101906200091b919062000d3c565b60015b620009a7573d806000811462000951576040519150601f19603f3d011682016040523d82523d6000602084013e62000956565b606091505b506000815114156200099f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009969062000ee8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620009fd565b600190505b949350505050565b600062000a2282600262000aa060201b620032771790919060201c565b9050919050565b505050565b600062000a48836000018360001b62000ac260201b60201c565b905092915050565b600062000a84846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b62000b3c60201b60201c565b90509392505050565b600080823b905060008111915050919050565b600062000aba836000018360001b62000c2f60201b60201c565b905092915050565b600062000ad6838362000c5260201b60201c565b62000b3157826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000b36565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000be55784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000c28565b828560000160018362000bf9919062000fbf565b8154811062000c0d5762000c0c6200112e565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805462000c83906200109a565b90600052602060002090601f01602090048101928262000ca7576000855562000cf3565b82601f1062000cc257805160ff191683800117855562000cf3565b8280016001018555821562000cf3579182015b8281111562000cf257825182559160200191906001019062000cd5565b5b50905062000d02919062000d06565b5090565b5b8082111562000d2157600081600090555060010162000d07565b5090565b60008151905062000d368162001266565b92915050565b60006020828403121562000d555762000d546200115d565b5b600062000d658482850162000d25565b91505092915050565b62000d798162000ffa565b82525050565b600062000d8c8262000f92565b62000d98818562000f9d565b935062000daa81856020860162001064565b62000db58162001162565b840191505092915050565b600062000dcf60328362000fae565b915062000ddc8262001173565b604082019050919050565b600062000df6601c8362000fae565b915062000e0382620011c2565b602082019050919050565b600062000e1d601c8362000fae565b915062000e2a82620011eb565b602082019050919050565b600062000e4460208362000fae565b915062000e518262001214565b602082019050919050565b600062000e6b60208362000fae565b915062000e78826200123d565b602082019050919050565b62000e8e816200105a565b82525050565b600060808201905062000eab600083018762000d6e565b62000eba602083018662000d6e565b62000ec9604083018562000e83565b818103606083015262000edd818462000d7f565b905095945050505050565b6000602082019050818103600083015262000f038162000dc0565b9050919050565b6000602082019050818103600083015262000f258162000de7565b9050919050565b6000602082019050818103600083015262000f478162000e0e565b9050919050565b6000602082019050818103600083015262000f698162000e35565b9050919050565b6000602082019050818103600083015262000f8b8162000e5c565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000fcc826200105a565b915062000fd9836200105a565b92508282101562000fef5762000fee620010d0565b5b828203905092915050565b600062001007826200103a565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200108457808201518184015260208101905062001067565b8381111562001094576000848401525b50505050565b60006002820490506001821680620010b357607f821691505b60208210811415620010ca57620010c9620010ff565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433136353a20696e76616c696420696e7465726661636520696400000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62001271816200100e565b81146200127d57600080fd5b50565b615fac80620012906000396000f3fe6080604052600436106103765760003560e01c8063753853c1116101d1578063a7f93ebd11610102578063cd53d08e116100a0578063f0c9dc601161006f578063f0c9dc6014610ce6578063f2fde38b14610d11578063f4a0a52814610d3a578063f893887914610d6357610376565b8063cd53d08e14610c2a578063de69fe8814610c67578063e985e9c514610c92578063ee889ed014610ccf57610376565b8063b66a0e5d116100dc578063b66a0e5d14610b70578063b88d4fde14610b87578063c87b56dd14610bb0578063c8a0122614610bed57610376565b8063a7f93ebd14610add578063acf35ebd14610b08578063adc9545714610b3357610376565b8063911d2b1d1161016f5780639d044ed3116101495780639d044ed314610a30578063a0712d6814610a5b578063a22cb46514610a77578063a386439714610aa057610376565b8063911d2b1d146109b157806395d89b41146109c85780639758e904146109f357610376565b80638462151c116101ab5780638462151c14610916578063853828b614610953578063891cc1771461095d5780638da5cb5b1461098657610376565b8063753853c11461089957806378a4ab85146108c45780637f649783146108ed57610376565b80634c0f38c2116102ab578063564566a8116102495780636c0360eb116102235780636c0360eb146107ef57806370a082311461081a578063715018a61461085757806371c1aa931461086e57610376565b8063564566a81461074a5780636352211e1461077557806363d96941146107b257610376565b8063548db17411610285578063548db174146106ca57806355367ba9146106f357806355dd574c1461070a57806355f804b31461072157610376565b80634c0f38c2146106395780634cc8ea76146106645780634f6ccce71461068d57610376565b806318160ddd116103185780632f745c59116102f25780632f745c5914610559578063388024e4146105965780633a3ab672146105d357806342842e0e1461061057610376565b806318160ddd146104da57806323b872dd146105055780632ee2ac361461052e57610376565b8063081812fc11610354578063081812fc14610420578063095ea7b31461045d5780630f42757e1461048657806310969523146104b157610376565b806301ffc9a71461037b578063025ef838146103b857806306fdde03146103f5575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614580565b610d7a565b6040516103af9190614df6565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190614370565b610de1565b6040516103ec919061520e565b60405180910390f35b34801561040157600080fd5b5061040a610e2a565b6040516104179190614e2c565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190614623565b610ebc565b6040516104549190614d6d565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f91906144f3565b610f41565b005b34801561049257600080fd5b5061049b611059565b6040516104a89190614df6565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d391906145da565b61106c565b005b3480156104e657600080fd5b506104ef611102565b6040516104fc919061520e565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906143dd565b611113565b005b34801561053a57600080fd5b50610543611173565b6040516105509190614e2c565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b91906144f3565b611201565b60405161058d919061520e565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190614623565b61125c565b6040516105ca9190614e2c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614370565b611301565b6040516106079190614df6565b60405180910390f35b34801561061c57600080fd5b50610637600480360381019061063291906143dd565b611357565b005b34801561064557600080fd5b5061064e611377565b60405161065b919061520e565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190614650565b611381565b005b34801561069957600080fd5b506106b460048036038101906106af9190614623565b61149d565b6040516106c1919061520e565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190614533565b6114c0565b005b3480156106ff57600080fd5b5061070861164e565b005b34801561071657600080fd5b5061071f6116e7565b005b34801561072d57600080fd5b50610748600480360381019061074391906145da565b611780565b005b34801561075657600080fd5b5061075f611808565b60405161076c9190614df6565b60405180910390f35b34801561078157600080fd5b5061079c60048036038101906107979190614623565b61181b565b6040516107a99190614d6d565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d49190614623565b611852565b6040516107e69190614e2c565b60405180910390f35b3480156107fb57600080fd5b506108046118ce565b6040516108119190614e2c565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190614370565b611960565b60405161084e919061520e565b60405180910390f35b34801561086357600080fd5b5061086c611a1f565b005b34801561087a57600080fd5b50610883611b5c565b604051610890919061520e565b60405180910390f35b3480156108a557600080fd5b506108ae611b62565b6040516108bb9190614e2c565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e691906145da565b611bf0565b005b3480156108f957600080fd5b50610914600480360381019061090f9190614533565b611c86565b005b34801561092257600080fd5b5061093d60048036038101906109389190614370565b611eaa565b60405161094a9190614dd4565b60405180910390f35b61095b611fb4565b005b34801561096957600080fd5b50610984600480360381019061097f91906145da565b612070565b005b34801561099257600080fd5b5061099b612106565b6040516109a89190614d6d565b60405180910390f35b3480156109bd57600080fd5b506109c6612130565b005b3480156109d457600080fd5b506109dd6121c9565b6040516109ea9190614e2c565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614623565b61225b565b604051610a279190614e2c565b60405180910390f35b348015610a3c57600080fd5b50610a456122d7565b604051610a529190614df6565b60405180910390f35b610a756004803603810190610a709190614623565b6122ea565b005b348015610a8357600080fd5b50610a9e6004803603810190610a9991906144b3565b612753565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190614623565b6128d4565b604051610ad49190614e11565b60405180910390f35b348015610ae957600080fd5b50610af2612998565b604051610aff919061520e565b60405180910390f35b348015610b1457600080fd5b50610b1d6129a2565b604051610b2a919061520e565b60405180910390f35b348015610b3f57600080fd5b50610b5a6004803603810190610b559190614623565b6129a8565b604051610b679190614e2c565b60405180910390f35b348015610b7c57600080fd5b50610b85612a48565b005b348015610b9357600080fd5b50610bae6004803603810190610ba99190614430565b612ae1565b005b348015610bbc57600080fd5b50610bd76004803603810190610bd29190614623565b612b43565b604051610be49190614e2c565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f9190614623565b612cb6565b604051610c21919061520e565b60405180910390f35b348015610c3657600080fd5b50610c516004803603810190610c4c9190614623565b612cce565b604051610c5e9190614d6d565b60405180910390f35b348015610c7357600080fd5b50610c7c612d01565b604051610c899190614e2c565b60405180910390f35b348015610c9e57600080fd5b50610cb96004803603810190610cb4919061439d565b612d8f565b604051610cc69190614df6565b60405180910390f35b348015610cdb57600080fd5b50610ce4612e23565b005b348015610cf257600080fd5b50610cfb612ebc565b604051610d089190614e2c565b60405180910390f35b348015610d1d57600080fd5b50610d386004803603810190610d339190614370565b612f4a565b005b348015610d4657600080fd5b50610d616004803603810190610d5c9190614623565b6130f6565b005b348015610d6f57600080fd5b50610d7861317c565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060068054610e3990615516565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6590615516565b8015610eb25780601f10610e8757610100808354040283529160200191610eb2565b820191906000526020600020905b815481529060010190602001808311610e9557829003601f168201915b5050505050905090565b6000610ec782613291565b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd906150ae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f4c8261181b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb49061514e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fdc6132ae565b73ffffffffffffffffffffffffffffffffffffffff16148061100b575061100a816110056132ae565b612d8f565b5b61104a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110419061500e565b60405180910390fd5b61105483836132b6565b505050565b601260009054906101000a900460ff1681565b6110746132ae565b73ffffffffffffffffffffffffffffffffffffffff16611092612106565b73ffffffffffffffffffffffffffffffffffffffff16146110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df906150ce565b60405180910390fd5b80601390805190602001906110fe92919061412e565b5050565b600061110e600261336f565b905090565b61112461111e6132ae565b82613384565b611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a9061518e565b60405180910390fd5b61116e838383613462565b505050565b6014805461118090615516565b80601f01602080910402602001604051908101604052809291908181526020018280546111ac90615516565b80156111f95780601f106111ce576101008083540402835291602001916111f9565b820191906000526020600020905b8154815290600101906020018083116111dc57829003601f168201915b505050505081565b600061125482600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061367990919063ffffffff16565b905092915050565b606060116000838152602001908152602001600020805461127c90615516565b80601f01602080910402602001604051908101604052809291908181526020018280546112a890615516565b80156112f55780601f106112ca576101008083540402835291602001916112f5565b820191906000526020600020905b8154815290600101906020018083116112d857829003601f168201915b50505050509050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61137283838360405180602001604052806000815250612ae1565b505050565b6000610242905090565b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614fee565b60405180910390fd5b601260009054906101000a900460ff16611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906151ee565b60405180910390fd5b8060116000848152602001908152602001600020908051906020019061149892919061412e565b505050565b6000806114b483600261369390919063ffffffff16565b50905080915050919050565b6114c86132ae565b73ffffffffffffffffffffffffffffffffffffffff166114e6612106565b73ffffffffffffffffffffffffffffffffffffffff161461153c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611533906150ce565b60405180910390fd5b60005b8282905081101561164957600083838381811061155f5761155e6156dd565b5b90506020020160208101906115749190614370565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614e6e565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550808061164190615579565b91505061153f565b505050565b6116566132ae565b73ffffffffffffffffffffffffffffffffffffffff16611674612106565b73ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c1906150ce565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b6116ef6132ae565b73ffffffffffffffffffffffffffffffffffffffff1661170d612106565b73ffffffffffffffffffffffffffffffffffffffff1614611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a906150ce565b60405180910390fd5b6001600c60016101000a81548160ff021916908315150217905550565b6117886132ae565b73ffffffffffffffffffffffffffffffffffffffff166117a6612106565b73ffffffffffffffffffffffffffffffffffffffff16146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f3906150ce565b60405180910390fd5b611805816136bf565b50565b600c60009054906101000a900460ff1681565b600061184b82604051806060016040528060298152602001615f4e6029913960026136d99092919063ffffffff16565b9050919050565b606061185d82613291565b61189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906151ae565b60405180910390fd5b60146118a7836136f8565b6040516020016118b8929190614d49565b6040516020818303038152906040529050919050565b6060600980546118dd90615516565b80601f016020809104026020016040519081016040528092919081815260200182805461190990615516565b80156119565780601f1061192b57610100808354040283529160200191611956565b820191906000526020600020905b81548152906001019060200180831161193957829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c89061502e565b60405180910390fd5b611a18600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613859565b9050919050565b611a276132ae565b73ffffffffffffffffffffffffffffffffffffffff16611a45612106565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906150ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61024281565b60158054611b6f90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9b90615516565b8015611be85780601f10611bbd57610100808354040283529160200191611be8565b820191906000526020600020905b815481529060010190602001808311611bcb57829003601f168201915b505050505081565b611bf86132ae565b73ffffffffffffffffffffffffffffffffffffffff16611c16612106565b73ffffffffffffffffffffffffffffffffffffffff1614611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c63906150ce565b60405180910390fd5b8060169080519060200190611c8292919061412e565b5050565b611c8e6132ae565b73ffffffffffffffffffffffffffffffffffffffff16611cac612106565b73ffffffffffffffffffffffffffffffffffffffff1614611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf9906150ce565b60405180910390fd5b60005b82829050811015611ea5576000838383818110611d2557611d246156dd565b5b9050602002016020810190611d3a9190614370565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390614e6e565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090614fce565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611e9d90615579565b915050611d05565b505050565b60606000611eb783611960565b90506000811415611f1457600067ffffffffffffffff811115611edd57611edc61570c565b5b604051908082528060200260200182016040528015611f0b5781602001602082028036833780820191505090505b50915050611faf565b60008167ffffffffffffffff811115611f3057611f2f61570c565b5b604051908082528060200260200182016040528015611f5e5781602001602082028036833780820191505090505b50905060005b82811015611fa857611f768582611201565b828281518110611f8957611f886156dd565b5b6020026020010181815250508080611fa090615579565b915050611f64565b8193505050505b919050565b611fbc6132ae565b73ffffffffffffffffffffffffffffffffffffffff16611fda612106565b73ffffffffffffffffffffffffffffffffffffffff1614612030576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612027906150ce565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061206e57600080fd5b565b6120786132ae565b73ffffffffffffffffffffffffffffffffffffffff16612096612106565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e3906150ce565b60405180910390fd5b806015908051906020019061210292919061412e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6121386132ae565b73ffffffffffffffffffffffffffffffffffffffff16612156612106565b73ffffffffffffffffffffffffffffffffffffffff16146121ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a3906150ce565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b6060600780546121d890615516565b80601f016020809104026020016040519081016040528092919081815260200182805461220490615516565b80156122515780601f1061222657610100808354040283529160200191612251565b820191906000526020600020905b81548152906001019060200180831161223457829003601f168201915b5050505050905090565b606061226682613291565b6122a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229c906151ae565b60405180910390fd5b60156122b0836136f8565b6040516020016122c1929190614d49565b6040516020818303038152906040529050919050565b600c60019054906101000a900460ff1681565b600c60009054906101000a900460ff16612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233090614f0e565b60405180910390fd5b610242612344611102565b10612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b9061516e565b60405180910390fd5b600c60019054906101000a900460ff161561253d57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c90614e8e565b60405180910390fd5b600081118015612436575060018111155b612475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246c90614f8e565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee9061512e565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61024261255a8261254c611102565b61386e90919063ffffffff16565b111561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906151ce565b60405180910390fd5b6000811180156125ac575060058111155b6125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290614f2e565b60405180910390fd5b612605816125f7612998565b61388490919063ffffffff16565b341015612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e9061504e565b60405180910390fd5b60005b8181101561274f576000600161265e611102565b6126689190615341565b9050612674338261389a565b43600d60008381526020019081526020016000208190555033600e600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600581526020017f302c302c3000000000000000000000000000000000000000000000000000000081525060116000838152602001908152602001600020908051906020019061273a92919061412e565b5050808061274790615579565b91505061264a565b5050565b61275b6132ae565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c090614f6e565b60405180910390fd5b80600560006127d66132ae565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166128836132ae565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128c89190614df6565b60405180910390a35050565b60006128df82613291565b61291e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612915906151ae565b60405180910390fd5b30600d600084815260200190815260200160002054600e600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460405160200161297b9493929190614cd7565b604051602081830303815290604052805190602001209050919050565b6000600b54905090565b600b5481565b601160205280600052604060002060009150905080546129c790615516565b80601f01602080910402602001604051908101604052809291908181526020018280546129f390615516565b8015612a405780601f10612a1557610100808354040283529160200191612a40565b820191906000526020600020905b815481529060010190602001808311612a2357829003601f168201915b505050505081565b612a506132ae565b73ffffffffffffffffffffffffffffffffffffffff16612a6e612106565b73ffffffffffffffffffffffffffffffffffffffff1614612ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abb906150ce565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b612af2612aec6132ae565b83613384565b612b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b289061518e565b60405180910390fd5b612b3d848484846138b8565b50505050565b6060612b4e82613291565b612b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b849061510e565b60405180910390fd5b6000600860008481526020019081526020016000208054612bad90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd990615516565b8015612c265780601f10612bfb57610100808354040283529160200191612c26565b820191906000526020600020905b815481529060010190602001808311612c0957829003601f168201915b505050505090506000612c376118ce565b9050600081511415612c4d578192505050612cb1565b600082511115612c82578082604051602001612c6a929190614d25565b60405160208183030381529060405292505050612cb1565b80612c8c856136f8565b604051602001612c9d929190614d25565b604051602081830303815290604052925050505b919050565b600d6020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60168054612d0e90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3a90615516565b8015612d875780601f10612d5c57610100808354040283529160200191612d87565b820191906000526020600020905b815481529060010190602001808311612d6a57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612e2b6132ae565b73ffffffffffffffffffffffffffffffffffffffff16612e49612106565b73ffffffffffffffffffffffffffffffffffffffff1614612e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e96906150ce565b60405180910390fd5b6000600c60016101000a81548160ff021916908315150217905550565b60138054612ec990615516565b80601f0160208091040260200160405190810160405280929190818152602001828054612ef590615516565b8015612f425780601f10612f1757610100808354040283529160200191612f42565b820191906000526020600020905b815481529060010190602001808311612f2557829003601f168201915b505050505081565b612f526132ae565b73ffffffffffffffffffffffffffffffffffffffff16612f70612106565b73ffffffffffffffffffffffffffffffffffffffff1614612fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbd906150ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302d90614ece565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6130fe6132ae565b73ffffffffffffffffffffffffffffffffffffffff1661311c612106565b73ffffffffffffffffffffffffffffffffffffffff1614613172576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613169906150ce565b60405180910390fd5b80600b8190555050565b6131846132ae565b73ffffffffffffffffffffffffffffffffffffffff166131a2612106565b73ffffffffffffffffffffffffffffffffffffffff16146131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef906150ce565b60405180910390fd5b6000601260006101000a81548160ff021916908315150217905550565b6000613227836000018360001b613914565b905092915050565b600061325b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613984565b90509392505050565b600080823b905060008111915050919050565b6000613289836000018360001b613a70565b905092915050565b60006132a782600261327790919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166133298361181b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061337d82600001613a93565b9050919050565b600061338f82613291565b6133ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c590614fae565b60405180910390fd5b60006133d98361181b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061344857508373ffffffffffffffffffffffffffffffffffffffff1661343084610ebc565b73ffffffffffffffffffffffffffffffffffffffff16145b8061345957506134588185612d8f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166134828261181b565b73ffffffffffffffffffffffffffffffffffffffff16146134d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cf906150ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353f90614f4e565b60405180910390fd5b613553838383613aa4565b61355e6000826132b6565b6135af81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613aa990919063ffffffff16565b5061360181600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061321590919063ffffffff16565b506136188183600261322f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006136888360000183613ac3565b60001c905092915050565b6000806000806136a68660000186613b37565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906136d592919061412e565b5050565b60006136ec846000018460001b84613bc1565b60001c90509392505050565b60606000821415613740576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613854565b600082905060005b6000821461377257808061375b90615579565b915050600a8261376b9190615397565b9150613748565b60008167ffffffffffffffff81111561378e5761378d61570c565b5b6040519080825280601f01601f1916602001820160405280156137c05781602001600182028036833780820191505090505b5090505b6000851461384d576001826137d99190615422565b9150600a856137e891906155f0565b60306137f49190615341565b60f81b81838151811061380a576138096156dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138469190615397565b94506137c4565b8093505050505b919050565b600061386782600001613c62565b9050919050565b6000818361387c9190615341565b905092915050565b6000818361389291906153c8565b905092915050565b6138b4828260405180602001604052806000815250613c73565b5050565b6138c3848484613462565b6138cf84848484613cce565b61390e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390590614eae565b60405180910390fd5b50505050565b60006139208383613e65565b61397957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061397e565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613a2b57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613a69565b8285600001600183613a3d9190615422565b81548110613a4e57613a4d6156dd565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000613abb836000018360001b613e88565b905092915050565b600081836000018054905011613b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0590614e4e565b60405180910390fd5b826000018281548110613b2457613b236156dd565b5b9060005260206000200154905092915050565b60008082846000018054905011613b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7a9061506e565b60405180910390fd5b6000846000018481548110613b9b57613b9a6156dd565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1a9190614e2c565b60405180910390fd5b5084600001600182613c359190615422565b81548110613c4657613c456156dd565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613c7d8383613fa0565b613c8a6000848484613cce565b613cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cc090614eae565b60405180910390fd5b505050565b6000613cef8473ffffffffffffffffffffffffffffffffffffffff16613264565b15613e58578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d186132ae565b8786866040518563ffffffff1660e01b8152600401613d3a9493929190614d88565b602060405180830381600087803b158015613d5457600080fd5b505af1925050508015613d8557506040513d601f19601f82011682018060405250810190613d8291906145ad565b60015b613e08573d8060008114613db5576040519150601f19603f3d011682016040523d82523d6000602084013e613dba565b606091505b50600081511415613e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df790614eae565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613e5d565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613f94576000600182613eba9190615422565b9050600060018660000180549050613ed29190615422565b90506000866000018281548110613eec57613eeb6156dd565b5b9060005260206000200154905080876000018481548110613f1057613f0f6156dd565b5b9060005260206000200181905550600183613f2b9190615341565b8760010160008381526020019081526020016000208190555086600001805480613f5857613f576156ae565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613f9a565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140079061508e565b60405180910390fd5b61401981613291565b15614059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161405090614eee565b60405180910390fd5b61406560008383613aa4565b6140b681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061321590919063ffffffff16565b506140cd8183600261322f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461413a90615516565b90600052602060002090601f01602090048101928261415c57600085556141a3565b82601f1061417557805160ff19168380011785556141a3565b828001600101855582156141a3579182015b828111156141a2578251825591602001919060010190614187565b5b5090506141b091906141b4565b5090565b5b808211156141cd5760008160009055506001016141b5565b5090565b60006141e46141df8461524e565b615229565b905082815260208101848484011115614200576141ff61574a565b5b61420b8482856154d4565b509392505050565b60006142266142218461527f565b615229565b9050828152602081018484840111156142425761424161574a565b5b61424d8482856154d4565b509392505050565b60008135905061426481615ef1565b92915050565b60008083601f8401126142805761427f615740565b5b8235905067ffffffffffffffff81111561429d5761429c61573b565b5b6020830191508360208202830111156142b9576142b8615745565b5b9250929050565b6000813590506142cf81615f08565b92915050565b6000813590506142e481615f1f565b92915050565b6000815190506142f981615f1f565b92915050565b600082601f83011261431457614313615740565b5b81356143248482602086016141d1565b91505092915050565b600082601f83011261434257614341615740565b5b8135614352848260208601614213565b91505092915050565b60008135905061436a81615f36565b92915050565b60006020828403121561438657614385615754565b5b600061439484828501614255565b91505092915050565b600080604083850312156143b4576143b3615754565b5b60006143c285828601614255565b92505060206143d385828601614255565b9150509250929050565b6000806000606084860312156143f6576143f5615754565b5b600061440486828701614255565b935050602061441586828701614255565b92505060406144268682870161435b565b9150509250925092565b6000806000806080858703121561444a57614449615754565b5b600061445887828801614255565b945050602061446987828801614255565b935050604061447a8782880161435b565b925050606085013567ffffffffffffffff81111561449b5761449a61574f565b5b6144a7878288016142ff565b91505092959194509250565b600080604083850312156144ca576144c9615754565b5b60006144d885828601614255565b92505060206144e9858286016142c0565b9150509250929050565b6000806040838503121561450a57614509615754565b5b600061451885828601614255565b92505060206145298582860161435b565b9150509250929050565b6000806020838503121561454a57614549615754565b5b600083013567ffffffffffffffff8111156145685761456761574f565b5b6145748582860161426a565b92509250509250929050565b60006020828403121561459657614595615754565b5b60006145a4848285016142d5565b91505092915050565b6000602082840312156145c3576145c2615754565b5b60006145d1848285016142ea565b91505092915050565b6000602082840312156145f0576145ef615754565b5b600082013567ffffffffffffffff81111561460e5761460d61574f565b5b61461a8482850161432d565b91505092915050565b60006020828403121561463957614638615754565b5b60006146478482850161435b565b91505092915050565b6000806040838503121561466757614666615754565b5b60006146758582860161435b565b925050602083013567ffffffffffffffff8111156146965761469561574f565b5b6146a28582860161432d565b9150509250929050565b60006146b88383614ca2565b60208301905092915050565b6146cd81615456565b82525050565b6146e46146df82615456565b6155c2565b82525050565b60006146f5826152d5565b6146ff8185615303565b935061470a836152b0565b8060005b8381101561473b57815161472288826146ac565b975061472d836152f6565b92505060018101905061470e565b5085935050505092915050565b61475181615468565b82525050565b61476081615474565b82525050565b6000614771826152e0565b61477b8185615314565b935061478b8185602086016154e3565b61479481615759565b840191505092915050565b60006147aa826152eb565b6147b48185615325565b93506147c48185602086016154e3565b6147cd81615759565b840191505092915050565b60006147e3826152eb565b6147ed8185615336565b93506147fd8185602086016154e3565b80840191505092915050565b6000815461481681615516565b6148208186615336565b9450600182166000811461483b576001811461484c5761487f565b60ff1983168652818601935061487f565b614855856152c0565b60005b8381101561487757815481890152600182019150602081019050614858565b838801955050505b50505092915050565b6000614895602283615325565b91506148a082615777565b604082019050919050565b60006148b8600c83615325565b91506148c3826157c6565b602082019050919050565b60006148db602883615325565b91506148e6826157ef565b604082019050919050565b60006148fe603283615325565b91506149098261583e565b604082019050919050565b6000614921602683615325565b915061492c8261588d565b604082019050919050565b6000614944601c83615325565b915061494f826158dc565b602082019050919050565b6000614967601c83615325565b915061497282615905565b602082019050919050565b600061498a603283615325565b91506149958261592e565b604082019050919050565b60006149ad602483615325565b91506149b88261597d565b604082019050919050565b60006149d0601983615325565b91506149db826159cc565b602082019050919050565b60006149f3602583615325565b91506149fe826159f5565b604082019050919050565b6000614a16602c83615325565b9150614a2182615a44565b604082019050919050565b6000614a39600f83615325565b9150614a4482615a93565b602082019050919050565b6000614a5c603583615325565b9150614a6782615abc565b604082019050919050565b6000614a7f603883615325565b9150614a8a82615b0b565b604082019050919050565b6000614aa2602a83615325565b9150614aad82615b5a565b604082019050919050565b6000614ac5602383615325565b9150614ad082615ba9565b604082019050919050565b6000614ae8602283615325565b9150614af382615bf8565b604082019050919050565b6000614b0b602083615325565b9150614b1682615c47565b602082019050919050565b6000614b2e602c83615325565b9150614b3982615c70565b604082019050919050565b6000614b51602083615325565b9150614b5c82615cbf565b602082019050919050565b6000614b74602983615325565b9150614b7f82615ce8565b604082019050919050565b6000614b97602f83615325565b9150614ba282615d37565b604082019050919050565b6000614bba601f83615325565b9150614bc582615d86565b602082019050919050565b6000614bdd602183615325565b9150614be882615daf565b604082019050919050565b6000614c00601a83615325565b9150614c0b82615dfe565b602082019050919050565b6000614c23603183615325565b9150614c2e82615e27565b604082019050919050565b6000614c46600e83615325565b9150614c5182615e76565b602082019050919050565b6000614c69601183615325565b9150614c7482615e9f565b602082019050919050565b6000614c8c601f83615325565b9150614c9782615ec8565b602082019050919050565b614cab816154ca565b82525050565b614cba816154ca565b82525050565b614cd1614ccc826154ca565b6155e6565b82525050565b6000614ce382876146d3565b601482019150614cf38286614cc0565b602082019150614d0382856146d3565b601482019150614d138284614cc0565b60208201915081905095945050505050565b6000614d3182856147d8565b9150614d3d82846147d8565b91508190509392505050565b6000614d558285614809565b9150614d6182846147d8565b91508190509392505050565b6000602082019050614d8260008301846146c4565b92915050565b6000608082019050614d9d60008301876146c4565b614daa60208301866146c4565b614db76040830185614cb1565b8181036060830152614dc98184614766565b905095945050505050565b60006020820190508181036000830152614dee81846146ea565b905092915050565b6000602082019050614e0b6000830184614748565b92915050565b6000602082019050614e266000830184614757565b92915050565b60006020820190508181036000830152614e46818461479f565b905092915050565b60006020820190508181036000830152614e6781614888565b9050919050565b60006020820190508181036000830152614e87816148ab565b9050919050565b60006020820190508181036000830152614ea7816148ce565b9050919050565b60006020820190508181036000830152614ec7816148f1565b9050919050565b60006020820190508181036000830152614ee781614914565b9050919050565b60006020820190508181036000830152614f0781614937565b9050919050565b60006020820190508181036000830152614f278161495a565b9050919050565b60006020820190508181036000830152614f478161497d565b9050919050565b60006020820190508181036000830152614f67816149a0565b9050919050565b60006020820190508181036000830152614f87816149c3565b9050919050565b60006020820190508181036000830152614fa7816149e6565b9050919050565b60006020820190508181036000830152614fc781614a09565b9050919050565b60006020820190508181036000830152614fe781614a2c565b9050919050565b6000602082019050818103600083015261500781614a4f565b9050919050565b6000602082019050818103600083015261502781614a72565b9050919050565b6000602082019050818103600083015261504781614a95565b9050919050565b6000602082019050818103600083015261506781614ab8565b9050919050565b6000602082019050818103600083015261508781614adb565b9050919050565b600060208201905081810360008301526150a781614afe565b9050919050565b600060208201905081810360008301526150c781614b21565b9050919050565b600060208201905081810360008301526150e781614b44565b9050919050565b6000602082019050818103600083015261510781614b67565b9050919050565b6000602082019050818103600083015261512781614b8a565b9050919050565b6000602082019050818103600083015261514781614bad565b9050919050565b6000602082019050818103600083015261516781614bd0565b9050919050565b6000602082019050818103600083015261518781614bf3565b9050919050565b600060208201905081810360008301526151a781614c16565b9050919050565b600060208201905081810360008301526151c781614c39565b9050919050565b600060208201905081810360008301526151e781614c5c565b9050919050565b6000602082019050818103600083015261520781614c7f565b9050919050565b60006020820190506152236000830184614cb1565b92915050565b6000615233615244565b905061523f8282615548565b919050565b6000604051905090565b600067ffffffffffffffff8211156152695761526861570c565b5b61527282615759565b9050602081019050919050565b600067ffffffffffffffff82111561529a5761529961570c565b5b6152a382615759565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061534c826154ca565b9150615357836154ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561538c5761538b615621565b5b828201905092915050565b60006153a2826154ca565b91506153ad836154ca565b9250826153bd576153bc615650565b5b828204905092915050565b60006153d3826154ca565b91506153de836154ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541757615416615621565b5b828202905092915050565b600061542d826154ca565b9150615438836154ca565b92508282101561544b5761544a615621565b5b828203905092915050565b6000615461826154aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156155015780820151818401526020810190506154e6565b83811115615510576000848401525b50505050565b6000600282049050600182168061552e57607f821691505b602082108114156155425761554161567f565b5b50919050565b61555182615759565b810181811067ffffffffffffffff821117156155705761556f61570c565b5b80604052505050565b6000615584826154ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155b7576155b6615621565b5b600182019050919050565b60006155cd826155d4565b9050919050565b60006155df8261576a565b9050919050565b6000819050919050565b60006155fb826154ca565b9150615606836154ca565b92508261561657615615615650565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b7f41646472657373206e6f742077686974656c697374656420666f72207468697360008201527f2070726573616c65000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e67206973206e6f74206f70656e6564207965742e2e2e00000000600082015250565b7f596f752063616e20636c61696d206d696e696d756d20312c206d6178696d756d60008201527f203520706572207472616e73616374696f6e0000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f6e6c792031206d696e74207065722077616c6c657420647572696e6720707260008201527f6573616c65000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b7f4f6e6c7920746865206f776e6572206f66207468697320746f6b656e2063616e60008201527f207570646174652074686520706f736974696f6e2e0000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416c7265616479206d696e746564203120647572696e672070726573616c6500600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178204f6d6e69732068617665206265656e206d696e746564000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b7f45786365656473204d41585f4f4d4e4953000000000000000000000000000000600082015250565b7f5570646174696e6720706f736974696f6e732069732064697361626c65642e00600082015250565b615efa81615456565b8114615f0557600080fd5b50565b615f1181615468565b8114615f1c57600080fd5b50565b615f288161547e565b8114615f3357600080fd5b50565b615f3f816154ca565b8114615f4a57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122091ebd06f7410eb72f7229768524fcafdb92e8afc58ff37d96df8ab6da77b37b464736f6c6343000807003368747470733a2f2f6170692e74696e79626c6f636b732e6172742f6f6d6e69732f766965772f68747470733a2f2f6170692e74696e79626c6f636b732e6172742f6f6d6e69732f746f6b656e2f

Deployed Bytecode

0x6080604052600436106103765760003560e01c8063753853c1116101d1578063a7f93ebd11610102578063cd53d08e116100a0578063f0c9dc601161006f578063f0c9dc6014610ce6578063f2fde38b14610d11578063f4a0a52814610d3a578063f893887914610d6357610376565b8063cd53d08e14610c2a578063de69fe8814610c67578063e985e9c514610c92578063ee889ed014610ccf57610376565b8063b66a0e5d116100dc578063b66a0e5d14610b70578063b88d4fde14610b87578063c87b56dd14610bb0578063c8a0122614610bed57610376565b8063a7f93ebd14610add578063acf35ebd14610b08578063adc9545714610b3357610376565b8063911d2b1d1161016f5780639d044ed3116101495780639d044ed314610a30578063a0712d6814610a5b578063a22cb46514610a77578063a386439714610aa057610376565b8063911d2b1d146109b157806395d89b41146109c85780639758e904146109f357610376565b80638462151c116101ab5780638462151c14610916578063853828b614610953578063891cc1771461095d5780638da5cb5b1461098657610376565b8063753853c11461089957806378a4ab85146108c45780637f649783146108ed57610376565b80634c0f38c2116102ab578063564566a8116102495780636c0360eb116102235780636c0360eb146107ef57806370a082311461081a578063715018a61461085757806371c1aa931461086e57610376565b8063564566a81461074a5780636352211e1461077557806363d96941146107b257610376565b8063548db17411610285578063548db174146106ca57806355367ba9146106f357806355dd574c1461070a57806355f804b31461072157610376565b80634c0f38c2146106395780634cc8ea76146106645780634f6ccce71461068d57610376565b806318160ddd116103185780632f745c59116102f25780632f745c5914610559578063388024e4146105965780633a3ab672146105d357806342842e0e1461061057610376565b806318160ddd146104da57806323b872dd146105055780632ee2ac361461052e57610376565b8063081812fc11610354578063081812fc14610420578063095ea7b31461045d5780630f42757e1461048657806310969523146104b157610376565b806301ffc9a71461037b578063025ef838146103b857806306fdde03146103f5575b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614580565b610d7a565b6040516103af9190614df6565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190614370565b610de1565b6040516103ec919061520e565b60405180910390f35b34801561040157600080fd5b5061040a610e2a565b6040516104179190614e2c565b60405180910390f35b34801561042c57600080fd5b5061044760048036038101906104429190614623565b610ebc565b6040516104549190614d6d565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f91906144f3565b610f41565b005b34801561049257600080fd5b5061049b611059565b6040516104a89190614df6565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d391906145da565b61106c565b005b3480156104e657600080fd5b506104ef611102565b6040516104fc919061520e565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906143dd565b611113565b005b34801561053a57600080fd5b50610543611173565b6040516105509190614e2c565b60405180910390f35b34801561056557600080fd5b50610580600480360381019061057b91906144f3565b611201565b60405161058d919061520e565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b89190614623565b61125c565b6040516105ca9190614e2c565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614370565b611301565b6040516106079190614df6565b60405180910390f35b34801561061c57600080fd5b50610637600480360381019061063291906143dd565b611357565b005b34801561064557600080fd5b5061064e611377565b60405161065b919061520e565b60405180910390f35b34801561067057600080fd5b5061068b60048036038101906106869190614650565b611381565b005b34801561069957600080fd5b506106b460048036038101906106af9190614623565b61149d565b6040516106c1919061520e565b60405180910390f35b3480156106d657600080fd5b506106f160048036038101906106ec9190614533565b6114c0565b005b3480156106ff57600080fd5b5061070861164e565b005b34801561071657600080fd5b5061071f6116e7565b005b34801561072d57600080fd5b50610748600480360381019061074391906145da565b611780565b005b34801561075657600080fd5b5061075f611808565b60405161076c9190614df6565b60405180910390f35b34801561078157600080fd5b5061079c60048036038101906107979190614623565b61181b565b6040516107a99190614d6d565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d49190614623565b611852565b6040516107e69190614e2c565b60405180910390f35b3480156107fb57600080fd5b506108046118ce565b6040516108119190614e2c565b60405180910390f35b34801561082657600080fd5b50610841600480360381019061083c9190614370565b611960565b60405161084e919061520e565b60405180910390f35b34801561086357600080fd5b5061086c611a1f565b005b34801561087a57600080fd5b50610883611b5c565b604051610890919061520e565b60405180910390f35b3480156108a557600080fd5b506108ae611b62565b6040516108bb9190614e2c565b60405180910390f35b3480156108d057600080fd5b506108eb60048036038101906108e691906145da565b611bf0565b005b3480156108f957600080fd5b50610914600480360381019061090f9190614533565b611c86565b005b34801561092257600080fd5b5061093d60048036038101906109389190614370565b611eaa565b60405161094a9190614dd4565b60405180910390f35b61095b611fb4565b005b34801561096957600080fd5b50610984600480360381019061097f91906145da565b612070565b005b34801561099257600080fd5b5061099b612106565b6040516109a89190614d6d565b60405180910390f35b3480156109bd57600080fd5b506109c6612130565b005b3480156109d457600080fd5b506109dd6121c9565b6040516109ea9190614e2c565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614623565b61225b565b604051610a279190614e2c565b60405180910390f35b348015610a3c57600080fd5b50610a456122d7565b604051610a529190614df6565b60405180910390f35b610a756004803603810190610a709190614623565b6122ea565b005b348015610a8357600080fd5b50610a9e6004803603810190610a9991906144b3565b612753565b005b348015610aac57600080fd5b50610ac76004803603810190610ac29190614623565b6128d4565b604051610ad49190614e11565b60405180910390f35b348015610ae957600080fd5b50610af2612998565b604051610aff919061520e565b60405180910390f35b348015610b1457600080fd5b50610b1d6129a2565b604051610b2a919061520e565b60405180910390f35b348015610b3f57600080fd5b50610b5a6004803603810190610b559190614623565b6129a8565b604051610b679190614e2c565b60405180910390f35b348015610b7c57600080fd5b50610b85612a48565b005b348015610b9357600080fd5b50610bae6004803603810190610ba99190614430565b612ae1565b005b348015610bbc57600080fd5b50610bd76004803603810190610bd29190614623565b612b43565b604051610be49190614e2c565b60405180910390f35b348015610bf957600080fd5b50610c146004803603810190610c0f9190614623565b612cb6565b604051610c21919061520e565b60405180910390f35b348015610c3657600080fd5b50610c516004803603810190610c4c9190614623565b612cce565b604051610c5e9190614d6d565b60405180910390f35b348015610c7357600080fd5b50610c7c612d01565b604051610c899190614e2c565b60405180910390f35b348015610c9e57600080fd5b50610cb96004803603810190610cb4919061439d565b612d8f565b604051610cc69190614df6565b60405180910390f35b348015610cdb57600080fd5b50610ce4612e23565b005b348015610cf257600080fd5b50610cfb612ebc565b604051610d089190614e2c565b60405180910390f35b348015610d1d57600080fd5b50610d386004803603810190610d339190614370565b612f4a565b005b348015610d4657600080fd5b50610d616004803603810190610d5c9190614623565b6130f6565b005b348015610d6f57600080fd5b50610d7861317c565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b6000601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b606060068054610e3990615516565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6590615516565b8015610eb25780601f10610e8757610100808354040283529160200191610eb2565b820191906000526020600020905b815481529060010190602001808311610e9557829003601f168201915b5050505050905090565b6000610ec782613291565b610f06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efd906150ae565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f4c8261181b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb49061514e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fdc6132ae565b73ffffffffffffffffffffffffffffffffffffffff16148061100b575061100a816110056132ae565b612d8f565b5b61104a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110419061500e565b60405180910390fd5b61105483836132b6565b505050565b601260009054906101000a900460ff1681565b6110746132ae565b73ffffffffffffffffffffffffffffffffffffffff16611092612106565b73ffffffffffffffffffffffffffffffffffffffff16146110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df906150ce565b60405180910390fd5b80601390805190602001906110fe92919061412e565b5050565b600061110e600261336f565b905090565b61112461111e6132ae565b82613384565b611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115a9061518e565b60405180910390fd5b61116e838383613462565b505050565b6014805461118090615516565b80601f01602080910402602001604051908101604052809291908181526020018280546111ac90615516565b80156111f95780601f106111ce576101008083540402835291602001916111f9565b820191906000526020600020905b8154815290600101906020018083116111dc57829003601f168201915b505050505081565b600061125482600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061367990919063ffffffff16565b905092915050565b606060116000838152602001908152602001600020805461127c90615516565b80601f01602080910402602001604051908101604052809291908181526020018280546112a890615516565b80156112f55780601f106112ca576101008083540402835291602001916112f5565b820191906000526020600020905b8154815290600101906020018083116112d857829003601f168201915b50505050509050919050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61137283838360405180602001604052806000815250612ae1565b505050565b6000610242905090565b600e600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614fee565b60405180910390fd5b601260009054906101000a900460ff16611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906151ee565b60405180910390fd5b8060116000848152602001908152602001600020908051906020019061149892919061412e565b505050565b6000806114b483600261369390919063ffffffff16565b50905080915050919050565b6114c86132ae565b73ffffffffffffffffffffffffffffffffffffffff166114e6612106565b73ffffffffffffffffffffffffffffffffffffffff161461153c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611533906150ce565b60405180910390fd5b60005b8282905081101561164957600083838381811061155f5761155e6156dd565b5b90506020020160208101906115749190614370565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115dd90614e6e565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549060ff021916905550808061164190615579565b91505061153f565b505050565b6116566132ae565b73ffffffffffffffffffffffffffffffffffffffff16611674612106565b73ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c1906150ce565b60405180910390fd5b6000600c60006101000a81548160ff021916908315150217905550565b6116ef6132ae565b73ffffffffffffffffffffffffffffffffffffffff1661170d612106565b73ffffffffffffffffffffffffffffffffffffffff1614611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a906150ce565b60405180910390fd5b6001600c60016101000a81548160ff021916908315150217905550565b6117886132ae565b73ffffffffffffffffffffffffffffffffffffffff166117a6612106565b73ffffffffffffffffffffffffffffffffffffffff16146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f3906150ce565b60405180910390fd5b611805816136bf565b50565b600c60009054906101000a900460ff1681565b600061184b82604051806060016040528060298152602001615f4e6029913960026136d99092919063ffffffff16565b9050919050565b606061185d82613291565b61189c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611893906151ae565b60405180910390fd5b60146118a7836136f8565b6040516020016118b8929190614d49565b6040516020818303038152906040529050919050565b6060600980546118dd90615516565b80601f016020809104026020016040519081016040528092919081815260200182805461190990615516565b80156119565780601f1061192b57610100808354040283529160200191611956565b820191906000526020600020905b81548152906001019060200180831161193957829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c89061502e565b60405180910390fd5b611a18600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613859565b9050919050565b611a276132ae565b73ffffffffffffffffffffffffffffffffffffffff16611a45612106565b73ffffffffffffffffffffffffffffffffffffffff1614611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906150ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61024281565b60158054611b6f90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9b90615516565b8015611be85780601f10611bbd57610100808354040283529160200191611be8565b820191906000526020600020905b815481529060010190602001808311611bcb57829003601f168201915b505050505081565b611bf86132ae565b73ffffffffffffffffffffffffffffffffffffffff16611c16612106565b73ffffffffffffffffffffffffffffffffffffffff1614611c6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c63906150ce565b60405180910390fd5b8060169080519060200190611c8292919061412e565b5050565b611c8e6132ae565b73ffffffffffffffffffffffffffffffffffffffff16611cac612106565b73ffffffffffffffffffffffffffffffffffffffff1614611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf9906150ce565b60405180910390fd5b60005b82829050811015611ea5576000838383818110611d2557611d246156dd565b5b9050602002016020810190611d3a9190614370565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da390614e6e565b60405180910390fd5b600f60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611e39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3090614fce565b60405180910390fd5b6001600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550508080611e9d90615579565b915050611d05565b505050565b60606000611eb783611960565b90506000811415611f1457600067ffffffffffffffff811115611edd57611edc61570c565b5b604051908082528060200260200182016040528015611f0b5781602001602082028036833780820191505090505b50915050611faf565b60008167ffffffffffffffff811115611f3057611f2f61570c565b5b604051908082528060200260200182016040528015611f5e5781602001602082028036833780820191505090505b50905060005b82811015611fa857611f768582611201565b828281518110611f8957611f886156dd565b5b6020026020010181815250508080611fa090615579565b915050611f64565b8193505050505b919050565b611fbc6132ae565b73ffffffffffffffffffffffffffffffffffffffff16611fda612106565b73ffffffffffffffffffffffffffffffffffffffff1614612030576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612027906150ce565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061206e57600080fd5b565b6120786132ae565b73ffffffffffffffffffffffffffffffffffffffff16612096612106565b73ffffffffffffffffffffffffffffffffffffffff16146120ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e3906150ce565b60405180910390fd5b806015908051906020019061210292919061412e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6121386132ae565b73ffffffffffffffffffffffffffffffffffffffff16612156612106565b73ffffffffffffffffffffffffffffffffffffffff16146121ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a3906150ce565b60405180910390fd5b6001601260006101000a81548160ff021916908315150217905550565b6060600780546121d890615516565b80601f016020809104026020016040519081016040528092919081815260200182805461220490615516565b80156122515780601f1061222657610100808354040283529160200191612251565b820191906000526020600020905b81548152906001019060200180831161223457829003601f168201915b5050505050905090565b606061226682613291565b6122a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229c906151ae565b60405180910390fd5b60156122b0836136f8565b6040516020016122c1929190614d49565b6040516020818303038152906040529050919050565b600c60019054906101000a900460ff1681565b600c60009054906101000a900460ff16612339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233090614f0e565b60405180910390fd5b610242612344611102565b10612384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237b9061516e565b60405180910390fd5b600c60019054906101000a900460ff161561253d57600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241c90614e8e565b60405180910390fd5b600081118015612436575060018111155b612475576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246c90614f8e565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106124f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ee9061512e565b60405180910390fd5b6001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b61024261255a8261254c611102565b61386e90919063ffffffff16565b111561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906151ce565b60405180910390fd5b6000811180156125ac575060058111155b6125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e290614f2e565b60405180910390fd5b612605816125f7612998565b61388490919063ffffffff16565b341015612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e9061504e565b60405180910390fd5b60005b8181101561274f576000600161265e611102565b6126689190615341565b9050612674338261389a565b43600d60008381526020019081526020016000208190555033600e600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600581526020017f302c302c3000000000000000000000000000000000000000000000000000000081525060116000838152602001908152602001600020908051906020019061273a92919061412e565b5050808061274790615579565b91505061264a565b5050565b61275b6132ae565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c090614f6e565b60405180910390fd5b80600560006127d66132ae565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166128836132ae565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128c89190614df6565b60405180910390a35050565b60006128df82613291565b61291e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612915906151ae565b60405180910390fd5b30600d600084815260200190815260200160002054600e600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460405160200161297b9493929190614cd7565b604051602081830303815290604052805190602001209050919050565b6000600b54905090565b600b5481565b601160205280600052604060002060009150905080546129c790615516565b80601f01602080910402602001604051908101604052809291908181526020018280546129f390615516565b8015612a405780601f10612a1557610100808354040283529160200191612a40565b820191906000526020600020905b815481529060010190602001808311612a2357829003601f168201915b505050505081565b612a506132ae565b73ffffffffffffffffffffffffffffffffffffffff16612a6e612106565b73ffffffffffffffffffffffffffffffffffffffff1614612ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612abb906150ce565b60405180910390fd5b6001600c60006101000a81548160ff021916908315150217905550565b612af2612aec6132ae565b83613384565b612b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b289061518e565b60405180910390fd5b612b3d848484846138b8565b50505050565b6060612b4e82613291565b612b8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b849061510e565b60405180910390fd5b6000600860008481526020019081526020016000208054612bad90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054612bd990615516565b8015612c265780601f10612bfb57610100808354040283529160200191612c26565b820191906000526020600020905b815481529060010190602001808311612c0957829003601f168201915b505050505090506000612c376118ce565b9050600081511415612c4d578192505050612cb1565b600082511115612c82578082604051602001612c6a929190614d25565b60405160208183030381529060405292505050612cb1565b80612c8c856136f8565b604051602001612c9d929190614d25565b604051602081830303815290604052925050505b919050565b600d6020528060005260406000206000915090505481565b600e6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60168054612d0e90615516565b80601f0160208091040260200160405190810160405280929190818152602001828054612d3a90615516565b8015612d875780601f10612d5c57610100808354040283529160200191612d87565b820191906000526020600020905b815481529060010190602001808311612d6a57829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b612e2b6132ae565b73ffffffffffffffffffffffffffffffffffffffff16612e49612106565b73ffffffffffffffffffffffffffffffffffffffff1614612e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e96906150ce565b60405180910390fd5b6000600c60016101000a81548160ff021916908315150217905550565b60138054612ec990615516565b80601f0160208091040260200160405190810160405280929190818152602001828054612ef590615516565b8015612f425780601f10612f1757610100808354040283529160200191612f42565b820191906000526020600020905b815481529060010190602001808311612f2557829003601f168201915b505050505081565b612f526132ae565b73ffffffffffffffffffffffffffffffffffffffff16612f70612106565b73ffffffffffffffffffffffffffffffffffffffff1614612fc6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fbd906150ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302d90614ece565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6130fe6132ae565b73ffffffffffffffffffffffffffffffffffffffff1661311c612106565b73ffffffffffffffffffffffffffffffffffffffff1614613172576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613169906150ce565b60405180910390fd5b80600b8190555050565b6131846132ae565b73ffffffffffffffffffffffffffffffffffffffff166131a2612106565b73ffffffffffffffffffffffffffffffffffffffff16146131f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131ef906150ce565b60405180910390fd5b6000601260006101000a81548160ff021916908315150217905550565b6000613227836000018360001b613914565b905092915050565b600061325b846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613984565b90509392505050565b600080823b905060008111915050919050565b6000613289836000018360001b613a70565b905092915050565b60006132a782600261327790919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166133298361181b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061337d82600001613a93565b9050919050565b600061338f82613291565b6133ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133c590614fae565b60405180910390fd5b60006133d98361181b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061344857508373ffffffffffffffffffffffffffffffffffffffff1661343084610ebc565b73ffffffffffffffffffffffffffffffffffffffff16145b8061345957506134588185612d8f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166134828261181b565b73ffffffffffffffffffffffffffffffffffffffff16146134d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cf906150ee565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353f90614f4e565b60405180910390fd5b613553838383613aa4565b61355e6000826132b6565b6135af81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613aa990919063ffffffff16565b5061360181600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061321590919063ffffffff16565b506136188183600261322f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006136888360000183613ac3565b60001c905092915050565b6000806000806136a68660000186613b37565b915091508160001c8160001c9350935050509250929050565b80600990805190602001906136d592919061412e565b5050565b60006136ec846000018460001b84613bc1565b60001c90509392505050565b60606000821415613740576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613854565b600082905060005b6000821461377257808061375b90615579565b915050600a8261376b9190615397565b9150613748565b60008167ffffffffffffffff81111561378e5761378d61570c565b5b6040519080825280601f01601f1916602001820160405280156137c05781602001600182028036833780820191505090505b5090505b6000851461384d576001826137d99190615422565b9150600a856137e891906155f0565b60306137f49190615341565b60f81b81838151811061380a576138096156dd565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138469190615397565b94506137c4565b8093505050505b919050565b600061386782600001613c62565b9050919050565b6000818361387c9190615341565b905092915050565b6000818361389291906153c8565b905092915050565b6138b4828260405180602001604052806000815250613c73565b5050565b6138c3848484613462565b6138cf84848484613cce565b61390e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161390590614eae565b60405180910390fd5b50505050565b60006139208383613e65565b61397957826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061397e565b600090505b92915050565b6000808460010160008581526020019081526020016000205490506000811415613a2b57846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613a69565b8285600001600183613a3d9190615422565b81548110613a4e57613a4d6156dd565b5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600081600001805490509050919050565b505050565b6000613abb836000018360001b613e88565b905092915050565b600081836000018054905011613b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b0590614e4e565b60405180910390fd5b826000018281548110613b2457613b236156dd565b5b9060005260206000200154905092915050565b60008082846000018054905011613b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b7a9061506e565b60405180910390fd5b6000846000018481548110613b9b57613b9a6156dd565b5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1a9190614e2c565b60405180910390fd5b5084600001600182613c359190615422565b81548110613c4657613c456156dd565b5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613c7d8383613fa0565b613c8a6000848484613cce565b613cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cc090614eae565b60405180910390fd5b505050565b6000613cef8473ffffffffffffffffffffffffffffffffffffffff16613264565b15613e58578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d186132ae565b8786866040518563ffffffff1660e01b8152600401613d3a9493929190614d88565b602060405180830381600087803b158015613d5457600080fd5b505af1925050508015613d8557506040513d601f19601f82011682018060405250810190613d8291906145ad565b60015b613e08573d8060008114613db5576040519150601f19603f3d011682016040523d82523d6000602084013e613dba565b606091505b50600081511415613e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613df790614eae565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613e5d565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114613f94576000600182613eba9190615422565b9050600060018660000180549050613ed29190615422565b90506000866000018281548110613eec57613eeb6156dd565b5b9060005260206000200154905080876000018481548110613f1057613f0f6156dd565b5b9060005260206000200181905550600183613f2b9190615341565b8760010160008381526020019081526020016000208190555086600001805480613f5857613f576156ae565b5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050613f9a565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614010576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140079061508e565b60405180910390fd5b61401981613291565b15614059576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161405090614eee565b60405180910390fd5b61406560008383613aa4565b6140b681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061321590919063ffffffff16565b506140cd8183600261322f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461413a90615516565b90600052602060002090601f01602090048101928261415c57600085556141a3565b82601f1061417557805160ff19168380011785556141a3565b828001600101855582156141a3579182015b828111156141a2578251825591602001919060010190614187565b5b5090506141b091906141b4565b5090565b5b808211156141cd5760008160009055506001016141b5565b5090565b60006141e46141df8461524e565b615229565b905082815260208101848484011115614200576141ff61574a565b5b61420b8482856154d4565b509392505050565b60006142266142218461527f565b615229565b9050828152602081018484840111156142425761424161574a565b5b61424d8482856154d4565b509392505050565b60008135905061426481615ef1565b92915050565b60008083601f8401126142805761427f615740565b5b8235905067ffffffffffffffff81111561429d5761429c61573b565b5b6020830191508360208202830111156142b9576142b8615745565b5b9250929050565b6000813590506142cf81615f08565b92915050565b6000813590506142e481615f1f565b92915050565b6000815190506142f981615f1f565b92915050565b600082601f83011261431457614313615740565b5b81356143248482602086016141d1565b91505092915050565b600082601f83011261434257614341615740565b5b8135614352848260208601614213565b91505092915050565b60008135905061436a81615f36565b92915050565b60006020828403121561438657614385615754565b5b600061439484828501614255565b91505092915050565b600080604083850312156143b4576143b3615754565b5b60006143c285828601614255565b92505060206143d385828601614255565b9150509250929050565b6000806000606084860312156143f6576143f5615754565b5b600061440486828701614255565b935050602061441586828701614255565b92505060406144268682870161435b565b9150509250925092565b6000806000806080858703121561444a57614449615754565b5b600061445887828801614255565b945050602061446987828801614255565b935050604061447a8782880161435b565b925050606085013567ffffffffffffffff81111561449b5761449a61574f565b5b6144a7878288016142ff565b91505092959194509250565b600080604083850312156144ca576144c9615754565b5b60006144d885828601614255565b92505060206144e9858286016142c0565b9150509250929050565b6000806040838503121561450a57614509615754565b5b600061451885828601614255565b92505060206145298582860161435b565b9150509250929050565b6000806020838503121561454a57614549615754565b5b600083013567ffffffffffffffff8111156145685761456761574f565b5b6145748582860161426a565b92509250509250929050565b60006020828403121561459657614595615754565b5b60006145a4848285016142d5565b91505092915050565b6000602082840312156145c3576145c2615754565b5b60006145d1848285016142ea565b91505092915050565b6000602082840312156145f0576145ef615754565b5b600082013567ffffffffffffffff81111561460e5761460d61574f565b5b61461a8482850161432d565b91505092915050565b60006020828403121561463957614638615754565b5b60006146478482850161435b565b91505092915050565b6000806040838503121561466757614666615754565b5b60006146758582860161435b565b925050602083013567ffffffffffffffff8111156146965761469561574f565b5b6146a28582860161432d565b9150509250929050565b60006146b88383614ca2565b60208301905092915050565b6146cd81615456565b82525050565b6146e46146df82615456565b6155c2565b82525050565b60006146f5826152d5565b6146ff8185615303565b935061470a836152b0565b8060005b8381101561473b57815161472288826146ac565b975061472d836152f6565b92505060018101905061470e565b5085935050505092915050565b61475181615468565b82525050565b61476081615474565b82525050565b6000614771826152e0565b61477b8185615314565b935061478b8185602086016154e3565b61479481615759565b840191505092915050565b60006147aa826152eb565b6147b48185615325565b93506147c48185602086016154e3565b6147cd81615759565b840191505092915050565b60006147e3826152eb565b6147ed8185615336565b93506147fd8185602086016154e3565b80840191505092915050565b6000815461481681615516565b6148208186615336565b9450600182166000811461483b576001811461484c5761487f565b60ff1983168652818601935061487f565b614855856152c0565b60005b8381101561487757815481890152600182019150602081019050614858565b838801955050505b50505092915050565b6000614895602283615325565b91506148a082615777565b604082019050919050565b60006148b8600c83615325565b91506148c3826157c6565b602082019050919050565b60006148db602883615325565b91506148e6826157ef565b604082019050919050565b60006148fe603283615325565b91506149098261583e565b604082019050919050565b6000614921602683615325565b915061492c8261588d565b604082019050919050565b6000614944601c83615325565b915061494f826158dc565b602082019050919050565b6000614967601c83615325565b915061497282615905565b602082019050919050565b600061498a603283615325565b91506149958261592e565b604082019050919050565b60006149ad602483615325565b91506149b88261597d565b604082019050919050565b60006149d0601983615325565b91506149db826159cc565b602082019050919050565b60006149f3602583615325565b91506149fe826159f5565b604082019050919050565b6000614a16602c83615325565b9150614a2182615a44565b604082019050919050565b6000614a39600f83615325565b9150614a4482615a93565b602082019050919050565b6000614a5c603583615325565b9150614a6782615abc565b604082019050919050565b6000614a7f603883615325565b9150614a8a82615b0b565b604082019050919050565b6000614aa2602a83615325565b9150614aad82615b5a565b604082019050919050565b6000614ac5602383615325565b9150614ad082615ba9565b604082019050919050565b6000614ae8602283615325565b9150614af382615bf8565b604082019050919050565b6000614b0b602083615325565b9150614b1682615c47565b602082019050919050565b6000614b2e602c83615325565b9150614b3982615c70565b604082019050919050565b6000614b51602083615325565b9150614b5c82615cbf565b602082019050919050565b6000614b74602983615325565b9150614b7f82615ce8565b604082019050919050565b6000614b97602f83615325565b9150614ba282615d37565b604082019050919050565b6000614bba601f83615325565b9150614bc582615d86565b602082019050919050565b6000614bdd602183615325565b9150614be882615daf565b604082019050919050565b6000614c00601a83615325565b9150614c0b82615dfe565b602082019050919050565b6000614c23603183615325565b9150614c2e82615e27565b604082019050919050565b6000614c46600e83615325565b9150614c5182615e76565b602082019050919050565b6000614c69601183615325565b9150614c7482615e9f565b602082019050919050565b6000614c8c601f83615325565b9150614c9782615ec8565b602082019050919050565b614cab816154ca565b82525050565b614cba816154ca565b82525050565b614cd1614ccc826154ca565b6155e6565b82525050565b6000614ce382876146d3565b601482019150614cf38286614cc0565b602082019150614d0382856146d3565b601482019150614d138284614cc0565b60208201915081905095945050505050565b6000614d3182856147d8565b9150614d3d82846147d8565b91508190509392505050565b6000614d558285614809565b9150614d6182846147d8565b91508190509392505050565b6000602082019050614d8260008301846146c4565b92915050565b6000608082019050614d9d60008301876146c4565b614daa60208301866146c4565b614db76040830185614cb1565b8181036060830152614dc98184614766565b905095945050505050565b60006020820190508181036000830152614dee81846146ea565b905092915050565b6000602082019050614e0b6000830184614748565b92915050565b6000602082019050614e266000830184614757565b92915050565b60006020820190508181036000830152614e46818461479f565b905092915050565b60006020820190508181036000830152614e6781614888565b9050919050565b60006020820190508181036000830152614e87816148ab565b9050919050565b60006020820190508181036000830152614ea7816148ce565b9050919050565b60006020820190508181036000830152614ec7816148f1565b9050919050565b60006020820190508181036000830152614ee781614914565b9050919050565b60006020820190508181036000830152614f0781614937565b9050919050565b60006020820190508181036000830152614f278161495a565b9050919050565b60006020820190508181036000830152614f478161497d565b9050919050565b60006020820190508181036000830152614f67816149a0565b9050919050565b60006020820190508181036000830152614f87816149c3565b9050919050565b60006020820190508181036000830152614fa7816149e6565b9050919050565b60006020820190508181036000830152614fc781614a09565b9050919050565b60006020820190508181036000830152614fe781614a2c565b9050919050565b6000602082019050818103600083015261500781614a4f565b9050919050565b6000602082019050818103600083015261502781614a72565b9050919050565b6000602082019050818103600083015261504781614a95565b9050919050565b6000602082019050818103600083015261506781614ab8565b9050919050565b6000602082019050818103600083015261508781614adb565b9050919050565b600060208201905081810360008301526150a781614afe565b9050919050565b600060208201905081810360008301526150c781614b21565b9050919050565b600060208201905081810360008301526150e781614b44565b9050919050565b6000602082019050818103600083015261510781614b67565b9050919050565b6000602082019050818103600083015261512781614b8a565b9050919050565b6000602082019050818103600083015261514781614bad565b9050919050565b6000602082019050818103600083015261516781614bd0565b9050919050565b6000602082019050818103600083015261518781614bf3565b9050919050565b600060208201905081810360008301526151a781614c16565b9050919050565b600060208201905081810360008301526151c781614c39565b9050919050565b600060208201905081810360008301526151e781614c5c565b9050919050565b6000602082019050818103600083015261520781614c7f565b9050919050565b60006020820190506152236000830184614cb1565b92915050565b6000615233615244565b905061523f8282615548565b919050565b6000604051905090565b600067ffffffffffffffff8211156152695761526861570c565b5b61527282615759565b9050602081019050919050565b600067ffffffffffffffff82111561529a5761529961570c565b5b6152a382615759565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061534c826154ca565b9150615357836154ca565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561538c5761538b615621565b5b828201905092915050565b60006153a2826154ca565b91506153ad836154ca565b9250826153bd576153bc615650565b5b828204905092915050565b60006153d3826154ca565b91506153de836154ca565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561541757615416615621565b5b828202905092915050565b600061542d826154ca565b9150615438836154ca565b92508282101561544b5761544a615621565b5b828203905092915050565b6000615461826154aa565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156155015780820151818401526020810190506154e6565b83811115615510576000848401525b50505050565b6000600282049050600182168061552e57607f821691505b602082108114156155425761554161567f565b5b50919050565b61555182615759565b810181811067ffffffffffffffff821117156155705761556f61570c565b5b80604052505050565b6000615584826154ca565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156155b7576155b6615621565b5b600182019050919050565b60006155cd826155d4565b9050919050565b60006155df8261576a565b9050919050565b6000819050919050565b60006155fb826154ca565b9150615606836154ca565b92508261561657615615615650565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e554c4c5f414444524553530000000000000000000000000000000000000000600082015250565b7f41646472657373206e6f742077686974656c697374656420666f72207468697360008201527f2070726573616c65000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4d696e74696e67206973206e6f74206f70656e6564207965742e2e2e00000000600082015250565b7f596f752063616e20636c61696d206d696e696d756d20312c206d6178696d756d60008201527f203520706572207472616e73616374696f6e0000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4f6e6c792031206d696e74207065722077616c6c657420647572696e6720707260008201527f6573616c65000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4455504c49434154455f454e5452590000000000000000000000000000000000600082015250565b7f4f6e6c7920746865206f776e6572206f66207468697320746f6b656e2063616e60008201527f207570646174652074686520706f736974696f6e2e0000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e742069732062656c6f772074686520707260008201527f6963650000000000000000000000000000000000000000000000000000000000602082015250565b7f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f416c7265616479206d696e746564203120647572696e672070726573616c6500600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178204f6d6e69732068617665206265656e206d696e746564000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f444f4553204e4f54204558495354000000000000000000000000000000000000600082015250565b7f45786365656473204d41585f4f4d4e4953000000000000000000000000000000600082015250565b7f5570646174696e6720706f736974696f6e732069732064697361626c65642e00600082015250565b615efa81615456565b8114615f0557600080fd5b50565b615f1181615468565b8114615f1c57600080fd5b50565b615f288161547e565b8114615f3357600080fd5b50565b615f3f816154ca565b8114615f4a57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122091ebd06f7410eb72f7229768524fcafdb92e8afc58ff37d96df8ab6da77b37b464736f6c63430008070033

Deployed Bytecode Sourcemap

71608:6989:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35300:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78365:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47494:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50502:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50001:435;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72142:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75726:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49429:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51561:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72279:83;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49141:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75229:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78246:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52008:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73449:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74899:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49717:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77952:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76166:77;;;;;;;;;;;;;:::i;:::-;;76255:82;;;;;;;;;;;;;:::i;:::-;;75975:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71812:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47138:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77030:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48960:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46768:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63569:148;;;;;;;;;;;;;:::i;:::-;;71714:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72369:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75624:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77606:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72773:572;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76434:123;;;:::i;:::-;;75850:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62918:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75404:97;;;;;;;;;;;;;:::i;:::-;;47663:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77292:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71851:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73546:1314;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50882:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76565:457;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73353:90;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71760:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72085:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76082:76;;;;;;;;;;;;;:::i;:::-;;52264:365;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47838:879;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71892:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71947:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72417:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51280:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76345:81;;;;;;;;;;;;;:::i;:::-;;72229:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63872:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;78495:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75513;;;;;;;;;;;;;:::i;:::-;;35300:200;35430:4;35459:20;:33;35480:11;35459:33;;;;;;;;;;;;;;;;;;;;;;;;;;;35452:40;;35300:200;;;:::o;78365:124::-;78433:4;78457:14;:24;78472:8;78457:24;;;;;;;;;;;;;;;;78450:31;;78365:124;;;:::o;47494:100::-;47548:13;47581:5;47574:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47494:100;:::o;50502:308::-;50623:7;50670:16;50678:7;50670;:16::i;:::-;50648:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;50778:15;:24;50794:7;50778:24;;;;;;;;;;;;;;;;;;;;;50771:31;;50502:308;;;:::o;50001:435::-;50082:13;50098:23;50113:7;50098:14;:23::i;:::-;50082:39;;50146:5;50140:11;;:2;:11;;;;50132:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;50240:5;50224:21;;:12;:10;:12::i;:::-;:21;;;:86;;;;50266:44;50290:5;50297:12;:10;:12::i;:::-;50266:23;:44::i;:::-;50224:86;50202:192;;;;;;;;;;;;:::i;:::-;;;;;;;;;50407:21;50416:2;50420:7;50407:8;:21::i;:::-;50071:365;50001:435;;:::o;72142:42::-;;;;;;;;;;;;;:::o;75726:116::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75829:5:::1;75802:24;:32;;;;;;;;;;;;:::i;:::-;;75726:116:::0;:::o;49429:211::-;49490:7;49611:21;:12;:19;:21::i;:::-;49604:28;;49429:211;:::o;51561:376::-;51770:41;51789:12;:10;:12::i;:::-;51803:7;51770:18;:41::i;:::-;51748:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;51901:28;51911:4;51917:2;51921:7;51901:9;:28::i;:::-;51561:376;;;:::o;72279:83::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49141:212::-;49283:7;49315:30;49339:5;49315:13;:20;49329:5;49315:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;49308:37;;49141:212;;;;:::o;75229:135::-;75297:13;75330:16;:26;75347:8;75330:26;;;;;;;;;;;75323:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75229:135;;;:::o;78246:113::-;78308:4;78332:9;:19;78342:8;78332:19;;;;;;;;;;;;;;;;;;;;;;;;;78325:26;;78246:113;;;:::o;52008:185::-;52146:39;52163:4;52169:2;52173:7;52146:39;;;;;;;;;;;;:16;:39::i;:::-;52008:185;;;:::o;73449:89::-;73494:7;71750:3;73514:16;;73449:89;:::o;74899:322::-;75011:8;:18;75020:8;75011:18;;;;;;;;;;;;;;;;;;;;;74997:32;;:10;:32;;;74989:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;75106:22;;;;;;;;;;;75098:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;75204:9;75175:16;:26;75192:8;75175:26;;;;;;;;;;;:38;;;;;;;;;;;;:::i;:::-;;74899:322;;:::o;49717:222::-;49837:7;49863:15;49884:22;49900:5;49884:12;:15;;:22;;;;:::i;:::-;49862:44;;;49924:7;49917:14;;;49717:222;;;:::o;77952:288::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78043:9:::1;78039:194;78062:7;;:14;;78058:1;:18;78039:194;;;78098:13;78114:7;;78122:1;78114:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;78098:26;;78164:1;78147:19;;:5;:19;;;;78139:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;78205:9;:16;78215:5;78205:16;;;;;;;;;;;;;;;;78198:23;;;;;;;;;;;78083:150;78078:3;;;;;:::i;:::-;;;;78039:194;;;;77952:288:::0;;:::o;76166:77::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76230:5:::1;76215:12;;:20;;;;;;;;;;;;;;;;;;76166:77::o:0;76255:82::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76325:4:::1;76307:15;;:22;;;;;;;;;;;;;;;;;;76255:82::o:0;75975:99::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76046:20:::1;76058:7;76046:11;:20::i;:::-;75975:99:::0;:::o;71812:32::-;;;;;;;;;;;;;:::o;47138:289::-;47255:7;47300:119;47335:7;47300:119;;;;;;;;;;;;;;;;;:12;:16;;:119;;;;;:::i;:::-;47280:139;;47138:289;;;:::o;77030:254::-;77121:13;77160:16;77168:7;77160;:16::i;:::-;77152:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;77237:17;77256:18;:7;:16;:18::i;:::-;77220:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77206:70;;77030:254;;;:::o;48960:97::-;49008:13;49041:8;49034:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48960:97;:::o;46768:308::-;46885:7;46949:1;46932:19;;:5;:19;;;;46910:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47039:29;:13;:20;47053:5;47039:20;;;;;;;;;;;;;;;:27;:29::i;:::-;47032:36;;46768:308;;;:::o;63569:148::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63676:1:::1;63639:40;;63660:6;;;;;;;;;;;63639:40;;;;;;;;;;;;63707:1;63690:6;;:19;;;;;;;;;;;;;;;;;;63569:148::o:0;71714:39::-;71750:3;71714:39;:::o;72369:41::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75624:94::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75703:7:::1;75694:6;:16;;;;;;;;;;;;:::i;:::-;;75624:94:::0;:::o;77606:340::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;77692:6:::1;77688:251;77708:7;;:14;;77704:1;:18;77688:251;;;77743:13;77759:7;;77767:1;77759:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;77743:26;;77809:1;77792:19;;:5;:19;;;;77784:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;77852:9;:16;77862:5;77852:16;;;;;;;;;;;;;;;;;;;;;;;;;77851:17;77843:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;77922:4;77903:9;:16;77913:5;77903:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;77728:211;77724:3;;;;;:::i;:::-;;;;77688:251;;;;77606:340:::0;;:::o;72773:572::-;72862:16;72896:18;72917:17;72927:6;72917:9;:17::i;:::-;72896:38;;72963:1;72949:10;:15;72945:393;;;73040:1;73026:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73019:23;;;;;72945:393;73075:23;73115:10;73101:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73075:51;;73141:13;73169:130;73193:10;73185:5;:18;73169:130;;;73249:34;73269:6;73277:5;73249:19;:34::i;:::-;73233:6;73240:5;73233:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;73205:7;;;;;:::i;:::-;;;;73169:130;;;73320:6;73313:13;;;;;72773:572;;;;:::o;76434:123::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76509:10:::1;76501:24;;:47;76526:21;76501:47;;;;;;;;;;;;;;;;;;;;;;;76493:56;;;::::0;::::1;;76434:123::o:0;75850:117::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75954:5:::1;75929:22;:30;;;;;;;;;;;;:::i;:::-;;75850:117:::0;:::o;62918:87::-;62964:7;62991:6;;;;;;;;;;;62984:13;;62918:87;:::o;75404:97::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75489:4:::1;75464:22;;:29;;;;;;;;;;;;;;;;;;75404:97::o:0;47663:104::-;47719:13;47752:7;47745:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47663:104;:::o;77292:308::-;77387:13;77426:16;77434:7;77426;:16::i;:::-;77418:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;77534:22;77558:18;:7;:16;:18::i;:::-;77517:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77472:120;;77292:308;;;:::o;71851:34::-;;;;;;;;;;;;;:::o;73546:1314::-;73618:12;;;;;;;;;;;73610:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;71750:3;73682:13;:11;:13::i;:::-;:25;73674:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;73754:15;;;;;;;;;;;73750:363;;;73794:9;:21;73804:10;73794:21;;;;;;;;;;;;;;;;;;;;;;;;;73786:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;73900:1;73883:14;:18;:41;;;;;73923:1;73905:14;:19;;73883:41;73875:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;74018:1;73989:14;:26;74004:10;73989:26;;;;;;;;;;;;;;;;:30;73981:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;74099:1;74070:14;:26;74085:10;74070:26;;;;;;;;;;;;;;;:30;;;;73750:363;71750:3;74145:33;74163:14;74145:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;74123:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;74286:1;74269:14;:18;:41;;;;;74309:1;74291:14;:19;;74269:41;74247:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;74434:34;74453:14;74434;:12;:14::i;:::-;:18;;:34;;;;:::i;:::-;74421:9;:47;;74399:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;74549:9;74544:309;74568:14;74564:1;:18;74544:309;;;74604:17;74640:1;74624:13;:11;:13::i;:::-;:17;;;;:::i;:::-;74604:37;;74656:32;74666:10;74678:9;74656;:32::i;:::-;74730:12;74703:13;:24;74717:9;74703:24;;;;;;;;;;;:39;;;;74779:10;74757:8;:19;74766:9;74757:19;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;74804:37;;;;;;;;;;;;;;;;;:16;:27;74821:9;74804:27;;;;;;;;;;;:37;;;;;;;;;;;;:::i;:::-;;74589:264;74584:3;;;;;:::i;:::-;;;;74544:309;;;;73546:1314;:::o;50882:327::-;51029:12;:10;:12::i;:::-;51017:24;;:8;:24;;;;51009:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51129:8;51084:18;:32;51103:12;:10;:12::i;:::-;51084:32;;;;;;;;;;;;;;;:42;51117:8;51084:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;51182:8;51153:48;;51168:12;:10;:12::i;:::-;51153:48;;;51192:8;51153:48;;;;;;:::i;:::-;;;;;;;;50882:327;;:::o;76565:457::-;76622:7;76650:16;76658:7;76650;:16::i;:::-;76642:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;76825:4;76857:13;:22;76871:7;76857:22;;;;;;;;;;;;76906:8;:17;76915:7;76906:17;;;;;;;;;;;;;;;;;;;;;76950:7;76774:206;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;76742:257;;;;;;76696:318;;76565:457;;;:::o;73353:90::-;73398:7;73425:10;;73418:17;;73353:90;:::o;71760:45::-;;;;:::o;72085:50::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;76082:76::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76146:4:::1;76131:12;;:19;;;;;;;;;;;;;;;;;;76082:76::o:0;52264:365::-;52453:41;52472:12;:10;:12::i;:::-;52486:7;52453:18;:41::i;:::-;52431:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;52582:39;52596:4;52602:2;52606:7;52615:5;52582:13;:39::i;:::-;52264:365;;;;:::o;47838:879::-;47956:13;48009:16;48017:7;48009;:16::i;:::-;47987:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;48113:23;48139:10;:19;48150:7;48139:19;;;;;;;;;;;48113:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48169:18;48190:9;:7;:9::i;:::-;48169:30;;48297:1;48281:4;48275:18;:23;48271:72;;;48322:9;48315:16;;;;;;48271:72;48473:1;48453:9;48447:23;:27;48443:108;;;48522:4;48528:9;48505:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48491:48;;;;;;48443:108;48683:4;48689:18;:7;:16;:18::i;:::-;48666:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48652:57;;;;47838:879;;;;:::o;71892:48::-;;;;;;;;;;;;;;;;;:::o;71947:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;72417:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51280:214::-;51422:4;51451:18;:25;51470:5;51451:25;;;;;;;;;;;;;;;:35;51477:8;51451:35;;;;;;;;;;;;;;;;;;;;;;;;;51444:42;;51280:214;;;;:::o;76345:81::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;76413:5:::1;76395:15;;:23;;;;;;;;;;;;;;;;;;76345:81::o:0;72229:43::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63872:281::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63995:1:::1;63975:22;;:8;:22;;;;63953:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;64108:8;64079:38;;64100:6;;;;;;;;;;;64079:38;;;;;;;;;;;;64137:8;64128:6;;:17;;;;;;;;;;;;;;;;;;63872:281:::0;:::o;78495:99::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;78577:9:::1;78564:10;:22;;;;78495:99:::0;:::o;75513:::-;63149:12;:10;:12::i;:::-;63138:23;;:7;:5;:7::i;:::-;:23;;;63130:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;75599:5:::1;75574:22;;:30;;;;;;;;;;;;;;;;;;75513:99::o:0;23329:131::-;23396:4;23420:32;23425:3;:10;;23445:5;23437:14;;23420:4;:32::i;:::-;23413:39;;23329:131;;;;:::o;11502:219::-;11625:4;11649:64;11654:3;:10;;11674:3;11666:12;;11704:5;11688:23;;11680:32;;11649:4;:64::i;:::-;11642:71;;11502:219;;;;;:::o;25591:444::-;25651:4;25859:12;25983:7;25971:20;25963:28;;26026:1;26019:4;:8;26012:15;;;25591:444;;;:::o;12136:183::-;12247:4;12276:35;12286:3;:10;;12306:3;12298:12;;12276:9;:35::i;:::-;12269:42;;12136:183;;;;:::o;54176:127::-;54241:4;54265:30;54287:7;54265:12;:21;;:30;;;;:::i;:::-;54258:37;;54176:127;;;:::o;44561:98::-;44614:7;44641:10;44634:17;;44561:98;:::o;60836:183::-;60929:2;60902:15;:24;60918:7;60902:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;60985:7;60981:2;60947:46;;60956:23;60971:7;60956:14;:23::i;:::-;60947:46;;;;;;;;;;;;60836:183;;:::o;12407:155::-;12503:7;12535:19;12543:3;:10;;12535:7;:19::i;:::-;12528:26;;12407:155;;;:::o;54470:459::-;54599:4;54643:16;54651:7;54643;:16::i;:::-;54621:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;54742:13;54758:23;54773:7;54758:14;:23::i;:::-;54742:39;;54811:5;54800:16;;:7;:16;;;:64;;;;54857:7;54833:31;;:20;54845:7;54833:11;:20::i;:::-;:31;;;54800:64;:120;;;;54881:39;54905:5;54912:7;54881:23;:39::i;:::-;54800:120;54792:129;;;54470:459;;;;:::o;57781:668::-;57954:4;57927:31;;:23;57942:7;57927:14;:23::i;:::-;:31;;;57905:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;58078:1;58064:16;;:2;:16;;;;58056:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58134:39;58155:4;58161:2;58165:7;58134:20;:39::i;:::-;58238:29;58255:1;58259:7;58238:8;:29::i;:::-;58280:35;58307:7;58280:13;:19;58294:4;58280:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;58326:30;58348:7;58326:13;:17;58340:2;58326:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;58369:29;58386:7;58395:2;58369:12;:16;;:29;;;;;:::i;:::-;;58433:7;58429:2;58414:27;;58423:4;58414:27;;;;;;;;;;;;57781:668;;;:::o;24614:169::-;24712:7;24752:22;24756:3;:10;;24768:5;24752:3;:22::i;:::-;24744:31;;24737:38;;24614:169;;;;:::o;12910:268::-;13017:7;13026;13052:11;13065:13;13082:22;13086:3;:10;;13098:5;13082:3;:22::i;:::-;13051:53;;;;13131:3;13123:12;;13161:5;13153:14;;13115:55;;;;;;12910:268;;;;;:::o;59110:100::-;59194:8;59183;:19;;;;;;;;;;;;:::i;:::-;;59110:100;:::o;14292:292::-;14433:7;14515:44;14520:3;:10;;14540:3;14532:12;;14546;14515:4;:44::i;:::-;14507:53;;14453:123;;14292:292;;;;;:::o;2207:723::-;2263:13;2493:1;2484:5;:10;2480:53;;;2511:10;;;;;;;;;;;;;;;;;;;;;2480:53;2543:12;2558:5;2543:20;;2574:14;2599:78;2614:1;2606:4;:9;2599:78;;2632:8;;;;;:::i;:::-;;;;2663:2;2655:10;;;;;:::i;:::-;;;2599:78;;;2687:19;2719:6;2709:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2687:39;;2737:154;2753:1;2744:5;:10;2737:154;;2781:1;2771:11;;;;;:::i;:::-;;;2848:2;2840:5;:10;;;;:::i;:::-;2827:2;:24;;;;:::i;:::-;2814:39;;2797:6;2804;2797:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2877:2;2868:11;;;;;:::i;:::-;;;2737:154;;;2915:6;2901:21;;;;;2207:723;;;;:::o;24146:114::-;24206:7;24233:19;24241:3;:10;;24233:7;:19::i;:::-;24226:26;;24146:114;;;:::o;67148:98::-;67206:7;67237:1;67233;:5;;;;:::i;:::-;67226:12;;67148:98;;;;:::o;67886:::-;67944:7;67975:1;67971;:5;;;;:::i;:::-;67964:12;;67886:98;;;;:::o;55272:110::-;55348:26;55358:2;55362:7;55348:26;;;;;;;;;;;;:9;:26::i;:::-;55272:110;;:::o;53511:352::-;53668:28;53678:4;53684:2;53688:7;53668:9;:28::i;:::-;53729:48;53752:4;53758:2;53762:7;53771:5;53729:22;:48::i;:::-;53707:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;53511:352;;;;:::o;16337:414::-;16400:4;16422:21;16432:3;16437:5;16422:9;:21::i;:::-;16417:327;;16460:3;:11;;16477:5;16460:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16643:3;:11;;:18;;;;16621:3;:12;;:19;16634:5;16621:19;;;;;;;;;;;:40;;;;16683:4;16676:11;;;;16417:327;16727:5;16720:12;;16337:414;;;;;:::o;5942:737::-;6052:4;6168:16;6187:3;:12;;:17;6200:3;6187:17;;;;;;;;;;;;6168:36;;6233:1;6221:8;:13;6217:455;;;6301:3;:12;;6319:36;;;;;;;;6335:3;6319:36;;;;6348:5;6319:36;;;6301:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6514:3;:12;;:19;;;;6494:3;:12;;:17;6507:3;6494:17;;;;;;;;;;;:39;;;;6555:4;6548:11;;;;;6217:455;6628:5;6592:3;:12;;6616:1;6605:8;:12;;;;:::i;:::-;6592:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;:41;;;;6655:5;6648:12;;;5942:737;;;;;;:::o;8500:157::-;8598:4;8648:1;8627:3;:12;;:17;8640:3;8627:17;;;;;;;;;;;;:22;;8620:29;;8500:157;;;;:::o;8752:110::-;8808:7;8835:3;:12;;:19;;;;8828:26;;8752:110;;;:::o;61632:126::-;;;;:::o;23636:160::-;23724:4;23753:35;23761:3;:10;;23781:5;23773:14;;23753:7;:35::i;:::-;23746:42;;23636:160;;;;:::o;19280:273::-;19374:7;19442:5;19421:3;:11;;:18;;;;:26;19399:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;19527:3;:11;;19539:5;19527:18;;;;;;;;:::i;:::-;;;;;;;;;;19520:25;;19280:273;;;;:::o;9227:348::-;9321:7;9330;9399:5;9377:3;:12;;:19;;;;:27;9355:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;9479:22;9504:3;:12;;9517:5;9504:19;;;;;;;;:::i;:::-;;;;;;;;;;;;9479:44;;9542:5;:10;;;9554:5;:12;;;9534:33;;;;;9227:348;;;;;:::o;10825:353::-;10953:7;10973:16;10992:3;:12;;:17;11005:3;10992:17;;;;;;;;;;;;10973:36;;11040:1;11028:8;:13;;11043:12;11020:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;11110:3;:12;;11134:1;11123:8;:12;;;;:::i;:::-;11110:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:33;;;11103:40;;;10825:353;;;;;:::o;18817:109::-;18873:7;18900:3;:11;;:18;;;;18893:25;;18817:109;;;:::o;55609:321::-;55739:18;55745:2;55749:7;55739:5;:18::i;:::-;55790:54;55821:1;55825:2;55829:7;55838:5;55790:22;:54::i;:::-;55768:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;55609:321;;;:::o;59775:1053::-;59930:4;59951:15;:2;:13;;;:15::i;:::-;59947:874;;;60020:2;60004:36;;;60063:12;:10;:12::i;:::-;60098:4;60125:7;60155:5;60004:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;59983:783;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60383:1;60366:6;:13;:18;60362:389;;;60409:108;;;;;;;;;;:::i;:::-;;;;;;;;60362:389;60701:6;60695:13;60686:6;60682:2;60678:15;60671:38;59983:783;60253:45;;;60243:55;;;:6;:55;;;;60236:62;;;;;59947:874;60805:4;60798:11;;59775:1053;;;;;;;:::o;18570:161::-;18670:4;18722:1;18699:3;:12;;:19;18712:5;18699:19;;;;;;;;;;;;:24;;18692:31;;18570:161;;;;:::o;16927:1557::-;16993:4;17111:18;17132:3;:12;;:19;17145:5;17132:19;;;;;;;;;;;;17111:40;;17182:1;17168:10;:15;17164:1313;;17543:21;17580:1;17567:10;:14;;;;:::i;:::-;17543:38;;17596:17;17637:1;17616:3;:11;;:18;;;;:22;;;;:::i;:::-;17596:42;;17883:17;17903:3;:11;;17915:9;17903:22;;;;;;;;:::i;:::-;;;;;;;;;;17883:42;;18049:9;18020:3;:11;;18032:13;18020:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;18168:1;18152:13;:17;;;;:::i;:::-;18126:3;:12;;:23;18139:9;18126:23;;;;;;;;;;;:43;;;;18278:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18373:3;:12;;:19;18386:5;18373:19;;;;;;;;;;;18366:26;;;18416:4;18409:11;;;;;;;;17164:1313;18460:5;18453:12;;;16927:1557;;;;;:::o;56266:404::-;56360:1;56346:16;;:2;:16;;;;56338:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;56419:16;56427:7;56419;:16::i;:::-;56418:17;56410:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;56481:45;56510:1;56514:2;56518:7;56481:20;:45::i;:::-;56539:30;56561:7;56539:13;:17;56553:2;56539:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;56582:29;56599:7;56608:2;56582:12;:16;;:29;;;;;:::i;:::-;;56654:7;56650:2;56629:33;;56646:1;56629:33;;;;;;;;;;;;56266:404;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:327::-;6834:6;6883:2;6871:9;6862:7;6858:23;6854:32;6851:119;;;6889:79;;:::i;:::-;6851:119;7009:1;7034:52;7078:7;7069:6;7058:9;7054:22;7034:52;:::i;:::-;7024:62;;6980:116;6776:327;;;;:::o;7109:349::-;7178:6;7227:2;7215:9;7206:7;7202:23;7198:32;7195:119;;;7233:79;;:::i;:::-;7195:119;7353:1;7378:63;7433:7;7424:6;7413:9;7409:22;7378:63;:::i;:::-;7368:73;;7324:127;7109:349;;;;:::o;7464:509::-;7533:6;7582:2;7570:9;7561:7;7557:23;7553:32;7550:119;;;7588:79;;:::i;:::-;7550:119;7736:1;7725:9;7721:17;7708:31;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:63;7948:7;7939:6;7928:9;7924:22;7893:63;:::i;:::-;7883:73;;7679:287;7464:509;;;;:::o;7979:329::-;8038:6;8087:2;8075:9;8066:7;8062:23;8058:32;8055:119;;;8093:79;;:::i;:::-;8055:119;8213:1;8238:53;8283:7;8274:6;8263:9;8259:22;8238:53;:::i;:::-;8228:63;;8184:117;7979:329;;;;:::o;8314:654::-;8392:6;8400;8449:2;8437:9;8428:7;8424:23;8420:32;8417:119;;;8455:79;;:::i;:::-;8417:119;8575:1;8600:53;8645:7;8636:6;8625:9;8621:22;8600:53;:::i;:::-;8590:63;;8546:117;8730:2;8719:9;8715:18;8702:32;8761:18;8753:6;8750:30;8747:117;;;8783:79;;:::i;:::-;8747:117;8888:63;8943:7;8934:6;8923:9;8919:22;8888:63;:::i;:::-;8878:73;;8673:288;8314:654;;;;;:::o;8974:179::-;9043:10;9064:46;9106:3;9098:6;9064:46;:::i;:::-;9142:4;9137:3;9133:14;9119:28;;8974:179;;;;:::o;9159:118::-;9246:24;9264:5;9246:24;:::i;:::-;9241:3;9234:37;9159:118;;:::o;9283:157::-;9388:45;9408:24;9426:5;9408:24;:::i;:::-;9388:45;:::i;:::-;9383:3;9376:58;9283:157;;:::o;9476:732::-;9595:3;9624:54;9672:5;9624:54;:::i;:::-;9694:86;9773:6;9768:3;9694:86;:::i;:::-;9687:93;;9804:56;9854:5;9804:56;:::i;:::-;9883:7;9914:1;9899:284;9924:6;9921:1;9918:13;9899:284;;;10000:6;9994:13;10027:63;10086:3;10071:13;10027:63;:::i;:::-;10020:70;;10113:60;10166:6;10113:60;:::i;:::-;10103:70;;9959:224;9946:1;9943;9939:9;9934:14;;9899:284;;;9903:14;10199:3;10192:10;;9600:608;;;9476:732;;;;:::o;10214:109::-;10295:21;10310:5;10295:21;:::i;:::-;10290:3;10283:34;10214:109;;:::o;10329:118::-;10416:24;10434:5;10416:24;:::i;:::-;10411:3;10404:37;10329:118;;:::o;10453:360::-;10539:3;10567:38;10599:5;10567:38;:::i;:::-;10621:70;10684:6;10679:3;10621:70;:::i;:::-;10614:77;;10700:52;10745:6;10740:3;10733:4;10726:5;10722:16;10700:52;:::i;:::-;10777:29;10799:6;10777:29;:::i;:::-;10772:3;10768:39;10761:46;;10543:270;10453:360;;;;:::o;10819:364::-;10907:3;10935:39;10968:5;10935:39;:::i;:::-;10990:71;11054:6;11049:3;10990:71;:::i;:::-;10983:78;;11070:52;11115:6;11110:3;11103:4;11096:5;11092:16;11070:52;:::i;:::-;11147:29;11169:6;11147:29;:::i;:::-;11142:3;11138:39;11131:46;;10911:272;10819:364;;;;:::o;11189:377::-;11295:3;11323:39;11356:5;11323:39;:::i;:::-;11378:89;11460:6;11455:3;11378:89;:::i;:::-;11371:96;;11476:52;11521:6;11516:3;11509:4;11502:5;11498:16;11476:52;:::i;:::-;11553:6;11548:3;11544:16;11537:23;;11299:267;11189:377;;;;:::o;11596:845::-;11699:3;11736:5;11730:12;11765:36;11791:9;11765:36;:::i;:::-;11817:89;11899:6;11894:3;11817:89;:::i;:::-;11810:96;;11937:1;11926:9;11922:17;11953:1;11948:137;;;;12099:1;12094:341;;;;11915:520;;11948:137;12032:4;12028:9;12017;12013:25;12008:3;12001:38;12068:6;12063:3;12059:16;12052:23;;11948:137;;12094:341;12161:38;12193:5;12161:38;:::i;:::-;12221:1;12235:154;12249:6;12246:1;12243:13;12235:154;;;12323:7;12317:14;12313:1;12308:3;12304:11;12297:35;12373:1;12364:7;12360:15;12349:26;;12271:4;12268:1;12264:12;12259:17;;12235:154;;;12418:6;12413:3;12409:16;12402:23;;12101:334;;11915:520;;11703:738;;11596:845;;;;:::o;12447:366::-;12589:3;12610:67;12674:2;12669:3;12610:67;:::i;:::-;12603:74;;12686:93;12775:3;12686:93;:::i;:::-;12804:2;12799:3;12795:12;12788:19;;12447:366;;;:::o;12819:::-;12961:3;12982:67;13046:2;13041:3;12982:67;:::i;:::-;12975:74;;13058:93;13147:3;13058:93;:::i;:::-;13176:2;13171:3;13167:12;13160:19;;12819:366;;;:::o;13191:::-;13333:3;13354:67;13418:2;13413:3;13354:67;:::i;:::-;13347:74;;13430:93;13519:3;13430:93;:::i;:::-;13548:2;13543:3;13539:12;13532:19;;13191:366;;;:::o;13563:::-;13705:3;13726:67;13790:2;13785:3;13726:67;:::i;:::-;13719:74;;13802:93;13891:3;13802:93;:::i;:::-;13920:2;13915:3;13911:12;13904:19;;13563:366;;;:::o;13935:::-;14077:3;14098:67;14162:2;14157:3;14098:67;:::i;:::-;14091:74;;14174:93;14263:3;14174:93;:::i;:::-;14292:2;14287:3;14283:12;14276:19;;13935:366;;;:::o;14307:::-;14449:3;14470:67;14534:2;14529:3;14470:67;:::i;:::-;14463:74;;14546:93;14635:3;14546:93;:::i;:::-;14664:2;14659:3;14655:12;14648:19;;14307:366;;;:::o;14679:::-;14821:3;14842:67;14906:2;14901:3;14842:67;:::i;:::-;14835:74;;14918:93;15007:3;14918:93;:::i;:::-;15036:2;15031:3;15027:12;15020:19;;14679:366;;;:::o;15051:::-;15193:3;15214:67;15278:2;15273:3;15214:67;:::i;:::-;15207:74;;15290:93;15379:3;15290:93;:::i;:::-;15408:2;15403:3;15399:12;15392:19;;15051:366;;;:::o;15423:::-;15565:3;15586:67;15650:2;15645:3;15586:67;:::i;:::-;15579:74;;15662:93;15751:3;15662:93;:::i;:::-;15780:2;15775:3;15771:12;15764:19;;15423:366;;;:::o;15795:::-;15937:3;15958:67;16022:2;16017:3;15958:67;:::i;:::-;15951:74;;16034:93;16123:3;16034:93;:::i;:::-;16152:2;16147:3;16143:12;16136:19;;15795:366;;;:::o;16167:::-;16309:3;16330:67;16394:2;16389:3;16330:67;:::i;:::-;16323:74;;16406:93;16495:3;16406:93;:::i;:::-;16524:2;16519:3;16515:12;16508:19;;16167:366;;;:::o;16539:::-;16681:3;16702:67;16766:2;16761:3;16702:67;:::i;:::-;16695:74;;16778:93;16867:3;16778:93;:::i;:::-;16896:2;16891:3;16887:12;16880:19;;16539:366;;;:::o;16911:::-;17053:3;17074:67;17138:2;17133:3;17074:67;:::i;:::-;17067:74;;17150:93;17239:3;17150:93;:::i;:::-;17268:2;17263:3;17259:12;17252:19;;16911:366;;;:::o;17283:::-;17425:3;17446:67;17510:2;17505:3;17446:67;:::i;:::-;17439:74;;17522:93;17611:3;17522:93;:::i;:::-;17640:2;17635:3;17631:12;17624:19;;17283:366;;;:::o;17655:::-;17797:3;17818:67;17882:2;17877:3;17818:67;:::i;:::-;17811:74;;17894:93;17983:3;17894:93;:::i;:::-;18012:2;18007:3;18003:12;17996:19;;17655:366;;;:::o;18027:::-;18169:3;18190:67;18254:2;18249:3;18190:67;:::i;:::-;18183:74;;18266:93;18355:3;18266:93;:::i;:::-;18384:2;18379:3;18375:12;18368:19;;18027:366;;;:::o;18399:::-;18541:3;18562:67;18626:2;18621:3;18562:67;:::i;:::-;18555:74;;18638:93;18727:3;18638:93;:::i;:::-;18756:2;18751:3;18747:12;18740:19;;18399:366;;;:::o;18771:::-;18913:3;18934:67;18998:2;18993:3;18934:67;:::i;:::-;18927:74;;19010:93;19099:3;19010:93;:::i;:::-;19128:2;19123:3;19119:12;19112:19;;18771:366;;;:::o;19143:::-;19285:3;19306:67;19370:2;19365:3;19306:67;:::i;:::-;19299:74;;19382:93;19471:3;19382:93;:::i;:::-;19500:2;19495:3;19491:12;19484:19;;19143:366;;;:::o;19515:::-;19657:3;19678:67;19742:2;19737:3;19678:67;:::i;:::-;19671:74;;19754:93;19843:3;19754:93;:::i;:::-;19872:2;19867:3;19863:12;19856:19;;19515:366;;;:::o;19887:::-;20029:3;20050:67;20114:2;20109:3;20050:67;:::i;:::-;20043:74;;20126:93;20215:3;20126:93;:::i;:::-;20244:2;20239:3;20235:12;20228:19;;19887:366;;;:::o;20259:::-;20401:3;20422:67;20486:2;20481:3;20422:67;:::i;:::-;20415:74;;20498:93;20587:3;20498:93;:::i;:::-;20616:2;20611:3;20607:12;20600:19;;20259:366;;;:::o;20631:::-;20773:3;20794:67;20858:2;20853:3;20794:67;:::i;:::-;20787:74;;20870:93;20959:3;20870:93;:::i;:::-;20988:2;20983:3;20979:12;20972:19;;20631:366;;;:::o;21003:::-;21145:3;21166:67;21230:2;21225:3;21166:67;:::i;:::-;21159:74;;21242:93;21331:3;21242:93;:::i;:::-;21360:2;21355:3;21351:12;21344:19;;21003:366;;;:::o;21375:::-;21517:3;21538:67;21602:2;21597:3;21538:67;:::i;:::-;21531:74;;21614:93;21703:3;21614:93;:::i;:::-;21732:2;21727:3;21723:12;21716:19;;21375:366;;;:::o;21747:::-;21889:3;21910:67;21974:2;21969:3;21910:67;:::i;:::-;21903:74;;21986:93;22075:3;21986:93;:::i;:::-;22104:2;22099:3;22095:12;22088:19;;21747:366;;;:::o;22119:::-;22261:3;22282:67;22346:2;22341:3;22282:67;:::i;:::-;22275:74;;22358:93;22447:3;22358:93;:::i;:::-;22476:2;22471:3;22467:12;22460:19;;22119:366;;;:::o;22491:::-;22633:3;22654:67;22718:2;22713:3;22654:67;:::i;:::-;22647:74;;22730:93;22819:3;22730:93;:::i;:::-;22848:2;22843:3;22839:12;22832:19;;22491:366;;;:::o;22863:::-;23005:3;23026:67;23090:2;23085:3;23026:67;:::i;:::-;23019:74;;23102:93;23191:3;23102:93;:::i;:::-;23220:2;23215:3;23211:12;23204:19;;22863:366;;;:::o;23235:::-;23377:3;23398:67;23462:2;23457:3;23398:67;:::i;:::-;23391:74;;23474:93;23563:3;23474:93;:::i;:::-;23592:2;23587:3;23583:12;23576:19;;23235:366;;;:::o;23607:108::-;23684:24;23702:5;23684:24;:::i;:::-;23679:3;23672:37;23607:108;;:::o;23721:118::-;23808:24;23826:5;23808:24;:::i;:::-;23803:3;23796:37;23721:118;;:::o;23845:157::-;23950:45;23970:24;23988:5;23970:24;:::i;:::-;23950:45;:::i;:::-;23945:3;23938:58;23845:157;;:::o;24008:679::-;24204:3;24219:75;24290:3;24281:6;24219:75;:::i;:::-;24319:2;24314:3;24310:12;24303:19;;24332:75;24403:3;24394:6;24332:75;:::i;:::-;24432:2;24427:3;24423:12;24416:19;;24445:75;24516:3;24507:6;24445:75;:::i;:::-;24545:2;24540:3;24536:12;24529:19;;24558:75;24629:3;24620:6;24558:75;:::i;:::-;24658:2;24653:3;24649:12;24642:19;;24678:3;24671:10;;24008:679;;;;;;;:::o;24693:435::-;24873:3;24895:95;24986:3;24977:6;24895:95;:::i;:::-;24888:102;;25007:95;25098:3;25089:6;25007:95;:::i;:::-;25000:102;;25119:3;25112:10;;24693:435;;;;;:::o;25134:429::-;25311:3;25333:92;25421:3;25412:6;25333:92;:::i;:::-;25326:99;;25442:95;25533:3;25524:6;25442:95;:::i;:::-;25435:102;;25554:3;25547:10;;25134:429;;;;;:::o;25569:222::-;25662:4;25700:2;25689:9;25685:18;25677:26;;25713:71;25781:1;25770:9;25766:17;25757:6;25713:71;:::i;:::-;25569:222;;;;:::o;25797:640::-;25992:4;26030:3;26019:9;26015:19;26007:27;;26044:71;26112:1;26101:9;26097:17;26088:6;26044:71;:::i;:::-;26125:72;26193:2;26182:9;26178:18;26169:6;26125:72;:::i;:::-;26207;26275:2;26264:9;26260:18;26251:6;26207:72;:::i;:::-;26326:9;26320:4;26316:20;26311:2;26300:9;26296:18;26289:48;26354:76;26425:4;26416:6;26354:76;:::i;:::-;26346:84;;25797:640;;;;;;;:::o;26443:373::-;26586:4;26624:2;26613:9;26609:18;26601:26;;26673:9;26667:4;26663:20;26659:1;26648:9;26644:17;26637:47;26701:108;26804:4;26795:6;26701:108;:::i;:::-;26693:116;;26443:373;;;;:::o;26822:210::-;26909:4;26947:2;26936:9;26932:18;26924:26;;26960:65;27022:1;27011:9;27007:17;26998:6;26960:65;:::i;:::-;26822:210;;;;:::o;27038:222::-;27131:4;27169:2;27158:9;27154:18;27146:26;;27182:71;27250:1;27239:9;27235:17;27226:6;27182:71;:::i;:::-;27038:222;;;;:::o;27266:313::-;27379:4;27417:2;27406:9;27402:18;27394:26;;27466:9;27460:4;27456:20;27452:1;27441:9;27437:17;27430:47;27494:78;27567:4;27558:6;27494:78;:::i;:::-;27486:86;;27266:313;;;;:::o;27585:419::-;27751:4;27789:2;27778:9;27774:18;27766:26;;27838:9;27832:4;27828:20;27824:1;27813:9;27809:17;27802:47;27866:131;27992:4;27866:131;:::i;:::-;27858:139;;27585:419;;;:::o;28010:::-;28176:4;28214:2;28203:9;28199:18;28191:26;;28263:9;28257:4;28253:20;28249:1;28238:9;28234:17;28227:47;28291:131;28417:4;28291:131;:::i;:::-;28283:139;;28010:419;;;:::o;28435:::-;28601:4;28639:2;28628:9;28624:18;28616:26;;28688:9;28682:4;28678:20;28674:1;28663:9;28659:17;28652:47;28716:131;28842:4;28716:131;:::i;:::-;28708:139;;28435:419;;;:::o;28860:::-;29026:4;29064:2;29053:9;29049:18;29041:26;;29113:9;29107:4;29103:20;29099:1;29088:9;29084:17;29077:47;29141:131;29267:4;29141:131;:::i;:::-;29133:139;;28860:419;;;:::o;29285:::-;29451:4;29489:2;29478:9;29474:18;29466:26;;29538:9;29532:4;29528:20;29524:1;29513:9;29509:17;29502:47;29566:131;29692:4;29566:131;:::i;:::-;29558:139;;29285:419;;;:::o;29710:::-;29876:4;29914:2;29903:9;29899:18;29891:26;;29963:9;29957:4;29953:20;29949:1;29938:9;29934:17;29927:47;29991:131;30117:4;29991:131;:::i;:::-;29983:139;;29710:419;;;:::o;30135:::-;30301:4;30339:2;30328:9;30324:18;30316:26;;30388:9;30382:4;30378:20;30374:1;30363:9;30359:17;30352:47;30416:131;30542:4;30416:131;:::i;:::-;30408:139;;30135:419;;;:::o;30560:::-;30726:4;30764:2;30753:9;30749:18;30741:26;;30813:9;30807:4;30803:20;30799:1;30788:9;30784:17;30777:47;30841:131;30967:4;30841:131;:::i;:::-;30833:139;;30560:419;;;:::o;30985:::-;31151:4;31189:2;31178:9;31174:18;31166:26;;31238:9;31232:4;31228:20;31224:1;31213:9;31209:17;31202:47;31266:131;31392:4;31266:131;:::i;:::-;31258:139;;30985:419;;;:::o;31410:::-;31576:4;31614:2;31603:9;31599:18;31591:26;;31663:9;31657:4;31653:20;31649:1;31638:9;31634:17;31627:47;31691:131;31817:4;31691:131;:::i;:::-;31683:139;;31410:419;;;:::o;31835:::-;32001:4;32039:2;32028:9;32024:18;32016:26;;32088:9;32082:4;32078:20;32074:1;32063:9;32059:17;32052:47;32116:131;32242:4;32116:131;:::i;:::-;32108:139;;31835:419;;;:::o;32260:::-;32426:4;32464:2;32453:9;32449:18;32441:26;;32513:9;32507:4;32503:20;32499:1;32488:9;32484:17;32477:47;32541:131;32667:4;32541:131;:::i;:::-;32533:139;;32260:419;;;:::o;32685:::-;32851:4;32889:2;32878:9;32874:18;32866:26;;32938:9;32932:4;32928:20;32924:1;32913:9;32909:17;32902:47;32966:131;33092:4;32966:131;:::i;:::-;32958:139;;32685:419;;;:::o;33110:::-;33276:4;33314:2;33303:9;33299:18;33291:26;;33363:9;33357:4;33353:20;33349:1;33338:9;33334:17;33327:47;33391:131;33517:4;33391:131;:::i;:::-;33383:139;;33110:419;;;:::o;33535:::-;33701:4;33739:2;33728:9;33724:18;33716:26;;33788:9;33782:4;33778:20;33774:1;33763:9;33759:17;33752:47;33816:131;33942:4;33816:131;:::i;:::-;33808:139;;33535:419;;;:::o;33960:::-;34126:4;34164:2;34153:9;34149:18;34141:26;;34213:9;34207:4;34203:20;34199:1;34188:9;34184:17;34177:47;34241:131;34367:4;34241:131;:::i;:::-;34233:139;;33960:419;;;:::o;34385:::-;34551:4;34589:2;34578:9;34574:18;34566:26;;34638:9;34632:4;34628:20;34624:1;34613:9;34609:17;34602:47;34666:131;34792:4;34666:131;:::i;:::-;34658:139;;34385:419;;;:::o;34810:::-;34976:4;35014:2;35003:9;34999:18;34991:26;;35063:9;35057:4;35053:20;35049:1;35038:9;35034:17;35027:47;35091:131;35217:4;35091:131;:::i;:::-;35083:139;;34810:419;;;:::o;35235:::-;35401:4;35439:2;35428:9;35424:18;35416:26;;35488:9;35482:4;35478:20;35474:1;35463:9;35459:17;35452:47;35516:131;35642:4;35516:131;:::i;:::-;35508:139;;35235:419;;;:::o;35660:::-;35826:4;35864:2;35853:9;35849:18;35841:26;;35913:9;35907:4;35903:20;35899:1;35888:9;35884:17;35877:47;35941:131;36067:4;35941:131;:::i;:::-;35933:139;;35660:419;;;:::o;36085:::-;36251:4;36289:2;36278:9;36274:18;36266:26;;36338:9;36332:4;36328:20;36324:1;36313:9;36309:17;36302:47;36366:131;36492:4;36366:131;:::i;:::-;36358:139;;36085:419;;;:::o;36510:::-;36676:4;36714:2;36703:9;36699:18;36691:26;;36763:9;36757:4;36753:20;36749:1;36738:9;36734:17;36727:47;36791:131;36917:4;36791:131;:::i;:::-;36783:139;;36510:419;;;:::o;36935:::-;37101:4;37139:2;37128:9;37124:18;37116:26;;37188:9;37182:4;37178:20;37174:1;37163:9;37159:17;37152:47;37216:131;37342:4;37216:131;:::i;:::-;37208:139;;36935:419;;;:::o;37360:::-;37526:4;37564:2;37553:9;37549:18;37541:26;;37613:9;37607:4;37603:20;37599:1;37588:9;37584:17;37577:47;37641:131;37767:4;37641:131;:::i;:::-;37633:139;;37360:419;;;:::o;37785:::-;37951:4;37989:2;37978:9;37974:18;37966:26;;38038:9;38032:4;38028:20;38024:1;38013:9;38009:17;38002:47;38066:131;38192:4;38066:131;:::i;:::-;38058:139;;37785:419;;;:::o;38210:::-;38376:4;38414:2;38403:9;38399:18;38391:26;;38463:9;38457:4;38453:20;38449:1;38438:9;38434:17;38427:47;38491:131;38617:4;38491:131;:::i;:::-;38483:139;;38210:419;;;:::o;38635:::-;38801:4;38839:2;38828:9;38824:18;38816:26;;38888:9;38882:4;38878:20;38874:1;38863:9;38859:17;38852:47;38916:131;39042:4;38916:131;:::i;:::-;38908:139;;38635:419;;;:::o;39060:::-;39226:4;39264:2;39253:9;39249:18;39241:26;;39313:9;39307:4;39303:20;39299:1;39288:9;39284:17;39277:47;39341:131;39467:4;39341:131;:::i;:::-;39333:139;;39060:419;;;:::o;39485:::-;39651:4;39689:2;39678:9;39674:18;39666:26;;39738:9;39732:4;39728:20;39724:1;39713:9;39709:17;39702:47;39766:131;39892:4;39766:131;:::i;:::-;39758:139;;39485:419;;;:::o;39910:::-;40076:4;40114:2;40103:9;40099:18;40091:26;;40163:9;40157:4;40153:20;40149:1;40138:9;40134:17;40127:47;40191:131;40317:4;40191:131;:::i;:::-;40183:139;;39910:419;;;:::o;40335:222::-;40428:4;40466:2;40455:9;40451:18;40443:26;;40479:71;40547:1;40536:9;40532:17;40523:6;40479:71;:::i;:::-;40335:222;;;;:::o;40563:129::-;40597:6;40624:20;;:::i;:::-;40614:30;;40653:33;40681:4;40673:6;40653:33;:::i;:::-;40563:129;;;:::o;40698:75::-;40731:6;40764:2;40758:9;40748:19;;40698:75;:::o;40779:307::-;40840:4;40930:18;40922:6;40919:30;40916:56;;;40952:18;;:::i;:::-;40916:56;40990:29;41012:6;40990:29;:::i;:::-;40982:37;;41074:4;41068;41064:15;41056:23;;40779:307;;;:::o;41092:308::-;41154:4;41244:18;41236:6;41233:30;41230:56;;;41266:18;;:::i;:::-;41230:56;41304:29;41326:6;41304:29;:::i;:::-;41296:37;;41388:4;41382;41378:15;41370:23;;41092:308;;;:::o;41406:132::-;41473:4;41496:3;41488:11;;41526:4;41521:3;41517:14;41509:22;;41406:132;;;:::o;41544:141::-;41593:4;41616:3;41608:11;;41639:3;41636:1;41629:14;41673:4;41670:1;41660:18;41652:26;;41544:141;;;:::o;41691:114::-;41758:6;41792:5;41786:12;41776:22;;41691:114;;;:::o;41811:98::-;41862:6;41896:5;41890:12;41880:22;;41811:98;;;:::o;41915:99::-;41967:6;42001:5;41995:12;41985:22;;41915:99;;;:::o;42020:113::-;42090:4;42122;42117:3;42113:14;42105:22;;42020:113;;;:::o;42139:184::-;42238:11;42272:6;42267:3;42260:19;42312:4;42307:3;42303:14;42288:29;;42139:184;;;;:::o;42329:168::-;42412:11;42446:6;42441:3;42434:19;42486:4;42481:3;42477:14;42462:29;;42329:168;;;;:::o;42503:169::-;42587:11;42621:6;42616:3;42609:19;42661:4;42656:3;42652:14;42637:29;;42503:169;;;;:::o;42678:148::-;42780:11;42817:3;42802:18;;42678:148;;;;:::o;42832:305::-;42872:3;42891:20;42909:1;42891:20;:::i;:::-;42886:25;;42925:20;42943:1;42925:20;:::i;:::-;42920:25;;43079:1;43011:66;43007:74;43004:1;43001:81;42998:107;;;43085:18;;:::i;:::-;42998:107;43129:1;43126;43122:9;43115:16;;42832:305;;;;:::o;43143:185::-;43183:1;43200:20;43218:1;43200:20;:::i;:::-;43195:25;;43234:20;43252:1;43234:20;:::i;:::-;43229:25;;43273:1;43263:35;;43278:18;;:::i;:::-;43263:35;43320:1;43317;43313:9;43308:14;;43143:185;;;;:::o;43334:348::-;43374:7;43397:20;43415:1;43397:20;:::i;:::-;43392:25;;43431:20;43449:1;43431:20;:::i;:::-;43426:25;;43619:1;43551:66;43547:74;43544:1;43541:81;43536:1;43529:9;43522:17;43518:105;43515:131;;;43626:18;;:::i;:::-;43515:131;43674:1;43671;43667:9;43656:20;;43334:348;;;;:::o;43688:191::-;43728:4;43748:20;43766:1;43748:20;:::i;:::-;43743:25;;43782:20;43800:1;43782:20;:::i;:::-;43777:25;;43821:1;43818;43815:8;43812:34;;;43826:18;;:::i;:::-;43812:34;43871:1;43868;43864:9;43856:17;;43688:191;;;;:::o;43885:96::-;43922:7;43951:24;43969:5;43951:24;:::i;:::-;43940:35;;43885:96;;;:::o;43987:90::-;44021:7;44064:5;44057:13;44050:21;44039:32;;43987:90;;;:::o;44083:77::-;44120:7;44149:5;44138:16;;44083:77;;;:::o;44166:149::-;44202:7;44242:66;44235:5;44231:78;44220:89;;44166:149;;;:::o;44321:126::-;44358:7;44398:42;44391:5;44387:54;44376:65;;44321:126;;;:::o;44453:77::-;44490:7;44519:5;44508:16;;44453:77;;;:::o;44536:154::-;44620:6;44615:3;44610;44597:30;44682:1;44673:6;44668:3;44664:16;44657:27;44536:154;;;:::o;44696:307::-;44764:1;44774:113;44788:6;44785:1;44782:13;44774:113;;;44873:1;44868:3;44864:11;44858:18;44854:1;44849:3;44845:11;44838:39;44810:2;44807:1;44803:10;44798:15;;44774:113;;;44905:6;44902:1;44899:13;44896:101;;;44985:1;44976:6;44971:3;44967:16;44960:27;44896:101;44745:258;44696:307;;;:::o;45009:320::-;45053:6;45090:1;45084:4;45080:12;45070:22;;45137:1;45131:4;45127:12;45158:18;45148:81;;45214:4;45206:6;45202:17;45192:27;;45148:81;45276:2;45268:6;45265:14;45245:18;45242:38;45239:84;;;45295:18;;:::i;:::-;45239:84;45060:269;45009:320;;;:::o;45335:281::-;45418:27;45440:4;45418:27;:::i;:::-;45410:6;45406:40;45548:6;45536:10;45533:22;45512:18;45500:10;45497:34;45494:62;45491:88;;;45559:18;;:::i;:::-;45491:88;45599:10;45595:2;45588:22;45378:238;45335:281;;:::o;45622:233::-;45661:3;45684:24;45702:5;45684:24;:::i;:::-;45675:33;;45730:66;45723:5;45720:77;45717:103;;;45800:18;;:::i;:::-;45717:103;45847:1;45840:5;45836:13;45829:20;;45622:233;;;:::o;45861:100::-;45900:7;45929:26;45949:5;45929:26;:::i;:::-;45918:37;;45861:100;;;:::o;45967:94::-;46006:7;46035:20;46049:5;46035:20;:::i;:::-;46024:31;;45967:94;;;:::o;46067:79::-;46106:7;46135:5;46124:16;;46067:79;;;:::o;46152:176::-;46184:1;46201:20;46219:1;46201:20;:::i;:::-;46196:25;;46235:20;46253:1;46235:20;:::i;:::-;46230:25;;46274:1;46264:35;;46279:18;;:::i;:::-;46264:35;46320:1;46317;46313:9;46308:14;;46152:176;;;;:::o;46334:180::-;46382:77;46379:1;46372:88;46479:4;46476:1;46469:15;46503:4;46500:1;46493:15;46520:180;46568:77;46565:1;46558:88;46665:4;46662:1;46655:15;46689:4;46686:1;46679:15;46706:180;46754:77;46751:1;46744:88;46851:4;46848:1;46841:15;46875:4;46872:1;46865:15;46892:180;46940:77;46937:1;46930:88;47037:4;47034:1;47027:15;47061:4;47058:1;47051:15;47078:180;47126:77;47123:1;47116:88;47223:4;47220:1;47213:15;47247:4;47244:1;47237:15;47264:180;47312:77;47309:1;47302:88;47409:4;47406:1;47399:15;47433:4;47430:1;47423:15;47450:117;47559:1;47556;47549:12;47573:117;47682:1;47679;47672:12;47696:117;47805:1;47802;47795:12;47819:117;47928:1;47925;47918:12;47942:117;48051:1;48048;48041:12;48065:117;48174:1;48171;48164:12;48188:102;48229:6;48280:2;48276:7;48271:2;48264:5;48260:14;48256:28;48246:38;;48188:102;;;:::o;48296:94::-;48329:8;48377:5;48373:2;48369:14;48348:35;;48296:94;;;:::o;48396:221::-;48536:34;48532:1;48524:6;48520:14;48513:58;48605:4;48600:2;48592:6;48588:15;48581:29;48396:221;:::o;48623:162::-;48763:14;48759:1;48751:6;48747:14;48740:38;48623:162;:::o;48791:227::-;48931:34;48927:1;48919:6;48915:14;48908:58;49000:10;48995:2;48987:6;48983:15;48976:35;48791:227;:::o;49024:237::-;49164:34;49160:1;49152:6;49148:14;49141:58;49233:20;49228:2;49220:6;49216:15;49209:45;49024:237;:::o;49267:225::-;49407:34;49403:1;49395:6;49391:14;49384:58;49476:8;49471:2;49463:6;49459:15;49452:33;49267:225;:::o;49498:178::-;49638:30;49634:1;49626:6;49622:14;49615:54;49498:178;:::o;49682:::-;49822:30;49818:1;49810:6;49806:14;49799:54;49682:178;:::o;49866:237::-;50006:34;50002:1;49994:6;49990:14;49983:58;50075:20;50070:2;50062:6;50058:15;50051:45;49866:237;:::o;50109:223::-;50249:34;50245:1;50237:6;50233:14;50226:58;50318:6;50313:2;50305:6;50301:15;50294:31;50109:223;:::o;50338:175::-;50478:27;50474:1;50466:6;50462:14;50455:51;50338:175;:::o;50519:224::-;50659:34;50655:1;50647:6;50643:14;50636:58;50728:7;50723:2;50715:6;50711:15;50704:32;50519:224;:::o;50749:231::-;50889:34;50885:1;50877:6;50873:14;50866:58;50958:14;50953:2;50945:6;50941:15;50934:39;50749:231;:::o;50986:165::-;51126:17;51122:1;51114:6;51110:14;51103:41;50986:165;:::o;51157:240::-;51297:34;51293:1;51285:6;51281:14;51274:58;51366:23;51361:2;51353:6;51349:15;51342:48;51157:240;:::o;51403:243::-;51543:34;51539:1;51531:6;51527:14;51520:58;51612:26;51607:2;51599:6;51595:15;51588:51;51403:243;:::o;51652:229::-;51792:34;51788:1;51780:6;51776:14;51769:58;51861:12;51856:2;51848:6;51844:15;51837:37;51652:229;:::o;51887:222::-;52027:34;52023:1;52015:6;52011:14;52004:58;52096:5;52091:2;52083:6;52079:15;52072:30;51887:222;:::o;52115:221::-;52255:34;52251:1;52243:6;52239:14;52232:58;52324:4;52319:2;52311:6;52307:15;52300:29;52115:221;:::o;52342:182::-;52482:34;52478:1;52470:6;52466:14;52459:58;52342:182;:::o;52530:231::-;52670:34;52666:1;52658:6;52654:14;52647:58;52739:14;52734:2;52726:6;52722:15;52715:39;52530:231;:::o;52767:182::-;52907:34;52903:1;52895:6;52891:14;52884:58;52767:182;:::o;52955:228::-;53095:34;53091:1;53083:6;53079:14;53072:58;53164:11;53159:2;53151:6;53147:15;53140:36;52955:228;:::o;53189:234::-;53329:34;53325:1;53317:6;53313:14;53306:58;53398:17;53393:2;53385:6;53381:15;53374:42;53189:234;:::o;53429:181::-;53569:33;53565:1;53557:6;53553:14;53546:57;53429:181;:::o;53616:220::-;53756:34;53752:1;53744:6;53740:14;53733:58;53825:3;53820:2;53812:6;53808:15;53801:28;53616:220;:::o;53842:176::-;53982:28;53978:1;53970:6;53966:14;53959:52;53842:176;:::o;54024:236::-;54164:34;54160:1;54152:6;54148:14;54141:58;54233:19;54228:2;54220:6;54216:15;54209:44;54024:236;:::o;54266:164::-;54406:16;54402:1;54394:6;54390:14;54383:40;54266:164;:::o;54436:167::-;54576:19;54572:1;54564:6;54560:14;54553:43;54436:167;:::o;54609:181::-;54749:33;54745:1;54737:6;54733:14;54726:57;54609:181;:::o;54796:122::-;54869:24;54887:5;54869:24;:::i;:::-;54862:5;54859:35;54849:63;;54908:1;54905;54898:12;54849:63;54796:122;:::o;54924:116::-;54994:21;55009:5;54994:21;:::i;:::-;54987:5;54984:32;54974:60;;55030:1;55027;55020:12;54974:60;54924:116;:::o;55046:120::-;55118:23;55135:5;55118:23;:::i;:::-;55111:5;55108:34;55098:62;;55156:1;55153;55146:12;55098:62;55046:120;:::o;55172:122::-;55245:24;55263:5;55245:24;:::i;:::-;55238:5;55235:35;55225:63;;55284:1;55281;55274:12;55225:63;55172:122;:::o

Swarm Source

ipfs://91ebd06f7410eb72f7229768524fcafdb92e8afc58ff37d96df8ab6da77b37b4
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.