ETH Price: $2,811.21 (+2.59%)
 

Overview

Max Total Supply

0 BOOK

Holders

71

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
irogue.eth
Balance
2 BOOK
0xe1e0da672b12f7d0d025f4b52512ab1678b2c7fd
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:
LostChapters

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

            if (lastIndex != toDeleteIndex) {
                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] = valueIndex; // Replace lastvalue's index to valueIndex
            }

            // 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) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

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

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

// File: @manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol



pragma solidity ^0.8.0;

/// @author: manifold.xyz


/**
 * @dev Interface for admin control
 */
interface IAdminControl is IERC165 {

    event AdminApproved(address indexed account, address indexed sender);
    event AdminRevoked(address indexed account, address indexed sender);

    /**
     * @dev gets address of all admins
     */
    function getAdmins() external view returns (address[] memory);

    /**
     * @dev add an admin.  Can only be called by contract owner.
     */
    function approveAdmin(address admin) external;

    /**
     * @dev remove an admin.  Can only be called by contract owner.
     */
    function revokeAdmin(address admin) external;

    /**
     * @dev checks whether or not given address is an admin
     * Returns True if they are
     */
    function isAdmin(address admin) external view returns (bool);

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


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

pragma solidity ^0.8.0;


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

// File: @manifoldxyz/libraries-solidity/contracts/access/AdminControl.sol



pragma solidity ^0.8.0;






abstract contract AdminControl is Ownable, IAdminControl, ERC165 {
    using EnumerableSet for EnumerableSet.AddressSet;

    // Track registered admins
    EnumerableSet.AddressSet private _admins;

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

    /**
     * @dev Only allows approved admins to call the specified function
     */
    modifier adminRequired() {
        require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin");
        _;
    }   

    /**
     * @dev See {IAdminControl-getAdmins}.
     */
    function getAdmins() external view override returns (address[] memory admins) {
        admins = new address[](_admins.length());
        for (uint i = 0; i < _admins.length(); i++) {
            admins[i] = _admins.at(i);
        }
        return admins;
    }

    /**
     * @dev See {IAdminControl-approveAdmin}.
     */
    function approveAdmin(address admin) external override onlyOwner {
        if (!_admins.contains(admin)) {
            emit AdminApproved(admin, msg.sender);
            _admins.add(admin);
        }
    }

    /**
     * @dev See {IAdminControl-revokeAdmin}.
     */
    function revokeAdmin(address admin) external override onlyOwner {
        if (_admins.contains(admin)) {
            emit AdminRevoked(admin, msg.sender);
            _admins.remove(admin);
        }
    }

    /**
     * @dev See {IAdminControl-isAdmin}.
     */
    function isAdmin(address admin) public override view returns (bool) {
        return (owner() == admin || _admins.contains(admin));
    }

}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

// File: contracts/LostChapters.sol


pragma solidity >=0.7.0 <0.9.0;

//@Artist: rodortega.eth
//@Developer: CardoLove.eth


contract LostChapters is ERC721, AdminControl {
    using Strings for uint256;

    uint256 public ashBalance;
    uint256 public ashPrice = 20000000000000000000; // 20 ASH;
    uint256 public ashWLPrice = 15000000000000000000; // 15 ASH;
    address public ashContract = 0x64D91f12Ece7362F91A6f8E7940Cd55F05060b92;

    string private decisionsURI;
    string private phaseOneURI;
    string private routeAURI;
    string private routeBURI;
    string public targetURI;
    uint256 public storyCount;
    bool public mintingActive;
    bool public buildingActive;
    bool public phaseOneActive;
    
    uint256 private _royaltyBps;
    address payable private _royaltyRecipient;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;
    bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6;

    mapping (uint256 => string) private storyURI;
    mapping (string => uint256) public URICount;
    mapping (address => uint256) public minted;
    mapping (address => bool) public whitelisted;

    constructor() ERC721("Lost Chapters", "BOOK") {}
 
    function supportsInterface(bytes4 interfaceId) public view virtual override(AdminControl, ERC721) returns (bool) {
        return interfaceId == type(IERC721Receiver).interfaceId  || ERC721.supportsInterface(interfaceId) 
            || AdminControl.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 
            || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE || interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE;
    }

    function mint(uint256 quantity, address recipient, string memory uri) internal {
        for (uint256 i = 0; i < quantity; i++) {
            _safeMint(recipient, storyCount);
            storyURI[storyCount] = uri;
            minted[recipient]++;
            URICount[uri]++;
            storyCount++;
        }
    }

    // *** Player options ***
    function mintStory(uint256 quantity) external payable {
        require(mintingActive, "Minting is inactive");
        require(quantity > 0 && minted[msg.sender] + quantity <= 4, "Out of minting range");
        uint256 amount = getPrice(msg.sender)*quantity;
        
        IERC20(ashContract).transferFrom(msg.sender, address(this), amount);
        ashBalance += amount;

        uint256 _quantity = calcBonusQuantity(quantity);
        mint(_quantity, msg.sender, ":)");
    }

    function buildStory(uint256 tokenId, bool decision) external {
        require(_exists(tokenId), "ERC721: URI query for nonexistent token");
        require(buildingActive, "Chapter building is inactive");
        require(ownerOf(tokenId) == msg.sender, "You are not the owner of this story");
        require(istargetURI(tokenId), "Your chapter can not be currently built on");
        URICount[storyURI[tokenId]]--;
        if (decision) {
            storyURI[tokenId] = routeAURI;
            URICount[routeAURI]++;
        } else {
            storyURI[tokenId] = routeBURI;
            URICount[routeBURI]++;
        }
    }

    function burnStory(uint256 tokenId) external {
        require(ownerOf(tokenId) == msg.sender);
        _burn(tokenId);
        URICount[storyURI[tokenId]]--;
    }

    // *** View Functions ***   
    function getPrice(address  recipient) public view returns(uint256) {
        return(whitelisted[recipient] ? ashWLPrice : ashPrice);
    }

    function calcBonusQuantity(uint256 quantity) public view returns(uint256) {
        return(minted[msg.sender] + quantity == 4 ? quantity + 1 : quantity);
    }

    function istargetURI(uint256 tokenId) public view returns(bool) {
        string memory a = storyURI[tokenId];
        string memory b = targetURI;
        return(keccak256(abi.encodePacked(a)) == keccak256(abi.encodePacked(b)) ? true : false);
    }

    // *** ADMIN ONLY ***
    function adminMint(address[] calldata addresses, string memory uri, uint256 quantity) external adminRequired {
        for (uint256 i = 0; i < addresses.length; i++) {
            mint(quantity, addresses[i], uri);
        }
    }

    function toggleMinting() external adminRequired {
            mintingActive = !mintingActive;
    }

    function toggleBuilding() external adminRequired {
            buildingActive = !buildingActive;
    }

    function togglePhaseOne() external adminRequired {
            phaseOneActive = !phaseOneActive;
    }

    function openDecisions(string calldata _routeAURI, string calldata _routeBURI, string calldata _targetURI) external adminRequired {
        buildingActive = true;
        routeAURI = _routeAURI;
        routeBURI = _routeBURI;
        targetURI = _targetURI;
    }

    // ** URI **
    function tokenURI(uint256 tokenId) public view override returns(string memory) {
        require(_exists(tokenId), "ERC721: URI query for nonexistent token");
        if (buildingActive || mintingActive) {
            return decisionsURI;
        } else if (phaseOneActive) {
            return phaseOneURI;
        } else {
            return storyURI[tokenId];
        }
    }

    function updateStoryURI(uint256 tokenId, string calldata uri) external adminRequired {
        storyURI[tokenId] = uri;
    }

    function updateDecisionsURI(string calldata uri) external adminRequired {
        decisionsURI = uri;
    }

    function updatePhaseOneURI(string calldata uri) external adminRequired {
        phaseOneURI = uri;
    }

    // *** Whitelist Functions ***
    function addWhitelistAddresses(address[] memory addresses) external adminRequired {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelisted[addresses[i]] = true;
        }
    }

