ETH Price: $2,561.52 (-1.68%)
Gas: 4 Gwei

BARGANG (BARGANG)
 

Overview

TokenID

4

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
BarGangNFT

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <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/IERC721Metadata.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <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/IERC721Enumerable.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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/introspection/ERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

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

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

// File: @openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

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

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

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

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

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

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

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

            bytes32 lastvalue = set._values[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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


    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

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

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

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

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

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

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

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

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

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

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

            MapEntry storage lastEntry = map._entries[lastIndex];

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

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

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

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

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

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

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    /**
     * @dev Converts a `uint256` to its ASCII `string` 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);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;












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

    // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector`
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Base URI
    string private _baseURI;

    /*
     *     bytes4(keccak256('balanceOf(address)')) == 0x70a08231
     *     bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e
     *     bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3
     *     bytes4(keccak256('getApproved(uint256)')) == 0x081812fc
     *     bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465
     *     bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5
     *     bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e
     *     bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde
     *
     *     => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^
     *        0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd
     */
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    /*
     *     bytes4(keccak256('name()')) == 0x06fdde03
     *     bytes4(keccak256('symbol()')) == 0x95d89b41
     *     bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd
     *
     *     => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f
     */
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    /*
     *     bytes4(keccak256('totalSupply()')) == 0x18160ddd
     *     bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59
     *     bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7
     *
     *     => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63
     */
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }

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

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

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

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

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        _tokenOwners.set(tokenId, to);

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <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 () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;


/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath}
 * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never
 * directly accessed.
 */
library Counters {
    using SafeMath for uint256;

    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

    function increment(Counter storage counter) internal {
        // The {SafeMath} overflow check can be skipped here, see the comment at the top
        counter._value += 1;
    }

    function decrement(Counter storage counter) internal {
        counter._value = counter._value.sub(1);
    }
}

// File: contracts/BarGangNFT.sol

pragma solidity 0.6.6;
pragma experimental ABIEncoderV2;






contract BarGangNFT is ERC721, Ownable {

    using Counters for Counters.Counter;
    using SafeMath for uint256;

    /**********  staging value for 
        initial state (value = 0)
        presale (value = 1), 
        public minting (value = 2)
        ended (value = 3)
    *******************************/
    uint _stagingValue = 0;
    string public _contractURI = "";

    Counters.Counter private _tokenIds;

    uint256 MAX_SUPPLY = 10000;

    uint GIVEAWAY_MAX_PER_USER = 1;
    uint PRIVATESALE_MAX_PER_USER = 5;
    uint PUBLICSALE_MAX_PER_USER = 10;

    uint256 _privateSalePrice = 65000000000000000; // 0.065 ETH
    uint256 _publicSalePrice = 85000000000000000; // 0.085 ETH
    
    mapping(address => bool) private _familyWhitelist;
    mapping(address => bool) private _presaleWhitelist;
    
    mapping(address => uint) private _familyCountlist;
    mapping(address => uint) private _presaleCountlist;
    mapping(address => uint) private _publicsaleCountlist;

    constructor() public ERC721("BARGANG", "BARGANG") payable {
        for (uint i = 0; i < 15; i++)
            airdrop();
    }

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

    function setFamilyWhiteList(address[] memory params) public onlyOwner{
        require(params.length > 0, "Please input whiltelist array");
        for(uint i = 0; i < params.length; i++) {
            _familyWhitelist[params[i]] = true;
        }
    }

    function setPresaleWhiteList(address[] memory params) public onlyOwner{
        require(params.length > 0, "Please input whiltelist array");
        for(uint i = 0; i < params.length; i++) {
            _presaleWhitelist[params[i]] = true;
        }
    }

    function _tokenMint() internal {
        _tokenIds.increment();
        uint256 tokenId = _tokenIds.current();
        _safeMint(msg.sender, tokenId);
        _setTokenURI(tokenId, uint2str(tokenId));
    }

    function requestGiveAway() external payable {
        require(super.totalSupply() < MAX_SUPPLY, "Maximum supply reached");
        require(_familyWhitelist[msg.sender], "This address is not included in family/friend whitelist");
        require(_familyCountlist[msg.sender] < GIVEAWAY_MAX_PER_USER, "You can get a giveaway no more than one");

        _tokenMint();
        _familyCountlist[msg.sender] = _familyCountlist[msg.sender] + 1;
    }

    function requestPrivateSale(uint mintCount) external payable {
        require(super.totalSupply() + mintCount < MAX_SUPPLY, "Maximum supply reached");
        require(_stagingValue == 1, "Presale is not allowed");
        require(_presaleWhitelist[msg.sender], "This address is not included in whitelist");
        require(_presaleCountlist[msg.sender] + mintCount <= PRIVATESALE_MAX_PER_USER, "Overflow 5 tokens");
        require(msg.value >= _privateSalePrice.mul(mintCount), "Invalid funds");
        for (uint256 index = 0; index < mintCount; index++) {
            _tokenMint();
            _presaleCountlist[msg.sender] = _presaleCountlist[msg.sender] + 1;
        }
    }

    function requestPublicSale(uint mintCount) external payable {
        require(super.totalSupply() + mintCount <= MAX_SUPPLY, "Maximum supply reached.");
        require(_stagingValue == 2, "PublicSale is not allowed.");
        require(_publicsaleCountlist[msg.sender] + mintCount <= PUBLICSALE_MAX_PER_USER, "Overflow 10 tokens");
        require(msg.value >= _publicSalePrice.mul(mintCount), "Invalid funds");
        for (uint256 index = 0; index < mintCount; index++) {
            _tokenMint();
            _publicsaleCountlist[msg.sender] = _publicsaleCountlist[msg.sender] + 1;
        }
    }

    function airdrop() internal {
        // owner will mint the first 15 rare ones
        _tokenMint();
    }

    function ownerMint(uint mintCount) external onlyOwner{
        for (uint256 index = 0; index < mintCount; index++) {
            _tokenMint();
        }
    }

    function getCurrentStage() external view returns(uint256) {
        return _stagingValue;
    }

    function setStage(uint256 value) external onlyOwner{
        require(value >= 0, "Invalid staging value");
        require(value <= 3, "Invalid staging value");
        _stagingValue = value; 
    }

    // Function to withdraw all Ether from this contract.
    function withdraw() external onlyOwner{
        // send all Ether to owner
        // Owner can receive Ether since the address of owner is payable
        (bool success, ) = owner().call{value: address(this).balance}("");
        require(success, "Failed to send Ether");
    }

    function setContractURI(string calldata URI) external onlyOwner {
        _contractURI = URI;
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestGiveAway","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"requestPrivateSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintCount","type":"uint256"}],"name":"requestPublicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"params","type":"address[]"}],"name":"setFamilyWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"params","type":"address[]"}],"name":"setPresaleWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b5560405180602001604052806000815250600c90805190602001906200003092919062000d83565b50612710600e556001600f556005601055600a60115566e6ed27d666800060125567012dfb0cb5e880006013556040518060400160405280600781526020017f42415247414e47000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f42415247414e4700000000000000000000000000000000000000000000000000815250620000e16301ffc9a760e01b6200024360201b60201c565b8160069080519060200190620000f992919062000d83565b5080600790805190602001906200011292919062000d83565b506200012b6380ac58cd60e01b6200024360201b60201c565b62000143635b5e139f60e01b6200024360201b60201c565b6200015b63780e9d6360e01b6200024360201b60201c565b505060006200016f6200031b60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35060008090505b600f8110156200023c576200022e6200032360201b60201c565b808060010191505062000214565b5062001442565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620002af576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a69062001254565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b620003336200033560201b60201c565b565b6200034c600d6200039e60201b62002a3f1760201c565b600062000365600d620003b460201b62002a551760201c565b9050620003793382620003c260201b60201c565b6200039b816200038f83620003e860201b60201c565b6200054460201b60201c565b50565b6001816000016000828254019250508190555050565b600081600001549050919050565b620003e4828260405180602001604052806000815250620005c560201b60201c565b5050565b6060600082141562000432576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506200053f565b600082905060005b600082146200045f578080600101915050600a82816200045657fe5b0491506200043a565b60608167ffffffffffffffff811180156200047957600080fd5b506040519080825280601f01601f191660200182016040528015620004ad5781602001600182028036833780820191505090505b50905060008290505b6000861462000537576001810390506000600a808881620004d357fe5b04028703603001905060008160f81b905080848481518110620004f257fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a88816200052c57fe5b0497505050620004b6565b819450505050505b919050565b62000555826200063360201b60201c565b62000597576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200058e90620012dc565b60405180910390fd5b80600860008481526020019081526020016000209080519060200190620005c092919062000d83565b505050565b620005d783836200065760201b60201c565b620005ec60008484846200080960201b60201c565b6200062e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006259062001232565b60405180910390fd5b505050565b6000620006508260026200099060201b62002a251790919060201c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620006ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006c190620012ba565b60405180910390fd5b620006db816200063360201b60201c565b156200071e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007159062001276565b60405180910390fd5b6200073260008383620009b260201b60201c565b6200078a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020620009b760201b62002c751790919060201c565b50620007a881836002620009d960201b62002c8f179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008378473ffffffffffffffffffffffffffffffffffffffff1662000a1660201b6200326c1760201c565b62000846576001905062000988565b60606200091f63150b7a0260e01b620008646200031b60201b60201c565b8887876040516024016200087c9493929190620011ba565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001620063cd603291398773ffffffffffffffffffffffffffffffffffffffff1662000a2960201b6200327f179092919060201c565b905060008180602001905181019062000939919062000e49565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b6000620009aa836000018360001b62000a4960201b60201c565b905092915050565b505050565b6000620009d1836000018360001b62000a6c60201b60201c565b905092915050565b600062000a0d846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b62000ae660201b60201c565b90509392505050565b600080823b905060008111915050919050565b606062000a40848460008562000bc560201b60201c565b90509392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600062000a80838362000cf460201b60201c565b62000adb57826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000ae0565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000b8f5784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000bbe565b8285600001600183038154811062000ba357fe5b90600052602060002090600202016001018190555060009150505b9392505050565b60608247101562000c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c049062001298565b60405180910390fd5b62000c1e8562000a1660201b60201c565b62000c60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c5790620012fe565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff16858760405162000c8c9190620011a1565b60006040518083038185875af1925050503d806000811462000ccb576040519150601f19603f3d011682016040523d82523d6000602084013e62000cd0565b606091505b509150915062000ce882828662000d1760201b60201c565b92505050949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b6060831562000d295782905062000d7c565b60008351111562000d3d5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d7391906200120e565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000dc657805160ff191683800117855562000df7565b8280016001018555821562000df7579182015b8281111562000df657825182559160200191906001019062000dd9565b5b50905062000e06919062000e0a565b5090565b62000e2f91905b8082111562000e2b57600081600090555060010162000e11565b5090565b90565b60008151905062000e438162001428565b92915050565b60006020828403121562000e5c57600080fd5b600062000e6c8482850162000e32565b91505092915050565b62000e808162001377565b82525050565b62000e918162001363565b82525050565b600062000ea48262001320565b62000eb0818562001336565b935062000ec2818560208601620013e1565b62000ecd8162001417565b840191505092915050565b600062000ee58262001320565b62000ef1818562001347565b935062000f03818560208601620013e1565b80840191505092915050565b600062000f1c826200132b565b62000f28818562001352565b935062000f3a818560208601620013e1565b62000f458162001417565b840191505092915050565b600062000f5f60328362001352565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062000fc7601c8362001352565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600062001009601c8362001352565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006200104b60268362001352565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000620010b360208362001352565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000620010f5602c8362001352565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006200115d601d8362001352565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6200119b81620013d7565b82525050565b6000620011af828462000ed8565b915081905092915050565b6000608082019050620011d1600083018762000e75565b620011e0602083018662000e86565b620011ef604083018562001190565b818103606083015262001203818462000e97565b905095945050505050565b600060208201905081810360008301526200122a818462000f0f565b905092915050565b600060208201905081810360008301526200124d8162000f50565b9050919050565b600060208201905081810360008301526200126f8162000fb8565b9050919050565b60006020820190508181036000830152620012918162000ffa565b9050919050565b60006020820190508181036000830152620012b3816200103c565b9050919050565b60006020820190508181036000830152620012d581620010a4565b9050919050565b60006020820190508181036000830152620012f781620010e6565b9050919050565b6000602082019050818103600083015262001319816200114e565b9050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006200137082620013b7565b9050919050565b60006200138482620013b7565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562001401578082015181840152602081019050620013e4565b8381111562001411576000848401525b50505050565b6000601f19601f8301169050919050565b62001433816200138b565b81146200143f57600080fd5b50565b614f7b80620014526000396000f3fe6080604052600436106101ee5760003560e01c806370a082311161010d578063b88d4fde116100a0578063e8a3d4851161006f578063e8a3d485146106aa578063e985e9c5146106d5578063eedbe31d14610712578063f19e75d41461073d578063f2fde38b14610766576101ee565b8063b88d4fde146105fd578063c0e7274014610626578063c2b1f3f714610651578063c87b56dd1461066d576101ee565b806395d89b41116100dc57806395d89b4114610564578063a22cb4651461058f578063a2faf6a5146105b8578063a54ee844146105e1576101ee565b806370a08231146104bc578063715018a6146104f95780638da5cb5b14610510578063938e3d7b1461053b576101ee565b80633ccfd60b116101855780634f6ccce7116101545780634f6ccce7146103ee57806355f804b31461042b5780636352211e146104545780636c0360eb14610491576101ee565b80633ccfd60b1461035c5780633eb1d7771461037357806342842e0e1461039c57806343c624b3146103c5576101ee565b8063126c54b7116101c1578063126c54b7146102c157806318160ddd146102cb57806323b872dd146102f65780632f745c591461031f576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613a5b565b61078f565b604051610227919061484e565b60405180910390f35b34801561023c57600080fd5b506102456107f6565b6040516102529190614869565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613af2565b610898565b60405161028f91906147e7565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906139de565b61091d565b005b6102c9610a35565b005b3480156102d757600080fd5b506102e0610c1f565b6040516102ed9190614ccb565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906138d8565b610c30565b005b34801561032b57600080fd5b50610346600480360381019061034191906139de565b610c90565b6040516103539190614ccb565b60405180910390f35b34801561036857600080fd5b50610371610ceb565b005b34801561037f57600080fd5b5061039a60048036038101906103959190613af2565b610e1d565b005b3480156103a857600080fd5b506103c360048036038101906103be91906138d8565b610f2b565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190613a1a565b610f4b565b005b3480156103fa57600080fd5b5061041560048036038101906104109190613af2565b611096565b6040516104229190614ccb565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613aad565b6110b9565b005b34801561046057600080fd5b5061047b60048036038101906104769190613af2565b611186565b60405161048891906147e7565b60405180910390f35b34801561049d57600080fd5b506104a66111bd565b6040516104b39190614869565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613873565b61125f565b6040516104f09190614ccb565b60405180910390f35b34801561050557600080fd5b5061050e61131e565b005b34801561051c57600080fd5b5061052561145b565b60405161053291906147e7565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190613aad565b611485565b005b34801561057057600080fd5b50610579611517565b6040516105869190614869565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b191906139a2565b6115b9565b005b3480156105c457600080fd5b506105df60048036038101906105da9190613a1a565b61173a565b005b6105fb60048036038101906105f69190613af2565b611885565b005b34801561060957600080fd5b50610624600480360381019061061f9190613927565b611aa2565b005b34801561063257600080fd5b5061063b611b04565b6040516106489190614869565b60405180910390f35b61066b60048036038101906106669190613af2565b611ba2565b005b34801561067957600080fd5b50610694600480360381019061068f9190613af2565b611e4a565b6040516106a19190614869565b60405180910390f35b3480156106b657600080fd5b506106bf611fcd565b6040516106cc9190614869565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f7919061389c565b61206f565b604051610709919061484e565b60405180910390f35b34801561071e57600080fd5b50610727612103565b6040516107349190614ccb565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613af2565b61210d565b005b34801561077257600080fd5b5061078d60048036038101906107889190613873565b6121b0565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561088e5780601f106108635761010080835404028352916020019161088e565b820191906000526020600020905b81548152906001019060200180831161087157829003601f168201915b5050505050905090565b60006108a38261235c565b6108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990614b2b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092882611186565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090614c2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b8612379565b73ffffffffffffffffffffffffffffffffffffffff1614806109e757506109e6816109e1612379565b61206f565b5b610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d90614a4b565b60405180910390fd5b610a308383612381565b505050565b600e54610a40610c1f565b10610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614a2b565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b03906148eb565b60405180910390fd5b600f54601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86906149ab565b60405180910390fd5b610b9761243a565b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000610c2b6002612471565b905090565b610c41610c3b612379565b82612486565b610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790614c4b565b60405180910390fd5b610c8b838383612564565b505050565b6000610ce382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061277b90919063ffffffff16565b905092915050565b610cf3612379565b73ffffffffffffffffffffffffffffffffffffffff16610d1161145b565b73ffffffffffffffffffffffffffffffffffffffff1614610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90614b8b565b60405180910390fd5b6000610d7161145b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d94906147d2565b60006040518083038185875af1925050503d8060008114610dd1576040519150601f19603f3d011682016040523d82523d6000602084013e610dd6565b606091505b5050905080610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e119061494b565b60405180910390fd5b50565b610e25612379565b73ffffffffffffffffffffffffffffffffffffffff16610e4361145b565b73ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614b8b565b60405180910390fd5b6000811015610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614cab565b60405180910390fd5b6003811115610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890614cab565b60405180910390fd5b80600b8190555050565b610f4683838360405180602001604052806000815250611aa2565b505050565b610f53612379565b73ffffffffffffffffffffffffffffffffffffffff16610f7161145b565b73ffffffffffffffffffffffffffffffffffffffff1614610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90614b8b565b60405180910390fd5b600081511161100b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611002906148ab565b60405180910390fd5b60008090505b81518110156110925760016014600084848151811061102c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611011565b5050565b6000806110ad83600261279590919063ffffffff16565b50905080915050919050565b6110c1612379565b73ffffffffffffffffffffffffffffffffffffffff166110df61145b565b73ffffffffffffffffffffffffffffffffffffffff1614611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90614b8b565b60405180910390fd5b61118282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127c4565b5050565b60006111b682604051806060016040528060298152602001614f1d6029913960026127de9092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112555780601f1061122a57610100808354040283529160200191611255565b820191906000526020600020905b81548152906001019060200180831161123857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614a8b565b60405180910390fd5b611317600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206127fd565b9050919050565b611326612379565b73ffffffffffffffffffffffffffffffffffffffff1661134461145b565b73ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614b8b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61148d612379565b73ffffffffffffffffffffffffffffffffffffffff166114ab61145b565b73ffffffffffffffffffffffffffffffffffffffff1614611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614b8b565b60405180910390fd5b8181600c91906115129291906135c4565b505050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115af5780601f10611584576101008083540402835291602001916115af565b820191906000526020600020905b81548152906001019060200180831161159257829003601f168201915b5050505050905090565b6115c1612379565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116269061498b565b60405180910390fd5b806005600061163c612379565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e9612379565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172e919061484e565b60405180910390a35050565b611742612379565b73ffffffffffffffffffffffffffffffffffffffff1661176061145b565b73ffffffffffffffffffffffffffffffffffffffff16146117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90614b8b565b60405180910390fd5b60008151116117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906148ab565b60405180910390fd5b60008090505b81518110156118815760016015600084848151811061181b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611800565b5050565b600e5481611891610c1f565b0111156118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90614beb565b60405180910390fd5b6002600b5414611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614aeb565b60405180910390fd5b60115481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401111561199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614a6b565b60405180910390fd5b6119b38160135461281290919063ffffffff16565b3410156119f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec90614b6b565b60405180910390fd5b60008090505b81811015611a9e57611a0b61243a565b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806001019150506119fb565b5050565b611ab3611aad612379565b83612486565b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae990614c4b565b60405180910390fd5b611afe84848484612882565b50505050565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b9a5780601f10611b6f57610100808354040283529160200191611b9a565b820191906000526020600020905b815481529060010190602001808311611b7d57829003601f168201915b505050505081565b600e5481611bae610c1f565b0110611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690614a2b565b60405180910390fd5b6001600b5414611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b90614c0b565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614c8b565b60405180910390fd5b60105481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614a0b565b60405180910390fd5b611d5b8160125461281290919063ffffffff16565b341015611d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9490614b6b565b60405180910390fd5b60008090505b81811015611e4657611db361243a565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611da3565b5050565b6060611e558261235c565b611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614bcb565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f3d5780601f10611f1257610100808354040283529160200191611f3d565b820191906000526020600020905b815481529060010190602001808311611f2057829003601f168201915b505050505090506060611f4e6111bd565b9050600081511415611f64578192505050611fc8565b600082511115611f99578082604051602001611f819291906147ae565b60405160208183030381529060405292505050611fc8565b80611fa3856128de565b604051602001611fb49291906147ae565b604051602081830303815290604052925050505b919050565b6060600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120655780601f1061203a57610100808354040283529160200191612065565b820191906000526020600020905b81548152906001019060200180831161204857829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600b54905090565b612115612379565b73ffffffffffffffffffffffffffffffffffffffff1661213361145b565b73ffffffffffffffffffffffffffffffffffffffff1614612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614b8b565b60405180910390fd5b60008090505b818110156121ac5761219f61243a565b808060010191505061218f565b5050565b6121b8612379565b73ffffffffffffffffffffffffffffffffffffffff166121d661145b565b73ffffffffffffffffffffffffffffffffffffffff161461222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222390614b8b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561229c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122939061490b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612372826002612a2590919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123f483611186565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612444600d612a3f565b6000612450600d612a55565b905061245c3382612a63565b61246e8161246983612a81565b612bd1565b50565b600061247f82600001612c45565b9050919050565b60006124918261235c565b6124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c7906149eb565b60405180910390fd5b60006124db83611186565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061254a57508373ffffffffffffffffffffffffffffffffffffffff1661253284610898565b73ffffffffffffffffffffffffffffffffffffffff16145b8061255b575061255a818561206f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661258482611186565b73ffffffffffffffffffffffffffffffffffffffff16146125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190614bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561264a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126419061496b565b60405180910390fd5b612655838383612c56565b612660600082612381565b6126b181600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c5b90919063ffffffff16565b5061270381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c7590919063ffffffff16565b5061271a81836002612c8f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061278a8360000183612cc4565b60001c905092915050565b6000806000806127a88660000186612d31565b915091508160001c8160001c8090509350935050509250929050565b80600990805190602001906127da929190613644565b5050565b60006127f1846000018460001b84612db4565b60001c90509392505050565b600061280b82600001612e45565b9050919050565b600080831415612825576000905061287c565b600082840290508284828161283657fe5b0414612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e90614b0b565b60405180910390fd5b809150505b92915050565b61288d848484612564565b61289984848484612e56565b6128d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cf906148cb565b60405180910390fd5b50505050565b60606000821415612926576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a20565b600082905060005b60008214612950578080600101915050600a828161294857fe5b04915061292e565b60608167ffffffffffffffff8111801561296957600080fd5b506040519080825280601f01601f19166020018201604052801561299c5781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612a1857600a84816129bd57fe5b0660300160f81b828280600190039350815181106129d757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612a1057fe5b0493506129ab565b819450505050505b919050565b6000612a37836000018360001b612fba565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612a7d828260405180602001604052806000815250612fdd565b5050565b60606000821415612ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bcc565b600082905060005b60008214612af3578080600101915050600a8281612aeb57fe5b049150612ad1565b60608167ffffffffffffffff81118015612b0c57600080fd5b506040519080825280601f01601f191660200182016040528015612b3f5781602001600182028036833780820191505090505b50905060008290505b60008614612bc4576001810390506000600a808881612b6357fe5b04028703603001905060008160f81b905080848481518110612b8157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8881612bba57fe5b0497505050612b48565b819450505050505b919050565b612bda8261235c565b612c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1090614b4b565b60405180910390fd5b80600860008481526020019081526020016000209080519060200190612c40929190613644565b505050565b600081600001805490509050919050565b505050565b6000612c6d836000018360001b613038565b905092915050565b6000612c87836000018360001b613120565b905092915050565b6000612cbb846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613190565b90509392505050565b600081836000018054905011612d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d069061488b565b60405180910390fd5b826000018281548110612d1e57fe5b9060005260206000200154905092915050565b60008082846000018054905011612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490614aab565b60405180910390fd5b6000846000018481548110612d8e57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0d9190614869565b60405180910390fd5b50846000016001820381548110612e2957fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e778473ffffffffffffffffffffffffffffffffffffffff1661326c565b612e845760019050612fb2565b6060612f4b63150b7a0260e01b612e99612379565b888787604051602401612eaf9493929190614802565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614eeb603291398773ffffffffffffffffffffffffffffffffffffffff1661327f9092919063ffffffff16565b9050600081806020019051810190612f639190613a84565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612fe78383613297565b612ff46000848484612e56565b613033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302a906148cb565b60405180910390fd5b505050565b60008083600101600084815260200190815260200160002054905060008114613114576000600182039050600060018660000180549050039050600086600001828154811061308357fe5b90600052602060002001549050808760000184815481106130a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806130d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061311a565b60009150505b92915050565b600061312c8383613425565b61318557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061318a565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561323757846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613265565b8285600001600183038154811061324a57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061328e8484600085613448565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fe90614acb565b60405180910390fd5b6133108161235c565b15613350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133479061492b565b60405180910390fd5b61335c60008383612c56565b6133ad81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c7590919063ffffffff16565b506133c481836002612c8f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561348d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613484906149cb565b60405180910390fd5b6134968561326c565b6134d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cc90614c6b565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516134ff9190614797565b60006040518083038185875af1925050503d806000811461353c576040519150601f19603f3d011682016040523d82523d6000602084013e613541565b606091505b509150915061355182828661355d565b92505050949350505050565b6060831561356d578290506135bd565b6000835111156135805782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b49190614869565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061360557803560ff1916838001178555613633565b82800160010185558215613633579182015b82811115613632578235825591602001919060010190613617565b5b50905061364091906136c4565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061368557805160ff19168380011785556136b3565b828001600101855582156136b3579182015b828111156136b2578251825591602001919060010190613697565b5b5090506136c091906136c4565b5090565b6136e691905b808211156136e25760008160009055506001016136ca565b5090565b90565b6000813590506136f881614e8e565b92915050565b600082601f83011261370f57600080fd5b813561372261371d82614d13565b614ce6565b9150818183526020840193506020810190508385602084028201111561374757600080fd5b60005b83811015613777578161375d88826136e9565b84526020840193506020830192505060018101905061374a565b5050505092915050565b60008135905061379081614ea5565b92915050565b6000813590506137a581614ebc565b92915050565b6000815190506137ba81614ebc565b92915050565b600082601f8301126137d157600080fd5b81356137e46137df82614d3b565b614ce6565b9150808252602083016020830185838301111561380057600080fd5b61380b838284614e3b565b50505092915050565b60008083601f84011261382657600080fd5b8235905067ffffffffffffffff81111561383f57600080fd5b60208301915083600182028301111561385757600080fd5b9250929050565b60008135905061386d81614ed3565b92915050565b60006020828403121561388557600080fd5b6000613893848285016136e9565b91505092915050565b600080604083850312156138af57600080fd5b60006138bd858286016136e9565b92505060206138ce858286016136e9565b9150509250929050565b6000806000606084860312156138ed57600080fd5b60006138fb868287016136e9565b935050602061390c868287016136e9565b925050604061391d8682870161385e565b9150509250925092565b6000806000806080858703121561393d57600080fd5b600061394b878288016136e9565b945050602061395c878288016136e9565b935050604061396d8782880161385e565b925050606085013567ffffffffffffffff81111561398a57600080fd5b613996878288016137c0565b91505092959194509250565b600080604083850312156139b557600080fd5b60006139c3858286016136e9565b92505060206139d485828601613781565b9150509250929050565b600080604083850312156139f157600080fd5b60006139ff858286016136e9565b9250506020613a108582860161385e565b9150509250929050565b600060208284031215613a2c57600080fd5b600082013567ffffffffffffffff811115613a4657600080fd5b613a52848285016136fe565b91505092915050565b600060208284031215613a6d57600080fd5b6000613a7b84828501613796565b91505092915050565b600060208284031215613a9657600080fd5b6000613aa4848285016137ab565b91505092915050565b60008060208385031215613ac057600080fd5b600083013567ffffffffffffffff811115613ada57600080fd5b613ae685828601613814565b92509250509250929050565b600060208284031215613b0457600080fd5b6000613b128482850161385e565b91505092915050565b613b2481614dc7565b82525050565b613b3381614db5565b82525050565b613b4281614dd9565b82525050565b6000613b5382614d67565b613b5d8185614d7d565b9350613b6d818560208601614e4a565b613b7681614e7d565b840191505092915050565b6000613b8c82614d67565b613b968185614d8e565b9350613ba6818560208601614e4a565b80840191505092915050565b6000613bbd82614d72565b613bc78185614d99565b9350613bd7818560208601614e4a565b613be081614e7d565b840191505092915050565b6000613bf682614d72565b613c008185614daa565b9350613c10818560208601614e4a565b80840191505092915050565b6000613c29602283614d99565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c8f601d83614d99565b91507f506c6561736520696e707574207768696c74656c6973742061727261790000006000830152602082019050919050565b6000613ccf603283614d99565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d35603783614d99565b91507f546869732061646472657373206973206e6f7420696e636c7564656420696e2060008301527f66616d696c792f667269656e642077686974656c6973740000000000000000006020830152604082019050919050565b6000613d9b602683614d99565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e01601c83614d99565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e41601483614d99565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b6000613e81602483614d99565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee7601983614d99565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f27602783614d99565b91507f596f752063616e206765742061206769766561776179206e6f206d6f7265207460008301527f68616e206f6e65000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f8d602683614d99565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff3602c83614d99565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614059601183614d99565b91507f4f766572666c6f77203520746f6b656e730000000000000000000000000000006000830152602082019050919050565b6000614099601683614d99565b91507f4d6178696d756d20737570706c792072656163686564000000000000000000006000830152602082019050919050565b60006140d9603883614d99565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061413f601283614d99565b91507f4f766572666c6f7720313020746f6b656e7300000000000000000000000000006000830152602082019050919050565b600061417f602a83614d99565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141e5602283614d99565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061424b602083614d99565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061428b601a83614d99565b91507f5075626c696353616c65206973206e6f7420616c6c6f7765642e0000000000006000830152602082019050919050565b60006142cb602183614d99565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614331602c83614d99565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614397602c83614d99565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143fd600d83614d99565b91507f496e76616c69642066756e6473000000000000000000000000000000000000006000830152602082019050919050565b600061443d602083614d99565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061447d602983614d99565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006144e3602f83614d99565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614549601783614d99565b91507f4d6178696d756d20737570706c7920726561636865642e0000000000000000006000830152602082019050919050565b6000614589601683614d99565b91507f50726573616c65206973206e6f7420616c6c6f776564000000000000000000006000830152602082019050919050565b60006145c9602183614d99565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061462f600083614d8e565b9150600082019050919050565b6000614649603183614d99565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006146af601d83614d99565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006146ef602983614d99565b91507f546869732061646472657373206973206e6f7420696e636c7564656420696e2060008301527f77686974656c69737400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614755601583614d99565b91507f496e76616c69642073746167696e672076616c756500000000000000000000006000830152602082019050919050565b61479181614e31565b82525050565b60006147a38284613b81565b915081905092915050565b60006147ba8285613beb565b91506147c68284613beb565b91508190509392505050565b60006147dd82614622565b9150819050919050565b60006020820190506147fc6000830184613b2a565b92915050565b60006080820190506148176000830187613b1b565b6148246020830186613b2a565b6148316040830185614788565b81810360608301526148438184613b48565b905095945050505050565b60006020820190506148636000830184613b39565b92915050565b600060208201905081810360008301526148838184613bb2565b905092915050565b600060208201905081810360008301526148a481613c1c565b9050919050565b600060208201905081810360008301526148c481613c82565b9050919050565b600060208201905081810360008301526148e481613cc2565b9050919050565b6000602082019050818103600083015261490481613d28565b9050919050565b6000602082019050818103600083015261492481613d8e565b9050919050565b6000602082019050818103600083015261494481613df4565b9050919050565b6000602082019050818103600083015261496481613e34565b9050919050565b6000602082019050818103600083015261498481613e74565b9050919050565b600060208201905081810360008301526149a481613eda565b9050919050565b600060208201905081810360008301526149c481613f1a565b9050919050565b600060208201905081810360008301526149e481613f80565b9050919050565b60006020820190508181036000830152614a0481613fe6565b9050919050565b60006020820190508181036000830152614a248161404c565b9050919050565b60006020820190508181036000830152614a448161408c565b9050919050565b60006020820190508181036000830152614a64816140cc565b9050919050565b60006020820190508181036000830152614a8481614132565b9050919050565b60006020820190508181036000830152614aa481614172565b9050919050565b60006020820190508181036000830152614ac4816141d8565b9050919050565b60006020820190508181036000830152614ae48161423e565b9050919050565b60006020820190508181036000830152614b048161427e565b9050919050565b60006020820190508181036000830152614b24816142be565b9050919050565b60006020820190508181036000830152614b4481614324565b9050919050565b60006020820190508181036000830152614b648161438a565b9050919050565b60006020820190508181036000830152614b84816143f0565b9050919050565b60006020820190508181036000830152614ba481614430565b9050919050565b60006020820190508181036000830152614bc481614470565b9050919050565b60006020820190508181036000830152614be4816144d6565b9050919050565b60006020820190508181036000830152614c048161453c565b9050919050565b60006020820190508181036000830152614c248161457c565b9050919050565b60006020820190508181036000830152614c44816145bc565b9050919050565b60006020820190508181036000830152614c648161463c565b9050919050565b60006020820190508181036000830152614c84816146a2565b9050919050565b60006020820190508181036000830152614ca4816146e2565b9050919050565b60006020820190508181036000830152614cc481614748565b9050919050565b6000602082019050614ce06000830184614788565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614d0957600080fd5b8060405250919050565b600067ffffffffffffffff821115614d2a57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614d5257600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614dc082614e11565b9050919050565b6000614dd282614e11565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e68578082015181840152602081019050614e4d565b83811115614e77576000848401525b50505050565b6000601f19601f8301169050919050565b614e9781614db5565b8114614ea257600080fd5b50565b614eae81614dd9565b8114614eb957600080fd5b50565b614ec581614de5565b8114614ed057600080fd5b50565b614edc81614e31565b8114614ee757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220aac4f1fdd8d6fd14e964ad467ee95fa22763b73a13f76496d7d0afd5a3dff83664736f6c634300060600334552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e746572

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806370a082311161010d578063b88d4fde116100a0578063e8a3d4851161006f578063e8a3d485146106aa578063e985e9c5146106d5578063eedbe31d14610712578063f19e75d41461073d578063f2fde38b14610766576101ee565b8063b88d4fde146105fd578063c0e7274014610626578063c2b1f3f714610651578063c87b56dd1461066d576101ee565b806395d89b41116100dc57806395d89b4114610564578063a22cb4651461058f578063a2faf6a5146105b8578063a54ee844146105e1576101ee565b806370a08231146104bc578063715018a6146104f95780638da5cb5b14610510578063938e3d7b1461053b576101ee565b80633ccfd60b116101855780634f6ccce7116101545780634f6ccce7146103ee57806355f804b31461042b5780636352211e146104545780636c0360eb14610491576101ee565b80633ccfd60b1461035c5780633eb1d7771461037357806342842e0e1461039c57806343c624b3146103c5576101ee565b8063126c54b7116101c1578063126c54b7146102c157806318160ddd146102cb57806323b872dd146102f65780632f745c591461031f576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613a5b565b61078f565b604051610227919061484e565b60405180910390f35b34801561023c57600080fd5b506102456107f6565b6040516102529190614869565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190613af2565b610898565b60405161028f91906147e7565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906139de565b61091d565b005b6102c9610a35565b005b3480156102d757600080fd5b506102e0610c1f565b6040516102ed9190614ccb565b60405180910390f35b34801561030257600080fd5b5061031d600480360381019061031891906138d8565b610c30565b005b34801561032b57600080fd5b50610346600480360381019061034191906139de565b610c90565b6040516103539190614ccb565b60405180910390f35b34801561036857600080fd5b50610371610ceb565b005b34801561037f57600080fd5b5061039a60048036038101906103959190613af2565b610e1d565b005b3480156103a857600080fd5b506103c360048036038101906103be91906138d8565b610f2b565b005b3480156103d157600080fd5b506103ec60048036038101906103e79190613a1a565b610f4b565b005b3480156103fa57600080fd5b5061041560048036038101906104109190613af2565b611096565b6040516104229190614ccb565b60405180910390f35b34801561043757600080fd5b50610452600480360381019061044d9190613aad565b6110b9565b005b34801561046057600080fd5b5061047b60048036038101906104769190613af2565b611186565b60405161048891906147e7565b60405180910390f35b34801561049d57600080fd5b506104a66111bd565b6040516104b39190614869565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613873565b61125f565b6040516104f09190614ccb565b60405180910390f35b34801561050557600080fd5b5061050e61131e565b005b34801561051c57600080fd5b5061052561145b565b60405161053291906147e7565b60405180910390f35b34801561054757600080fd5b50610562600480360381019061055d9190613aad565b611485565b005b34801561057057600080fd5b50610579611517565b6040516105869190614869565b60405180910390f35b34801561059b57600080fd5b506105b660048036038101906105b191906139a2565b6115b9565b005b3480156105c457600080fd5b506105df60048036038101906105da9190613a1a565b61173a565b005b6105fb60048036038101906105f69190613af2565b611885565b005b34801561060957600080fd5b50610624600480360381019061061f9190613927565b611aa2565b005b34801561063257600080fd5b5061063b611b04565b6040516106489190614869565b60405180910390f35b61066b60048036038101906106669190613af2565b611ba2565b005b34801561067957600080fd5b50610694600480360381019061068f9190613af2565b611e4a565b6040516106a19190614869565b60405180910390f35b3480156106b657600080fd5b506106bf611fcd565b6040516106cc9190614869565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f7919061389c565b61206f565b604051610709919061484e565b60405180910390f35b34801561071e57600080fd5b50610727612103565b6040516107349190614ccb565b60405180910390f35b34801561074957600080fd5b50610764600480360381019061075f9190613af2565b61210d565b005b34801561077257600080fd5b5061078d60048036038101906107889190613873565b6121b0565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561088e5780601f106108635761010080835404028352916020019161088e565b820191906000526020600020905b81548152906001019060200180831161087157829003601f168201915b5050505050905090565b60006108a38261235c565b6108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990614b2b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092882611186565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090614c2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b8612379565b73ffffffffffffffffffffffffffffffffffffffff1614806109e757506109e6816109e1612379565b61206f565b5b610a26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1d90614a4b565b60405180910390fd5b610a308383612381565b505050565b600e54610a40610c1f565b10610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790614a2b565b60405180910390fd5b601460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b03906148eb565b60405180910390fd5b600f54601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b86906149ab565b60405180910390fd5b610b9761243a565b6001601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401601660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b6000610c2b6002612471565b905090565b610c41610c3b612379565b82612486565b610c80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7790614c4b565b60405180910390fd5b610c8b838383612564565b505050565b6000610ce382600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061277b90919063ffffffff16565b905092915050565b610cf3612379565b73ffffffffffffffffffffffffffffffffffffffff16610d1161145b565b73ffffffffffffffffffffffffffffffffffffffff1614610d67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5e90614b8b565b60405180910390fd5b6000610d7161145b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d94906147d2565b60006040518083038185875af1925050503d8060008114610dd1576040519150601f19603f3d011682016040523d82523d6000602084013e610dd6565b606091505b5050905080610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e119061494b565b60405180910390fd5b50565b610e25612379565b73ffffffffffffffffffffffffffffffffffffffff16610e4361145b565b73ffffffffffffffffffffffffffffffffffffffff1614610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090614b8b565b60405180910390fd5b6000811015610edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed490614cab565b60405180910390fd5b6003811115610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890614cab565b60405180910390fd5b80600b8190555050565b610f4683838360405180602001604052806000815250611aa2565b505050565b610f53612379565b73ffffffffffffffffffffffffffffffffffffffff16610f7161145b565b73ffffffffffffffffffffffffffffffffffffffff1614610fc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbe90614b8b565b60405180910390fd5b600081511161100b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611002906148ab565b60405180910390fd5b60008090505b81518110156110925760016014600084848151811061102c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611011565b5050565b6000806110ad83600261279590919063ffffffff16565b50905080915050919050565b6110c1612379565b73ffffffffffffffffffffffffffffffffffffffff166110df61145b565b73ffffffffffffffffffffffffffffffffffffffff1614611135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112c90614b8b565b60405180910390fd5b61118282828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506127c4565b5050565b60006111b682604051806060016040528060298152602001614f1d6029913960026127de9092919063ffffffff16565b9050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112555780601f1061122a57610100808354040283529160200191611255565b820191906000526020600020905b81548152906001019060200180831161123857829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c790614a8b565b60405180910390fd5b611317600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206127fd565b9050919050565b611326612379565b73ffffffffffffffffffffffffffffffffffffffff1661134461145b565b73ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614b8b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61148d612379565b73ffffffffffffffffffffffffffffffffffffffff166114ab61145b565b73ffffffffffffffffffffffffffffffffffffffff1614611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f890614b8b565b60405180910390fd5b8181600c91906115129291906135c4565b505050565b606060078054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115af5780601f10611584576101008083540402835291602001916115af565b820191906000526020600020905b81548152906001019060200180831161159257829003601f168201915b5050505050905090565b6115c1612379565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561162f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116269061498b565b60405180910390fd5b806005600061163c612379565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116e9612379565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161172e919061484e565b60405180910390a35050565b611742612379565b73ffffffffffffffffffffffffffffffffffffffff1661176061145b565b73ffffffffffffffffffffffffffffffffffffffff16146117b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ad90614b8b565b60405180910390fd5b60008151116117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906148ab565b60405180910390fd5b60008090505b81518110156118815760016015600084848151811061181b57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611800565b5050565b600e5481611891610c1f565b0111156118d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ca90614beb565b60405180910390fd5b6002600b5414611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190f90614aeb565b60405180910390fd5b60115481601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401111561199e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199590614a6b565b60405180910390fd5b6119b38160135461281290919063ffffffff16565b3410156119f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ec90614b6b565b60405180910390fd5b60008090505b81811015611a9e57611a0b61243a565b6001601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401601860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806001019150506119fb565b5050565b611ab3611aad612379565b83612486565b611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae990614c4b565b60405180910390fd5b611afe84848484612882565b50505050565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b9a5780601f10611b6f57610100808354040283529160200191611b9a565b820191906000526020600020905b815481529060010190602001808311611b7d57829003601f168201915b505050505081565b600e5481611bae610c1f565b0110611bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be690614a2b565b60405180910390fd5b6001600b5414611c34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2b90614c0b565b60405180910390fd5b601560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb790614c8b565b60405180910390fd5b60105481601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054011115611d46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3d90614a0b565b60405180910390fd5b611d5b8160125461281290919063ffffffff16565b341015611d9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9490614b6b565b60405180910390fd5b60008090505b81811015611e4657611db361243a565b6001601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401601760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080600101915050611da3565b5050565b6060611e558261235c565b611e94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8b90614bcb565b60405180910390fd5b6060600860008481526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611f3d5780601f10611f1257610100808354040283529160200191611f3d565b820191906000526020600020905b815481529060010190602001808311611f2057829003601f168201915b505050505090506060611f4e6111bd565b9050600081511415611f64578192505050611fc8565b600082511115611f99578082604051602001611f819291906147ae565b60405160208183030381529060405292505050611fc8565b80611fa3856128de565b604051602001611fb49291906147ae565b604051602081830303815290604052925050505b919050565b6060600c8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156120655780601f1061203a57610100808354040283529160200191612065565b820191906000526020600020905b81548152906001019060200180831161204857829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600b54905090565b612115612379565b73ffffffffffffffffffffffffffffffffffffffff1661213361145b565b73ffffffffffffffffffffffffffffffffffffffff1614612189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218090614b8b565b60405180910390fd5b60008090505b818110156121ac5761219f61243a565b808060010191505061218f565b5050565b6121b8612379565b73ffffffffffffffffffffffffffffffffffffffff166121d661145b565b73ffffffffffffffffffffffffffffffffffffffff161461222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222390614b8b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561229c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122939061490b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612372826002612a2590919063ffffffff16565b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123f483611186565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612444600d612a3f565b6000612450600d612a55565b905061245c3382612a63565b61246e8161246983612a81565b612bd1565b50565b600061247f82600001612c45565b9050919050565b60006124918261235c565b6124d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c7906149eb565b60405180910390fd5b60006124db83611186565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061254a57508373ffffffffffffffffffffffffffffffffffffffff1661253284610898565b73ffffffffffffffffffffffffffffffffffffffff16145b8061255b575061255a818561206f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661258482611186565b73ffffffffffffffffffffffffffffffffffffffff16146125da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d190614bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561264a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126419061496b565b60405180910390fd5b612655838383612c56565b612660600082612381565b6126b181600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c5b90919063ffffffff16565b5061270381600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c7590919063ffffffff16565b5061271a81836002612c8f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600061278a8360000183612cc4565b60001c905092915050565b6000806000806127a88660000186612d31565b915091508160001c8160001c8090509350935050509250929050565b80600990805190602001906127da929190613644565b5050565b60006127f1846000018460001b84612db4565b60001c90509392505050565b600061280b82600001612e45565b9050919050565b600080831415612825576000905061287c565b600082840290508284828161283657fe5b0414612877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286e90614b0b565b60405180910390fd5b809150505b92915050565b61288d848484612564565b61289984848484612e56565b6128d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cf906148cb565b60405180910390fd5b50505050565b60606000821415612926576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a20565b600082905060005b60008214612950578080600101915050600a828161294857fe5b04915061292e565b60608167ffffffffffffffff8111801561296957600080fd5b506040519080825280601f01601f19166020018201604052801561299c5781602001600182028036833780820191505090505b50905060006001830390508593505b60008414612a1857600a84816129bd57fe5b0660300160f81b828280600190039350815181106129d757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8481612a1057fe5b0493506129ab565b819450505050505b919050565b6000612a37836000018360001b612fba565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b612a7d828260405180602001604052806000815250612fdd565b5050565b60606000821415612ac9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bcc565b600082905060005b60008214612af3578080600101915050600a8281612aeb57fe5b049150612ad1565b60608167ffffffffffffffff81118015612b0c57600080fd5b506040519080825280601f01601f191660200182016040528015612b3f5781602001600182028036833780820191505090505b50905060008290505b60008614612bc4576001810390506000600a808881612b6357fe5b04028703603001905060008160f81b905080848481518110612b8157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8881612bba57fe5b0497505050612b48565b819450505050505b919050565b612bda8261235c565b612c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c1090614b4b565b60405180910390fd5b80600860008481526020019081526020016000209080519060200190612c40929190613644565b505050565b600081600001805490509050919050565b505050565b6000612c6d836000018360001b613038565b905092915050565b6000612c87836000018360001b613120565b905092915050565b6000612cbb846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b613190565b90509392505050565b600081836000018054905011612d0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d069061488b565b60405180910390fd5b826000018281548110612d1e57fe5b9060005260206000200154905092915050565b60008082846000018054905011612d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7490614aab565b60405180910390fd5b6000846000018481548110612d8e57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390612e16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0d9190614869565b60405180910390fd5b50846000016001820381548110612e2957fe5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b6000612e778473ffffffffffffffffffffffffffffffffffffffff1661326c565b612e845760019050612fb2565b6060612f4b63150b7a0260e01b612e99612379565b888787604051602401612eaf9493929190614802565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051806060016040528060328152602001614eeb603291398773ffffffffffffffffffffffffffffffffffffffff1661327f9092919063ffffffff16565b9050600081806020019051810190612f639190613a84565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614925050505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b612fe78383613297565b612ff46000848484612e56565b613033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302a906148cb565b60405180910390fd5b505050565b60008083600101600084815260200190815260200160002054905060008114613114576000600182039050600060018660000180549050039050600086600001828154811061308357fe5b90600052602060002001549050808760000184815481106130a057fe5b90600052602060002001819055506001830187600101600083815260200190815260200160002081905550866000018054806130d857fe5b6001900381819060005260206000200160009055905586600101600087815260200190815260200160002060009055600194505050505061311a565b60009150505b92915050565b600061312c8383613425565b61318557826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061318a565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141561323757846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613265565b8285600001600183038154811061324a57fe5b90600052602060002090600202016001018190555060009150505b9392505050565b600080823b905060008111915050919050565b606061328e8484600085613448565b90509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fe90614acb565b60405180910390fd5b6133108161235c565b15613350576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133479061492b565b60405180910390fd5b61335c60008383612c56565b6133ad81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612c7590919063ffffffff16565b506133c481836002612c8f9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080836001016000848152602001908152602001600020541415905092915050565b60608247101561348d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613484906149cb565b60405180910390fd5b6134968561326c565b6134d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134cc90614c6b565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516134ff9190614797565b60006040518083038185875af1925050503d806000811461353c576040519150601f19603f3d011682016040523d82523d6000602084013e613541565b606091505b509150915061355182828661355d565b92505050949350505050565b6060831561356d578290506135bd565b6000835111156135805782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b49190614869565b60405180910390fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061360557803560ff1916838001178555613633565b82800160010185558215613633579182015b82811115613632578235825591602001919060010190613617565b5b50905061364091906136c4565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061368557805160ff19168380011785556136b3565b828001600101855582156136b3579182015b828111156136b2578251825591602001919060010190613697565b5b5090506136c091906136c4565b5090565b6136e691905b808211156136e25760008160009055506001016136ca565b5090565b90565b6000813590506136f881614e8e565b92915050565b600082601f83011261370f57600080fd5b813561372261371d82614d13565b614ce6565b9150818183526020840193506020810190508385602084028201111561374757600080fd5b60005b83811015613777578161375d88826136e9565b84526020840193506020830192505060018101905061374a565b5050505092915050565b60008135905061379081614ea5565b92915050565b6000813590506137a581614ebc565b92915050565b6000815190506137ba81614ebc565b92915050565b600082601f8301126137d157600080fd5b81356137e46137df82614d3b565b614ce6565b9150808252602083016020830185838301111561380057600080fd5b61380b838284614e3b565b50505092915050565b60008083601f84011261382657600080fd5b8235905067ffffffffffffffff81111561383f57600080fd5b60208301915083600182028301111561385757600080fd5b9250929050565b60008135905061386d81614ed3565b92915050565b60006020828403121561388557600080fd5b6000613893848285016136e9565b91505092915050565b600080604083850312156138af57600080fd5b60006138bd858286016136e9565b92505060206138ce858286016136e9565b9150509250929050565b6000806000606084860312156138ed57600080fd5b60006138fb868287016136e9565b935050602061390c868287016136e9565b925050604061391d8682870161385e565b9150509250925092565b6000806000806080858703121561393d57600080fd5b600061394b878288016136e9565b945050602061395c878288016136e9565b935050604061396d8782880161385e565b925050606085013567ffffffffffffffff81111561398a57600080fd5b613996878288016137c0565b91505092959194509250565b600080604083850312156139b557600080fd5b60006139c3858286016136e9565b92505060206139d485828601613781565b9150509250929050565b600080604083850312156139f157600080fd5b60006139ff858286016136e9565b9250506020613a108582860161385e565b9150509250929050565b600060208284031215613a2c57600080fd5b600082013567ffffffffffffffff811115613a4657600080fd5b613a52848285016136fe565b91505092915050565b600060208284031215613a6d57600080fd5b6000613a7b84828501613796565b91505092915050565b600060208284031215613a9657600080fd5b6000613aa4848285016137ab565b91505092915050565b60008060208385031215613ac057600080fd5b600083013567ffffffffffffffff811115613ada57600080fd5b613ae685828601613814565b92509250509250929050565b600060208284031215613b0457600080fd5b6000613b128482850161385e565b91505092915050565b613b2481614dc7565b82525050565b613b3381614db5565b82525050565b613b4281614dd9565b82525050565b6000613b5382614d67565b613b5d8185614d7d565b9350613b6d818560208601614e4a565b613b7681614e7d565b840191505092915050565b6000613b8c82614d67565b613b968185614d8e565b9350613ba6818560208601614e4a565b80840191505092915050565b6000613bbd82614d72565b613bc78185614d99565b9350613bd7818560208601614e4a565b613be081614e7d565b840191505092915050565b6000613bf682614d72565b613c008185614daa565b9350613c10818560208601614e4a565b80840191505092915050565b6000613c29602283614d99565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c8f601d83614d99565b91507f506c6561736520696e707574207768696c74656c6973742061727261790000006000830152602082019050919050565b6000613ccf603283614d99565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000613d35603783614d99565b91507f546869732061646472657373206973206e6f7420696e636c7564656420696e2060008301527f66616d696c792f667269656e642077686974656c6973740000000000000000006020830152604082019050919050565b6000613d9b602683614d99565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613e01601c83614d99565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000613e41601483614d99565b91507f4661696c656420746f2073656e642045746865720000000000000000000000006000830152602082019050919050565b6000613e81602483614d99565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ee7601983614d99565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613f27602783614d99565b91507f596f752063616e206765742061206769766561776179206e6f206d6f7265207460008301527f68616e206f6e65000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f8d602683614d99565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ff3602c83614d99565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614059601183614d99565b91507f4f766572666c6f77203520746f6b656e730000000000000000000000000000006000830152602082019050919050565b6000614099601683614d99565b91507f4d6178696d756d20737570706c792072656163686564000000000000000000006000830152602082019050919050565b60006140d9603883614d99565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061413f601283614d99565b91507f4f766572666c6f7720313020746f6b656e7300000000000000000000000000006000830152602082019050919050565b600061417f602a83614d99565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006141e5602283614d99565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061424b602083614d99565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061428b601a83614d99565b91507f5075626c696353616c65206973206e6f7420616c6c6f7765642e0000000000006000830152602082019050919050565b60006142cb602183614d99565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614331602c83614d99565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614397602c83614d99565b91507f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006143fd600d83614d99565b91507f496e76616c69642066756e6473000000000000000000000000000000000000006000830152602082019050919050565b600061443d602083614d99565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061447d602983614d99565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006144e3602f83614d99565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614549601783614d99565b91507f4d6178696d756d20737570706c7920726561636865642e0000000000000000006000830152602082019050919050565b6000614589601683614d99565b91507f50726573616c65206973206e6f7420616c6c6f776564000000000000000000006000830152602082019050919050565b60006145c9602183614d99565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061462f600083614d8e565b9150600082019050919050565b6000614649603183614d99565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006146af601d83614d99565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b60006146ef602983614d99565b91507f546869732061646472657373206973206e6f7420696e636c7564656420696e2060008301527f77686974656c69737400000000000000000000000000000000000000000000006020830152604082019050919050565b6000614755601583614d99565b91507f496e76616c69642073746167696e672076616c756500000000000000000000006000830152602082019050919050565b61479181614e31565b82525050565b60006147a38284613b81565b915081905092915050565b60006147ba8285613beb565b91506147c68284613beb565b91508190509392505050565b60006147dd82614622565b9150819050919050565b60006020820190506147fc6000830184613b2a565b92915050565b60006080820190506148176000830187613b1b565b6148246020830186613b2a565b6148316040830185614788565b81810360608301526148438184613b48565b905095945050505050565b60006020820190506148636000830184613b39565b92915050565b600060208201905081810360008301526148838184613bb2565b905092915050565b600060208201905081810360008301526148a481613c1c565b9050919050565b600060208201905081810360008301526148c481613c82565b9050919050565b600060208201905081810360008301526148e481613cc2565b9050919050565b6000602082019050818103600083015261490481613d28565b9050919050565b6000602082019050818103600083015261492481613d8e565b9050919050565b6000602082019050818103600083015261494481613df4565b9050919050565b6000602082019050818103600083015261496481613e34565b9050919050565b6000602082019050818103600083015261498481613e74565b9050919050565b600060208201905081810360008301526149a481613eda565b9050919050565b600060208201905081810360008301526149c481613f1a565b9050919050565b600060208201905081810360008301526149e481613f80565b9050919050565b60006020820190508181036000830152614a0481613fe6565b9050919050565b60006020820190508181036000830152614a248161404c565b9050919050565b60006020820190508181036000830152614a448161408c565b9050919050565b60006020820190508181036000830152614a64816140cc565b9050919050565b60006020820190508181036000830152614a8481614132565b9050919050565b60006020820190508181036000830152614aa481614172565b9050919050565b60006020820190508181036000830152614ac4816141d8565b9050919050565b60006020820190508181036000830152614ae48161423e565b9050919050565b60006020820190508181036000830152614b048161427e565b9050919050565b60006020820190508181036000830152614b24816142be565b9050919050565b60006020820190508181036000830152614b4481614324565b9050919050565b60006020820190508181036000830152614b648161438a565b9050919050565b60006020820190508181036000830152614b84816143f0565b9050919050565b60006020820190508181036000830152614ba481614430565b9050919050565b60006020820190508181036000830152614bc481614470565b9050919050565b60006020820190508181036000830152614be4816144d6565b9050919050565b60006020820190508181036000830152614c048161453c565b9050919050565b60006020820190508181036000830152614c248161457c565b9050919050565b60006020820190508181036000830152614c44816145bc565b9050919050565b60006020820190508181036000830152614c648161463c565b9050919050565b60006020820190508181036000830152614c84816146a2565b9050919050565b60006020820190508181036000830152614ca4816146e2565b9050919050565b60006020820190508181036000830152614cc481614748565b9050919050565b6000602082019050614ce06000830184614788565b92915050565b6000604051905081810181811067ffffffffffffffff82111715614d0957600080fd5b8060405250919050565b600067ffffffffffffffff821115614d2a57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115614d5257600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614dc082614e11565b9050919050565b6000614dd282614e11565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614e68578082015181840152602081019050614e4d565b83811115614e77576000848401525b50505050565b6000601f19601f8301169050919050565b614e9781614db5565b8114614ea257600080fd5b50565b614eae81614dd9565b8114614eb957600080fd5b50565b614ec581614de5565b8114614ed057600080fd5b50565b614edc81614e31565b8114614ee757600080fd5b5056fe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220aac4f1fdd8d6fd14e964ad467ee95fa22763b73a13f76496d7d0afd5a3dff83664736f6c63430006060033