    // *** Royalties ***
    function updateRoyalties(address payable recipient, uint256 bps) external adminRequired {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function royaltyInfo(uint256 value) public view returns (address, uint256) {
        return (_royaltyRecipient, value * _royaltyBps / 10000);
    }

    // *** withdraw ASH from contract ***
    function withdraw(address _tokenContract, uint256 _amount) external adminRequired {
        IERC20(_tokenContract).transfer(msg.sender, _amount);
        if (_tokenContract == ashContract) {
            ashBalance -= _amount;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"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":[{"internalType":"string","name":"","type":"string"}],"name":"URICount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addWhitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"adminMint","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":"admin","type":"address"}],"name":"approveAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ashBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ashContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ashPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ashWLPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"decision","type":"bool"}],"name":"buildStory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buildingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burnStory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"calcBonusQuantity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"istargetURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintStory","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_routeAURI","type":"string"},{"internalType":"string","name":"_routeBURI","type":"string"},{"internalType":"string","name":"_targetURI","type":"string"}],"name":"openDecisions","outputs":[],"stateMutability":"nonpayable","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":"phaseOneActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":[],"name":"storyCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[],"name":"targetURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBuilding","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePhaseOne","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateDecisionsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updatePhaseOneURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"updateStoryURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526801158e460913d00000600a5567d02ab486cedc0000600b557364d91f12ece7362f91a6f8e7940cd55f05060b92600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007f57600080fd5b506040518060400160405280600d81526020017f4c6f7374204368617074657273000000000000000000000000000000000000008152506040518060400160405280600481526020017f424f4f4b000000000000000000000000000000000000000000000000000000008152506200010c620001006200014660201b60201c565b6200014e60201b60201c565b81600190805190602001906200012492919062000212565b5080600290805190602001906200013d92919062000212565b50505062000327565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022090620002c2565b90600052602060002090601f01602090048101928262000244576000855562000290565b82601f106200025f57805160ff191683800117855562000290565b8280016001018555821562000290579182015b828111156200028f57825182559160200191906001019062000272565b5b5090506200029f9190620002a3565b5090565b5b80821115620002be576000816000905550600101620002a4565b5090565b60006002820490506001821680620002db57607f821691505b60208210811415620002f257620002f1620002f8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615cf980620003376000396000f3fe6080604052600436106102c95760003560e01c80636352211e11610175578063b88d4fde116100dc578063d936547e11610095578063ec8b572f1161006f578063ec8b572f14610b29578063f0c3b75814610b40578063f2fde38b14610b5c578063f3fef3a314610b85576102c9565b8063d936547e14610a86578063e5d3d9d714610ac3578063e985e9c514610aec576102c9565b8063b88d4fde1461093f578063bbdbf7d414610968578063bf4dc670146109a5578063c325947d146109e2578063c87b56dd14610a0b578063cef6d36814610a48576102c9565b80638a9a8b6a1161012e5780638a9a8b6a146108415780638cf776041461086a5780638da5cb5b1461089557806395d89b41146108c0578063a22cb465146108eb578063a420ed3e14610914576102c9565b80636352211e146107475780636c2f5acd146107845780636d73e669146107ad57806370a08231146107d6578063715018a6146108135780637d55094d1461082a576102c9565b806321e44f6a1161023457806331f9c919116101ed57806341976e09116101c757806341976e091461068b57806342842e0e146106c8578063454e8054146106f15780634c7e9ecc1461071c576102c9565b806331f9c9191461060c57806333df33631461063757806340548dcb14610660576102c9565b806321e44f6a1461050057806323b872dd1461052957806324d7806c146105525780632c3eebb81461058f5780632d345670146105b857806331ae450b146105e1576102c9565b80630a0a4b38116102865780630a0a4b38146103f25780630e106d60146104095780630e256a5e146104465780630fc94ba71461046f5780631df96c0b146104985780631e7269c5146104c3576102c9565b806301ffc9a7146102ce57806303ac31421461030b57806306fdde0314610336578063076388c014610361578063081812fc1461038c578063095ea7b3146103c9575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906145da565b610bae565b6040516103029190614e38565b60405180910390f35b34801561031757600080fd5b50610320610d25565b60405161032d9190614e53565b60405180910390f35b34801561034257600080fd5b5061034b610db3565b6040516103589190614e53565b60405180910390f35b34801561036d57600080fd5b50610376610e45565b6040516103839190615135565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae919061477e565b610e4b565b6040516103c09190614d4f565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190614494565b610ed0565b005b3480156103fe57600080fd5b50610407610fe8565b005b34801561041557600080fd5b50610430600480360381019061042b919061477e565b6110a4565b60405161043d9190614e38565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190614564565b61123a565b005b34801561047b57600080fd5b50610496600480360381019061049191906147ab565b61135f565b005b3480156104a457600080fd5b506104ad6115ce565b6040516104ba9190614e38565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906142d1565b6115e1565b6040516104f79190615135565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190614634565b6115f9565b005b34801561053557600080fd5b50610550600480360381019061054b919061437e565b61169f565b005b34801561055e57600080fd5b50610579600480360381019061057491906142d1565b6116ff565b6040516105869190614e38565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b191906147eb565b611759565b005b3480156105c457600080fd5b506105df60048036038101906105da91906142d1565b611811565b005b3480156105ed57600080fd5b506105f6611919565b6040516106039190614e16565b60405180910390f35b34801561061857600080fd5b506106216119fb565b60405161062e9190614e38565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190614681565b611a0e565b005b34801561066c57600080fd5b50610675611af7565b6040516106829190615135565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad91906142d1565b611afd565b6040516106bf9190615135565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea919061437e565b611b63565b005b3480156106fd57600080fd5b50610706611b83565b6040516107139190614e38565b60405180910390f35b34801561072857600080fd5b50610731611b96565b60405161073e9190615135565b60405180910390f35b34801561075357600080fd5b5061076e6004803603810190610769919061477e565b611b9c565b60405161077b9190614d4f565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a691906142fe565b611c4e565b005b3480156107b957600080fd5b506107d460048036038101906107cf91906142d1565b611d2a565b005b3480156107e257600080fd5b506107fd60048036038101906107f891906142d1565b611e31565b60405161080a9190615135565b60405180910390f35b34801561081f57600080fd5b50610828611ee9565b005b34801561083657600080fd5b5061083f611f71565b005b34801561084d57600080fd5b506108686004803603810190610863919061477e565b61202d565b005b34801561087657600080fd5b5061087f6120bf565b60405161088c9190615135565b60405180910390f35b3480156108a157600080fd5b506108aa6120c5565b6040516108b79190614d4f565b60405180910390f35b3480156108cc57600080fd5b506108d56120ee565b6040516108e29190614e53565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190614454565b612180565b005b34801561092057600080fd5b50610929612196565b6040516109369190614d4f565b60405180910390f35b34801561094b57600080fd5b50610966600480360381019061096191906143d1565b6121bc565b005b34801561097457600080fd5b5061098f600480360381019061098a9190614735565b61221e565b60405161099c9190615135565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c7919061477e565b61224c565b6040516109d99190615135565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a0491906144d4565b6122bb565b005b348015610a1757600080fd5b50610a326004803603810190610a2d919061477e565b6123a5565b604051610a3f9190614e53565b60405180910390f35b348015610a5457600080fd5b50610a6f6004803603810190610a6a919061477e565b6125f8565b604051610a7d929190614ded565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa891906142d1565b612642565b604051610aba9190614e38565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190614634565b612662565b005b348015610af857600080fd5b50610b136004803603810190610b0e919061433e565b612708565b604051610b209190614e38565b60405180910390f35b348015610b3557600080fd5b50610b3e61279c565b005b610b5a6004803603810190610b55919061477e565b612858565b005b348015610b6857600080fd5b50610b836004803603810190610b7e91906142d1565b612a76565b005b348015610b9157600080fd5b50610bac6004803603810190610ba79190614494565b612b6e565b005b60007f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c215750610c2082612d00565b5b80610c315750610c3082612de2565b5b80610c805750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ccf575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d1e575063bb3bafd660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60118054610d329061549b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5e9061549b565b8015610dab5780601f10610d8057610100808354040283529160200191610dab565b820191906000526020600020905b815481529060010190602001808311610d8e57829003601f168201915b505050505081565b606060018054610dc29061549b565b80601f0160208091040260200160405190810160405280929190818152602001828054610dee9061549b565b8015610e3b5780601f10610e1057610100808354040283529160200191610e3b565b820191906000526020600020905b815481529060010190602001808311610e1e57829003601f168201915b5050505050905090565b600b5481565b6000610e5682612e5c565b610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90615015565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610edb82611b9c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390615075565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f6b612ec8565b73ffffffffffffffffffffffffffffffffffffffff161480610f9a5750610f9981610f94612ec8565b612708565b5b610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090614f95565b60405180910390fd5b610fe38383612ed0565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166110076120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806110395750611038336007612f8990919063ffffffff16565b5b611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f906150d5565b60405180910390fd5b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b6000806016600084815260200190815260200160002080546110c59061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546110f19061549b565b801561113e5780601f106111135761010080835404028352916020019161113e565b820191906000526020600020905b81548152906001019060200180831161112157829003601f168201915b505050505090506000601180546111549061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546111809061549b565b80156111cd5780601f106111a2576101008083540402835291602001916111cd565b820191906000526020600020905b8154815290600101906020018083116111b057829003601f168201915b50505050509050806040516020016111e59190614d21565b604051602081830303815290604052805190602001208260405160200161120c9190614d21565b604051602081830303815290604052805190602001201461122e576000611231565b60015b92505050919050565b3373ffffffffffffffffffffffffffffffffffffffff166112596120c5565b73ffffffffffffffffffffffffffffffffffffffff16148061128b575061128a336007612f8990919063ffffffff16565b5b6112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c1906150d5565b60405180910390fd5b60005b815181101561135b576001601960008484815181106112ef576112ee615603565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611353906154fe565b9150506112cd565b5050565b61136882612e5c565b6113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e90615115565b60405180910390fd5b601360019054906101000a900460ff166113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90615095565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661141683611b9c565b73ffffffffffffffffffffffffffffffffffffffff161461146c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611463906150f5565b60405180910390fd5b611475826110a4565b6114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90614f35565b60405180910390fd5b6017601660008481526020019081526020016000206040516114d69190614d38565b908152602001604051809103902060008154809291906114f590615471565b9190505550801561156757600f601660008481526020019081526020016000209080546115219061549b565b61152c929190613e5e565b506017600f60405161153e9190614d38565b9081526020016040518091039020600081548092919061155d906154fe565b91905055506115ca565b6010601660008481526020019081526020016000209080546115889061549b565b611593929190613e5e565b50601760106040516115a59190614d38565b908152602001604051809103902060008154809291906115c4906154fe565b91905055505b5050565b601360029054906101000a900460ff1681565b60186020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166116186120c5565b73ffffffffffffffffffffffffffffffffffffffff16148061164a5750611649336007612f8990919063ffffffff16565b5b611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906150d5565b60405180910390fd5b8181600e919061169a929190613eeb565b505050565b6116b06116aa612ec8565b82612fb9565b6116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e6906150b5565b60405180910390fd5b6116fa838383613097565b505050565b60008173ffffffffffffffffffffffffffffffffffffffff166117206120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806117525750611751826007612f8990919063ffffffff16565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff166117786120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806117aa57506117a9336007612f8990919063ffffffff16565b5b6117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e0906150d5565b60405180910390fd5b818160166000868152602001908152602001600020919061180b929190613eeb565b50505050565b611819612ec8565b73ffffffffffffffffffffffffffffffffffffffff166118376120c5565b73ffffffffffffffffffffffffffffffffffffffff161461188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490615035565b60405180910390fd5b6118a1816007612f8990919063ffffffff16565b15611916573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a36119148160076132f390919063ffffffff16565b505b50565b60606119256007613323565b67ffffffffffffffff81111561193e5761193d615632565b5b60405190808252806020026020018201604052801561196c5781602001602082028036833780820191505090505b50905060005b61197c6007613323565b8110156119f75761199781600761333890919063ffffffff16565b8282815181106119aa576119a9615603565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806119ef906154fe565b915050611972565b5090565b601360009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16611a2d6120c5565b73ffffffffffffffffffffffffffffffffffffffff161480611a5f5750611a5e336007612f8990919063ffffffff16565b5b611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a95906150d5565b60405180910390fd5b6001601360016101000a81548160ff0219169083151502179055508585600f9190611aca929190613eeb565b50838360109190611adc929190613eeb565b50818160119190611aee929190613eeb565b50505050505050565b60095481565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b5857600a54611b5c565b600b545b9050919050565b611b7e838383604051806020016040528060008152506121bc565b505050565b601360019054906101000a900460ff1681565b60125481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90614fd5565b60405180910390fd5b80915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611c6d6120c5565b73ffffffffffffffffffffffffffffffffffffffff161480611c9f5750611c9e336007612f8990919063ffffffff16565b5b611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd5906150d5565b60405180910390fd5b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806014819055505050565b611d32612ec8565b73ffffffffffffffffffffffffffffffffffffffff16611d506120c5565b73ffffffffffffffffffffffffffffffffffffffff1614611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d90615035565b60405180910390fd5b611dba816007612f8990919063ffffffff16565b611e2e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a3611e2c81600761335290919063ffffffff16565b505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614fb5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ef1612ec8565b73ffffffffffffffffffffffffffffffffffffffff16611f0f6120c5565b73ffffffffffffffffffffffffffffffffffffffff1614611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90615035565b60405180910390fd5b611f6f6000613382565b565b3373ffffffffffffffffffffffffffffffffffffffff16611f906120c5565b73ffffffffffffffffffffffffffffffffffffffff161480611fc25750611fc1336007612f8990919063ffffffff16565b5b612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff8906150d5565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1661204d82611b9c565b73ffffffffffffffffffffffffffffffffffffffff161461206d57600080fd5b61207681613446565b6017601660008381526020019081526020016000206040516120989190614d38565b908152602001604051809103902060008154809291906120b790615471565b919050555050565b600a5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546120fd9061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546121299061549b565b80156121765780601f1061214b57610100808354040283529160200191612176565b820191906000526020600020905b81548152906001019060200180831161215957829003601f168201915b5050505050905090565b61219261218b612ec8565b8383613557565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121cd6121c7612ec8565b83612fb9565b61220c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612203906150b5565b60405180910390fd5b612218848484846136c4565b50505050565b6017818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600482601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461229b9190615294565b146122a657816122b4565b6001826122b39190615294565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff166122da6120c5565b73ffffffffffffffffffffffffffffffffffffffff16148061230c575061230b336007612f8990919063ffffffff16565b5b61234b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612342906150d5565b60405180910390fd5b60005b8484905081101561239e5761238b828686848181106123705761236f615603565b5b905060200201602081019061238591906142d1565b85613720565b8080612396906154fe565b91505061234e565b5050505050565b60606123b082612e5c565b6123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e690615115565b60405180910390fd5b601360019054906101000a900460ff16806124165750601360009054906101000a900460ff165b156124ad57600d80546124289061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546124549061549b565b80156124a15780601f10612476576101008083540402835291602001916124a1565b820191906000526020600020905b81548152906001019060200180831161248457829003601f168201915b505050505090506125f3565b601360029054906101000a900460ff161561255457600e80546124cf9061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546124fb9061549b565b80156125485780601f1061251d57610100808354040283529160200191612548565b820191906000526020600020905b81548152906001019060200180831161252b57829003601f168201915b505050505090506125f3565b6016600083815260200190815260200160002080546125729061549b565b80601f016020809104026020016040519081016040528092919081815260200182805461259e9061549b565b80156125eb5780601f106125c0576101008083540402835291602001916125eb565b820191906000526020600020905b8154815290600101906020018083116125ce57829003601f168201915b505050505090505b919050565b600080601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106014548561262f919061531b565b61263991906152ea565b91509150915091565b60196020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166126816120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806126b357506126b2336007612f8990919063ffffffff16565b5b6126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e9906150d5565b60405180910390fd5b8181600d9190612703929190613eeb565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166127bb6120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806127ed57506127ec336007612f8990919063ffffffff16565b5b61282c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612823906150d5565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b601360009054906101000a900460ff166128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e90614e95565b60405180910390fd5b6000811180156129025750600481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128ff9190615294565b11155b612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293890614f55565b60405180910390fd5b60008161294d33611afd565b612957919061531b565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016129b893929190614d6a565b602060405180830381600087803b1580156129d257600080fd5b505af11580156129e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0a91906145ad565b508060096000828254612a1d9190615294565b925050819055506000612a2f8361224c565b9050612a7181336040518060400160405280600281526020017f3a29000000000000000000000000000000000000000000000000000000000000815250613720565b505050565b612a7e612ec8565b73ffffffffffffffffffffffffffffffffffffffff16612a9c6120c5565b73ffffffffffffffffffffffffffffffffffffffff1614612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae990615035565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5990614eb5565b60405180910390fd5b612b6b81613382565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612b8d6120c5565b73ffffffffffffffffffffffffffffffffffffffff161480612bbf5750612bbe336007612f8990919063ffffffff16565b5b612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf5906150d5565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612c39929190614ded565b602060405180830381600087803b158015612c5357600080fd5b505af1158015612c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8b91906145ad565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cfc578060096000828254612cf49190615375565b925050819055505b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dcb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ddb5750612dda8261381b565b5b9050919050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e555750612e5482612d00565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f4383611b9c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612fb1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613885565b905092915050565b6000612fc482612e5c565b613003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffa90614f75565b60405180910390fd5b600061300e83611b9c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061307d57508373ffffffffffffffffffffffffffffffffffffffff1661306584610e4b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061308e575061308d8185612708565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130b782611b9c565b73ffffffffffffffffffffffffffffffffffffffff161461310d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310490615055565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561317d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317490614ef5565b60405180910390fd5b6131888383836138a8565b613193600082612ed0565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131e39190615375565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461323a9190615294565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061331b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138ad565b905092915050565b6000613331826000016139c1565b9050919050565b600061334783600001836139d2565b60001c905092915050565b600061337a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6139fd565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061345182611b9c565b905061345f816000846138a8565b61346a600083612ed0565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134ba9190615375565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135bd90614f15565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136b79190614e38565b60405180910390a3505050565b6136cf848484613097565b6136db84848484613a6d565b61371a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371190614e75565b60405180910390fd5b50505050565b60005b838110156138155761373783601254613c04565b816016600060125481526020019081526020016000209080519060200190613760929190613f71565b50601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906137b1906154fe565b91905055506017826040516137c69190614d21565b908152602001604051809103902060008154809291906137e5906154fe565b9190505550601260008154809291906137fd906154fe565b9190505550808061380d906154fe565b915050613723565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b600080836001016000848152602001908152602001600020549050600081146139b55760006001826138df9190615375565b90506000600186600001805490506138f79190615375565b905081811461396657600086600001828154811061391857613917615603565b5b906000526020600020015490508087600001848154811061393c5761393b615603565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061397a576139796155d4565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506139bb565b60009150505b92915050565b600081600001805490509050919050565b60008260000182815481106139ea576139e9615603565b5b9060005260206000200154905092915050565b6000613a098383613885565b613a62578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613a67565b600090505b92915050565b6000613a8e8473ffffffffffffffffffffffffffffffffffffffff16613c22565b15613bf7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613ab7612ec8565b8786866040518563ffffffff1660e01b8152600401613ad99493929190614da1565b602060405180830381600087803b158015613af357600080fd5b505af1925050508015613b2457506040513d601f19601f82011682018060405250810190613b219190614607565b60015b613ba7573d8060008114613b54576040519150601f19603f3d011682016040523d82523d6000602084013e613b59565b606091505b50600081511415613b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9690614e75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613bfc565b600190505b949350505050565b613c1e828260405180602001604052806000815250613c35565b5050565b600080823b905060008111915050919050565b613c3f8383613c90565b613c4c6000848484613a6d565b613c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8290614e75565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cf790614ff5565b60405180910390fd5b613d0981612e5c565b15613d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4090614ed5565b60405180910390fd5b613d55600083836138a8565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613da59190615294565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613e6a9061549b565b90600052602060002090601f016020900481019282613e8c5760008555613eda565b82601f10613e9d5780548555613eda565b82800160010185558215613eda57600052602060002091601f016020900482015b82811115613ed9578254825591600101919060010190613ebe565b5b509050613ee79190613ff7565b5090565b828054613ef79061549b565b90600052602060002090601f016020900481019282613f195760008555613f60565b82601f10613f3257803560ff1916838001178555613f60565b82800160010185558215613f60579182015b82811115613f5f578235825591602001919060010190613f44565b5b509050613f6d9190613ff7565b5090565b828054613f7d9061549b565b90600052602060002090601f016020900481019282613f9f5760008555613fe6565b82601f10613fb857805160ff1916838001178555613fe6565b82800160010185558215613fe6579182015b82811115613fe5578251825591602001919060010190613fca565b5b509050613ff39190613ff7565b5090565b5b80821115614010576000816000905550600101613ff8565b5090565b600061402761402284615175565b615150565b9050808382526020820190508285602086028201111561404a5761404961566b565b5b60005b8581101561407a57816140608882614108565b84526020840193506020830192505060018101905061404d565b5050509392505050565b6000614097614092846151a1565b615150565b9050828152602081018484840111156140b3576140b2615670565b5b6140be84828561542f565b509392505050565b60006140d96140d4846151d2565b615150565b9050828152602081018484840111156140f5576140f4615670565b5b61410084828561542f565b509392505050565b60008135905061411781615c50565b92915050565b60008135905061412c81615c67565b92915050565b60008083601f84011261414857614147615666565b5b8235905067ffffffffffffffff81111561416557614164615661565b5b6020830191508360208202830111156141815761418061566b565b5b9250929050565b600082601f83011261419d5761419c615666565b5b81356141ad848260208601614014565b91505092915050565b6000813590506141c581615c7e565b92915050565b6000815190506141da81615c7e565b92915050565b6000813590506141ef81615c95565b92915050565b60008151905061420481615c95565b92915050565b600082601f83011261421f5761421e615666565b5b813561422f848260208601614084565b91505092915050565b60008083601f84011261424e5761424d615666565b5b8235905067ffffffffffffffff81111561426b5761426a615661565b5b6020830191508360018202830111156142875761428661566b565b5b9250929050565b600082601f8301126142a3576142a2615666565b5b81356142b38482602086016140c6565b91505092915050565b6000813590506142cb81615cac565b92915050565b6000602082840312156142e7576142e661567a565b5b60006142f584828501614108565b91505092915050565b600080604083850312156143155761431461567a565b5b60006143238582860161411d565b9250506020614334858286016142bc565b9150509250929050565b600080604083850312156143555761435461567a565b5b600061436385828601614108565b925050602061437485828601614108565b9150509250929050565b6000806000606084860312156143975761439661567a565b5b60006143a586828701614108565b93505060206143b686828701614108565b92505060406143c7868287016142bc565b9150509250925092565b600080600080608085870312156143eb576143ea61567a565b5b60006143f987828801614108565b945050602061440a87828801614108565b935050604061441b878288016142bc565b925050606085013567ffffffffffffffff81111561443c5761443b615675565b5b6144488782880161420a565b91505092959194509250565b6000806040838503121561446b5761446a61567a565b5b600061447985828601614108565b925050602061448a858286016141b6565b9150509250929050565b600080604083850312156144ab576144aa61567a565b5b60006144b985828601614108565b92505060206144ca858286016142bc565b9150509250929050565b600080600080606085870312156144ee576144ed61567a565b5b600085013567ffffffffffffffff81111561450c5761450b615675565b5b61451887828801614132565b9450945050602085013567ffffffffffffffff81111561453b5761453a615675565b5b6145478782880161428e565b9250506040614558878288016142bc565b91505092959194509250565b60006020828403121561457a5761457961567a565b5b600082013567ffffffffffffffff81111561459857614597615675565b5b6145a484828501614188565b91505092915050565b6000602082840312156145c3576145c261567a565b5b60006145d1848285016141cb565b91505092915050565b6000602082840312156145f0576145ef61567a565b5b60006145fe848285016141e0565b91505092915050565b60006020828403121561461d5761461c61567a565b5b600061462b848285016141f5565b91505092915050565b6000806020838503121561464b5761464a61567a565b5b600083013567ffffffffffffffff81111561466957614668615675565b5b61467585828601614238565b92509250509250929050565b6000806000806000806060878903121561469e5761469d61567a565b5b600087013567ffffffffffffffff8111156146bc576146bb615675565b5b6146c889828a01614238565b9650965050602087013567ffffffffffffffff8111156146eb576146ea615675565b5b6146f789828a01614238565b9450945050604087013567ffffffffffffffff81111561471a57614719615675565b5b61472689828a01614238565b92509250509295509295509295565b60006020828403121561474b5761474a61567a565b5b600082013567ffffffffffffffff81111561476957614768615675565b5b6147758482850161428e565b91505092915050565b6000602082840312156147945761479361567a565b5b60006147a2848285016142bc565b91505092915050565b600080604083850312156147c2576147c161567a565b5b60006147d0858286016142bc565b92505060206147e1858286016141b6565b9150509250929050565b6000806000604084860312156148045761480361567a565b5b6000614812868287016142bc565b935050602084013567ffffffffffffffff81111561483357614832615675565b5b61483f86828701614238565b92509250509250925092565b60006148578383614863565b60208301905092915050565b61486c816153a9565b82525050565b61487b816153a9565b82525050565b600061488c82615228565b6148968185615256565b93506148a183615203565b8060005b838110156148d25781516148b9888261484b565b97506148c483615249565b9250506001810190506148a5565b5085935050505092915050565b6148e8816153cd565b82525050565b60006148f982615233565b6149038185615267565b935061491381856020860161543e565b61491c8161567f565b840191505092915050565b60006149328261523e565b61493c8185615278565b935061494c81856020860161543e565b6149558161567f565b840191505092915050565b600061496b8261523e565b6149758185615289565b935061498581856020860161543e565b80840191505092915050565b6000815461499e8161549b565b6149a88186615289565b945060018216600081146149c357600181146149d457614a07565b60ff19831686528186019350614a07565b6149dd85615213565b60005b838110156149ff578154818901526001820191506020810190506149e0565b838801955050505b50505092915050565b6000614a1d603283615278565b9150614a2882615690565b604082019050919050565b6000614a40601383615278565b9150614a4b826156df565b602082019050919050565b6000614a63602683615278565b9150614a6e82615708565b604082019050919050565b6000614a86601c83615278565b9150614a9182615757565b602082019050919050565b6000614aa9602483615278565b9150614ab482615780565b604082019050919050565b6000614acc601983615278565b9150614ad7826157cf565b602082019050919050565b6000614aef602a83615278565b9150614afa826157f8565b604082019050919050565b6000614b12601483615278565b9150614b1d82615847565b602082019050919050565b6000614b35602c83615278565b9150614b4082615870565b604082019050919050565b6000614b58603883615278565b9150614b63826158bf565b604082019050919050565b6000614b7b602a83615278565b9150614b868261590e565b604082019050919050565b6000614b9e602983615278565b9150614ba98261595d565b604082019050919050565b6000614bc1602083615278565b9150614bcc826159ac565b602082019050919050565b6000614be4602c83615278565b9150614bef826159d5565b604082019050919050565b6000614c07602083615278565b9150614c1282615a24565b602082019050919050565b6000614c2a602983615278565b9150614c3582615a4d565b604082019050919050565b6000614c4d602183615278565b9150614c5882615a9c565b604082019050919050565b6000614c70601c83615278565b9150614c7b82615aeb565b602082019050919050565b6000614c93603183615278565b9150614c9e82615b14565b604082019050919050565b6000614cb6602483615278565b9150614cc182615b63565b604082019050919050565b6000614cd9602383615278565b9150614ce482615bb2565b604082019050919050565b6000614cfc602783615278565b9150614d0782615c01565b604082019050919050565b614d1b81615425565b82525050565b6000614d2d8284614960565b915081905092915050565b6000614d448284614991565b915081905092915050565b6000602082019050614d646000830184614872565b92915050565b6000606082019050614d7f6000830186614872565b614d8c6020830185614872565b614d996040830184614d12565b949350505050565b6000608082019050614db66000830187614872565b614dc36020830186614872565b614dd06040830185614d12565b8181036060830152614de281846148ee565b905095945050505050565b6000604082019050614e026000830185614872565b614e0f6020830184614d12565b9392505050565b60006020820190508181036000830152614e308184614881565b905092915050565b6000602082019050614e4d60008301846148df565b92915050565b60006020820190508181036000830152614e6d8184614927565b905092915050565b60006020820190508181036000830152614e8e81614a10565b9050919050565b60006020820190508181036000830152614eae81614a33565b9050919050565b60006020820190508181036000830152614ece81614a56565b9050919050565b60006020820190508181036000830152614eee81614a79565b9050919050565b60006020820190508181036000830152614f0e81614a9c565b9050919050565b60006020820190508181036000830152614f2e81614abf565b9050919050565b60006020820190508181036000830152614f4e81614ae2565b9050919050565b60006020820190508181036000830152614f6e81614b05565b9050919050565b60006020820190508181036000830152614f8e81614b28565b9050919050565b60006020820190508181036000830152614fae81614b4b565b9050919050565b60006020820190508181036000830152614fce81614b6e565b9050919050565b60006020820190508181036000830152614fee81614b91565b9050919050565b6000602082019050818103600083015261500e81614bb4565b9050919050565b6000602082019050818103600083015261502e81614bd7565b9050919050565b6000602082019050818103600083015261504e81614bfa565b9050919050565b6000602082019050818103600083015261506e81614c1d565b9050919050565b6000602082019050818103600083015261508e81614c40565b9050919050565b600060208201905081810360008301526150ae81614c63565b9050919050565b600060208201905081810360008301526150ce81614c86565b9050919050565b600060208201905081810360008301526150ee81614ca9565b9050919050565b6000602082019050818103600083015261510e81614ccc565b9050919050565b6000602082019050818103600083015261512e81614cef565b9050919050565b600060208201905061514a6000830184614d12565b92915050565b600061515a61516b565b905061516682826154cd565b919050565b6000604051905090565b600067ffffffffffffffff8211156151905761518f615632565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151bc576151bb615632565b5b6151c58261567f565b9050602081019050919050565b600067ffffffffffffffff8211156151ed576151ec615632565b5b6151f68261567f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061529f82615425565b91506152aa83615425565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152df576152de615547565b5b828201905092915050565b60006152f582615425565b915061530083615425565b9250826153105761530f615576565b5b828204905092915050565b600061532682615425565b915061533183615425565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561536a57615369615547565b5b828202905092915050565b600061538082615425565b915061538b83615425565b92508282101561539e5761539d615547565b5b828203905092915050565b60006153b482615405565b9050919050565b60006153c682615405565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561545c578082015181840152602081019050615441565b8381111561546b576000848401525b50505050565b600061547c82615425565b915060008214156154905761548f615547565b5b600182039050919050565b600060028204905060018216806154b357607f821691505b602082108114156154c7576154c66155a5565b5b50919050565b6154d68261567f565b810181811067ffffffffffffffff821117156154f5576154f4615632565b5b80604052505050565b600061550982615425565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561553c5761553b615547565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74696e6720697320696e61637469766500000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f757220636861707465722063616e206e6f742062652063757272656e746c60008201527f79206275696c74206f6e00000000000000000000000000000000000000000000602082015250565b7f4f7574206f66206d696e74696e672072616e6765000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43686170746572206275696c64696e6720697320696e61637469766500000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320737460008201527f6f72790000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2055524920717565727920666f72206e6f6e6578697374656e60008201527f7420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b615c59816153a9565b8114615c6457600080fd5b50565b615c70816153bb565b8114615c7b57600080fd5b50565b615c87816153cd565b8114615c9257600080fd5b50565b615c9e816153d9565b8114615ca957600080fd5b50565b615cb581615425565b8114615cc057600080fd5b5056fea264697066735822122097e12ad8d8450428fc5ef8029ef6b7c6218b2a0c1aa04778cc923631f4019ac064736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102c95760003560e01c80636352211e11610175578063b88d4fde116100dc578063d936547e11610095578063ec8b572f1161006f578063ec8b572f14610b29578063f0c3b75814610b40578063f2fde38b14610b5c578063f3fef3a314610b85576102c9565b8063d936547e14610a86578063e5d3d9d714610ac3578063e985e9c514610aec576102c9565b8063b88d4fde1461093f578063bbdbf7d414610968578063bf4dc670146109a5578063c325947d146109e2578063c87b56dd14610a0b578063cef6d36814610a48576102c9565b80638a9a8b6a1161012e5780638a9a8b6a146108415780638cf776041461086a5780638da5cb5b1461089557806395d89b41146108c0578063a22cb465146108eb578063a420ed3e14610914576102c9565b80636352211e146107475780636c2f5acd146107845780636d73e669146107ad57806370a08231146107d6578063715018a6146108135780637d55094d1461082a576102c9565b806321e44f6a1161023457806331f9c919116101ed57806341976e09116101c757806341976e091461068b57806342842e0e146106c8578063454e8054146106f15780634c7e9ecc1461071c576102c9565b806331f9c9191461060c57806333df33631461063757806340548dcb14610660576102c9565b806321e44f6a1461050057806323b872dd1461052957806324d7806c146105525780632c3eebb81461058f5780632d345670146105b857806331ae450b146105e1576102c9565b80630a0a4b38116102865780630a0a4b38146103f25780630e106d60146104095780630e256a5e146104465780630fc94ba71461046f5780631df96c0b146104985780631e7269c5146104c3576102c9565b806301ffc9a7146102ce57806303ac31421461030b57806306fdde0314610336578063076388c014610361578063081812fc1461038c578063095ea7b3146103c9575b600080fd5b3480156102da57600080fd5b506102f560048036038101906102f091906145da565b610bae565b6040516103029190614e38565b60405180910390f35b34801561031757600080fd5b50610320610d25565b60405161032d9190614e53565b60405180910390f35b34801561034257600080fd5b5061034b610db3565b6040516103589190614e53565b60405180910390f35b34801561036d57600080fd5b50610376610e45565b6040516103839190615135565b60405180910390f35b34801561039857600080fd5b506103b360048036038101906103ae919061477e565b610e4b565b6040516103c09190614d4f565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190614494565b610ed0565b005b3480156103fe57600080fd5b50610407610fe8565b005b34801561041557600080fd5b50610430600480360381019061042b919061477e565b6110a4565b60405161043d9190614e38565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190614564565b61123a565b005b34801561047b57600080fd5b50610496600480360381019061049191906147ab565b61135f565b005b3480156104a457600080fd5b506104ad6115ce565b6040516104ba9190614e38565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906142d1565b6115e1565b6040516104f79190615135565b60405180910390f35b34801561050c57600080fd5b5061052760048036038101906105229190614634565b6115f9565b005b34801561053557600080fd5b50610550600480360381019061054b919061437e565b61169f565b005b34801561055e57600080fd5b50610579600480360381019061057491906142d1565b6116ff565b6040516105869190614e38565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b191906147eb565b611759565b005b3480156105c457600080fd5b506105df60048036038101906105da91906142d1565b611811565b005b3480156105ed57600080fd5b506105f6611919565b6040516106039190614e16565b60405180910390f35b34801561061857600080fd5b506106216119fb565b60405161062e9190614e38565b60405180910390f35b34801561064357600080fd5b5061065e60048036038101906106599190614681565b611a0e565b005b34801561066c57600080fd5b50610675611af7565b6040516106829190615135565b60405180910390f35b34801561069757600080fd5b506106b260048036038101906106ad91906142d1565b611afd565b6040516106bf9190615135565b60405180910390f35b3480156106d457600080fd5b506106ef60048036038101906106ea919061437e565b611b63565b005b3480156106fd57600080fd5b50610706611b83565b6040516107139190614e38565b60405180910390f35b34801561072857600080fd5b50610731611b96565b60405161073e9190615135565b60405180910390f35b34801561075357600080fd5b5061076e6004803603810190610769919061477e565b611b9c565b60405161077b9190614d4f565b60405180910390f35b34801561079057600080fd5b506107ab60048036038101906107a691906142fe565b611c4e565b005b3480156107b957600080fd5b506107d460048036038101906107cf91906142d1565b611d2a565b005b3480156107e257600080fd5b506107fd60048036038101906107f891906142d1565b611e31565b60405161080a9190615135565b60405180910390f35b34801561081f57600080fd5b50610828611ee9565b005b34801561083657600080fd5b5061083f611f71565b005b34801561084d57600080fd5b506108686004803603810190610863919061477e565b61202d565b005b34801561087657600080fd5b5061087f6120bf565b60405161088c9190615135565b60405180910390f35b3480156108a157600080fd5b506108aa6120c5565b6040516108b79190614d4f565b60405180910390f35b3480156108cc57600080fd5b506108d56120ee565b6040516108e29190614e53565b60405180910390f35b3480156108f757600080fd5b50610912600480360381019061090d9190614454565b612180565b005b34801561092057600080fd5b50610929612196565b6040516109369190614d4f565b60405180910390f35b34801561094b57600080fd5b50610966600480360381019061096191906143d1565b6121bc565b005b34801561097457600080fd5b5061098f600480360381019061098a9190614735565b61221e565b60405161099c9190615135565b60405180910390f35b3480156109b157600080fd5b506109cc60048036038101906109c7919061477e565b61224c565b6040516109d99190615135565b60405180910390f35b3480156109ee57600080fd5b50610a096004803603810190610a0491906144d4565b6122bb565b005b348015610a1757600080fd5b50610a326004803603810190610a2d919061477e565b6123a5565b604051610a3f9190614e53565b60405180910390f35b348015610a5457600080fd5b50610a6f6004803603810190610a6a919061477e565b6125f8565b604051610a7d929190614ded565b60405180910390f35b348015610a9257600080fd5b50610aad6004803603810190610aa891906142d1565b612642565b604051610aba9190614e38565b60405180910390f35b348015610acf57600080fd5b50610aea6004803603810190610ae59190614634565b612662565b005b348015610af857600080fd5b50610b136004803603810190610b0e919061433e565b612708565b604051610b209190614e38565b60405180910390f35b348015610b3557600080fd5b50610b3e61279c565b005b610b5a6004803603810190610b55919061477e565b612858565b005b348015610b6857600080fd5b50610b836004803603810190610b7e91906142d1565b612a76565b005b348015610b9157600080fd5b50610bac6004803603810190610ba79190614494565b612b6e565b005b60007f150b7a02000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c215750610c2082612d00565b5b80610c315750610c3082612de2565b5b80610c805750632a55205a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ccf575063b779958460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d1e575063bb3bafd660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60118054610d329061549b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d5e9061549b565b8015610dab5780601f10610d8057610100808354040283529160200191610dab565b820191906000526020600020905b815481529060010190602001808311610d8e57829003601f168201915b505050505081565b606060018054610dc29061549b565b80601f0160208091040260200160405190810160405280929190818152602001828054610dee9061549b565b8015610e3b5780601f10610e1057610100808354040283529160200191610e3b565b820191906000526020600020905b815481529060010190602001808311610e1e57829003601f168201915b5050505050905090565b600b5481565b6000610e5682612e5c565b610e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8c90615015565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610edb82611b9c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4390615075565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610f6b612ec8565b73ffffffffffffffffffffffffffffffffffffffff161480610f9a5750610f9981610f94612ec8565b612708565b5b610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090614f95565b60405180910390fd5b610fe38383612ed0565b505050565b3373ffffffffffffffffffffffffffffffffffffffff166110076120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806110395750611038336007612f8990919063ffffffff16565b5b611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f906150d5565b60405180910390fd5b601360029054906101000a900460ff1615601360026101000a81548160ff021916908315150217905550565b6000806016600084815260200190815260200160002080546110c59061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546110f19061549b565b801561113e5780601f106111135761010080835404028352916020019161113e565b820191906000526020600020905b81548152906001019060200180831161112157829003601f168201915b505050505090506000601180546111549061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546111809061549b565b80156111cd5780601f106111a2576101008083540402835291602001916111cd565b820191906000526020600020905b8154815290600101906020018083116111b057829003601f168201915b50505050509050806040516020016111e59190614d21565b604051602081830303815290604052805190602001208260405160200161120c9190614d21565b604051602081830303815290604052805190602001201461122e576000611231565b60015b92505050919050565b3373ffffffffffffffffffffffffffffffffffffffff166112596120c5565b73ffffffffffffffffffffffffffffffffffffffff16148061128b575061128a336007612f8990919063ffffffff16565b5b6112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c1906150d5565b60405180910390fd5b60005b815181101561135b576001601960008484815181106112ef576112ee615603565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611353906154fe565b9150506112cd565b5050565b61136882612e5c565b6113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e90615115565b60405180910390fd5b601360019054906101000a900460ff166113f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ed90615095565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff1661141683611b9c565b73ffffffffffffffffffffffffffffffffffffffff161461146c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611463906150f5565b60405180910390fd5b611475826110a4565b6114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab90614f35565b60405180910390fd5b6017601660008481526020019081526020016000206040516114d69190614d38565b908152602001604051809103902060008154809291906114f590615471565b9190505550801561156757600f601660008481526020019081526020016000209080546115219061549b565b61152c929190613e5e565b506017600f60405161153e9190614d38565b9081526020016040518091039020600081548092919061155d906154fe565b91905055506115ca565b6010601660008481526020019081526020016000209080546115889061549b565b611593929190613e5e565b50601760106040516115a59190614d38565b908152602001604051809103902060008154809291906115c4906154fe565b91905055505b5050565b601360029054906101000a900460ff1681565b60186020528060005260406000206000915090505481565b3373ffffffffffffffffffffffffffffffffffffffff166116186120c5565b73ffffffffffffffffffffffffffffffffffffffff16148061164a5750611649336007612f8990919063ffffffff16565b5b611689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611680906150d5565b60405180910390fd5b8181600e919061169a929190613eeb565b505050565b6116b06116aa612ec8565b82612fb9565b6116ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e6906150b5565b60405180910390fd5b6116fa838383613097565b505050565b60008173ffffffffffffffffffffffffffffffffffffffff166117206120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806117525750611751826007612f8990919063ffffffff16565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff166117786120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806117aa57506117a9336007612f8990919063ffffffff16565b5b6117e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e0906150d5565b60405180910390fd5b818160166000868152602001908152602001600020919061180b929190613eeb565b50505050565b611819612ec8565b73ffffffffffffffffffffffffffffffffffffffff166118376120c5565b73ffffffffffffffffffffffffffffffffffffffff161461188d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188490615035565b60405180910390fd5b6118a1816007612f8990919063ffffffff16565b15611916573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d560405160405180910390a36119148160076132f390919063ffffffff16565b505b50565b60606119256007613323565b67ffffffffffffffff81111561193e5761193d615632565b5b60405190808252806020026020018201604052801561196c5781602001602082028036833780820191505090505b50905060005b61197c6007613323565b8110156119f75761199781600761333890919063ffffffff16565b8282815181106119aa576119a9615603565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080806119ef906154fe565b915050611972565b5090565b601360009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16611a2d6120c5565b73ffffffffffffffffffffffffffffffffffffffff161480611a5f5750611a5e336007612f8990919063ffffffff16565b5b611a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a95906150d5565b60405180910390fd5b6001601360016101000a81548160ff0219169083151502179055508585600f9190611aca929190613eeb565b50838360109190611adc929190613eeb565b50818160119190611aee929190613eeb565b50505050505050565b60095481565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611b5857600a54611b5c565b600b545b9050919050565b611b7e838383604051806020016040528060008152506121bc565b505050565b601360019054906101000a900460ff1681565b60125481565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3c90614fd5565b60405180910390fd5b80915050919050565b3373ffffffffffffffffffffffffffffffffffffffff16611c6d6120c5565b73ffffffffffffffffffffffffffffffffffffffff161480611c9f5750611c9e336007612f8990919063ffffffff16565b5b611cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd5906150d5565b60405180910390fd5b81601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806014819055505050565b611d32612ec8565b73ffffffffffffffffffffffffffffffffffffffff16611d506120c5565b73ffffffffffffffffffffffffffffffffffffffff1614611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d90615035565b60405180910390fd5b611dba816007612f8990919063ffffffff16565b611e2e573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb160405160405180910390a3611e2c81600761335290919063ffffffff16565b505b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614fb5565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611ef1612ec8565b73ffffffffffffffffffffffffffffffffffffffff16611f0f6120c5565b73ffffffffffffffffffffffffffffffffffffffff1614611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c90615035565b60405180910390fd5b611f6f6000613382565b565b3373ffffffffffffffffffffffffffffffffffffffff16611f906120c5565b73ffffffffffffffffffffffffffffffffffffffff161480611fc25750611fc1336007612f8990919063ffffffff16565b5b612001576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff8906150d5565b60405180910390fd5b601360009054906101000a900460ff1615601360006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff1661204d82611b9c565b73ffffffffffffffffffffffffffffffffffffffff161461206d57600080fd5b61207681613446565b6017601660008381526020019081526020016000206040516120989190614d38565b908152602001604051809103902060008154809291906120b790615471565b919050555050565b600a5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600280546120fd9061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546121299061549b565b80156121765780601f1061214b57610100808354040283529160200191612176565b820191906000526020600020905b81548152906001019060200180831161215957829003601f168201915b5050505050905090565b61219261218b612ec8565b8383613557565b5050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121cd6121c7612ec8565b83612fb9565b61220c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612203906150b5565b60405180910390fd5b612218848484846136c4565b50505050565b6017818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6000600482601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461229b9190615294565b146122a657816122b4565b6001826122b39190615294565b5b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff166122da6120c5565b73ffffffffffffffffffffffffffffffffffffffff16148061230c575061230b336007612f8990919063ffffffff16565b5b61234b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612342906150d5565b60405180910390fd5b60005b8484905081101561239e5761238b828686848181106123705761236f615603565b5b905060200201602081019061238591906142d1565b85613720565b8080612396906154fe565b91505061234e565b5050505050565b60606123b082612e5c565b6123ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e690615115565b60405180910390fd5b601360019054906101000a900460ff16806124165750601360009054906101000a900460ff165b156124ad57600d80546124289061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546124549061549b565b80156124a15780601f10612476576101008083540402835291602001916124a1565b820191906000526020600020905b81548152906001019060200180831161248457829003601f168201915b505050505090506125f3565b601360029054906101000a900460ff161561255457600e80546124cf9061549b565b80601f01602080910402602001604051908101604052809291908181526020018280546124fb9061549b565b80156125485780601f1061251d57610100808354040283529160200191612548565b820191906000526020600020905b81548152906001019060200180831161252b57829003601f168201915b505050505090506125f3565b6016600083815260200190815260200160002080546125729061549b565b80601f016020809104026020016040519081016040528092919081815260200182805461259e9061549b565b80156125eb5780601f106125c0576101008083540402835291602001916125eb565b820191906000526020600020905b8154815290600101906020018083116125ce57829003601f168201915b505050505090505b919050565b600080601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106014548561262f919061531b565b61263991906152ea565b91509150915091565b60196020528060005260406000206000915054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff166126816120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806126b357506126b2336007612f8990919063ffffffff16565b5b6126f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e9906150d5565b60405180910390fd5b8181600d9190612703929190613eeb565b505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff166127bb6120c5565b73ffffffffffffffffffffffffffffffffffffffff1614806127ed57506127ec336007612f8990919063ffffffff16565b5b61282c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612823906150d5565b60405180910390fd5b601360019054906101000a900460ff1615601360016101000a81548160ff021916908315150217905550565b601360009054906101000a900460ff166128a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289e90614e95565b60405180910390fd5b6000811180156129025750600481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546128ff9190615294565b11155b612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293890614f55565b60405180910390fd5b60008161294d33611afd565b612957919061531b565b9050600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b81526004016129b893929190614d6a565b602060405180830381600087803b1580156129d257600080fd5b505af11580156129e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a0a91906145ad565b508060096000828254612a1d9190615294565b925050819055506000612a2f8361224c565b9050612a7181336040518060400160405280600281526020017f3a29000000000000000000000000000000000000000000000000000000000000815250613720565b505050565b612a7e612ec8565b73ffffffffffffffffffffffffffffffffffffffff16612a9c6120c5565b73ffffffffffffffffffffffffffffffffffffffff1614612af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae990615035565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5990614eb5565b60405180910390fd5b612b6b81613382565b50565b3373ffffffffffffffffffffffffffffffffffffffff16612b8d6120c5565b73ffffffffffffffffffffffffffffffffffffffff161480612bbf5750612bbe336007612f8990919063ffffffff16565b5b612bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf5906150d5565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401612c39929190614ded565b602060405180830381600087803b158015612c5357600080fd5b505af1158015612c67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8b91906145ad565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612cfc578060096000828254612cf49190615375565b925050819055505b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612dcb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ddb5750612dda8261381b565b5b9050919050565b60007f553e757e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e555750612e5482612d00565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612f4383611b9c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000612fb1836000018373ffffffffffffffffffffffffffffffffffffffff1660001b613885565b905092915050565b6000612fc482612e5c565b613003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ffa90614f75565b60405180910390fd5b600061300e83611b9c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061307d57508373ffffffffffffffffffffffffffffffffffffffff1661306584610e4b565b73ffffffffffffffffffffffffffffffffffffffff16145b8061308e575061308d8185612708565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130b782611b9c565b73ffffffffffffffffffffffffffffffffffffffff161461310d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310490615055565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561317d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317490614ef5565b60405180910390fd5b6131888383836138a8565b613193600082612ed0565b6001600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131e39190615375565b925050819055506001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461323a9190615294565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061331b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6138ad565b905092915050565b6000613331826000016139c1565b9050919050565b600061334783600001836139d2565b60001c905092915050565b600061337a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6139fd565b905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600061345182611b9c565b905061345f816000846138a8565b61346a600083612ed0565b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134ba9190615375565b925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156135c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135bd90614f15565b60405180910390fd5b80600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516136b79190614e38565b60405180910390a3505050565b6136cf848484613097565b6136db84848484613a6d565b61371a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161371190614e75565b60405180910390fd5b50505050565b60005b838110156138155761373783601254613c04565b816016600060125481526020019081526020016000209080519060200190613760929190613f71565b50601860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906137b1906154fe565b91905055506017826040516137c69190614d21565b908152602001604051809103902060008154809291906137e5906154fe565b9190505550601260008154809291906137fd906154fe565b9190505550808061380d906154fe565b915050613723565b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b600080836001016000848152602001908152602001600020549050600081146139b55760006001826138df9190615375565b90506000600186600001805490506138f79190615375565b905081811461396657600086600001828154811061391857613917615603565b5b906000526020600020015490508087600001848154811061393c5761393b615603565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b8560000180548061397a576139796155d4565b5b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506139bb565b60009150505b92915050565b600081600001805490509050919050565b60008260000182815481106139ea576139e9615603565b5b9060005260206000200154905092915050565b6000613a098383613885565b613a62578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613a67565b600090505b92915050565b6000613a8e8473ffffffffffffffffffffffffffffffffffffffff16613c22565b15613bf7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613ab7612ec8565b8786866040518563ffffffff1660e01b8152600401613ad99493929190614da1565b602060405180830381600087803b158015613af357600080fd5b505af1925050508015613b2457506040513d601f19601f82011682018060405250810190613b219190614607565b60015b613ba7573d8060008114613b54576040519150601f19603f3d011682016040523d82523d6000602084013e613b59565b606091505b50600081511415613b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b9690614e75565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613bfc565b600190505b949350505050565b613c1e828260405180602001604052806000815250613c35565b5050565b600080823b905060008111915050919050565b613c3f8383613c90565b613c4c6000848484613a6d565b613c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c8290614e75565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cf790614ff5565b60405180910390fd5b613d0981612e5c565b15613d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4090614ed5565b60405180910390fd5b613d55600083836138a8565b6001600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613da59190615294565b92505081905550816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054613e6a9061549b565b90600052602060002090601f016020900481019282613e8c5760008555613eda565b82601f10613e9d5780548555613eda565b82800160010185558215613eda57600052602060002091601f016020900482015b82811115613ed9578254825591600101919060010190613ebe565b5b509050613ee79190613ff7565b5090565b828054613ef79061549b565b90600052602060002090601f016020900481019282613f195760008555613f60565b82601f10613f3257803560ff1916838001178555613f60565b82800160010185558215613f60579182015b82811115613f5f578235825591602001919060010190613f44565b5b509050613f6d9190613ff7565b5090565b828054613f7d9061549b565b90600052602060002090601f016020900481019282613f9f5760008555613fe6565b82601f10613fb857805160ff1916838001178555613fe6565b82800160010185558215613fe6579182015b82811115613fe5578251825591602001919060010190613fca565b5b509050613ff39190613ff7565b5090565b5b80821115614010576000816000905550600101613ff8565b5090565b600061402761402284615175565b615150565b9050808382526020820190508285602086028201111561404a5761404961566b565b5b60005b8581101561407a57816140608882614108565b84526020840193506020830192505060018101905061404d565b5050509392505050565b6000614097614092846151a1565b615150565b9050828152602081018484840111156140b3576140b2615670565b5b6140be84828561542f565b509392505050565b60006140d96140d4846151d2565b615150565b9050828152602081018484840111156140f5576140f4615670565b5b61410084828561542f565b509392505050565b60008135905061411781615c50565b92915050565b60008135905061412c81615c67565b92915050565b60008083601f84011261414857614147615666565b5b8235905067ffffffffffffffff81111561416557614164615661565b5b6020830191508360208202830111156141815761418061566b565b5b9250929050565b600082601f83011261419d5761419c615666565b5b81356141ad848260208601614014565b91505092915050565b6000813590506141c581615c7e565b92915050565b6000815190506141da81615c7e565b92915050565b6000813590506141ef81615c95565b92915050565b60008151905061420481615c95565b92915050565b600082601f83011261421f5761421e615666565b5b813561422f848260208601614084565b91505092915050565b60008083601f84011261424e5761424d615666565b5b8235905067ffffffffffffffff81111561426b5761426a615661565b5b6020830191508360018202830111156142875761428661566b565b5b9250929050565b600082601f8301126142a3576142a2615666565b5b81356142b38482602086016140c6565b91505092915050565b6000813590506142cb81615cac565b92915050565b6000602082840312156142e7576142e661567a565b5b60006142f584828501614108565b91505092915050565b600080604083850312156143155761431461567a565b5b60006143238582860161411d565b9250506020614334858286016142bc565b9150509250929050565b600080604083850312156143555761435461567a565b5b600061436385828601614108565b925050602061437485828601614108565b9150509250929050565b6000806000606084860312156143975761439661567a565b5b60006143a586828701614108565b93505060206143b686828701614108565b92505060406143c7868287016142bc565b9150509250925092565b600080600080608085870312156143eb576143ea61567a565b5b60006143f987828801614108565b945050602061440a87828801614108565b935050604061441b878288016142bc565b925050606085013567ffffffffffffffff81111561443c5761443b615675565b5b6144488782880161420a565b91505092959194509250565b6000806040838503121561446b5761446a61567a565b5b600061447985828601614108565b925050602061448a858286016141b6565b9150509250929050565b600080604083850312156144ab576144aa61567a565b5b60006144b985828601614108565b92505060206144ca858286016142bc565b9150509250929050565b600080600080606085870312156144ee576144ed61567a565b5b600085013567ffffffffffffffff81111561450c5761450b615675565b5b61451887828801614132565b9450945050602085013567ffffffffffffffff81111561453b5761453a615675565b5b6145478782880161428e565b9250506040614558878288016142bc565b91505092959194509250565b60006020828403121561457a5761457961567a565b5b600082013567ffffffffffffffff81111561459857614597615675565b5b6145a484828501614188565b91505092915050565b6000602082840312156145c3576145c261567a565b5b60006145d1848285016141cb565b91505092915050565b6000602082840312156145f0576145ef61567a565b5b60006145fe848285016141e0565b91505092915050565b60006020828403121561461d5761461c61567a565b5b600061462b848285016141f5565b91505092915050565b6000806020838503121561464b5761464a61567a565b5b600083013567ffffffffffffffff81111561466957614668615675565b5b61467585828601614238565b92509250509250929050565b6000806000806000806060878903121561469e5761469d61567a565b5b600087013567ffffffffffffffff8111156146bc576146bb615675565b5b6146c889828a01614238565b9650965050602087013567ffffffffffffffff8111156146eb576146ea615675565b5b6146f789828a01614238565b9450945050604087013567ffffffffffffffff81111561471a57614719615675565b5b61472689828a01614238565b92509250509295509295509295565b60006020828403121561474b5761474a61567a565b5b600082013567ffffffffffffffff81111561476957614768615675565b5b6147758482850161428e565b91505092915050565b6000602082840312156147945761479361567a565b5b60006147a2848285016142bc565b91505092915050565b600080604083850312156147c2576147c161567a565b5b60006147d0858286016142bc565b92505060206147e1858286016141b6565b9150509250929050565b6000806000604084860312156148045761480361567a565b5b6000614812868287016142bc565b935050602084013567ffffffffffffffff81111561483357614832615675565b5b61483f86828701614238565b92509250509250925092565b60006148578383614863565b60208301905092915050565b61486c816153a9565b82525050565b61487b816153a9565b82525050565b600061488c82615228565b6148968185615256565b93506148a183615203565b8060005b838110156148d25781516148b9888261484b565b97506148c483615249565b9250506001810190506148a5565b5085935050505092915050565b6148e8816153cd565b82525050565b60006148f982615233565b6149038185615267565b935061491381856020860161543e565b61491c8161567f565b840191505092915050565b60006149328261523e565b61493c8185615278565b935061494c81856020860161543e565b6149558161567f565b840191505092915050565b600061496b8261523e565b6149758185615289565b935061498581856020860161543e565b80840191505092915050565b6000815461499e8161549b565b6149a88186615289565b945060018216600081146149c357600181146149d457614a07565b60ff19831686528186019350614a07565b6149dd85615213565b60005b838110156149ff578154818901526001820191506020810190506149e0565b838801955050505b50505092915050565b6000614a1d603283615278565b9150614a2882615690565b604082019050919050565b6000614a40601383615278565b9150614a4b826156df565b602082019050919050565b6000614a63602683615278565b9150614a6e82615708565b604082019050919050565b6000614a86601c83615278565b9150614a9182615757565b602082019050919050565b6000614aa9602483615278565b9150614ab482615780565b604082019050919050565b6000614acc601983615278565b9150614ad7826157cf565b602082019050919050565b6000614aef602a83615278565b9150614afa826157f8565b604082019050919050565b6000614b12601483615278565b9150614b1d82615847565b602082019050919050565b6000614b35602c83615278565b9150614b4082615870565b604082019050919050565b6000614b58603883615278565b9150614b63826158bf565b604082019050919050565b6000614b7b602a83615278565b9150614b868261590e565b604082019050919050565b6000614b9e602983615278565b9150614ba98261595d565b604082019050919050565b6000614bc1602083615278565b9150614bcc826159ac565b602082019050919050565b6000614be4602c83615278565b9150614bef826159d5565b604082019050919050565b6000614c07602083615278565b9150614c1282615a24565b602082019050919050565b6000614c2a602983615278565b9150614c3582615a4d565b604082019050919050565b6000614c4d602183615278565b9150614c5882615a9c565b604082019050919050565b6000614c70601c83615278565b9150614c7b82615aeb565b602082019050919050565b6000614c93603183615278565b9150614c9e82615b14565b604082019050919050565b6000614cb6602483615278565b9150614cc182615b63565b604082019050919050565b6000614cd9602383615278565b9150614ce482615bb2565b604082019050919050565b6000614cfc602783615278565b9150614d0782615c01565b604082019050919050565b614d1b81615425565b82525050565b6000614d2d8284614960565b915081905092915050565b6000614d448284614991565b915081905092915050565b6000602082019050614d646000830184614872565b92915050565b6000606082019050614d7f6000830186614872565b614d8c6020830185614872565b614d996040830184614d12565b949350505050565b6000608082019050614db66000830187614872565b614dc36020830186614872565b614dd06040830185614d12565b8181036060830152614de281846148ee565b905095945050505050565b6000604082019050614e026000830185614872565b614e0f6020830184614d12565b9392505050565b60006020820190508181036000830152614e308184614881565b905092915050565b6000602082019050614e4d60008301846148df565b92915050565b60006020820190508181036000830152614e6d8184614927565b905092915050565b60006020820190508181036000830152614e8e81614a10565b9050919050565b60006020820190508181036000830152614eae81614a33565b9050919050565b60006020820190508181036000830152614ece81614a56565b9050919050565b60006020820190508181036000830152614eee81614a79565b9050919050565b60006020820190508181036000830152614f0e81614a9c565b9050919050565b60006020820190508181036000830152614f2e81614abf565b9050919050565b60006020820190508181036000830152614f4e81614ae2565b9050919050565b60006020820190508181036000830152614f6e81614b05565b9050919050565b60006020820190508181036000830152614f8e81614b28565b9050919050565b60006020820190508181036000830152614fae81614b4b565b9050919050565b60006020820190508181036000830152614fce81614b6e565b9050919050565b60006020820190508181036000830152614fee81614b91565b9050919050565b6000602082019050818103600083015261500e81614bb4565b9050919050565b6000602082019050818103600083015261502e81614bd7565b9050919050565b6000602082019050818103600083015261504e81614bfa565b9050919050565b6000602082019050818103600083015261506e81614c1d565b9050919050565b6000602082019050818103600083015261508e81614c40565b9050919050565b600060208201905081810360008301526150ae81614c63565b9050919050565b600060208201905081810360008301526150ce81614c86565b9050919050565b600060208201905081810360008301526150ee81614ca9565b9050919050565b6000602082019050818103600083015261510e81614ccc565b9050919050565b6000602082019050818103600083015261512e81614cef565b9050919050565b600060208201905061514a6000830184614d12565b92915050565b600061515a61516b565b905061516682826154cd565b919050565b6000604051905090565b600067ffffffffffffffff8211156151905761518f615632565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156151bc576151bb615632565b5b6151c58261567f565b9050602081019050919050565b600067ffffffffffffffff8211156151ed576151ec615632565b5b6151f68261567f565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061529f82615425565b91506152aa83615425565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156152df576152de615547565b5b828201905092915050565b60006152f582615425565b915061530083615425565b9250826153105761530f615576565b5b828204905092915050565b600061532682615425565b915061533183615425565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561536a57615369615547565b5b828202905092915050565b600061538082615425565b915061538b83615425565b92508282101561539e5761539d615547565b5b828203905092915050565b60006153b482615405565b9050919050565b60006153c682615405565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561545c578082015181840152602081019050615441565b8381111561546b576000848401525b50505050565b600061547c82615425565b915060008214156154905761548f615547565b5b600182039050919050565b600060028204905060018216806154b357607f821691505b602082108114156154c7576154c66155a5565b5b50919050565b6154d68261567f565b810181811067ffffffffffffffff821117156154f5576154f4615632565b5b80604052505050565b600061550982615425565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561553c5761553b615547565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d696e74696e6720697320696e61637469766500000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f596f757220636861707465722063616e206e6f742062652063757272656e746c60008201527f79206275696c74206f6e00000000000000000000000000000000000000000000602082015250565b7f4f7574206f66206d696e74696e672072616e6765000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f43686170746572206275696c64696e6720697320696e61637469766500000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f72206160008201527f646d696e00000000000000000000000000000000000000000000000000000000602082015250565b7f596f7520617265206e6f7420746865206f776e6572206f66207468697320737460008201527f6f72790000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2055524920717565727920666f72206e6f6e6578697374656e60008201527f7420746f6b656e00000000000000000000000000000000000000000000000000602082015250565b615c59816153a9565b8114615c6457600080fd5b50565b615c70816153bb565b8114615c7b57600080fd5b50565b615c87816153cd565b8114615c9257600080fd5b50565b615c9e816153d9565b8114615ca957600080fd5b50565b615cb581615425565b8114615cc057600080fd5b5056fea264697066735822122097e12ad8d8450428fc5ef8029ef6b7c6218b2a0c1aa04778cc923631f4019ac064736f6c63430008070033

Deployed Bytecode Sourcemap

54793:6525:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55990:458;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55251:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43163:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54976:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44722:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44245:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59252:104;;;;;;;;;;;;;:::i;:::-;;58500:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60457:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57322:643;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55378:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55831:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60306:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45472:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35005:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60054:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34727:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34105:267;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55313:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59364:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54880:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58183:140;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45882:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55345:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55281:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42857:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60697:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34445:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42587:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20236:103;;;;;;;;;;;;;:::i;:::-;;59031:101;;;;;;;;;;;;;:::i;:::-;;57973:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54912:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19585:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43332:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45015:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55042:71;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46138:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55781:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58331:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58789:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59659:387;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60869:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;55880:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60189:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45241:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59140:104;;;;;;;;;;;;;:::i;:::-;;56822:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20494:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61069:246;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55990:458;56097:4;56136:33;56121:48;;;:11;:48;;;;:90;;;;56174:37;56199:11;56174:24;:37::i;:::-;56121:90;:151;;;;56229:43;56260:11;56229:30;:43::i;:::-;56121:151;:201;;;;55557:10;56291:31;;56276:46;;;:11;:46;;;;56121:201;:265;;;;55632:10;56355:31;;56340:46;;;:11;:46;;;;56121:265;:319;;;;55711:10;56405:35;;56390:50;;;:11;:50;;;;56121:319;56114:326;;55990:458;;;:::o;55251:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43163:100::-;43217:13;43250:5;43243:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43163:100;:::o;54976:48::-;;;;:::o;44722:221::-;44798:7;44826:16;44834:7;44826;:16::i;:::-;44818:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44911:15;:24;44927:7;44911:24;;;;;;;;;;;;;;;;;;;;;44904:31;;44722:221;;;:::o;44245:411::-;44326:13;44342:23;44357:7;44342:14;:23::i;:::-;44326:39;;44390:5;44384:11;;:2;:11;;;;44376:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44484:5;44468:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44493:37;44510:5;44517:12;:10;:12::i;:::-;44493:16;:37::i;:::-;44468:62;44446:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;44627:21;44636:2;44640:7;44627:8;:21::i;:::-;44315:341;44245:411;;:::o;59252:104::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;59334:14:::1;;;;;;;;;;;59333:15;59316:14;;:32;;;;;;;;;;;;;;;;;;59252:104::o:0;58500:254::-;58558:4;58575:15;58593:8;:17;58602:7;58593:17;;;;;;;;;;;58575:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58621:15;58639:9;58621:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58727:1;58710:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;58700:30;;;;;;58693:1;58676:19;;;;;;;;:::i;:::-;;;;;;;;;;;;;58666:30;;;;;;:64;:79;;58740:5;58666:79;;;58733:4;58666:79;58659:87;;;;58500:254;;;:::o;60457:206::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;60555:9:::1;60550:106;60574:9;:16;60570:1;:20;60550:106;;;60640:4;60612:11;:25;60624:9;60634:1;60624:12;;;;;;;;:::i;:::-;;;;;;;;60612:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;60592:3;;;;;:::i;:::-;;;;60550:106;;;;60457:206:::0;:::o;57322:643::-;57402:16;57410:7;57402;:16::i;:::-;57394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57481:14;;;;;;;;;;;57473:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57567:10;57547:30;;:16;57555:7;57547;:16::i;:::-;:30;;;57539:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;57636:20;57648:7;57636:11;:20::i;:::-;57628:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;57714:8;57723;:17;57732:7;57723:17;;;;;;;;;;;57714:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;;:::i;:::-;;;;;;57758:8;57754:204;;;57803:9;57783:8;:17;57792:7;57783:17;;;;;;;;;;;:29;;;;;;:::i;:::-;;;;;;:::i;:::-;;57827:8;57836:9;57827:19;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;57754:204;;;57901:9;57881:8;:17;57890:7;57881:17;;;;;;;;;;;:29;;;;;;:::i;:::-;;;;;;:::i;:::-;;57925:8;57934:9;57925:19;;;;;;:::i;:::-;;;;;;;;;;;;;;:21;;;;;;;;;:::i;:::-;;;;;;57754:204;57322:643;;:::o;55378:26::-;;;;;;;;;;;;;:::o;55831:42::-;;;;;;;;;;;;;;;;;:::o;60306:107::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;60402:3:::1;;60388:11;:17;;;;;;;:::i;:::-;;60306:107:::0;;:::o;45472:339::-;45667:41;45686:12;:10;:12::i;:::-;45700:7;45667:18;:41::i;:::-;45659:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;45775:28;45785:4;45791:2;45795:7;45775:9;:28::i;:::-;45472:339;;;:::o;35005:139::-;35067:4;35103:5;35092:16;;:7;:5;:7::i;:::-;:16;;;:43;;;;35112:23;35129:5;35112:7;:16;;:23;;;;:::i;:::-;35092:43;35084:52;;35005:139;;;:::o;60054:127::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;60170:3:::1;;60150:8;:17;60159:7;60150:17;;;;;;;;;;;:23;;;;;;;:::i;:::-;;60054:127:::0;;;:::o;34727:210::-;19816:12;:10;:12::i;:::-;19805:23;;:7;:5;:7::i;:::-;:23;;;19797:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34806:23:::1;34823:5;34806:7;:16;;:23;;;;:::i;:::-;34802:128;;;34871:10;34851:31;;34864:5;34851:31;;;;;;;;;;;;34897:21;34912:5;34897:7;:14;;:21;;;;:::i;:::-;;34802:128;34727:210:::0;:::o;34105:267::-;34158:23;34217:16;:7;:14;:16::i;:::-;34203:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34194:40;;34250:6;34245:96;34266:16;:7;:14;:16::i;:::-;34262:1;:20;34245:96;;;34316:13;34327:1;34316:7;:10;;:13;;;;:::i;:::-;34304:6;34311:1;34304:9;;;;;;;;:::i;:::-;;;;;;;:25;;;;;;;;;;;34284:3;;;;;:::i;:::-;;;;34245:96;;;;34105:267;:::o;55313:25::-;;;;;;;;;;;;;:::o;59364:269::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;59522:4:::1;59505:14;;:21;;;;;;;;;;;;;;;;;;59549:10;;59537:9;:22;;;;;;;:::i;:::-;;59582:10;;59570:9;:22;;;;;;;:::i;:::-;;59615:10;;59603:9;:22;;;;;;;:::i;:::-;;59364:269:::0;;;;;;:::o;54880:25::-;;;;:::o;58183:140::-;58241:7;58268:11;:22;58280:9;58268:22;;;;;;;;;;;;;;;;;;;;;;;;;:46;;58306:8;;58268:46;;;58293:10;;58268:46;58261:54;;58183:140;;;:::o;45882:185::-;46020:39;46037:4;46043:2;46047:7;46020:39;;;;;;;;;;;;:16;:39::i;:::-;45882:185;;;:::o;55345:26::-;;;;;;;;;;;;;:::o;55281:25::-;;;;:::o;42857:239::-;42929:7;42949:13;42965:7;:16;42973:7;42965:16;;;;;;;;;;;;;;;;;;;;;42949:32;;43017:1;43000:19;;:5;:19;;;;42992:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43083:5;43076:12;;;42857:239;;;:::o;60697:164::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;60816:9:::1;60796:17;;:29;;;;;;;;;;;;;;;;;;60850:3;60836:11;:17;;;;60697:164:::0;;:::o;34445:210::-;19816:12;:10;:12::i;:::-;19805:23;;:7;:5;:7::i;:::-;:23;;;19797:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34526:23:::1;34543:5;34526:7;:16;;:23;;;;:::i;:::-;34521:127;;34592:10;34571:32;;34585:5;34571:32;;;;;;;;;;;;34618:18;34630:5;34618:7;:11;;:18;;;;:::i;:::-;;34521:127;34445:210:::0;:::o;42587:208::-;42659:7;42704:1;42687:19;;:5;:19;;;;42679:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42771:9;:16;42781:5;42771:16;;;;;;;;;;;;;;;;42764:23;;42587:208;;;:::o;20236:103::-;19816:12;:10;:12::i;:::-;19805:23;;:7;:5;:7::i;:::-;:23;;;19797:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20301:30:::1;20328:1;20301:18;:30::i;:::-;20236:103::o:0;59031:101::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;59111:13:::1;;;;;;;;;;;59110:14;59094:13;;:30;;;;;;;;;;;;;;;;;;59031:101::o:0;57973:168::-;58057:10;58037:30;;:16;58045:7;58037;:16::i;:::-;:30;;;58029:39;;;;;;58079:14;58085:7;58079:5;:14::i;:::-;58104:8;58113;:17;58122:7;58113:17;;;;;;;;;;;58104:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:29;;;;;;;;;:::i;:::-;;;;;;57973:168;:::o;54912:46::-;;;;:::o;19585:87::-;19631:7;19658:6;;;;;;;;;;;19651:13;;19585:87;:::o;43332:104::-;43388:13;43421:7;43414:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43332:104;:::o;45015:155::-;45110:52;45129:12;:10;:12::i;:::-;45143:8;45153;45110:18;:52::i;:::-;45015:155;;:::o;55042:71::-;;;;;;;;;;;;;:::o;46138:328::-;46313:41;46332:12;:10;:12::i;:::-;46346:7;46313:18;:41::i;:::-;46305:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;46419:39;46433:4;46439:2;46443:7;46452:5;46419:13;:39::i;:::-;46138:328;;;;:::o;55781:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58331:161::-;58396:7;58456:1;58444:8;58423:6;:18;58430:10;58423:18;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:34;:60;;58475:8;58423:60;;;58471:1;58460:8;:12;;;;:::i;:::-;58423:60;58416:68;;58331:161;;;:::o;58789:234::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;58914:9:::1;58909:107;58933:9;;:16;;58929:1;:20;58909:107;;;58971:33;58976:8;58986:9;;58996:1;58986:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;59000:3;58971:4;:33::i;:::-;58951:3;;;;;:::i;:::-;;;;58909:107;;;;58789:234:::0;;;;:::o;59659:387::-;59723:13;59757:16;59765:7;59757;:16::i;:::-;59749:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59832:14;;;;;;;;;;;:31;;;;59850:13;;;;;;;;;;;59832:31;59828:211;;;59887:12;59880:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59828:211;59921:14;;;;;;;;;;;59917:122;;;59959:11;59952:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59917:122;60010:8;:17;60019:7;60010:17;;;;;;;;;;;60003:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59659:387;;;;:::o;60869:149::-;60926:7;60935;60963:17;;;;;;;;;;;61004:5;60990:11;;60982:5;:19;;;;:::i;:::-;:27;;;;:::i;:::-;60955:55;;;;60869:149;;;:::o;55880:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;60189:109::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;60287:3:::1;;60272:12;:18;;;;;;;:::i;:::-;;60189:109:::0;;:::o;45241:164::-;45338:4;45362:18;:25;45381:5;45362:25;;;;;;;;;;;;;;;:35;45388:8;45362:35;;;;;;;;;;;;;;;;;;;;;;;;;45355:42;;45241:164;;;;:::o;59140:104::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;59222:14:::1;;;;;;;;;;;59221:15;59204:14;;:32;;;;;;;;;;;;;;;;;;59140:104::o:0;56822:492::-;56895:13;;;;;;;;;;;56887:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;56962:1;56951:8;:12;:50;;;;;57000:1;56988:8;56967:6;:18;56974:10;56967:18;;;;;;;;;;;;;;;;:29;;;;:::i;:::-;:34;;56951:50;56943:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;57037:14;57075:8;57054:20;57063:10;57054:8;:20::i;:::-;:29;;;;:::i;:::-;57037:46;;57111:11;;;;;;;;;;;57104:32;;;57137:10;57157:4;57164:6;57104:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;57196:6;57182:10;;:20;;;;;;;:::i;:::-;;;;;;;;57215:17;57235:27;57253:8;57235:17;:27::i;:::-;57215:47;;57273:33;57278:9;57289:10;57273:33;;;;;;;;;;;;;;;;;:4;:33::i;:::-;56876:438;;56822:492;:::o;20494:201::-;19816:12;:10;:12::i;:::-;19805:23;;:7;:5;:7::i;:::-;:23;;;19797:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20603:1:::1;20583:22;;:8;:22;;;;20575:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20659:28;20678:8;20659:18;:28::i;:::-;20494:201:::0;:::o;61069:246::-;33929:10;33918:21;;:7;:5;:7::i;:::-;:21;;;:53;;;;33943:28;33960:10;33943:7;:16;;:28;;;;:::i;:::-;33918:53;33910:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;61169:14:::1;61162:31;;;61194:10;61206:7;61162:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;61247:11;;;;;;;;;;;61229:29;;:14;:29;;;61225:83;;;61289:7;61275:10;;:21;;;;;;;:::i;:::-;;;;;;;;61225:83;61069:246:::0;;:::o;42218:305::-;42320:4;42372:25;42357:40;;;:11;:40;;;;:105;;;;42429:33;42414:48;;;:11;:48;;;;42357:105;:158;;;;42479:36;42503:11;42479:23;:36::i;:::-;42357:158;42337:178;;42218:305;;;:::o;33543:233::-;33645:4;33684:31;33669:46;;;:11;:46;;;;:99;;;;33732:36;33756:11;33732:23;:36::i;:::-;33669:99;33662:106;;33543:233;;;:::o;47976:127::-;48041:4;48093:1;48065:30;;:7;:16;48073:7;48065:16;;;;;;;;;;;;;;;;;;;;;:30;;;;48058:37;;47976:127;;;:::o;18309:98::-;18362:7;18389:10;18382:17;;18309:98;:::o;51958:174::-;52060:2;52033:15;:24;52049:7;52033:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52116:7;52112:2;52078:46;;52087:23;52102:7;52087:14;:23::i;:::-;52078:46;;;;;;;;;;;;51958:174;;:::o;8477:167::-;8557:4;8581:55;8591:3;:10;;8627:5;8611:23;;8603:32;;8581:9;:55::i;:::-;8574:62;;8477:167;;;;:::o;48270:348::-;48363:4;48388:16;48396:7;48388;:16::i;:::-;48380:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;48464:13;48480:23;48495:7;48480:14;:23::i;:::-;48464:39;;48533:5;48522:16;;:7;:16;;;:51;;;;48566:7;48542:31;;:20;48554:7;48542:11;:20::i;:::-;:31;;;48522:51;:87;;;;48577:32;48594:5;48601:7;48577:16;:32::i;:::-;48522:87;48514:96;;;48270:348;;;;:::o;51262:578::-;51421:4;51394:31;;:23;51409:7;51394:14;:23::i;:::-;:31;;;51386:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;51504:1;51490:16;;:2;:16;;;;51482:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51560:39;51581:4;51587:2;51591:7;51560:20;:39::i;:::-;51664:29;51681:1;51685:7;51664:8;:29::i;:::-;51725:1;51706:9;:15;51716:4;51706:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;51754:1;51737:9;:13;51747:2;51737:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;51785:2;51766:7;:16;51774:7;51766:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51824:7;51820:2;51805:27;;51814:4;51805:27;;;;;;;;;;;;51262:578;;;:::o;8233:158::-;8306:4;8330:53;8338:3;:10;;8374:5;8358:23;;8350:32;;8330:7;:53::i;:::-;8323:60;;8233:158;;;;:::o;8730:117::-;8793:7;8820:19;8828:3;:10;;8820:7;:19::i;:::-;8813:26;;8730:117;;;:::o;9201:158::-;9275:7;9326:22;9330:3;:10;;9342:5;9326:3;:22::i;:::-;9318:31;;9295:56;;9201:158;;;;:::o;7905:152::-;7975:4;7999:50;8004:3;:10;;8040:5;8024:23;;8016:32;;7999:4;:50::i;:::-;7992:57;;7905:152;;;;:::o;20855:191::-;20929:16;20948:6;;;;;;;;;;;20929:25;;20974:8;20965:6;;:17;;;;;;;;;;;;;;;;;;21029:8;20998:40;;21019:8;20998:40;;;;;;;;;;;;20918:128;20855:191;:::o;50565:360::-;50625:13;50641:23;50656:7;50641:14;:23::i;:::-;50625:39;;50677:48;50698:5;50713:1;50717:7;50677:20;:48::i;:::-;50766:29;50783:1;50787:7;50766:8;:29::i;:::-;50828:1;50808:9;:16;50818:5;50808:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;50847:7;:16;50855:7;50847:16;;;;;;;;;;;;50840:23;;;;;;;;;;;50909:7;50905:1;50881:36;;50890:5;50881:36;;;;;;;;;;;;50614:311;50565:360;:::o;52274:315::-;52429:8;52420:17;;:5;:17;;;;52412:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52516:8;52478:18;:25;52497:5;52478:25;;;;;;;;;;;;;;;:35;52504:8;52478:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52562:8;52540:41;;52555:5;52540:41;;;52572:8;52540:41;;;;;;:::i;:::-;;;;;;;;52274:315;;;:::o;47348:::-;47505:28;47515:4;47521:2;47525:7;47505:9;:28::i;:::-;47552:48;47575:4;47581:2;47585:7;47594:5;47552:22;:48::i;:::-;47544:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;47348:315;;;;:::o;56456:327::-;56551:9;56546:230;56570:8;56566:1;:12;56546:230;;;56600:32;56610:9;56621:10;;56600:9;:32::i;:::-;56670:3;56647:8;:20;56656:10;;56647:20;;;;;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;56688:6;:17;56695:9;56688:17;;;;;;;;;;;;;;;;:19;;;;;;;;;:::i;:::-;;;;;;56722:8;56731:3;56722:13;;;;;;:::i;:::-;;;;;;;;;;;;;;:15;;;;;;;;;:::i;:::-;;;;;;56752:10;;:12;;;;;;;;;:::i;:::-;;;;;;56580:3;;;;;:::i;:::-;;;;56546:230;;;;56456:327;;;:::o;32986:157::-;33071:4;33110:25;33095:40;;;:11;:40;;;;33088:47;;32986:157;;;:::o;3916:129::-;3989:4;4036:1;4013:3;:12;;:19;4026:5;4013:19;;;;;;;;;;;;:24;;4006:31;;3916:129;;;;:::o;54525:126::-;;;;:::o;2410:1420::-;2476:4;2594:18;2615:3;:12;;:19;2628:5;2615:19;;;;;;;;;;;;2594:40;;2665:1;2651:10;:15;2647:1176;;3026:21;3063:1;3050:10;:14;;;;:::i;:::-;3026:38;;3079:17;3120:1;3099:3;:11;;:18;;;;:22;;;;:::i;:::-;3079:42;;3155:13;3142:9;:26;3138:405;;3189:17;3209:3;:11;;3221:9;3209:22;;;;;;;;:::i;:::-;;;;;;;;;;3189:42;;3363:9;3334:3;:11;;3346:13;3334:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3474:10;3448:3;:12;;:23;3461:9;3448:23;;;;;;;;;;;:36;;;;3170:373;3138:405;3624:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3719:3;:12;;:19;3732:5;3719:19;;;;;;;;;;;3712:26;;;3762:4;3755:11;;;;;;;2647:1176;3806:5;3799:12;;;2410:1420;;;;;:::o;4131:109::-;4187:7;4214:3;:11;;:18;;;;4207:25;;4131:109;;;:::o;4594:120::-;4661:7;4688:3;:11;;4700:5;4688:18;;;;;;;;:::i;:::-;;;;;;;;;;4681:25;;4594:120;;;;:::o;1820:414::-;1883:4;1905:21;1915:3;1920:5;1905:9;:21::i;:::-;1900:327;;1943:3;:11;;1960:5;1943:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2126:3;:11;;:18;;;;2104:3;:12;;:19;2117:5;2104:19;;;;;;;;;;;:40;;;;2166:4;2159:11;;;;1900:327;2210:5;2203:12;;1820:414;;;;;:::o;53154:799::-;53309:4;53330:15;:2;:13;;;:15::i;:::-;53326:620;;;53382:2;53366:36;;;53403:12;:10;:12::i;:::-;53417:4;53423:7;53432:5;53366:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53362:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53625:1;53608:6;:13;:18;53604:272;;;53651:60;;;;;;;;;;:::i;:::-;;;;;;;;53604:272;53826:6;53820:13;53811:6;53807:2;53803:15;53796:38;53362:529;53499:41;;;53489:51;;;:6;:51;;;;53482:58;;;;;53326:620;53930:4;53923:11;;53154:799;;;;;;;:::o;48960:110::-;49036:26;49046:2;49050:7;49036:26;;;;;;;;;;;;:9;:26::i;:::-;48960:110;;:::o;21873:387::-;21933:4;22141:12;22208:7;22196:20;22188:28;;22251:1;22244:4;:8;22237:15;;;21873:387;;;:::o;49297:321::-;49427:18;49433:2;49437:7;49427:5;:18::i;:::-;49478:54;49509:1;49513:2;49517:7;49526:5;49478:22;:54::i;:::-;49456:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;49297:321;;;:::o;49954:382::-;50048:1;50034:16;;:2;:16;;;;50026:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;50107:16;50115:7;50107;:16::i;:::-;50106:17;50098:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50169:45;50198:1;50202:2;50206:7;50169:20;:45::i;:::-;50244:1;50227:9;:13;50237:2;50227:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50275:2;50256:7;:16;50264:7;50256:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50320:7;50316:2;50295:33;;50312:1;50295:33;;;;;;;;;;;;49954:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1731:155::-;1785:5;1823:6;1810:20;1801:29;;1839:41;1874:5;1839:41;:::i;:::-;1731:155;;;;:::o;1909:568::-;1982:8;1992:6;2042:3;2035:4;2027:6;2023:17;2019:27;2009:122;;2050:79;;:::i;:::-;2009:122;2163:6;2150:20;2140:30;;2193:18;2185:6;2182:30;2179:117;;;2215:79;;:::i;:::-;2179:117;2329:4;2321:6;2317:17;2305:29;;2383:3;2375:4;2367:6;2363:17;2353:8;2349:32;2346:41;2343:128;;;2390:79;;:::i;:::-;2343:128;1909:568;;;;;:::o;2500:370::-;2571:5;2620:3;2613:4;2605:6;2601:17;2597:27;2587:122;;2628:79;;:::i;:::-;2587:122;2745:6;2732:20;2770:94;2860:3;2852:6;2845:4;2837:6;2833:17;2770:94;:::i;:::-;2761:103;;2577:293;2500:370;;;;:::o;2876:133::-;2919:5;2957:6;2944:20;2935:29;;2973:30;2997:5;2973:30;:::i;:::-;2876:133;;;;:::o;3015:137::-;3069:5;3100:6;3094:13;3085:22;;3116:30;3140:5;3116:30;:::i;:::-;3015:137;;;;:::o;3158:::-;3203:5;3241:6;3228:20;3219:29;;3257:32;3283:5;3257:32;:::i;:::-;3158:137;;;;:::o;3301:141::-;3357:5;3388:6;3382:13;3373:22;;3404:32;3430:5;3404:32;:::i;:::-;3301:141;;;;:::o;3461:338::-;3516:5;3565:3;3558:4;3550:6;3546:17;3542:27;3532:122;;3573:79;;:::i;:::-;3532:122;3690:6;3677:20;3715:78;3789:3;3781:6;3774:4;3766:6;3762:17;3715:78;:::i;:::-;3706:87;;3522:277;3461:338;;;;:::o;3819:553::-;3877:8;3887:6;3937:3;3930:4;3922:6;3918:17;3914:27;3904:122;;3945:79;;:::i;:::-;3904:122;4058:6;4045:20;4035:30;;4088:18;4080:6;4077:30;4074:117;;;4110:79;;:::i;:::-;4074:117;4224:4;4216:6;4212:17;4200:29;;4278:3;4270:4;4262:6;4258:17;4248:8;4244:32;4241:41;4238:128;;;4285:79;;:::i;:::-;4238:128;3819:553;;;;;:::o;4392:340::-;4448:5;4497:3;4490:4;4482:6;4478:17;4474:27;4464:122;;4505:79;;:::i;:::-;4464:122;4622:6;4609:20;4647:79;4722:3;4714:6;4707:4;4699:6;4695:17;4647:79;:::i;:::-;4638:88;;4454:278;4392:340;;;;:::o;4738:139::-;4784:5;4822:6;4809:20;4800:29;;4838:33;4865:5;4838:33;:::i;:::-;4738:139;;;;:::o;4883:329::-;4942:6;4991:2;4979:9;4970:7;4966:23;4962:32;4959:119;;;4997:79;;:::i;:::-;4959:119;5117:1;5142:53;5187:7;5178:6;5167:9;5163:22;5142:53;:::i;:::-;5132:63;;5088:117;4883:329;;;;:::o;5218:490::-;5294:6;5302;5351:2;5339:9;5330:7;5326:23;5322:32;5319:119;;;5357:79;;:::i;:::-;5319:119;5477:1;5502:61;5555:7;5546:6;5535:9;5531:22;5502:61;:::i;:::-;5492:71;;5448:125;5612:2;5638:53;5683:7;5674:6;5663:9;5659:22;5638:53;:::i;:::-;5628:63;;5583:118;5218:490;;;;;:::o;5714:474::-;5782:6;5790;5839:2;5827:9;5818:7;5814:23;5810:32;5807:119;;;5845:79;;:::i;:::-;5807:119;5965:1;5990:53;6035:7;6026:6;6015:9;6011:22;5990:53;:::i;:::-;5980:63;;5936:117;6092:2;6118:53;6163:7;6154:6;6143:9;6139:22;6118:53;:::i;:::-;6108:63;;6063:118;5714:474;;;;;:::o;6194:619::-;6271:6;6279;6287;6336:2;6324:9;6315:7;6311:23;6307:32;6304:119;;;6342:79;;:::i;:::-;6304:119;6462:1;6487:53;6532:7;6523:6;6512:9;6508:22;6487:53;:::i;:::-;6477:63;;6433:117;6589:2;6615:53;6660:7;6651:6;6640:9;6636:22;6615:53;:::i;:::-;6605:63;;6560:118;6717:2;6743:53;6788:7;6779:6;6768:9;6764:22;6743:53;:::i;:::-;6733:63;;6688:118;6194:619;;;;;:::o;6819:943::-;6914:6;6922;6930;6938;6987:3;6975:9;6966:7;6962:23;6958:33;6955:120;;;6994:79;;:::i;:::-;6955:120;7114:1;7139:53;7184:7;7175:6;7164:9;7160:22;7139:53;:::i;:::-;7129:63;;7085:117;7241:2;7267:53;7312:7;7303:6;7292:9;7288:22;7267:53;:::i;:::-;7257:63;;7212:118;7369:2;7395:53;7440:7;7431:6;7420:9;7416:22;7395:53;:::i;:::-;7385:63;;7340:118;7525:2;7514:9;7510:18;7497:32;7556:18;7548:6;7545:30;7542:117;;;7578:79;;:::i;:::-;7542:117;7683:62;7737:7;7728:6;7717:9;7713:22;7683:62;:::i;:::-;7673:72;;7468:287;6819:943;;;;;;;:::o;7768:468::-;7833:6;7841;7890:2;7878:9;7869:7;7865:23;7861:32;7858:119;;;7896:79;;:::i;:::-;7858:119;8016:1;8041:53;8086:7;8077:6;8066:9;8062:22;8041:53;:::i;:::-;8031:63;;7987:117;8143:2;8169:50;8211:7;8202:6;8191:9;8187:22;8169:50;:::i;:::-;8159:60;;8114:115;7768:468;;;;;:::o;8242:474::-;8310:6;8318;8367:2;8355:9;8346:7;8342:23;8338:32;8335:119;;;8373:79;;:::i;:::-;8335:119;8493:1;8518:53;8563:7;8554:6;8543:9;8539:22;8518:53;:::i;:::-;8508:63;;8464:117;8620:2;8646:53;8691:7;8682:6;8671:9;8667:22;8646:53;:::i;:::-;8636:63;;8591:118;8242:474;;;;;:::o;8722:1029::-;8836:6;8844;8852;8860;8909:2;8897:9;8888:7;8884:23;8880:32;8877:119;;;8915:79;;:::i;:::-;8877:119;9063:1;9052:9;9048:17;9035:31;9093:18;9085:6;9082:30;9079:117;;;9115:79;;:::i;:::-;9079:117;9228:80;9300:7;9291:6;9280:9;9276:22;9228:80;:::i;:::-;9210:98;;;;9006:312;9385:2;9374:9;9370:18;9357:32;9416:18;9408:6;9405:30;9402:117;;;9438:79;;:::i;:::-;9402:117;9543:63;9598:7;9589:6;9578:9;9574:22;9543:63;:::i;:::-;9533:73;;9328:288;9655:2;9681:53;9726:7;9717:6;9706:9;9702:22;9681:53;:::i;:::-;9671:63;;9626:118;8722:1029;;;;;;;:::o;9757:539::-;9841:6;9890:2;9878:9;9869:7;9865:23;9861:32;9858:119;;;9896:79;;:::i;:::-;9858:119;10044:1;10033:9;10029:17;10016:31;10074:18;10066:6;10063:30;10060:117;;;10096:79;;:::i;:::-;10060:117;10201:78;10271:7;10262:6;10251:9;10247:22;10201:78;:::i;:::-;10191:88;;9987:302;9757:539;;;;:::o;10302:345::-;10369:6;10418:2;10406:9;10397:7;10393:23;10389:32;10386:119;;;10424:79;;:::i;:::-;10386:119;10544:1;10569:61;10622:7;10613:6;10602:9;10598:22;10569:61;:::i;:::-;10559:71;;10515:125;10302:345;;;;:::o;10653:327::-;10711:6;10760:2;10748:9;10739:7;10735:23;10731:32;10728:119;;;10766:79;;:::i;:::-;10728:119;10886:1;10911:52;10955:7;10946:6;10935:9;10931:22;10911:52;:::i;:::-;10901:62;;10857:116;10653:327;;;;:::o;10986:349::-;11055:6;11104:2;11092:9;11083:7;11079:23;11075:32;11072:119;;;11110:79;;:::i;:::-;11072:119;11230:1;11255:63;11310:7;11301:6;11290:9;11286:22;11255:63;:::i;:::-;11245:73;;11201:127;10986:349;;;;:::o;11341:529::-;11412:6;11420;11469:2;11457:9;11448:7;11444:23;11440:32;11437:119;;;11475:79;;:::i;:::-;11437:119;11623:1;11612:9;11608:17;11595:31;11653:18;11645:6;11642:30;11639:117;;;11675:79;;:::i;:::-;11639:117;11788:65;11845:7;11836:6;11825:9;11821:22;11788:65;:::i;:::-;11770:83;;;;11566:297;11341:529;;;;;:::o;11876:1219::-;11989:6;11997;12005;12013;12021;12029;12078:2;12066:9;12057:7;12053:23;12049:32;12046:119;;;12084:79;;:::i;:::-;12046:119;12232:1;12221:9;12217:17;12204:31;12262:18;12254:6;12251:30;12248:117;;;12284:79;;:::i;:::-;12248:117;12397:65;12454:7;12445:6;12434:9;12430:22;12397:65;:::i;:::-;12379:83;;;;12175:297;12539:2;12528:9;12524:18;12511:32;12570:18;12562:6;12559:30;12556:117;;;12592:79;;:::i;:::-;12556:117;12705:65;12762:7;12753:6;12742:9;12738:22;12705:65;:::i;:::-;12687:83;;;;12482:298;12847:2;12836:9;12832:18;12819:32;12878:18;12870:6;12867:30;12864:117;;;12900:79;;:::i;:::-;12864:117;13013:65;13070:7;13061:6;13050:9;13046:22;13013:65;:::i;:::-;12995:83;;;;12790:298;11876:1219;;;;;;;;:::o;13101:509::-;13170:6;13219:2;13207:9;13198:7;13194:23;13190:32;13187:119;;;13225:79;;:::i;:::-;13187:119;13373:1;13362:9;13358:17;13345:31;13403:18;13395:6;13392:30;13389:117;;;13425:79;;:::i;:::-;13389:117;13530:63;13585:7;13576:6;13565:9;13561:22;13530:63;:::i;:::-;13520:73;;13316:287;13101:509;;;;:::o;13616:329::-;13675:6;13724:2;13712:9;13703:7;13699:23;13695:32;13692:119;;;13730:79;;:::i;:::-;13692:119;13850:1;13875:53;13920:7;13911:6;13900:9;13896:22;13875:53;:::i;:::-;13865:63;;13821:117;13616:329;;;;:::o;13951:468::-;14016:6;14024;14073:2;14061:9;14052:7;14048:23;14044:32;14041:119;;;14079:79;;:::i;:::-;14041:119;14199:1;14224:53;14269:7;14260:6;14249:9;14245:22;14224:53;:::i;:::-;14214:63;;14170:117;14326:2;14352:50;14394:7;14385:6;14374:9;14370:22;14352:50;:::i;:::-;14342:60;;14297:115;13951:468;;;;;:::o;14425:674::-;14505:6;14513;14521;14570:2;14558:9;14549:7;14545:23;14541:32;14538:119;;;14576:79;;:::i;:::-;14538:119;14696:1;14721:53;14766:7;14757:6;14746:9;14742:22;14721:53;:::i;:::-;14711:63;;14667:117;14851:2;14840:9;14836:18;14823:32;14882:18;14874:6;14871:30;14868:117;;;14904:79;;:::i;:::-;14868:117;15017:65;15074:7;15065:6;15054:9;15050:22;15017:65;:::i;:::-;14999:83;;;;14794:298;14425:674;;;;;:::o;15105:179::-;15174:10;15195:46;15237:3;15229:6;15195:46;:::i;:::-;15273:4;15268:3;15264:14;15250:28;;15105:179;;;;:::o;15290:108::-;15367:24;15385:5;15367:24;:::i;:::-;15362:3;15355:37;15290:108;;:::o;15404:118::-;15491:24;15509:5;15491:24;:::i;:::-;15486:3;15479:37;15404:118;;:::o;15558:732::-;15677:3;15706:54;15754:5;15706:54;:::i;:::-;15776:86;15855:6;15850:3;15776:86;:::i;:::-;15769:93;;15886:56;15936:5;15886:56;:::i;:::-;15965:7;15996:1;15981:284;16006:6;16003:1;16000:13;15981:284;;;16082:6;16076:13;16109:63;16168:3;16153:13;16109:63;:::i;:::-;16102:70;;16195:60;16248:6;16195:60;:::i;:::-;16185:70;;16041:224;16028:1;16025;16021:9;16016:14;;15981:284;;;15985:14;16281:3;16274:10;;15682:608;;;15558:732;;;;:::o;16296:109::-;16377:21;16392:5;16377:21;:::i;:::-;16372:3;16365:34;16296:109;;:::o;16411:360::-;16497:3;16525:38;16557:5;16525:38;:::i;:::-;16579:70;16642:6;16637:3;16579:70;:::i;:::-;16572:77;;16658:52;16703:6;16698:3;16691:4;16684:5;16680:16;16658:52;:::i;:::-;16735:29;16757:6;16735:29;:::i;:::-;16730:3;16726:39;16719:46;;16501:270;16411:360;;;;:::o;16777:364::-;16865:3;16893:39;16926:5;16893:39;:::i;:::-;16948:71;17012:6;17007:3;16948:71;:::i;:::-;16941:78;;17028:52;17073:6;17068:3;17061:4;17054:5;17050:16;17028:52;:::i;:::-;17105:29;17127:6;17105:29;:::i;:::-;17100:3;17096:39;17089:46;;16869:272;16777:364;;;;:::o;17147:377::-;17253:3;17281:39;17314:5;17281:39;:::i;:::-;17336:89;17418:6;17413:3;17336:89;:::i;:::-;17329:96;;17434:52;17479:6;17474:3;17467:4;17460:5;17456:16;17434:52;:::i;:::-;17511:6;17506:3;17502:16;17495:23;;17257:267;17147:377;;;;:::o;17554:845::-;17657:3;17694:5;17688:12;17723:36;17749:9;17723:36;:::i;:::-;17775:89;17857:6;17852:3;17775:89;:::i;:::-;17768:96;;17895:1;17884:9;17880:17;17911:1;17906:137;;;;18057:1;18052:341;;;;17873:520;;17906:137;17990:4;17986:9;17975;17971:25;17966:3;17959:38;18026:6;18021:3;18017:16;18010:23;;17906:137;;18052:341;18119:38;18151:5;18119:38;:::i;:::-;18179:1;18193:154;18207:6;18204:1;18201:13;18193:154;;;18281:7;18275:14;18271:1;18266:3;18262:11;18255:35;18331:1;18322:7;18318:15;18307:26;;18229:4;18226:1;18222:12;18217:17;;18193:154;;;18376:6;18371:3;18367:16;18360:23;;18059:334;;17873:520;;17661:738;;17554:845;;;;:::o;18405:366::-;18547:3;18568:67;18632:2;18627:3;18568:67;:::i;:::-;18561:74;;18644:93;18733:3;18644:93;:::i;:::-;18762:2;18757:3;18753:12;18746:19;;18405:366;;;:::o;18777:::-;18919:3;18940:67;19004:2;18999:3;18940:67;:::i;:::-;18933:74;;19016:93;19105:3;19016:93;:::i;:::-;19134:2;19129:3;19125:12;19118:19;;18777:366;;;:::o;19149:::-;19291:3;19312:67;19376:2;19371:3;19312:67;:::i;:::-;19305:74;;19388:93;19477:3;19388:93;:::i;:::-;19506:2;19501:3;19497:12;19490:19;;19149:366;;;:::o;19521:::-;19663:3;19684:67;19748:2;19743:3;19684:67;:::i;:::-;19677:74;;19760:93;19849:3;19760:93;:::i;:::-;19878:2;19873:3;19869:12;19862:19;;19521:366;;;:::o;19893:::-;20035:3;20056:67;20120:2;20115:3;20056:67;:::i;:::-;20049:74;;20132:93;20221:3;20132:93;:::i;:::-;20250:2;20245:3;20241:12;20234:19;;19893:366;;;:::o;20265:::-;20407:3;20428:67;20492:2;20487:3;20428:67;:::i;:::-;20421:74;;20504:93;20593:3;20504:93;:::i;:::-;20622:2;20617:3;20613:12;20606:19;;20265:366;;;:::o;20637:::-;20779:3;20800:67;20864:2;20859:3;20800:67;:::i;:::-;20793:74;;20876:93;20965:3;20876:93;:::i;:::-;20994:2;20989:3;20985:12;20978:19;;20637:366;;;:::o;21009:::-;21151:3;21172:67;21236:2;21231:3;21172:67;:::i;:::-;21165:74;;21248:93;21337:3;21248:93;:::i;:::-;21366:2;21361:3;21357:12;21350:19;;21009:366;;;:::o;21381:::-;21523:3;21544:67;21608:2;21603:3;21544:67;:::i;:::-;21537:74;;21620:93;21709:3;21620:93;:::i;:::-;21738:2;21733:3;21729:12;21722:19;;21381:366;;;:::o;21753:::-;21895:3;21916:67;21980:2;21975:3;21916:67;:::i;:::-;21909:74;;21992:93;22081:3;21992:93;:::i;:::-;22110:2;22105:3;22101:12;22094:19;;21753:366;;;:::o;22125:::-;22267:3;22288:67;22352:2;22347:3;22288:67;:::i;:::-;22281:74;;22364:93;22453:3;22364:93;:::i;:::-;22482:2;22477:3;22473:12;22466:19;;22125:366;;;:::o;22497:::-;22639:3;22660:67;22724:2;22719:3;22660:67;:::i;:::-;22653:74;;22736:93;22825:3;22736:93;:::i;:::-;22854:2;22849:3;22845:12;22838:19;;22497:366;;;:::o;22869:::-;23011:3;23032:67;23096:2;23091:3;23032:67;:::i;:::-;23025:74;;23108:93;23197:3;23108:93;:::i;:::-;23226:2;23221:3;23217:12;23210:19;;22869:366;;;:::o;23241:::-;23383:3;23404:67;23468:2;23463:3;23404:67;:::i;:::-;23397:74;;23480:93;23569:3;23480:93;:::i;:::-;23598:2;23593:3;23589:12;23582:19;;23241:366;;;:::o;23613:::-;23755:3;23776:67;23840:2;23835:3;23776:67;:::i;:::-;23769:74;;23852:93;23941:3;23852:93;:::i;:::-;23970:2;23965:3;23961:12;23954:19;;23613:366;;;:::o;23985:::-;24127:3;24148:67;24212:2;24207:3;24148:67;:::i;:::-;24141:74;;24224:93;24313:3;24224:93;:::i;:::-;24342:2;24337:3;24333:12;24326:19;;23985:366;;;:::o;24357:::-;24499:3;24520:67;24584:2;24579:3;24520:67;:::i;:::-;24513:74;;24596:93;24685:3;24596:93;:::i;:::-;24714:2;24709:3;24705:12;24698:19;;24357:366;;;:::o;24729:::-;24871:3;24892:67;24956:2;24951:3;24892:67;:::i;:::-;24885:74;;24968:93;25057:3;24968:93;:::i;:::-;25086:2;25081:3;25077:12;25070:19;;24729:366;;;:::o;25101:::-;25243:3;25264:67;25328:2;25323:3;25264:67;:::i;:::-;25257:74;;25340:93;25429:3;25340:93;:::i;:::-;25458:2;25453:3;25449:12;25442:19;;25101:366;;;:::o;25473:::-;25615:3;25636:67;25700:2;25695:3;25636:67;:::i;:::-;25629:74;;25712:93;25801:3;25712:93;:::i;:::-;25830:2;25825:3;25821:12;25814:19;;25473:366;;;:::o;25845:::-;25987:3;26008:67;26072:2;26067:3;26008:67;:::i;:::-;26001:74;;26084:93;26173:3;26084:93;:::i;:::-;26202:2;26197:3;26193:12;26186:19;;25845:366;;;:::o;26217:::-;26359:3;26380:67;26444:2;26439:3;26380:67;:::i;:::-;26373:74;;26456:93;26545:3;26456:93;:::i;:::-;26574:2;26569:3;26565:12;26558:19;;26217:366;;;:::o;26589:118::-;26676:24;26694:5;26676:24;:::i;:::-;26671:3;26664:37;26589:118;;:::o;26713:275::-;26845:3;26867:95;26958:3;26949:6;26867:95;:::i;:::-;26860:102;;26979:3;26972:10;;26713:275;;;;:::o;26994:269::-;27123:3;27145:92;27233:3;27224:6;27145:92;:::i;:::-;27138:99;;27254:3;27247:10;;26994:269;;;;:::o;27269:222::-;27362:4;27400:2;27389:9;27385:18;27377:26;;27413:71;27481:1;27470:9;27466:17;27457:6;27413:71;:::i;:::-;27269:222;;;;:::o;27497:442::-;27646:4;27684:2;27673:9;27669:18;27661:26;;27697:71;27765:1;27754:9;27750:17;27741:6;27697:71;:::i;:::-;27778:72;27846:2;27835:9;27831:18;27822:6;27778:72;:::i;:::-;27860;27928:2;27917:9;27913:18;27904:6;27860:72;:::i;:::-;27497:442;;;;;;:::o;27945:640::-;28140:4;28178:3;28167:9;28163:19;28155:27;;28192:71;28260:1;28249:9;28245:17;28236:6;28192:71;:::i;:::-;28273:72;28341:2;28330:9;28326:18;28317:6;28273:72;:::i;:::-;28355;28423:2;28412:9;28408:18;28399:6;28355:72;:::i;:::-;28474:9;28468:4;28464:20;28459:2;28448:9;28444:18;28437:48;28502:76;28573:4;28564:6;28502:76;:::i;:::-;28494:84;;27945:640;;;;;;;:::o;28591:332::-;28712:4;28750:2;28739:9;28735:18;28727:26;;28763:71;28831:1;28820:9;28816:17;28807:6;28763:71;:::i;:::-;28844:72;28912:2;28901:9;28897:18;28888:6;28844:72;:::i;:::-;28591:332;;;;;:::o;28929:373::-;29072:4;29110:2;29099:9;29095:18;29087:26;;29159:9;29153:4;29149:20;29145:1;29134:9;29130:17;29123:47;29187:108;29290:4;29281:6;29187:108;:::i;:::-;29179:116;;28929:373;;;;:::o;29308:210::-;29395:4;29433:2;29422:9;29418:18;29410:26;;29446:65;29508:1;29497:9;29493:17;29484:6;29446:65;:::i;:::-;29308:210;;;;:::o;29524:313::-;29637:4;29675:2;29664:9;29660:18;29652:26;;29724:9;29718:4;29714:20;29710:1;29699:9;29695:17;29688:47;29752:78;29825:4;29816:6;29752:78;:::i;:::-;29744:86;;29524:313;;;;:::o;29843:419::-;30009:4;30047:2;30036:9;30032:18;30024:26;;30096:9;30090:4;30086:20;30082:1;30071:9;30067:17;30060:47;30124:131;30250:4;30124:131;:::i;:::-;30116:139;;29843:419;;;:::o;30268:::-;30434:4;30472:2;30461:9;30457:18;30449:26;;30521:9;30515:4;30511:20;30507:1;30496:9;30492:17;30485:47;30549:131;30675:4;30549:131;:::i;:::-;30541:139;;30268:419;;;:::o;30693:::-;30859:4;30897:2;30886:9;30882:18;30874:26;;30946:9;30940:4;30936:20;30932:1;30921:9;30917:17;30910:47;30974:131;31100:4;30974:131;:::i;:::-;30966:139;;30693:419;;;:::o;31118:::-;31284:4;31322:2;31311:9;31307:18;31299:26;;31371:9;31365:4;31361:20;31357:1;31346:9;31342:17;31335:47;31399:131;31525:4;31399:131;:::i;:::-;31391:139;;31118:419;;;:::o;31543:::-;31709:4;31747:2;31736:9;31732:18;31724:26;;31796:9;31790:4;31786:20;31782:1;31771:9;31767:17;31760:47;31824:131;31950:4;31824:131;:::i;:::-;31816:139;;31543:419;;;:::o;31968:::-;32134:4;32172:2;32161:9;32157:18;32149:26;;32221:9;32215:4;32211:20;32207:1;32196:9;32192:17;32185:47;32249:131;32375:4;32249:131;:::i;:::-;32241:139;;31968:419;;;:::o;32393:::-;32559:4;32597:2;32586:9;32582:18;32574:26;;32646:9;32640:4;32636:20;32632:1;32621:9;32617:17;32610:47;32674:131;32800:4;32674:131;:::i;:::-;32666:139;;32393:419;;;:::o;32818:::-;32984:4;33022:2;33011:9;33007:18;32999:26;;33071:9;33065:4;33061:20;33057:1;33046:9;33042:17;33035:47;33099:131;33225:4;33099:131;:::i;:::-;33091:139;;32818:419;;;:::o;33243:::-;33409:4;33447:2;33436:9;33432:18;33424:26;;33496:9;33490:4;33486:20;33482:1;33471:9;33467:17;33460:47;33524:131;33650:4;33524:131;:::i;:::-;33516:139;;33243:419;;;:::o;33668:::-;33834:4;33872:2;33861:9;33857:18;33849:26;;33921:9;33915:4;33911:20;33907:1;33896:9;33892:17;33885:47;33949:131;34075:4;33949:131;:::i;:::-;33941:139;;33668:419;;;:::o;34093:::-;34259:4;34297:2;34286:9;34282:18;34274:26;;34346:9;34340:4;34336:20;34332:1;34321:9;34317:17;34310:47;34374:131;34500:4;34374:131;:::i;:::-;34366:139;;34093:419;;;:::o;34518:::-;34684:4;34722:2;34711:9;34707:18;34699:26;;34771:9;34765:4;34761:20;34757:1;34746:9;34742:17;34735:47;34799:131;34925:4;34799:131;:::i;:::-;34791:139;;34518:419;;;:::o;34943:::-;35109:4;35147:2;35136:9;35132:18;35124:26;;35196:9;35190:4;35186:20;35182:1;35171:9;35167:17;35160:47;35224:131;35350:4;35224:131;:::i;:::-;35216:139;;34943:419;;;:::o;35368:::-;35534:4;35572:2;35561:9;35557:18;35549:26;;35621:9;35615:4;35611:20;35607:1;35596:9;35592:17;35585:47;35649:131;35775:4;35649:131;:::i;:::-;35641:139;;35368:419;;;:::o;35793:::-;35959:4;35997:2;35986:9;35982:18;35974:26;;36046:9;36040:4;36036:20;36032:1;36021:9;36017:17;36010:47;36074:131;36200:4;36074:131;:::i;:::-;36066:139;;35793:419;;;:::o;36218:::-;36384:4;36422:2;36411:9;36407:18;36399:26;;36471:9;36465:4;36461:20;36457:1;36446:9;36442:17;36435:47;36499:131;36625:4;36499:131;:::i;:::-;36491:139;;36218:419;;;:::o;36643:::-;36809:4;36847:2;36836:9;36832:18;36824:26;;36896:9;36890:4;36886:20;36882:1;36871:9;36867:17;36860:47;36924:131;37050:4;36924:131;:::i;:::-;36916:139;;36643:419;;;:::o;37068:::-;37234:4;37272:2;37261:9;37257:18;37249:26;;37321:9;37315:4;37311:20;37307:1;37296:9;37292:17;37285:47;37349:131;37475:4;37349:131;:::i;:::-;37341:139;;37068:419;;;:::o;37493:::-;37659:4;37697:2;37686:9;37682:18;37674:26;;37746:9;37740:4;37736:20;37732:1;37721:9;37717:17;37710:47;37774:131;37900:4;37774:131;:::i;:::-;37766:139;;37493:419;;;:::o;37918:::-;38084:4;38122:2;38111:9;38107:18;38099:26;;38171:9;38165:4;38161:20;38157:1;38146:9;38142:17;38135:47;38199:131;38325:4;38199:131;:::i;:::-;38191:139;;37918:419;;;:::o;38343:::-;38509:4;38547:2;38536:9;38532:18;38524:26;;38596:9;38590:4;38586:20;38582:1;38571:9;38567:17;38560:47;38624:131;38750:4;38624:131;:::i;:::-;38616:139;;38343:419;;;:::o;38768:::-;38934:4;38972:2;38961:9;38957:18;38949:26;;39021:9;39015:4;39011:20;39007:1;38996:9;38992:17;38985:47;39049:131;39175:4;39049:131;:::i;:::-;39041:139;;38768:419;;;:::o;39193:222::-;39286:4;39324:2;39313:9;39309:18;39301:26;;39337:71;39405:1;39394:9;39390:17;39381:6;39337:71;:::i;:::-;39193:222;;;;:::o;39421:129::-;39455:6;39482:20;;:::i;:::-;39472:30;;39511:33;39539:4;39531:6;39511:33;:::i;:::-;39421:129;;;:::o;39556:75::-;39589:6;39622:2;39616:9;39606:19;;39556:75;:::o;39637:311::-;39714:4;39804:18;39796:6;39793:30;39790:56;;;39826:18;;:::i;:::-;39790:56;39876:4;39868:6;39864:17;39856:25;;39936:4;39930;39926:15;39918:23;;39637:311;;;:::o;39954:307::-;40015:4;40105:18;40097:6;40094:30;40091:56;;;40127:18;;:::i;:::-;40091:56;40165:29;40187:6;40165:29;:::i;:::-;40157:37;;40249:4;40243;40239:15;40231:23;;39954:307;;;:::o;40267:308::-;40329:4;40419:18;40411:6;40408:30;40405:56;;;40441:18;;:::i;:::-;40405:56;40479:29;40501:6;40479:29;:::i;:::-;40471:37;;40563:4;40557;40553:15;40545:23;;40267:308;;;:::o;40581:132::-;40648:4;40671:3;40663:11;;40701:4;40696:3;40692:14;40684:22;;40581:132;;;:::o;40719:141::-;40768:4;40791:3;40783:11;;40814:3;40811:1;40804:14;40848:4;40845:1;40835:18;40827:26;;40719:141;;;:::o;40866:114::-;40933:6;40967:5;40961:12;40951:22;;40866:114;;;:::o;40986:98::-;41037:6;41071:5;41065:12;41055:22;;40986:98;;;:::o;41090:99::-;41142:6;41176:5;41170:12;41160:22;;41090:99;;;:::o;41195:113::-;41265:4;41297;41292:3;41288:14;41280:22;;41195:113;;;:::o;41314:184::-;41413:11;41447:6;41442:3;41435:19;41487:4;41482:3;41478:14;41463:29;;41314:184;;;;:::o;41504:168::-;41587:11;41621:6;41616:3;41609:19;41661:4;41656:3;41652:14;41637:29;;41504:168;;;;:::o;41678:169::-;41762:11;41796:6;41791:3;41784:19;41836:4;41831:3;41827:14;41812:29;;41678:169;;;;:::o;41853:148::-;41955:11;41992:3;41977:18;;41853:148;;;;:::o;42007:305::-;42047:3;42066:20;42084:1;42066:20;:::i;:::-;42061:25;;42100:20;42118:1;42100:20;:::i;:::-;42095:25;;42254:1;42186:66;42182:74;42179:1;42176:81;42173:107;;;42260:18;;:::i;:::-;42173:107;42304:1;42301;42297:9;42290:16;;42007:305;;;;:::o;42318:185::-;42358:1;42375:20;42393:1;42375:20;:::i;:::-;42370:25;;42409:20;42427:1;42409:20;:::i;:::-;42404:25;;42448:1;42438:35;;42453:18;;:::i;:::-;42438:35;42495:1;42492;42488:9;42483:14;;42318:185;;;;:::o;42509:348::-;42549:7;42572:20;42590:1;42572:20;:::i;:::-;42567:25;;42606:20;42624:1;42606:20;:::i;:::-;42601:25;;42794:1;42726:66;42722:74;42719:1;42716:81;42711:1;42704:9;42697:17;42693:105;42690:131;;;42801:18;;:::i;:::-;42690:131;42849:1;42846;42842:9;42831:20;;42509:348;;;;:::o;42863:191::-;42903:4;42923:20;42941:1;42923:20;:::i;:::-;42918:25;;42957:20;42975:1;42957:20;:::i;:::-;42952:25;;42996:1;42993;42990:8;42987:34;;;43001:18;;:::i;:::-;42987:34;43046:1;43043;43039:9;43031:17;;42863:191;;;;:::o;43060:96::-;43097:7;43126:24;43144:5;43126:24;:::i;:::-;43115:35;;43060:96;;;:::o;43162:104::-;43207:7;43236:24;43254:5;43236:24;:::i;:::-;43225:35;;43162:104;;;:::o;43272:90::-;43306:7;43349:5;43342:13;43335:21;43324:32;;43272:90;;;:::o;43368:149::-;43404:7;43444:66;43437:5;43433:78;43422:89;;43368:149;;;:::o;43523:126::-;43560:7;43600:42;43593:5;43589:54;43578:65;;43523:126;;;:::o;43655:77::-;43692:7;43721:5;43710:16;;43655:77;;;:::o;43738:154::-;43822:6;43817:3;43812;43799:30;43884:1;43875:6;43870:3;43866:16;43859:27;43738:154;;;:::o;43898:307::-;43966:1;43976:113;43990:6;43987:1;43984:13;43976:113;;;44075:1;44070:3;44066:11;44060:18;44056:1;44051:3;44047:11;44040:39;44012:2;44009:1;44005:10;44000:15;;43976:113;;;44107:6;44104:1;44101:13;44098:101;;;44187:1;44178:6;44173:3;44169:16;44162:27;44098:101;43947:258;43898:307;;;:::o;44211:171::-;44250:3;44273:24;44291:5;44273:24;:::i;:::-;44264:33;;44319:4;44312:5;44309:15;44306:41;;;44327:18;;:::i;:::-;44306:41;44374:1;44367:5;44363:13;44356:20;;44211:171;;;:::o;44388:320::-;44432:6;44469:1;44463:4;44459:12;44449:22;;44516:1;44510:4;44506:12;44537:18;44527:81;;44593:4;44585:6;44581:17;44571:27;;44527:81;44655:2;44647:6;44644:14;44624:18;44621:38;44618:84;;;44674:18;;:::i;:::-;44618:84;44439:269;44388:320;;;:::o;44714:281::-;44797:27;44819:4;44797:27;:::i;:::-;44789:6;44785:40;44927:6;44915:10;44912:22;44891:18;44879:10;44876:34;44873:62;44870:88;;;44938:18;;:::i;:::-;44870:88;44978:10;44974:2;44967:22;44757:238;44714:281;;:::o;45001:233::-;45040:3;45063:24;45081:5;45063:24;:::i;:::-;45054:33;;45109:66;45102:5;45099:77;45096:103;;;45179:18;;:::i;:::-;45096:103;45226:1;45219:5;45215:13;45208:20;;45001:233;;;:::o;45240:180::-;45288:77;45285:1;45278:88;45385:4;45382:1;45375:15;45409:4;45406:1;45399:15;45426:180;45474:77;45471:1;45464:88;45571:4;45568:1;45561:15;45595:4;45592:1;45585:15;45612:180;45660:77;45657:1;45650:88;45757:4;45754:1;45747:15;45781:4;45778:1;45771:15;45798:180;45846:77;45843:1;45836:88;45943:4;45940:1;45933:15;45967:4;45964:1;45957:15;45984:180;46032:77;46029:1;46022:88;46129:4;46126:1;46119:15;46153:4;46150:1;46143:15;46170:180;46218:77;46215:1;46208:88;46315:4;46312:1;46305:15;46339:4;46336:1;46329:15;46356:117;46465:1;46462;46455:12;46479:117;46588:1;46585;46578:12;46602:117;46711:1;46708;46701:12;46725:117;46834:1;46831;46824:12;46848:117;46957:1;46954;46947:12;46971:117;47080:1;47077;47070:12;47094:102;47135:6;47186:2;47182:7;47177:2;47170:5;47166:14;47162:28;47152:38;;47094:102;;;:::o;47202:237::-;47342:34;47338:1;47330:6;47326:14;47319:58;47411:20;47406:2;47398:6;47394:15;47387:45;47202:237;:::o;47445:169::-;47585:21;47581:1;47573:6;47569:14;47562:45;47445:169;:::o;47620:225::-;47760:34;47756:1;47748:6;47744:14;47737:58;47829:8;47824:2;47816:6;47812:15;47805:33;47620:225;:::o;47851:178::-;47991:30;47987:1;47979:6;47975:14;47968:54;47851:178;:::o;48035:223::-;48175:34;48171:1;48163:6;48159:14;48152:58;48244:6;48239:2;48231:6;48227:15;48220:31;48035:223;:::o;48264:175::-;48404:27;48400:1;48392:6;48388:14;48381:51;48264:175;:::o;48445:229::-;48585:34;48581:1;48573:6;48569:14;48562:58;48654:12;48649:2;48641:6;48637:15;48630:37;48445:229;:::o;48680:170::-;48820:22;48816:1;48808:6;48804:14;48797:46;48680:170;:::o;48856:231::-;48996:34;48992:1;48984:6;48980:14;48973:58;49065:14;49060:2;49052:6;49048:15;49041:39;48856:231;:::o;49093:243::-;49233:34;49229:1;49221:6;49217:14;49210:58;49302:26;49297:2;49289:6;49285:15;49278:51;49093:243;:::o;49342:229::-;49482:34;49478:1;49470:6;49466:14;49459:58;49551:12;49546:2;49538:6;49534:15;49527:37;49342:229;:::o;49577:228::-;49717:34;49713:1;49705:6;49701:14;49694:58;49786:11;49781:2;49773:6;49769:15;49762:36;49577:228;:::o;49811:182::-;49951:34;49947:1;49939:6;49935:14;49928:58;49811:182;:::o;49999:231::-;50139:34;50135:1;50127:6;50123:14;50116:58;50208:14;50203:2;50195:6;50191:15;50184:39;49999:231;:::o;50236:182::-;50376:34;50372:1;50364:6;50360:14;50353:58;50236:182;:::o;50424:228::-;50564:34;50560:1;50552:6;50548:14;50541:58;50633:11;50628:2;50620:6;50616:15;50609:36;50424:228;:::o;50658:220::-;50798:34;50794:1;50786:6;50782:14;50775:58;50867:3;50862:2;50854:6;50850:15;50843:28;50658:220;:::o;50884:178::-;51024:30;51020:1;51012:6;51008:14;51001:54;50884:178;:::o;51068:236::-;51208:34;51204:1;51196:6;51192:14;51185:58;51277:19;51272:2;51264:6;51260:15;51253:44;51068:236;:::o;51310:223::-;51450:34;51446:1;51438:6;51434:14;51427:58;51519:6;51514:2;51506:6;51502:15;51495:31;51310:223;:::o;51539:222::-;51679:34;51675:1;51667:6;51663:14;51656:58;51748:5;51743:2;51735:6;51731:15;51724:30;51539:222;:::o;51767:226::-;51907:34;51903:1;51895:6;51891:14;51884:58;51976:9;51971:2;51963:6;51959:15;51952:34;51767:226;:::o;51999:122::-;52072:24;52090:5;52072:24;:::i;:::-;52065:5;52062:35;52052:63;;52111:1;52108;52101:12;52052:63;51999:122;:::o;52127:138::-;52208:32;52234:5;52208:32;:::i;:::-;52201:5;52198:43;52188:71;;52255:1;52252;52245:12;52188:71;52127:138;:::o;52271:116::-;52341:21;52356:5;52341:21;:::i;:::-;52334:5;52331:32;52321:60;;52377:1;52374;52367:12;52321:60;52271:116;:::o;52393:120::-;52465:23;52482:5;52465:23;:::i;:::-;52458:5;52455:34;52445:62;;52503:1;52500;52493:12;52445:62;52393:120;:::o;52519:122::-;52592:24;52610:5;52592:24;:::i;:::-;52585:5;52582:35;52572:63;;52631:1;52628;52621:12;52572:63;52519:122;:::o

Swarm Source

ipfs://97e12ad8d8450428fc5ef8029ef6b7c6218b2a0c1aa04778cc923631f4019ac0
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.