Deployed Bytecode Sourcemap

68899:5542:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;10421:150:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10421:150:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51911:100;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51911:100:0;;;:::i;:::-;;;;;;;;;;;;;;;;54697:221;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54697:221:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;54227:404;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54227:404:0;;;;;;;;;;;;;;;;:::i;:::-;;70924:451;;;:::i;:::-;;53705:211;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53705:211:0;;;:::i;:::-;;;;;;;;;;;;;;;;55587:305;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55587:305:0;;;;;;;;;;;;;;;;:::i;:::-;;53467:162;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53467:162:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;73360:283;;5:9:-1;2:2;;;27:1;24;17:12;2:2;73360:283:0;;;:::i;:::-;;73091:202;;5:9:-1;2:2;;;27:1;24;17:12;2:2;73091:202:0;;;;;;;;;;;;;;;;:::i;:::-;;55963:151;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55963:151:0;;;;;;;;;;;;;;;;:::i;:::-;;70171:258;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70171:258:0;;;;;;;;;;;;;;;;:::i;:::-;;53993:172;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53993:172:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;70060:103;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70060:103:0;;;;;;;;;;;;;;;;:::i;:::-;;51667:177;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51667:177:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;53286:97;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53286:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;51384:221;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51384:221:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;66653:148;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66653:148:0;;;:::i;:::-;;66002:87;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66002:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;73651:101;;5:9:-1;2:2;;;27:1;24;17:12;2:2;73651:101:0;;;;;;;;;;;;;;;;:::i;:::-;;52080:104;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52080:104:0;;;:::i;:::-;;;;;;;;;;;;;;;;54990:295;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54990:295:0;;;;;;;;;;;;;;;;:::i;:::-;;70437:260;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70437:260:0;;;;;;;;;;;;;;;;:::i;:::-;;72081:609;;;;;;;;;;;;;;;;:::i;:::-;;56185:285;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56185:285:0;;;;;;;;;;;;;;;;:::i;:::-;;69257:31;;5:9:-1;2:2;;;27:1;24;17:12;2:2;69257:31:0;;;:::i;:::-;;;;;;;;;;;;;;;;71383:690;;;;;;;;;;;;;;;;:::i;:::-;;52255:792;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52255:792:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;73760:97;;5:9:-1;2:2;;;27:1;24;17:12;2:2;73760:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;55356:164;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55356:164:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;72986:97;;5:9:-1;2:2;;;27:1;24;17:12;2:2;72986:97:0;;;:::i;:::-;;;;;;;;;;;;;;;;72816:162;;5:9:-1;2:2;;;27:1;24;17:12;2:2;72816:162:0;;;;;;;;;;;;;;;;:::i;:::-;;66956:244;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66956:244:0;;;;;;;;;;;;;;;;:::i;:::-;;10421:150;10506:4;10530:20;:33;10551:11;10530:33;;;;;;;;;;;;;;;;;;;;;;;;;;;10523:40;;10421:150;;;:::o;51911:100::-;51965:13;51998:5;51991:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51911:100;:::o;54697:221::-;54773:7;54801:16;54809:7;54801;:16::i;:::-;54793:73;;;;;;;;;;;;;;;;;;;;;;54886:15;:24;54902:7;54886:24;;;;;;;;;;;;;;;;;;;;;54879:31;;54697:221;;;:::o;54227:404::-;54308:13;54324:23;54339:7;54324:14;:23::i;:::-;54308:39;;54372:5;54366:11;;:2;:11;;;;54358:57;;;;;;;;;;;;;;;;;;;;;;54452:5;54436:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;54461:44;54485:5;54492:12;:10;:12::i;:::-;54461:23;:44::i;:::-;54436:69;54428:161;;;;;;;;;;;;;;;;;;;;;;54602:21;54611:2;54615:7;54602:8;:21::i;:::-;54227:404;;;:::o;70924:451::-;71009:10;;70987:19;:17;:19::i;:::-;:32;70979:67;;;;;;;;;;;;;;;;;;;;;;71065:16;:28;71082:10;71065:28;;;;;;;;;;;;;;;;;;;;;;;;;71057:96;;;;;;;;;;;;;;;;;;;;;;71203:21;;71172:16;:28;71189:10;71172:28;;;;;;;;;;;;;;;;:52;71164:104;;;;;;;;;;;;;;;;;;;;;;71281:12;:10;:12::i;:::-;71366:1;71335:16;:28;71352:10;71335:28;;;;;;;;;;;;;;;;:32;71304:16;:28;71321:10;71304:28;;;;;;;;;;;;;;;:63;;;;70924:451::o;53705:211::-;53766:7;53887:21;:12;:19;:21::i;:::-;53880:28;;53705:211;:::o;55587:305::-;55748:41;55767:12;:10;:12::i;:::-;55781:7;55748:18;:41::i;:::-;55740:103;;;;;;;;;;;;;;;;;;;;;;55856:28;55866:4;55872:2;55876:7;55856:9;:28::i;:::-;55587:305;;;:::o;53467:162::-;53564:7;53591:30;53615:5;53591:13;:20;53605:5;53591:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;53584:37;;53467:162;;;;:::o;73360:283::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;73520:12:::1;73538:7;:5;:7::i;:::-;:12;;73558:21;73538:46;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;73519:65:0;;;73603:7;73595:40;;;;;;;;;;;;;;;;;;;;;;66293:1;73360:283::o:0;73091:202::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;73170:1:::1;73161:5;:10;;73153:44;;;;;;;;;;;;;;;;;;;;;;73225:1;73216:5;:10;;73208:44;;;;;;;;;;;;;;;;;;;;;;73279:5;73263:13;:21;;;;73091:202:::0;:::o;55963:151::-;56067:39;56084:4;56090:2;56094:7;56067:39;;;;;;;;;;;;:16;:39::i;:::-;55963:151;;;:::o;70171:258::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;70275:1:::1;70259:6;:13;:17;70251:59;;;;;;;;;;;;;;;;;;;;;;70325:6;70334:1:::0;70325:10:::1;;70321:101;70341:6;:13;70337:1;:17;70321:101;;;70406:4;70376:16;:27;70393:6;70400:1;70393:9;;;;;;;;;;;;;;70376:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;70356:3;;;;;;;70321:101;;;;70171:258:::0;:::o;53993:172::-;54068:7;54089:15;54110:22;54126:5;54110:12;:15;;:22;;;;:::i;:::-;54088:44;;;54150:7;54143:14;;;53993:172;;;:::o;70060:103::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;70135:20:::1;70147:7;;70135:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;70135:20:0;;;;;;:11;:20::i;:::-;70060:103:::0;;:::o;51667:177::-;51739:7;51766:70;51783:7;51766:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;51759:77;;51667:177;;;:::o;53286:97::-;53334:13;53367:8;53360:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53286:97;:::o;51384:221::-;51456:7;51501:1;51484:19;;:5;:19;;;;51476:74;;;;;;;;;;;;;;;;;;;;;;51568:29;:13;:20;51582:5;51568:20;;;;;;;;;;;;;;;:27;:29::i;:::-;51561:36;;51384:221;;;:::o;66653:148::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;66760:1:::1;66723:40;;66744:6;;;;;;;;;;;66723:40;;;;;;;;;;;;66791:1;66774:6;;:19;;;;;;;;;;;;;;;;;;66653:148::o:0;66002:87::-;66048:7;66075:6;;;;;;;;;;;66068:13;;66002:87;:::o;73651:101::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;73741:3:::1;;73726:12;:18;;;;;;;:::i;:::-;;73651:101:::0;;:::o;52080:104::-;52136:13;52169:7;52162:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52080:104;:::o;54990:295::-;55105:12;:10;:12::i;:::-;55093:24;;:8;:24;;;;55085:62;;;;;;;;;;;;;;;;;;;;;;55205:8;55160:18;:32;55179:12;:10;:12::i;:::-;55160:32;;;;;;;;;;;;;;;:42;55193:8;55160:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;55258:8;55229:48;;55244:12;:10;:12::i;:::-;55229:48;;;55268:8;55229:48;;;;;;;;;;;;;;;54990:295;;:::o;70437:260::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;70542:1:::1;70526:6;:13;:17;70518:59;;;;;;;;;;;;;;;;;;;;;;70592:6;70601:1:::0;70592:10:::1;;70588:102;70608:6;:13;70604:1;:17;70588:102;;;70674:4;70643:17;:28;70661:6;70668:1;70661:9;;;;;;;;;;;;;;70643:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;70623:3;;;;;;;70588:102;;;;70437:260:::0;:::o;72081:609::-;72195:10;;72182:9;72160:19;:17;:19::i;:::-;:31;:45;;72152:81;;;;;;;;;;;;;;;;;;;;;;72269:1;72252:13;;:18;72244:57;;;;;;;;;;;;;;;;;;;;;;72368:23;;72355:9;72320:20;:32;72341:10;72320:32;;;;;;;;;;;;;;;;:44;:71;;72312:102;;;;;;;;;;;;;;;;;;;;;;72446:31;72467:9;72446:16;;:20;;:31;;;;:::i;:::-;72433:9;:44;;72425:70;;;;;;;;;;;;;;;;;;;;;;72511:13;72527:1;72511:17;;72506:177;72538:9;72530:5;:17;72506:177;;;72573:12;:10;:12::i;:::-;72670:1;72635:20;:32;72656:10;72635:32;;;;;;;;;;;;;;;;:36;72600:20;:32;72621:10;72600:32;;;;;;;;;;;;;;;:71;;;;72549:7;;;;;;;72506:177;;;;72081:609;:::o;56185:285::-;56317:41;56336:12;:10;:12::i;:::-;56350:7;56317:18;:41::i;:::-;56309:103;;;;;;;;;;;;;;;;;;;;;;56423:39;56437:4;56443:2;56447:7;56456:5;56423:13;:39::i;:::-;56185:285;;;;:::o;69257:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;71383:690::-;71497:10;;71485:9;71463:19;:17;:19::i;:::-;:31;:44;71455:79;;;;;;;;;;;;;;;;;;;;;;71570:1;71553:13;;:18;71545:53;;;;;;;;;;;;;;;;;;;;;;71617:17;:29;71635:10;71617:29;;;;;;;;;;;;;;;;;;;;;;;;;71609:83;;;;;;;;;;;;;;;;;;;;;;71756:24;;71743:9;71711:17;:29;71729:10;71711:29;;;;;;;;;;;;;;;;:41;:69;;71703:99;;;;;;;;;;;;;;;;;;;;;;71834:32;71856:9;71834:17;;:21;;:32;;;;:::i;:::-;71821:9;:45;;71813:71;;;;;;;;;;;;;;;;;;;;;;71900:13;71916:1;71900:17;;71895:171;71927:9;71919:5;:17;71895:171;;;71962:12;:10;:12::i;:::-;72053:1;72021:17;:29;72039:10;72021:29;;;;;;;;;;;;;;;;:33;71989:17;:29;72007:10;71989:29;;;;;;;;;;;;;;;:65;;;;71938:7;;;;;;;71895:171;;;;71383:690;:::o;52255:792::-;52328:13;52362:16;52370:7;52362;:16::i;:::-;52354:76;;;;;;;;;;;;;;;;;;;;;;52443:23;52469:10;:19;52480:7;52469:19;;;;;;;;;;;52443:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52499:18;52520:9;:7;:9::i;:::-;52499:30;;52627:1;52611:4;52605:18;:23;52601:72;;;52652:9;52645:16;;;;;;52601:72;52803:1;52783:9;52777:23;:27;52773:108;;;52852:4;52858:9;52835:33;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52835:33:0;;;52821:48;;;;;;52773:108;53013:4;53019:18;:7;:16;:18::i;:::-;52996:42;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;52996:42:0;;;52982:57;;;;52255:792;;;;:::o;73760:97::-;73804:13;73837:12;73830:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73760:97;:::o;55356:164::-;55453:4;55477:18;:25;55496:5;55477:25;;;;;;;;;;;;;;;:35;55503:8;55477:35;;;;;;;;;;;;;;;;;;;;;;;;;55470:42;;55356:164;;;;:::o;72986:97::-;73035:7;73062:13;;73055:20;;72986:97;:::o;72816:162::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;72885:13:::1;72901:1:::0;72885:17:::1;;72880:91;72912:9;72904:5;:17;72880:91;;;72947:12;:10;:12::i;:::-;72923:7;;;;;;;72880:91;;;;72816:162:::0;:::o;66956:244::-;66233:12;:10;:12::i;:::-;66222:23;;:7;:5;:7::i;:::-;:23;;;66214:68;;;;;;;;;;;;;;;;;;;;;;67065:1:::1;67045:22;;:8;:22;;;;67037:73;;;;;;;;;;;;;;;;;;;;;;67155:8;67126:38;;67147:6;;;;;;;;;;;67126:38;;;;;;;;;;;;67184:8;67175:6;;:17;;;;;;;;;;;;;;;;;;66956:244:::0;:::o;57937:127::-;58002:4;58026:30;58048:7;58026:12;:21;;:30;;;;:::i;:::-;58019:37;;57937:127;;;:::o;667:106::-;720:15;755:10;748:17;;667:106;:::o;63955:192::-;64057:2;64030:15;:24;64046:7;64030:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;64113:7;64109:2;64075:46;;64084:23;64099:7;64084:14;:23::i;:::-;64075:46;;;;;;;;;;;;63955:192;;:::o;70705:211::-;70747:21;:9;:19;:21::i;:::-;70779:15;70797:19;:9;:17;:19::i;:::-;70779:37;;70827:30;70837:10;70849:7;70827:9;:30::i;:::-;70868:40;70881:7;70890:17;70899:7;70890:8;:17::i;:::-;70868:12;:40::i;:::-;70705:211;:::o;44588:123::-;44657:7;44684:19;44692:3;:10;;44684:7;:19::i;:::-;44677:26;;44588:123;;;:::o;58231:355::-;58324:4;58349:16;58357:7;58349;:16::i;:::-;58341:73;;;;;;;;;;;;;;;;;;;;;;58425:13;58441:23;58456:7;58441:14;:23::i;:::-;58425:39;;58494:5;58483:16;;:7;:16;;;:51;;;;58527:7;58503:31;;:20;58515:7;58503:11;:20::i;:::-;:31;;;58483:51;:94;;;;58538:39;58562:5;58569:7;58538:23;:39::i;:::-;58483:94;58475:103;;;58231:355;;;;:::o;61367:599::-;61492:4;61465:31;;:23;61480:7;61465:14;:23::i;:::-;:31;;;61457:85;;;;;;;;;;;;;;;;;;;;;;61593:1;61579:16;;:2;:16;;;;61571:65;;;;;;;;;;;;;;;;;;;;;;61649:39;61670:4;61676:2;61680:7;61649:20;:39::i;:::-;61753:29;61770:1;61774:7;61753:8;:29::i;:::-;61795:35;61822:7;61795:13;:19;61809:4;61795:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;61841:30;61863:7;61841:13;:17;61855:2;61841:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;61884:29;61901:7;61910:2;61884:12;:16;;:29;;;;;:::i;:::-;;61950:7;61946:2;61931:27;;61940:4;61931:27;;;;;;;;;;;;61367:599;;;:::o;36348:137::-;36419:7;36454:22;36458:3;:10;;36470:5;36454:3;:22::i;:::-;36446:31;;36439:38;;36348:137;;;;:::o;45050:236::-;45130:7;45139;45160:11;45173:13;45190:22;45194:3;:10;;45206:5;45190:3;:22::i;:::-;45159:53;;;;45239:3;45231:12;;45269:5;45261:14;;45223:55;;;;;;;;;45050:236;;;;;:::o;62567:100::-;62651:8;62640;:19;;;;;;;;;;;;:::i;:::-;;62567:100;:::o;46336:213::-;46443:7;46494:44;46499:3;:10;;46519:3;46511:12;;46525;46494:4;:44::i;:::-;46486:53;;46463:78;;46336:213;;;;;:::o;35890:114::-;35950:7;35977:19;35985:3;:10;;35977:7;:19::i;:::-;35970:26;;35890:114;;;:::o;14893:220::-;14951:7;14980:1;14975;:6;14971:20;;;14990:1;14983:8;;;;14971:20;15002:9;15018:1;15014;:5;15002:17;;15047:1;15042;15038;:5;;;;;;:10;15030:56;;;;;;;;;;;;;;;;;;;;;;15104:1;15097:8;;;14893:220;;;;;:::o;57352:272::-;57466:28;57476:4;57482:2;57486:7;57466:9;:28::i;:::-;57513:48;57536:4;57542:2;57546:7;57555:5;57513:22;:48::i;:::-;57505:111;;;;;;;;;;;;;;;;;;;;;;57352:272;;;;:::o;46831:746::-;46887:13;47117:1;47108:5;:10;47104:53;;;47135:10;;;;;;;;;;;;;;;;;;;;;47104:53;47167:12;47182:5;47167:20;;47198:14;47223:78;47238:1;47230:4;:9;47223:78;;47256:8;;;;;;;47287:2;47279:10;;;;;;;;;47223:78;;;47311:19;47343:6;47333:17;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47333:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;47333:17:0;;;;47311:39;;47361:13;47386:1;47377:6;:10;47361:26;;47405:5;47398:12;;47421:117;47436:1;47428:4;:9;47421:117;;47497:2;47490:4;:9;;;;;;47485:2;:14;47472:29;;47454:6;47461:7;;;;;;;47454:15;;;;;;;;;;;:47;;;;;;;;;;;47524:2;47516:10;;;;;;;;;47421:117;;;47562:6;47548:21;;;;;;46831:746;;;;:::o;44349:151::-;44433:4;44457:35;44467:3;:10;;44487:3;44479:12;;44457:9;:35::i;:::-;44450:42;;44349:151;;;;:::o;68485:181::-;68657:1;68639:7;:14;;;:19;;;;;;;;;;;68485:181;:::o;68363:114::-;68428:7;68455;:14;;;68448:21;;68363:114;;;:::o;58929:110::-;59005:26;59015:2;59019:7;59005:26;;;;;;;;;;;;:9;:26::i;:::-;58929:110;;:::o;73865:573::-;73915:27;73965:1;73959:2;:7;73955:50;;;73983:10;;;;;;;;;;;;;;;;;;;;;73955:50;74015:6;74024:2;74015:11;;74037:8;74056:69;74068:1;74063;:6;74056:69;;74086:5;;;;;;;74111:2;74106:7;;;;;;;;;74056:69;;;74135:17;74165:3;74155:14;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;74155:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;124:4;108:14;100:6;87:42;155:4;147:6;143:17;133:27;;0:164;74155:14:0;;;;74135:34;;74180:6;74189:3;74180:12;;74203:198;74216:1;74210:2;:7;74203:198;;74240:1;74238;:3;74234:7;;74256:10;74296:2;74291;74286;:7;;;;;;:12;74281:2;:17;74270:2;:29;74256:44;;74315:9;74334:4;74327:12;;74315:24;;74364:2;74354:4;74359:1;74354:7;;;;;;;;;;;:12;;;;;;;;;;;74387:2;74381:8;;;;;;;;;74203:198;;;;;74425:4;74411:19;;;;;;73865:573;;;;:::o;62122:215::-;62222:16;62230:7;62222;:16::i;:::-;62214:73;;;;;;;;;;;;;;;;;;;;;;62320:9;62298:10;:19;62309:7;62298:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;62122:215;;:::o;41167:110::-;41223:7;41250:3;:12;;:19;;;;41243:26;;41167:110;;;:::o;64760:93::-;;;;:::o;35435:137::-;35505:4;35529:35;35537:3;:10;;35557:5;35549:14;;35529:7;:35::i;:::-;35522:42;;35435:137;;;;:::o;35128:131::-;35195:4;35219:32;35224:3;:10;;35244:5;35236:14;;35219:4;:32::i;:::-;35212:39;;35128:131;;;;:::o;43772:185::-;43861:4;43885:64;43890:3;:10;;43910:3;43902:12;;43940:5;43924:23;;43916:32;;43885:4;:64::i;:::-;43878:71;;43772:185;;;;;:::o;31386:204::-;31453:7;31502:5;31481:3;:11;;:18;;;;:26;31473:73;;;;;;;;;;;;;;;;;;;;;;31564:3;:11;;31576:5;31564:18;;;;;;;;;;;;;;;;31557:25;;31386:204;;;;:::o;41632:279::-;41699:7;41708;41758:5;41736:3;:12;;:19;;;;:27;41728:74;;;;;;;;;;;;;;;;;;;;;;41815:22;41840:3;:12;;41853:5;41840:19;;;;;;;;;;;;;;;;;;41815:44;;41878:5;:10;;;41890:5;:12;;;41870:33;;;;;41632:279;;;;;:::o;43129:319::-;43223:7;43243:16;43262:3;:12;;:17;43275:3;43262:17;;;;;;;;;;;;43243:36;;43310:1;43298:8;:13;;43313:12;43290:36;;;;;;;;;;;;;;;;;;;;;;;;;43380:3;:12;;43404:1;43393:8;:12;43380:26;;;;;;;;;;;;;;;;;;:33;;;43373:40;;;43129:319;;;;;:::o;30933:109::-;30989:7;31016:3;:11;;:18;;;;31009:25;;30933:109;;;:::o;63232:604::-;63353:4;63380:15;:2;:13;;;:15::i;:::-;63375:60;;63419:4;63412:11;;;;63375:60;63445:23;63471:252;63524:45;;;63584:12;:10;:12::i;:::-;63611:4;63630:7;63652:5;63487:181;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;63487:181:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;63487:181:0;63471:252;;;;;;;;;;;;;;;;;:2;:15;;;;:252;;;;;:::i;:::-;63445:278;;63734:13;63761:10;63750:32;;;;;;;;;;;;;;63734:48;;48381:10;63811:16;;63801:26;;;:6;:26;;;;63793:35;;;;63232:604;;;;;;;:::o;40947:125::-;41018:4;41063:1;41042:3;:12;;:17;41055:3;41042:17;;;;;;;;;;;;:22;;41035:29;;40947:125;;;;:::o;59266:250::-;59362:18;59368:2;59372:7;59362:5;:18::i;:::-;59399:54;59430:1;59434:2;59438:7;59447:5;59399:22;:54::i;:::-;59391:117;;;;;;;;;;;;;;;;;;;;;;59266:250;;;:::o;29088:1544::-;29154:4;29272:18;29293:3;:12;;:19;29306:5;29293:19;;;;;;;;;;;;29272:40;;29343:1;29329:10;:15;29325:1300;;29691:21;29728:1;29715:10;:14;29691:38;;29744:17;29785:1;29764:3;:11;;:18;;;;:22;29744:42;;30031:17;30051:3;:11;;30063:9;30051:22;;;;;;;;;;;;;;;;30031:42;;30197:9;30168:3;:11;;30180:13;30168:26;;;;;;;;;;;;;;;:38;;;;30316:1;30300:13;:17;30274:3;:12;;:23;30287:9;30274:23;;;;;;;;;;;:43;;;;30426:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;30521:3;:12;;:19;30534:5;30521:19;;;;;;;;;;;30514:26;;;30564:4;30557:11;;;;;;;;29325:1300;30608:5;30601:12;;;29088:1544;;;;;:::o;28498:414::-;28561:4;28583:21;28593:3;28598:5;28583:9;:21::i;:::-;28578:327;;28621:3;:11;;28638:5;28621:23;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;28621:23:0;;;;;;;;;;;;;;;;;;;28804:3;:11;;:18;;;;28782:3;:12;;:19;28795:5;28782:19;;;;;;;;;;;:40;;;;28844:4;28837:11;;;;28578:327;28888:5;28881:12;;28498:414;;;;;:::o;38447:692::-;38523:4;38639:16;38658:3;:12;;:17;38671:3;38658:17;;;;;;;;;;;;38639:36;;38704:1;38692:8;:13;38688:444;;;38759:3;:12;;38777:38;;;;;;;;38794:3;38777:38;;;;38807:5;38777:38;;;38759:57;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38759:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38974:3;:12;;:19;;;;38954:3;:12;;:17;38967:3;38954:17;;;;;;;;;;;:39;;;;39015:4;39008:11;;;;;38688:444;39088:5;39052:3;:12;;39076:1;39065:8;:12;39052:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;39115:5;39108:12;;;38447:692;;;;;;:::o;19486:422::-;19546:4;19754:12;19865:7;19853:20;19845:28;;19899:1;19892:4;:8;19885:15;;;19486:422;;;:::o;22404:195::-;22507:12;22539:52;22561:6;22569:4;22575:1;22578:12;22539:21;:52::i;:::-;22532:59;;22404:195;;;;;:::o;59852:404::-;59946:1;59932:16;;:2;:16;;;;59924:61;;;;;;;;;;;;;;;;;;;;;;60005:16;60013:7;60005;:16::i;:::-;60004:17;59996:58;;;;;;;;;;;;;;;;;;;;;;60067:45;60096:1;60100:2;60104:7;60067:20;:45::i;:::-;60125:30;60147:7;60125:13;:17;60139:2;60125:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;60168:29;60185:7;60194:2;60168:12;:16;;:29;;;;;:::i;:::-;;60240:7;60236:2;60215:33;;60232:1;60215:33;;;;;;;;;;;;59852:404;;:::o;30718:129::-;30791:4;30838:1;30815:3;:12;;:19;30828:5;30815:19;;;;;;;;;;;;:24;;30808:31;;30718:129;;;;:::o;23456:530::-;23583:12;23641:5;23616:21;:30;;23608:81;;;;;;;;;;;;;;;;;;;;;;23708:18;23719:6;23708:10;:18::i;:::-;23700:60;;;;;;;;;;;;;;;;;;;;;;23834:12;23848:23;23875:6;:11;;23895:5;23903:4;23875:33;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;23833:75:0;;;;23926:52;23944:7;23953:10;23965:12;23926:17;:52::i;:::-;23919:59;;;;23456:530;;;;;;:::o;25996:742::-;26111:12;26140:7;26136:595;;;26171:10;26164:17;;;;26136:595;26305:1;26285:10;:17;:21;26281:439;;;26548:10;26542:17;26609:15;26596:10;26592:2;26588:19;26581:44;26496:148;26691:12;26684:20;;;;;;;;;;;;;;;;;;;;25996:742;;;;;;:::o;68899:5542::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;295:1;292;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;;;354:80;;;345:89;;451:5;476:6;469:5;462:21;506:4;498:6;494:17;484:27;;528:4;523:3;519:14;512:21;;581:6;628:3;620:4;612:6;608:17;603:3;599:27;596:36;593:2;;;645:1;642;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;738:3;760:37;793:3;781:10;760:37;;;755:3;748:50;821:4;816:3;812:14;805:21;;849:4;844:3;840:14;833:21;;712:149;702:1;699;695:9;690:14;;655:206;;;659:14;237:630;;;;;;;;875:124;;952:6;939:20;930:29;;964:30;988:5;964:30;;;924:75;;;;;1006:128;;1085:6;1072:20;1063:29;;1097:32;1123:5;1097:32;;;1057:77;;;;;1141:132;;1224:6;1218:13;1209:22;;1236:32;1262:5;1236:32;;;1203:70;;;;;1281:440;;1382:3;1375:4;1367:6;1363:17;1359:27;1349:2;;1400:1;1397;1390:12;1349:2;1437:6;1424:20;1459:64;1474:48;1515:6;1474:48;;;1459:64;;;1450:73;;1543:6;1536:5;1529:21;1579:4;1571:6;1567:17;1612:4;1605:5;1601:16;1647:3;1638:6;1633:3;1629:16;1626:25;1623:2;;;1664:1;1661;1654:12;1623:2;1674:41;1708:6;1703:3;1698;1674:41;;;1342:379;;;;;;;;1744:337;;;1859:3;1852:4;1844:6;1840:17;1836:27;1826:2;;1877:1;1874;1867:12;1826:2;1910:6;1897:20;1887:30;;1937:18;1929:6;1926:30;1923:2;;;1969:1;1966;1959:12;1923:2;2003:4;1995:6;1991:17;1979:29;;2054:3;2046:4;2038:6;2034:17;2024:8;2020:32;2017:41;2014:2;;;2071:1;2068;2061:12;2014:2;1819:262;;;;;;2089:130;;2169:6;2156:20;2147:29;;2181:33;2208:5;2181:33;;;2141:78;;;;;2226:241;;2330:2;2318:9;2309:7;2305:23;2301:32;2298:2;;;2346:1;2343;2336:12;2298:2;2381:1;2398:53;2443:7;2434:6;2423:9;2419:22;2398:53;;;2388:63;;2360:97;2292:175;;;;;2474:366;;;2595:2;2583:9;2574:7;2570:23;2566:32;2563:2;;;2611:1;2608;2601:12;2563:2;2646:1;2663:53;2708:7;2699:6;2688:9;2684:22;2663:53;;;2653:63;;2625:97;2753:2;2771:53;2816:7;2807:6;2796:9;2792:22;2771:53;;;2761:63;;2732:98;2557:283;;;;;;2847:491;;;;2985:2;2973:9;2964:7;2960:23;2956:32;2953:2;;;3001:1;2998;2991:12;2953:2;3036:1;3053:53;3098:7;3089:6;3078:9;3074:22;3053:53;;;3043:63;;3015:97;3143:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;;;3151:63;;3122:98;3251:2;3269:53;3314:7;3305:6;3294:9;3290:22;3269:53;;;3259:63;;3230:98;2947:391;;;;;;3345:721;;;;;3509:3;3497:9;3488:7;3484:23;3480:33;3477:2;;;3526:1;3523;3516:12;3477:2;3561:1;3578:53;3623:7;3614:6;3603:9;3599:22;3578:53;;;3568:63;;3540:97;3668:2;3686:53;3731:7;3722:6;3711:9;3707:22;3686:53;;;3676:63;;3647:98;3776:2;3794:53;3839:7;3830:6;3819:9;3815:22;3794:53;;;3784:63;;3755:98;3912:2;3901:9;3897:18;3884:32;3936:18;3928:6;3925:30;3922:2;;;3968:1;3965;3958:12;3922:2;3988:62;4042:7;4033:6;4022:9;4018:22;3988:62;;;3978:72;;3863:193;3471:595;;;;;;;;4073:360;;;4191:2;4179:9;4170:7;4166:23;4162:32;4159:2;;;4207:1;4204;4197:12;4159:2;4242:1;4259:53;4304:7;4295:6;4284:9;4280:22;4259:53;;;4249:63;;4221:97;4349:2;4367:50;4409:7;4400:6;4389:9;4385:22;4367:50;;;4357:60;;4328:95;4153:280;;;;;;4440:366;;;4561:2;4549:9;4540:7;4536:23;4532:32;4529:2;;;4577:1;4574;4567:12;4529:2;4612:1;4629:53;4674:7;4665:6;4654:9;4650:22;4629:53;;;4619:63;;4591:97;4719:2;4737:53;4782:7;4773:6;4762:9;4758:22;4737:53;;;4727:63;;4698:98;4523:283;;;;;;4813:377;;4942:2;4930:9;4921:7;4917:23;4913:32;4910:2;;;4958:1;4955;4948:12;4910:2;5021:1;5010:9;5006:17;4993:31;5044:18;5036:6;5033:30;5030:2;;;5076:1;5073;5066:12;5030:2;5096:78;5166:7;5157:6;5146:9;5142:22;5096:78;;;5086:88;;4972:208;4904:286;;;;;5197:239;;5300:2;5288:9;5279:7;5275:23;5271:32;5268:2;;;5316:1;5313;5306:12;5268:2;5351:1;5368:52;5412:7;5403:6;5392:9;5388:22;5368:52;;;5358:62;;5330:96;5262:174;;;;;5443:261;;5557:2;5545:9;5536:7;5532:23;5528:32;5525:2;;;5573:1;5570;5563:12;5525:2;5608:1;5625:63;5680:7;5671:6;5660:9;5656:22;5625:63;;;5615:73;;5587:107;5519:185;;;;;5711:367;;;5835:2;5823:9;5814:7;5810:23;5806:32;5803:2;;;5851:1;5848;5841:12;5803:2;5914:1;5903:9;5899:17;5886:31;5937:18;5929:6;5926:30;5923:2;;;5969:1;5966;5959:12;5923:2;5997:65;6054:7;6045:6;6034:9;6030:22;5997:65;;;5987:75;;;;5865:203;5797:281;;;;;;6085:241;;6189:2;6177:9;6168:7;6164:23;6160:32;6157:2;;;6205:1;6202;6195:12;6157:2;6240:1;6257:53;6302:7;6293:6;6282:9;6278:22;6257:53;;;6247:63;;6219:97;6151:175;;;;;6333:137;6432:32;6458:5;6432:32;;;6427:3;6420:45;6414:56;;;6477:113;6560:24;6578:5;6560:24;;;6555:3;6548:37;6542:48;;;6597:104;6674:21;6689:5;6674:21;;;6669:3;6662:34;6656:45;;;6708:343;;6818:38;6850:5;6818:38;;;6868:70;6931:6;6926:3;6868:70;;;6861:77;;6943:52;6988:6;6983:3;6976:4;6969:5;6965:16;6943:52;;;7016:29;7038:6;7016:29;;;7011:3;7007:39;7000:46;;6798:253;;;;;;7058:356;;7186:38;7218:5;7186:38;;;7236:88;7317:6;7312:3;7236:88;;;7229:95;;7329:52;7374:6;7369:3;7362:4;7355:5;7351:16;7329:52;;;7402:6;7397:3;7393:16;7386:23;;7166:248;;;;;;7421:347;;7533:39;7566:5;7533:39;;;7584:71;7648:6;7643:3;7584:71;;;7577:78;;7660:52;7705:6;7700:3;7693:4;7686:5;7682:16;7660:52;;;7733:29;7755:6;7733:29;;;7728:3;7724:39;7717:46;;7513:255;;;;;;7775:360;;7905:39;7938:5;7905:39;;;7956:89;8038:6;8033:3;7956:89;;;7949:96;;8050:52;8095:6;8090:3;8083:4;8076:5;8072:16;8050:52;;;8123:6;8118:3;8114:16;8107:23;;7885:250;;;;;;8143:371;;8303:67;8367:2;8362:3;8303:67;;;8296:74;;8403:34;8399:1;8394:3;8390:11;8383:55;8472:4;8467:2;8462:3;8458:12;8451:26;8505:2;8500:3;8496:12;8489:19;;8289:225;;;;8523:329;;8683:67;8747:2;8742:3;8683:67;;;8676:74;;8783:31;8779:1;8774:3;8770:11;8763:52;8843:2;8838:3;8834:12;8827:19;;8669:183;;;;8861:387;;9021:67;9085:2;9080:3;9021:67;;;9014:74;;9121:34;9117:1;9112:3;9108:11;9101:55;9190:20;9185:2;9180:3;9176:12;9169:42;9239:2;9234:3;9230:12;9223:19;;9007:241;;;;9257:392;;9417:67;9481:2;9476:3;9417:67;;;9410:74;;9517:34;9513:1;9508:3;9504:11;9497:55;9586:25;9581:2;9576:3;9572:12;9565:47;9640:2;9635:3;9631:12;9624:19;;9403:246;;;;9658:375;;9818:67;9882:2;9877:3;9818:67;;;9811:74;;9918:34;9914:1;9909:3;9905:11;9898:55;9987:8;9982:2;9977:3;9973:12;9966:30;10024:2;10019:3;10015:12;10008:19;;9804:229;;;;10042:328;;10202:67;10266:2;10261:3;10202:67;;;10195:74;;10302:30;10298:1;10293:3;10289:11;10282:51;10361:2;10356:3;10352:12;10345:19;;10188:182;;;;10379:320;;10539:67;10603:2;10598:3;10539:67;;;10532:74;;10639:22;10635:1;10630:3;10626:11;10619:43;10690:2;10685:3;10681:12;10674:19;;10525:174;;;;10708:373;;10868:67;10932:2;10927:3;10868:67;;;10861:74;;10968:34;10964:1;10959:3;10955:11;10948:55;11037:6;11032:2;11027:3;11023:12;11016:28;11072:2;11067:3;11063:12;11056:19;;10854:227;;;;11090:325;;11250:67;11314:2;11309:3;11250:67;;;11243:74;;11350:27;11346:1;11341:3;11337:11;11330:48;11406:2;11401:3;11397:12;11390:19;;11236:179;;;;11424:376;;11584:67;11648:2;11643:3;11584:67;;;11577:74;;11684:34;11680:1;11675:3;11671:11;11664:55;11753:9;11748:2;11743:3;11739:12;11732:31;11791:2;11786:3;11782:12;11775:19;;11570:230;;;;11809:375;;11969:67;12033:2;12028:3;11969:67;;;11962:74;;12069:34;12065:1;12060:3;12056:11;12049:55;12138:8;12133:2;12128:3;12124:12;12117:30;12175:2;12170:3;12166:12;12159:19;;11955:229;;;;12193:381;;12353:67;12417:2;12412:3;12353:67;;;12346:74;;12453:34;12449:1;12444:3;12440:11;12433:55;12522:14;12517:2;12512:3;12508:12;12501:36;12565:2;12560:3;12556:12;12549:19;;12339:235;;;;12583:317;;12743:67;12807:2;12802:3;12743:67;;;12736:74;;12843:19;12839:1;12834:3;12830:11;12823:40;12891:2;12886:3;12882:12;12875:19;;12729:171;;;;12909:322;;13069:67;13133:2;13128:3;13069:67;;;13062:74;;13169:24;13165:1;13160:3;13156:11;13149:45;13222:2;13217:3;13213:12;13206:19;;13055:176;;;;13240:393;;13400:67;13464:2;13459:3;13400:67;;;13393:74;;13500:34;13496:1;13491:3;13487:11;13480:55;13569:26;13564:2;13559:3;13555:12;13548:48;13624:2;13619:3;13615:12;13608:19;;13386:247;;;;13642:318;;13802:67;13866:2;13861:3;13802:67;;;13795:74;;13902:20;13898:1;13893:3;13889:11;13882:41;13951:2;13946:3;13942:12;13935:19;;13788:172;;;;13969:379;;14129:67;14193:2;14188:3;14129:67;;;14122:74;;14229:34;14225:1;14220:3;14216:11;14209:55;14298:12;14293:2;14288:3;14284:12;14277:34;14339:2;14334:3;14330:12;14323:19;;14115:233;;;;14357:371;;14517:67;14581:2;14576:3;14517:67;;;14510:74;;14617:34;14613:1;14608:3;14604:11;14597:55;14686:4;14681:2;14676:3;14672:12;14665:26;14719:2;14714:3;14710:12;14703:19;;14503:225;;;;14737:332;;14897:67;14961:2;14956:3;14897:67;;;14890:74;;14997:34;14993:1;14988:3;14984:11;14977:55;15060:2;15055:3;15051:12;15044:19;;14883:186;;;;15078:326;;15238:67;15302:2;15297:3;15238:67;;;15231:74;;15338:28;15334:1;15329:3;15325:11;15318:49;15395:2;15390:3;15386:12;15379:19;;15224:180;;;;15413:370;;15573:67;15637:2;15632:3;15573:67;;;15566:74;;15673:34;15669:1;15664:3;15660:11;15653:55;15742:3;15737:2;15732:3;15728:12;15721:25;15774:2;15769:3;15765:12;15758:19;;15559:224;;;;15792:381;;15952:67;16016:2;16011:3;15952:67;;;15945:74;;16052:34;16048:1;16043:3;16039:11;16032:55;16121:14;16116:2;16111:3;16107:12;16100:36;16164:2;16159:3;16155:12;16148:19;;15938:235;;;;16182:381;;16342:67;16406:2;16401:3;16342:67;;;16335:74;;16442:34;16438:1;16433:3;16429:11;16422:55;16511:14;16506:2;16501:3;16497:12;16490:36;16554:2;16549:3;16545:12;16538:19;;16328:235;;;;16572:313;;16732:67;16796:2;16791:3;16732:67;;;16725:74;;16832:15;16828:1;16823:3;16819:11;16812:36;16876:2;16871:3;16867:12;16860:19;;16718:167;;;;16894:332;;17054:67;17118:2;17113:3;17054:67;;;17047:74;;17154:34;17150:1;17145:3;17141:11;17134:55;17217:2;17212:3;17208:12;17201:19;;17040:186;;;;17235:378;;17395:67;17459:2;17454:3;17395:67;;;17388:74;;17495:34;17491:1;17486:3;17482:11;17475:55;17564:11;17559:2;17554:3;17550:12;17543:33;17604:2;17599:3;17595:12;17588:19;;17381:232;;;;17622:384;;17782:67;17846:2;17841:3;17782:67;;;17775:74;;17882:34;17878:1;17873:3;17869:11;17862:55;17951:17;17946:2;17941:3;17937:12;17930:39;17997:2;17992:3;17988:12;17981:19;;17768:238;;;;18015:323;;18175:67;18239:2;18234:3;18175:67;;;18168:74;;18275:25;18271:1;18266:3;18262:11;18255:46;18329:2;18324:3;18320:12;18313:19;;18161:177;;;;18347:322;;18507:67;18571:2;18566:3;18507:67;;;18500:74;;18607:24;18603:1;18598:3;18594:11;18587:45;18660:2;18655:3;18651:12;18644:19;;18493:176;;;;18678:370;;18838:67;18902:2;18897:3;18838:67;;;18831:74;;18938:34;18934:1;18929:3;18925:11;18918:55;19007:3;19002:2;18997:3;18993:12;18986:25;19039:2;19034:3;19030:12;19023:19;;18824:224;;;;19057:296;;19234:83;19315:1;19310:3;19234:83;;;19227:90;;19345:1;19340:3;19336:11;19329:18;;19220:133;;;;19362:386;;19522:67;19586:2;19581:3;19522:67;;;19515:74;;19622:34;19618:1;19613:3;19609:11;19602:55;19691:19;19686:2;19681:3;19677:12;19670:41;19739:2;19734:3;19730:12;19723:19;;19508:240;;;;19757:329;;19917:67;19981:2;19976:3;19917:67;;;19910:74;;20017:31;20013:1;20008:3;20004:11;19997:52;20077:2;20072:3;20068:12;20061:19;;19903:183;;;;20095:378;;20255:67;20319:2;20314:3;20255:67;;;20248:74;;20355:34;20351:1;20346:3;20342:11;20335:55;20424:11;20419:2;20414:3;20410:12;20403:33;20464:2;20459:3;20455:12;20448:19;;20241:232;;;;20482:321;;20642:67;20706:2;20701:3;20642:67;;;20635:74;;20742:23;20738:1;20733:3;20729:11;20722:44;20794:2;20789:3;20785:12;20778:19;;20628:175;;;;20811:113;20894:24;20912:5;20894:24;;;20889:3;20882:37;20876:48;;;20931:262;;21075:93;21164:3;21155:6;21075:93;;;21068:100;;21185:3;21178:10;;21056:137;;;;;21200:427;;21394:95;21485:3;21476:6;21394:95;;;21387:102;;21507:95;21598:3;21589:6;21507:95;;;21500:102;;21619:3;21612:10;;21375:252;;;;;;21634:370;;21832:147;21975:3;21832:147;;;21825:154;;21996:3;21989:10;;21813:191;;;;22011:213;;22129:2;22118:9;22114:18;22106:26;;22143:71;22211:1;22200:9;22196:17;22187:6;22143:71;;;22100:124;;;;;22231:663;;22467:3;22456:9;22452:19;22444:27;;22482:87;22566:1;22555:9;22551:17;22542:6;22482:87;;;22580:72;22648:2;22637:9;22633:18;22624:6;22580:72;;;22663;22731:2;22720:9;22716:18;22707:6;22663:72;;;22783:9;22777:4;22773:20;22768:2;22757:9;22753:18;22746:48;22808:76;22879:4;22870:6;22808:76;;;22800:84;;22438:456;;;;;;;;22901:201;;23013:2;23002:9;22998:18;22990:26;;23027:65;23089:1;23078:9;23074:17;23065:6;23027:65;;;22984:118;;;;;23109:301;;23247:2;23236:9;23232:18;23224:26;;23297:9;23291:4;23287:20;23283:1;23272:9;23268:17;23261:47;23322:78;23395:4;23386:6;23322:78;;;23314:86;;23218:192;;;;;23417:407;;23608:2;23597:9;23593:18;23585:26;;23658:9;23652:4;23648:20;23644:1;23633:9;23629:17;23622:47;23683:131;23809:4;23683:131;;;23675:139;;23579:245;;;;23831:407;;24022:2;24011:9;24007:18;23999:26;;24072:9;24066:4;24062:20;24058:1;24047:9;24043:17;24036:47;24097:131;24223:4;24097:131;;;24089:139;;23993:245;;;;24245:407;;24436:2;24425:9;24421:18;24413:26;;24486:9;24480:4;24476:20;24472:1;24461:9;24457:17;24450:47;24511:131;24637:4;24511:131;;;24503:139;;24407:245;;;;24659:407;;24850:2;24839:9;24835:18;24827:26;;24900:9;24894:4;24890:20;24886:1;24875:9;24871:17;24864:47;24925:131;25051:4;24925:131;;;24917:139;;24821:245;;;;25073:407;;25264:2;25253:9;25249:18;25241:26;;25314:9;25308:4;25304:20;25300:1;25289:9;25285:17;25278:47;25339:131;25465:4;25339:131;;;25331:139;;25235:245;;;;25487:407;;25678:2;25667:9;25663:18;25655:26;;25728:9;25722:4;25718:20;25714:1;25703:9;25699:17;25692:47;25753:131;25879:4;25753:131;;;25745:139;;25649:245;;;;25901:407;;26092:2;26081:9;26077:18;26069:26;;26142:9;26136:4;26132:20;26128:1;26117:9;26113:17;26106:47;26167:131;26293:4;26167:131;;;26159:139;;26063:245;;;;26315:407;;26506:2;26495:9;26491:18;26483:26;;26556:9;26550:4;26546:20;26542:1;26531:9;26527:17;26520:47;26581:131;26707:4;26581:131;;;26573:139;;26477:245;;;;26729:407;;26920:2;26909:9;26905:18;26897:26;;26970:9;26964:4;26960:20;26956:1;26945:9;26941:17;26934:47;26995:131;27121:4;26995:131;;;26987:139;;26891:245;;;;27143:407;;27334:2;27323:9;27319:18;27311:26;;27384:9;27378:4;27374:20;27370:1;27359:9;27355:17;27348:47;27409:131;27535:4;27409:131;;;27401:139;;27305:245;;;;27557:407;;27748:2;27737:9;27733:18;27725:26;;27798:9;27792:4;27788:20;27784:1;27773:9;27769:17;27762:47;27823:131;27949:4;27823:131;;;27815:139;;27719:245;;;;27971:407;;28162:2;28151:9;28147:18;28139:26;;28212:9;28206:4;28202:20;28198:1;28187:9;28183:17;28176:47;28237:131;28363:4;28237:131;;;28229:139;;28133:245;;;;28385:407;;28576:2;28565:9;28561:18;28553:26;;28626:9;28620:4;28616:20;28612:1;28601:9;28597:17;28590:47;28651:131;28777:4;28651:131;;;28643:139;;28547:245;;;;28799:407;;28990:2;28979:9;28975:18;28967:26;;29040:9;29034:4;29030:20;29026:1;29015:9;29011:17;29004:47;29065:131;29191:4;29065:131;;;29057:139;;28961:245;;;;29213:407;;29404:2;29393:9;29389:18;29381:26;;29454:9;29448:4;29444:20;29440:1;29429:9;29425:17;29418:47;29479:131;29605:4;29479:131;;;29471:139;;29375:245;;;;29627:407;;29818:2;29807:9;29803:18;29795:26;;29868:9;29862:4;29858:20;29854:1;29843:9;29839:17;29832:47;29893:131;30019:4;29893:131;;;29885:139;;29789:245;;;;30041:407;;30232:2;30221:9;30217:18;30209:26;;30282:9;30276:4;30272:20;30268:1;30257:9;30253:17;30246:47;30307:131;30433:4;30307:131;;;30299:139;;30203:245;;;;30455:407;;30646:2;30635:9;30631:18;30623:26;;30696:9;30690:4;30686:20;30682:1;30671:9;30667:17;30660:47;30721:131;30847:4;30721:131;;;30713:139;;30617:245;;;;30869:407;;31060:2;31049:9;31045:18;31037:26;;31110:9;31104:4;31100:20;31096:1;31085:9;31081:17;31074:47;31135:131;31261:4;31135:131;;;31127:139;;31031:245;;;;31283:407;;31474:2;31463:9;31459:18;31451:26;;31524:9;31518:4;31514:20;31510:1;31499:9;31495:17;31488:47;31549:131;31675:4;31549:131;;;31541:139;;31445:245;;;;31697:407;;31888:2;31877:9;31873:18;31865:26;;31938:9;31932:4;31928:20;31924:1;31913:9;31909:17;31902:47;31963:131;32089:4;31963:131;;;31955:139;;31859:245;;;;32111:407;;32302:2;32291:9;32287:18;32279:26;;32352:9;32346:4;32342:20;32338:1;32327:9;32323:17;32316:47;32377:131;32503:4;32377:131;;;32369:139;;32273:245;;;;32525:407;;32716:2;32705:9;32701:18;32693:26;;32766:9;32760:4;32756:20;32752:1;32741:9;32737:17;32730:47;32791:131;32917:4;32791:131;;;32783:139;;32687:245;;;;32939:407;;33130:2;33119:9;33115:18;33107:26;;33180:9;33174:4;33170:20;33166:1;33155:9;33151:17;33144:47;33205:131;33331:4;33205:131;;;33197:139;;33101:245;;;;33353:407;;33544:2;33533:9;33529:18;33521:26;;33594:9;33588:4;33584:20;33580:1;33569:9;33565:17;33558:47;33619:131;33745:4;33619:131;;;33611:139;;33515:245;;;;33767:407;;33958:2;33947:9;33943:18;33935:26;;34008:9;34002:4;33998:20;33994:1;33983:9;33979:17;33972:47;34033:131;34159:4;34033:131;;;34025:139;;33929:245;;;;34181:407;;34372:2;34361:9;34357:18;34349:26;;34422:9;34416:4;34412:20;34408:1;34397:9;34393:17;34386:47;34447:131;34573:4;34447:131;;;34439:139;;34343:245;;;;34595:407;;34786:2;34775:9;34771:18;34763:26;;34836:9;34830:4;34826:20;34822:1;34811:9;34807:17;34800:47;34861:131;34987:4;34861:131;;;34853:139;;34757:245;;;;35009:407;;35200:2;35189:9;35185:18;35177:26;;35250:9;35244:4;35240:20;35236:1;35225:9;35221:17;35214:47;35275:131;35401:4;35275:131;;;35267:139;;35171:245;;;;35423:407;;35614:2;35603:9;35599:18;35591:26;;35664:9;35658:4;35654:20;35650:1;35639:9;35635:17;35628:47;35689:131;35815:4;35689:131;;;35681:139;;35585:245;;;;35837:407;;36028:2;36017:9;36013:18;36005:26;;36078:9;36072:4;36068:20;36064:1;36053:9;36049:17;36042:47;36103:131;36229:4;36103:131;;;36095:139;;35999:245;;;;36251:407;;36442:2;36431:9;36427:18;36419:26;;36492:9;36486:4;36482:20;36478:1;36467:9;36463:17;36456:47;36517:131;36643:4;36517:131;;;36509:139;;36413:245;;;;36665:407;;36856:2;36845:9;36841:18;36833:26;;36906:9;36900:4;36896:20;36892:1;36881:9;36877:17;36870:47;36931:131;37057:4;36931:131;;;36923:139;;36827:245;;;;37079:407;;37270:2;37259:9;37255:18;37247:26;;37320:9;37314:4;37310:20;37306:1;37295:9;37291:17;37284:47;37345:131;37471:4;37345:131;;;37337:139;;37241:245;;;;37493:213;;37611:2;37600:9;37596:18;37588:26;;37625:71;37693:1;37682:9;37678:17;37669:6;37625:71;;;37582:124;;;;;37713:256;;37775:2;37769:9;37759:19;;37813:4;37805:6;37801:17;37912:6;37900:10;37897:22;37876:18;37864:10;37861:34;37858:62;37855:2;;;37933:1;37930;37923:12;37855:2;37953:10;37949:2;37942:22;37753:216;;;;;37976:304;;38135:18;38127:6;38124:30;38121:2;;;38167:1;38164;38157:12;38121:2;38202:4;38194:6;38190:17;38182:25;;38265:4;38259;38255:15;38247:23;;38058:222;;;;38287:321;;38430:18;38422:6;38419:30;38416:2;;;38462:1;38459;38452:12;38416:2;38529:4;38525:9;38518:4;38510:6;38506:17;38502:33;38494:41;;38593:4;38587;38583:15;38575:23;;38353:255;;;;38615:121;;38708:5;38702:12;38692:22;;38673:63;;;;38743:122;;38837:5;38831:12;38821:22;;38802:63;;;;38873:162;;38987:6;38982:3;38975:19;39024:4;39019:3;39015:14;39000:29;;38968:67;;;;;39044:144;;39179:3;39164:18;;39157:31;;;;;39197:163;;39312:6;39307:3;39300:19;39349:4;39344:3;39340:14;39325:29;;39293:67;;;;;39369:145;;39505:3;39490:18;;39483:31;;;;;39522:91;;39584:24;39602:5;39584:24;;;39573:35;;39567:46;;;;39620:99;;39690:24;39708:5;39690:24;;;39679:35;;39673:46;;;;39726:85;;39799:5;39792:13;39785:21;39774:32;;39768:43;;;;39818:144;;39890:66;39883:5;39879:78;39868:89;;39862:100;;;;39969:121;;40042:42;40035:5;40031:54;40020:65;;40014:76;;;;40097:72;;40159:5;40148:16;;40142:27;;;;40177:145;40258:6;40253:3;40248;40235:30;40314:1;40305:6;40300:3;40296:16;40289:27;40228:94;;;;40331:268;40396:1;40403:101;40417:6;40414:1;40411:13;40403:101;;;40493:1;40488:3;40484:11;40478:18;40474:1;40469:3;40465:11;40458:39;40439:2;40436:1;40432:10;40427:15;;40403:101;;;40519:6;40516:1;40513:13;40510:2;;;40584:1;40575:6;40570:3;40566:16;40559:27;40510:2;40380:219;;;;;40607:97;;40695:2;40691:7;40686:2;40679:5;40675:14;40671:28;40661:38;;40655:49;;;;40712:117;40781:24;40799:5;40781:24;;;40774:5;40771:35;40761:2;;40820:1;40817;40810:12;40761:2;40755:74;;40836:111;40902:21;40917:5;40902:21;;;40895:5;40892:32;40882:2;;40938:1;40935;40928:12;40882:2;40876:71;;40954:115;41022:23;41039:5;41022:23;;;41015:5;41012:34;41002:2;;41060:1;41057;41050:12;41002:2;40996:73;;41076:117;41145:24;41163:5;41145:24;;;41138:5;41135:35;41125:2;;41184:1;41181;41174:12;41125:2;41119:74;

Swarm Source

ipfs://aac4f1fdd8d6fd14e964ad467ee95fa22763b73a13f76496d7d0afd5a3dff836
Loading...
Loading
Loading...
Loading
[ 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.