ETH Price: $3,319.29 (-4.36%)

Token

NFTBox ([BOX])
 

Overview

Max Total Supply

500 [BOX]

Holders

339

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
icemoney55.eth
Balance
1 [BOX]
0x6bc7a4adbd772edd45555dacc73e3457efe36060
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

NFTBoxes is a curated monthly box of NFTs on the newest gold standard of NFT technology.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFTBoxesBox

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-01-30
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.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);
}




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




/**
 * @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--] = byte(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}


interface IVendingMachine {

	function NFTMachineFor(uint256 NFTId, address _recipient) external;
}
pragma experimental ABIEncoderV2;












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







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







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





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







/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
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 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;
    }
}





/**
 * @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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}





/**
 * @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 in 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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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);
            }
        }
    }
}





/**
 * @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.0.0, only sets of type `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];
    }

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





/**
 * @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 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) {
        return _get(map, key, "EnumerableMap: nonexistent key");
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     */
    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(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(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(uint256(_get(map._inner, bytes32(key))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint256(_get(map._inner, bytes32(key), errorMessage)));
    }
}



/**
 * @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 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 override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];

        // If there is no base URI, return the token URI.
        if (bytes(_baseURI).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(_baseURI, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(_baseURI, 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 returns (string memory) {
        return _baseURI;
    }

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view 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 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 = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view 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 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 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 returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || 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 = ownerOf(tokenId);

        _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(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

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

    /**
     * @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 { }
}







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


contract HasSecondaryBoxSaleFees is ERC165 {
    
    address payable teamAddress;
    uint256 teamSecondaryBps;  
        
   /*
    * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f
    * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb
    *
    * => 0x0ebd4c7f ^ 0xb9c4d9fb == 0xb7799584
    */
    
    bytes4 private constant _INTERFACE_ID_FEES = 0xb7799584;
    
    constructor() public {
        _registerInterface(_INTERFACE_ID_FEES);
    }

    function getFeeRecipients(uint256 id) public view returns (address payable[] memory){
        address payable[] memory addressArray;
        addressArray[0] = teamAddress;
        return addressArray;
    }
    
    function getFeeBps(uint256 id) public view returns (uint[] memory){
        uint[] memory bpsArray;
        bpsArray[0] = teamSecondaryBps; 
        return bpsArray;
    }
 
}


contract NFTBoxesBox is ERC721("NFTBox", "[BOX]"), Ownable, HasSecondaryBoxSaleFees {
    
	struct BoxMould{
		uint8				live; // bool
		uint8				shared; // bool
		uint128				maxEdition;
		uint152				maxBuyAmount;
		uint128				currentEditionCount;
		uint256				price;
		address payable[]	artists;
		uint256[]			shares;
		string				name;
		string				series;
		string				theme;
		string				ipfsHash;
		string				arweaveHash;
	}

	struct Box {
		uint256				mouldId;
		uint256				edition;
	}

	IVendingMachine public	vendingMachine;
	uint256 public			boxMouldCount;

	uint256 constant public TOTAL_SHARES = 1000;

	mapping(uint256 => BoxMould) public	boxMoulds;
	mapping(uint256 =>  Box) public	boxes;
	mapping(uint256 => bool) public lockedBoxes;

	mapping(address => uint256) public teamShare;
	address payable[] public team;

	mapping(address => bool) public authorisedCaller;

	event BoxMouldCreated(uint256 id);
	event BoxBought(uint256 indexed boxMould, uint256 boxEdition, uint256 tokenId);

	constructor() public {
		_setBaseURI("https://nftboxesbox.azurewebsites.net/api/HttpTrigger?id=");
		team.push(payable(0x3428B1746Dfd26C7C725913D829BE2706AA89B2e));
		team.push(payable(0x63a9dbCe75413036B2B778E670aaBd4493aAF9F3));
		team.push(payable(0x4C7BEdfA26C744e6bd61CBdF86F3fc4a76DCa073));
		team.push(payable(0xf521Bb7437bEc77b0B15286dC3f49A87b9946773));
		team.push(payable(0x3945476E477De76d53b4833a46c806Ef3D72b21E));

		teamShare[address(0x3428B1746Dfd26C7C725913D829BE2706AA89B2e)] = 580;
		teamShare[address(0x63a9dbCe75413036B2B778E670aaBd4493aAF9F3)] = 10;
		teamShare[address(0x4C7BEdfA26C744e6bd61CBdF86F3fc4a76DCa073)] = 30;
		teamShare[address(0xf521Bb7437bEc77b0B15286dC3f49A87b9946773)] = 30;
		teamShare[address(0x3945476E477De76d53b4833a46c806Ef3D72b21E)] = 10;
	}

	function updateURI(string memory newURI) public onlyOwner {
		_setBaseURI(newURI);
	}

	modifier authorised() {
		require(authorisedCaller[msg.sender] || msg.sender == owner(), "NFTBoxes: Not authorised to execute.");
		_;
	}

	function setCaller(address _caller, bool _value) external onlyOwner {
		authorisedCaller[_caller] = _value;
	}

	function addTeamMember(address payable _member) external onlyOwner {
		for (uint256 i = 0; i < team.length; i++)
			require( _member != team[i], "NFTBoxes: members exists already");
		team.push(_member);
	}

	function removeTeamMember(address payable _member) external onlyOwner {
		for (uint256 i = 0; i < team.length; i++)
			if (team[i] == _member) {
				delete teamShare[_member];
				team[i] = team[team.length - 1];
				team.pop();
			}
	}

	function setTeamShare(address _member, uint _share) external onlyOwner {
		require(_share <= TOTAL_SHARES, "NFTBoxes: share must be below 1000");
		for (uint256 i = 0; i < team.length; i++)
			if (team[i] == _member)
				teamShare[_member] = _share;
	}

	function setLockOnBox(uint256 _id, bool _lock) external authorised {
		require(_id <= boxMouldCount && _id > 0, "NFTBoxes: Mould ID does not exist.");
		lockedBoxes[_id] = _lock;
	}

	function createBoxMould(
		uint128 _max,
		uint128 _maxBuyAmount,
		uint256 _price,
		address payable[] memory _artists,
		uint256[] memory _shares,
		string memory _name,
		string memory _series,
		string memory _theme,
		string memory _ipfsHash,
		string memory _arweaveHash)
		external
		onlyOwner {
		require(_artists.length == _shares.length, "NFTBoxes: arrays are not of same length.");
		boxMoulds[boxMouldCount + 1] = BoxMould({
			live: uint8(0),
			shared: uint8(0),
			maxEdition: _max,
			maxBuyAmount: _maxBuyAmount,
			currentEditionCount: 0,
			price: _price,
			artists: _artists,
			shares: _shares,
			name: _name,
			series: _series,
			theme: _theme,
			ipfsHash: _ipfsHash,
			arweaveHash: _arweaveHash
		});
		boxMouldCount++;
		lockedBoxes[boxMouldCount] = true;
		emit BoxMouldCreated(boxMouldCount);
	}

	function removeArtist(uint256 _id, address payable _artist) external onlyOwner {
		BoxMould storage boxMould = boxMoulds[_id];
		require(_id <= boxMouldCount && _id > 0, "NFTBoxes: Mould ID does not exist.");
		for (uint256 i = 0; i < boxMould.artists.length; i++) {
			if (boxMould.artists[i] == _artist) {
				boxMould.artists[i] = boxMould.artists[boxMould.artists.length - 1];
				boxMould.artists.pop();
				boxMould.shares[i] = boxMould.shares[boxMould.shares.length - 1];
				boxMould.shares.pop();
			}
		}
	}
	
	function addArtists(uint256 _id, address payable _artist, uint256 _share) external onlyOwner {
		BoxMould storage boxMould = boxMoulds[_id];
		require(_id <= boxMouldCount && _id > 0, "NFTBoxes: Mould ID does not exist.");
		boxMould.artists.push(_artist);
		boxMould.shares.push(_share);
	}

	// dont even need this tbh?
	function getArtistRoyalties(uint256 _id) external view returns (address payable[] memory artists, uint256[] memory royalties) {
		require(_id <= boxMouldCount && _id > 0, "NFTBoxes: Mould ID does not exist.");
		BoxMould memory boxMould = boxMoulds[_id];
		artists = boxMould.artists;
		royalties = boxMould.shares;
	}

	function buyManyBoxes(uint256 _id, uint128 _quantity) external payable {
		BoxMould storage boxMould = boxMoulds[_id];
		uint128 currentEdition = boxMould.currentEditionCount;
		uint128 max = boxMould.maxEdition;
		require(_id <= boxMouldCount && _id > 0, "NFTBoxes: Mould ID does not exist.");
		require(!lockedBoxes[_id], "NFTBoxes: Box is locked");
		require(boxMould.price.mul(_quantity) == msg.value, "NFTBoxes: Wrong total price.");
		require(currentEdition + _quantity <= max, "NFTBoxes: Minting too many boxes.");
		require(_quantity <= boxMould.maxBuyAmount, "NFTBoxes: Cannot buy this many boxes.");

		for (uint128 i = 0; i < _quantity; i++)
			_buy(currentEdition, _id, i);
		boxMould.currentEditionCount += _quantity;
		if (currentEdition + _quantity == max)
			boxMould.live = uint8(1);
	}

	function _buy(uint128 _currentEdition, uint256 _id, uint256 _new) internal {
		boxes[totalSupply() + 1] = Box(_id, _currentEdition + _new + 1);
		//safe mint?
		emit BoxBought(_id, _currentEdition + _new, totalSupply());
		_mint(msg.sender, totalSupply() + 1);
	}

	// close a sale if not sold out
	function closeBox(uint256 _id) external authorised {
		BoxMould storage boxMould = boxMoulds[_id];
		require(_id <= boxMouldCount && _id > 0, "NFTBoxes: Mould ID does not exist.");
		boxMould.live = uint8(1);
	}

	function setVendingMachine(address _machine) external onlyOwner {
		vendingMachine = IVendingMachine(_machine);
	}

	function distributeOffchain(uint256 _id, address[][] calldata _recipients, uint256[] calldata _ids) external authorised {
		BoxMould memory boxMould= boxMoulds[_id];
		require(boxMould.live == 1, "NTFBoxes: Box is still live, cannot start distribution");
		require (_recipients[0].length == _ids.length, "NFTBoxes: Wrong array size.");

		// i is batch number
		for (uint256 i = 0; i < _recipients.length; i++) {
			// j is for the index of nft ID to send
			for (uint256 j = 0;j <  _recipients[0].length; j++)
				vendingMachine.NFTMachineFor(_ids[j], _recipients[i][j]);
		}
	}

	function distributeShares(uint256 _id) external {
		BoxMould storage boxMould= boxMoulds[_id];
		require(_id <= boxMouldCount && _id > 0, "NFTBoxes: Mould ID does not exist.");
		require(boxMould.live == 1 && boxMould.shared == 0,  "NFTBoxes: cannot distribute shares yet.");
		require(is100(_id), "NFTBoxes: shares do not add up to 100%.");

		boxMould.shared = 1;
		uint256 rev = uint256(boxMould.currentEditionCount).mul(boxMould.price);
		uint256 share;
		for (uint256 i = 0; i < team.length; i++) {
			share = rev.mul(teamShare[team[i]]).div(TOTAL_SHARES);
			team[i].transfer(share);
		}
		for (uint256 i = 0; i < boxMould.artists.length; i++) {
			share = rev.mul(boxMould.shares[i]).div(TOTAL_SHARES);
			boxMould.artists[i].transfer(share);
		}
	}

	function is100(uint256 _id) internal returns(bool) {
		BoxMould storage boxMould= boxMoulds[_id];
		uint256 total;
		for (uint256 i = 0; i < team.length; i++) {
			total = total.add(teamShare[team[i]]);
		}
		for (uint256 i = 0; i < boxMould.shares.length; i++) {
			total = total.add(boxMould.shares[i]);
		}
		return total == TOTAL_SHARES;
	}

	function _getNewSeed(bytes32 _seed) public pure returns (bytes32) {
		return keccak256(abi.encodePacked(_seed));
	}

	function getArtist(uint256 _id) external view returns (address payable[] memory) {
		return boxMoulds[_id].artists;
	}

	function getArtistShares(uint256 _id) external view returns (uint256[] memory) {
		return boxMoulds[_id].shares;
	}

    function updateTeamAddress(address payable newTeamAddress) public onlyOwner {
        teamAddress = newTeamAddress;
    }
    
    function updateSecondaryFee(uint256 newSecondaryBps) public onlyOwner {
        teamSecondaryBps = newSecondaryBps;
    }

    function getBoxMetaData(uint256 _id) external view returns 
    (uint256 boxId, uint256 boxEdition, uint128 boxMax, string memory boxName, string memory boxSeries, string memory boxTheme, string memory boxHashIPFS, string memory boxHashArweave) {
        Box memory box = boxes[_id];
        BoxMould memory mould = boxMoulds[box.mouldId];
        return (box.mouldId, box.edition, mould.maxEdition, mould.name, mould.series, mould.theme, mould.ipfsHash, mould.arweaveHash);
    }

	function _transfer(address from, address to, uint256 tokenId) internal override {
		Box memory box = boxes[tokenId];
		require(!lockedBoxes[box.mouldId], "NFTBoxes: Box is locked");
		super._transfer(from, to, tokenId);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"boxMould","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"boxEdition","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"BoxBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"}],"name":"BoxMouldCreated","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":"TOTAL_SHARES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_seed","type":"bytes32"}],"name":"_getNewSeed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address payable","name":"_artist","type":"address"},{"internalType":"uint256","name":"_share","type":"uint256"}],"name":"addArtists","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_member","type":"address"}],"name":"addTeamMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorisedCaller","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"boxMouldCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxMoulds","outputs":[{"internalType":"uint8","name":"live","type":"uint8"},{"internalType":"uint8","name":"shared","type":"uint8"},{"internalType":"uint128","name":"maxEdition","type":"uint128"},{"internalType":"uint152","name":"maxBuyAmount","type":"uint152"},{"internalType":"uint128","name":"currentEditionCount","type":"uint128"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"series","type":"string"},{"internalType":"string","name":"theme","type":"string"},{"internalType":"string","name":"ipfsHash","type":"string"},{"internalType":"string","name":"arweaveHash","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxes","outputs":[{"internalType":"uint256","name":"mouldId","type":"uint256"},{"internalType":"uint256","name":"edition","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint128","name":"_quantity","type":"uint128"}],"name":"buyManyBoxes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"closeBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_max","type":"uint128"},{"internalType":"uint128","name":"_maxBuyAmount","type":"uint128"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"address payable[]","name":"_artists","type":"address[]"},{"internalType":"uint256[]","name":"_shares","type":"uint256[]"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_series","type":"string"},{"internalType":"string","name":"_theme","type":"string"},{"internalType":"string","name":"_ipfsHash","type":"string"},{"internalType":"string","name":"_arweaveHash","type":"string"}],"name":"createBoxMould","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address[][]","name":"_recipients","type":"address[][]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"distributeOffchain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"distributeShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getArtist","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getArtistRoyalties","outputs":[{"internalType":"address payable[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"royalties","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getArtistShares","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getBoxMetaData","outputs":[{"internalType":"uint256","name":"boxId","type":"uint256"},{"internalType":"uint256","name":"boxEdition","type":"uint256"},{"internalType":"uint128","name":"boxMax","type":"uint128"},{"internalType":"string","name":"boxName","type":"string"},{"internalType":"string","name":"boxSeries","type":"string"},{"internalType":"string","name":"boxTheme","type":"string"},{"internalType":"string","name":"boxHashIPFS","type":"string"},{"internalType":"string","name":"boxHashArweave","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedBoxes","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":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address payable","name":"_artist","type":"address"}],"name":"removeArtist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_member","type":"address"}],"name":"removeTeamMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_caller","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setCaller","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bool","name":"_lock","type":"bool"}],"name":"setLockOnBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"},{"internalType":"uint256","name":"_share","type":"uint256"}],"name":"setTeamShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_machine","type":"address"}],"name":"setVendingMachine","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":"","type":"uint256"}],"name":"team","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"teamShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"newSecondaryBps","type":"uint256"}],"name":"updateSecondaryFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newTeamAddress","type":"address"}],"name":"updateTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"updateURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vendingMachine","outputs":[{"internalType":"contract IVendingMachine","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600681526509c8ca884def60d31b602080830191909152825180840190935260058352645b424f585d60d81b90830152906200005e6301ffc9a760e01b62000307565b8151620000739060069060208501906200037f565b508051620000899060079060208401906200037f565b506200009c6380ac58cd60e01b62000307565b620000ae635b5e139f60e01b62000307565b620000c063780e9d6360e01b62000307565b5060009050620000cf62000362565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200012f632dde656160e21b62000307565b620001536040518060600160405280603981526020016200590b6039913962000366565b60138054600181810183557f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a09091820180546001600160a01b0319908116733428b1746dfd26c7c725913d829be2706aa89b2e17909155835480830185558301805482167363a9dbce75413036b2b778e670aabd4493aaf9f317905583548083018555830180548216734c7bedfa26c744e6bd61cbdf86f3fc4a76dca0731790558354808301855583018054821673f521bb7437bec77b0b15286dc3f49a87b99467731790558354918201909355018054909116733945476e477de76d53b4833a46c806ef3d72b21e90811790915560126020526102447f2a5556231608a05ac97b64345c5a2e21baac02555c887d2dd75327b0c18cac0455600a7f6d030ecaa2f30a32947e763b87db54f79a19e318093972e45512d9b7ea923002819055601e7f4b42c0dc43e7e2cec57c7e4866bff09faaba5ef9b3bf565d2d418946c71fc3b28190557f3096d3bdad4035ea1f4d23022025075807d861b5ee3aea1974b7098734c1bd84556000919091527f5db3e8327cc4e96f3a8fdf465904ddae5fc276c86b73cb53d45eae1c671dc8635562000452565b6001600160e01b031980821614156200033d5760405162461bcd60e51b815260040162000334906200041b565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b80516200037b9060099060208401906200037f565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003c257805160ff1916838001178555620003f2565b82800160010185558215620003f2579182015b82811115620003f2578251825591602001919060010190620003d5565b506200040092915062000404565b5090565b5b8082111562000400576000815560010162000405565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6154a980620004626000396000f3fe6080604052600436106102ff5760003560e01c8063783abc8e11610190578063b88d4fde116100dc578063d9db4adb11610095578063f2fde38b1161006f578063f2fde38b14610934578063f5f0cebd14610954578063f769046f14610974578063fb4a255814610994576102ff565b8063d9db4adb146108c6578063e985e9c5146108f4578063eba2389d14610914576102ff565b8063b88d4fde14610806578063b9c4d9fb14610826578063c30f4a5a14610846578063c87b56dd14610866578063cb67558e14610886578063d6829d69146108a6576102ff565b80639cae6eae11610149578063a74772c811610123578063a74772c81461078a578063aef078bc146107aa578063b3ed1da4146107bd578063b5a3f84f146107f1576102ff565b80639cae6eae1461072a5780639e4189261461074a578063a22cb4651461076a576102ff565b8063783abc8e1461067e578063811dd0e21461069e57806385e3f997146106cb578063894ca535146106e05780638da5cb5b1461070057806395d89b4114610715576102ff565b80632f745c591161024f5780634ccc6b5f116102085780636352211e116101e25780636352211e146106145780636c0360eb1461063457806370a0823114610649578063715018a614610669576102ff565b80634ccc6b5f146105a65780634ed3faf2146105c65780634f6ccce7146105f4576102ff565b80632f745c59146104da57806333c1da70146104fa5780633eb2b5ad14610531578063424f4fef1461055157806342842e0e1461056657806346fd552214610586576102ff565b806314eb76ac116102bc578063197ebd5311610296578063197ebd531461045a57806323b872dd1461047a578063263030561461049a5780632b28bc99146104ba576102ff565b806314eb76ac146103f857806314eba0261461041857806318160ddd14610438576102ff565b806301ffc9a71461030457806306fdde031461033a578063081812fc1461035c578063095ea7b3146103895780630ebd4c7f146103ab5780630fceb9ab146103d8575b600080fd5b34801561031057600080fd5b5061032461031f36600461443f565b6109b4565b6040516103319190614904565b60405180910390f35b34801561034657600080fd5b5061034f6109d7565b604051610331919061490f565b34801561036857600080fd5b5061037c610377366004614427565b610a6d565b604051610331919061485f565b34801561039557600080fd5b506103a96103a43660046143fc565b610ab9565b005b3480156103b757600080fd5b506103cb6103c6366004614427565b610b51565b60405161033191906148f1565b3480156103e457600080fd5b506103a96103f3366004614427565b610b75565b34801561040457600080fd5b506103a96104133660046142cd565b610c11565b34801561042457600080fd5b506103a96104333660046142cd565b610c68565b34801561044457600080fd5b5061044d610d95565b60405161033191906147b9565b34801561046657600080fd5b5061037c610475366004614427565b610da6565b34801561048657600080fd5b506103a9610495366004614321565b610dcd565b3480156104a657600080fd5b506103cb6104b5366004614427565b610e05565b3480156104c657600080fd5b506103a96104d5366004614610565b610e6a565b3480156104e657600080fd5b5061044d6104f53660046143fc565b610f2a565b34801561050657600080fd5b5061051a610515366004614427565b610f55565b6040516103319b9a99989796959493929190615279565b34801561053d57600080fd5b506103a961054c3660046142cd565b611278565b34801561055d57600080fd5b5061037c611359565b34801561057257600080fd5b506103a9610581366004614321565b611368565b34801561059257600080fd5b506103a96105a13660046144aa565b611383565b3480156105b257600080fd5b506103246105c1366004614427565b611681565b3480156105d257600080fd5b506105e66105e1366004614427565b611696565b6040516103319291906151dd565b34801561060057600080fd5b5061044d61060f366004614427565b6116af565b34801561062057600080fd5b5061037c61062f366004614427565b6116c5565b34801561064057600080fd5b5061034f6116ed565b34801561065557600080fd5b5061044d6106643660046142cd565b61174e565b34801561067557600080fd5b506103a9611797565b34801561068a57600080fd5b506103a96106993660046145ec565b611816565b3480156106aa57600080fd5b506106be6106b9366004614427565b6119d1565b60405161033191906148b0565b3480156106d757600080fd5b5061044d611a3f565b3480156106ec57600080fd5b506103a96106fb366004614427565b611a45565b34801561070c57600080fd5b5061037c611a7f565b34801561072157600080fd5b5061034f611a8e565b34801561073657600080fd5b506103a96107453660046143cb565b611aef565b34801561075657600080fd5b506103a96107653660046146ad565b611b4f565b34801561077657600080fd5b506103a96107853660046143cb565b611bef565b34801561079657600080fd5b506103246107a53660046142cd565b611cbd565b6103a96107b83660046146d5565b611cd2565b3480156107c957600080fd5b506107dd6107d8366004614427565b611e85565b6040516103319897969594939291906151eb565b3480156107fd57600080fd5b5061044d612320565b34801561081257600080fd5b506103a9610821366004614361565b612326565b34801561083257600080fd5b506106be610841366004614427565b61235f565b34801561085257600080fd5b506103a9610861366004614477565b6123a4565b34801561087257600080fd5b5061034f610881366004614427565b6123e5565b34801561089257600080fd5b506103a96108a13660046142cd565b61252f565b3480156108b257600080fd5b5061044d6108c1366004614427565b612586565b3480156108d257600080fd5b506108e66108e1366004614427565b6125b6565b6040516103319291906148c3565b34801561090057600080fd5b5061032461090f3660046142e9565b612a0e565b34801561092057600080fd5b506103a961092f3660046143fc565b612a3c565b34801561094057600080fd5b506103a961094f3660046142cd565b612af6565b34801561096057600080fd5b506103a961096f366004614636565b612bad565b34801561098057600080fd5b5061044d61098f3660046142cd565b61317a565b3480156109a057600080fd5b506103a96109af366004614427565b61318c565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a635780601f10610a3857610100808354040283529160200191610a63565b820191906000526020600020905b815481529060010190602001808311610a4657829003601f168201915b5050505050905090565b6000610a78826133a1565b610a9d5760405162461bcd60e51b8152600401610a9490614ec3565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ac4826116c5565b9050806001600160a01b0316836001600160a01b03161415610af85760405162461bcd60e51b8152600401610a9490615032565b806001600160a01b0316610b0a6133ae565b6001600160a01b03161480610b265750610b268161090f6133ae565b610b425760405162461bcd60e51b8152600401610a9490614d1d565b610b4c83836133b2565b505050565b606080600c5481600081518110610b6457fe5b602090810291909101015292915050565b3360009081526014602052604090205460ff1680610bab5750610b96611a7f565b6001600160a01b0316336001600160a01b0316145b610bc75760405162461bcd60e51b8152600401610a9490615073565b6000818152600f60205260409020600e548211801590610be75750600082115b610c035760405162461bcd60e51b8152600401610a9490614964565b805460ff1916600117905550565b610c196133ae565b600a546001600160a01b03908116911614610c465760405162461bcd60e51b8152600401610a9490614f0f565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b610c706133ae565b600a546001600160a01b03908116911614610c9d5760405162461bcd60e51b8152600401610a9490614f0f565b60005b601354811015610d9157816001600160a01b031660138281548110610cc157fe5b6000918252602090912001546001600160a01b03161415610d89576001600160a01b038216600090815260126020526040812055601380546000198101908110610d0757fe5b600091825260209091200154601380546001600160a01b039092169183908110610d2d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506013805480610d6657fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b600101610ca0565b5050565b6000610da16002613420565b905090565b60138181548110610db357fe5b6000918252602090912001546001600160a01b0316905081565b610dde610dd86133ae565b8261342b565b610dfa5760405162461bcd60e51b8152600401610a94906150fc565b610b4c8383836134b0565b6000818152600f6020908152604091829020600501805483518184028101840190945280845260609392830182828015610e5e57602002820191906000526020600020905b815481526020019060010190808311610e4a575b50505050509050919050565b610e726133ae565b600a546001600160a01b03908116911614610e9f5760405162461bcd60e51b8152600401610a9490614f0f565b6000838152600f60205260409020600e548411801590610ebf5750600084115b610edb5760405162461bcd60e51b8152600401610a9490614964565b600481018054600180820183556000928352602080842090920180546001600160a01b0319166001600160a01b0397909716969096179095556005909201805494850181558152209091015550565b6001600160a01b0382166000908152600160205260408120610f4c9083613517565b90505b92915050565b600f60209081526000918252604091829020805460018083015460028085015460038601546006870180548a516101009782161588026000190190911694909404601f81018a90048a0285018a01909a5289845260ff8088169a9688041698620100009097046001600160801b03908116986001600160981b03909616979316959194939290919083018282801561102e5780601f106110035761010080835404028352916020019161102e565b820191906000526020600020905b81548152906001019060200180831161101157829003601f168201915b5050505060078301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156110be5780601f10611093576101008083540402835291602001916110be565b820191906000526020600020905b8154815290600101906020018083116110a157829003601f168201915b5050505060088301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561114e5780601f106111235761010080835404028352916020019161114e565b820191906000526020600020905b81548152906001019060200180831161113157829003601f168201915b5050505060098301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156111de5780601f106111b3576101008083540402835291602001916111de565b820191906000526020600020905b8154815290600101906020018083116111c157829003601f168201915b50505050600a8301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561126e5780601f106112435761010080835404028352916020019161126e565b820191906000526020600020905b81548152906001019060200180831161125157829003601f168201915b505050505090508b565b6112806133ae565b600a546001600160a01b039081169116146112ad5760405162461bcd60e51b8152600401610a9490614f0f565b60005b60135481101561130657601381815481106112c757fe5b6000918252602090912001546001600160a01b03838116911614156112fe5760405162461bcd60e51b8152600401610a94906149a6565b6001016112b0565b50601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b610b4c83838360405180602001604052806000815250612326565b61138b6133ae565b600a546001600160a01b039081169116146113b85760405162461bcd60e51b8152600401610a9490614f0f565b85518751146113d95760405162461bcd60e51b8152600401610a94906149db565b604051806101a00160405280600060ff168152602001600060ff1681526020018b6001600160801b031681526020018a6001600160801b03166001600160981b0316815260200160006001600160801b0316815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182815250600f6000600e54600101815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160010160006101000a8154816001600160981b0302191690836001600160981b0316021790555060808201518160020160006101000a8154816001600160801b0302191690836001600160801b0316021790555060a0820151816003015560c0820151816004019080519060200190611565929190613f46565b5060e08201518051611581916005840191602090910190613fab565b50610100820151805161159e916006840191602090910190613ff2565b5061012082015180516115bb916007840191602090910190613ff2565b5061014082015180516115d8916008840191602090910190613ff2565b5061016082015180516115f5916009840191602090910190613ff2565b50610180820151805161161291600a840191602090910190613ff2565b5050600e8054600190810180835560009081526011602052604090819020805460ff1916909217909155905490517f77628c9166aca2fc4ccb8b7681fa345c93f54fb929f857d05cfebbfb665bad02925061166d91906147b9565b60405180910390a150505050505050505050565b60116020526000908152604090205460ff1681565b6010602052600090815260409020805460019091015482565b6000806116bd600284613523565b509392505050565b6000610f4f8260405180606001604052806029815260200161544b6029913960029190613541565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a635780601f10610a3857610100808354040283529160200191610a63565b60006001600160a01b0382166117765760405162461bcd60e51b8152600401610a9490614d7a565b6001600160a01b0382166000908152600160205260409020610f4f90613420565b61179f6133ae565b600a546001600160a01b039081169116146117cc5760405162461bcd60e51b8152600401610a9490614f0f565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b61181e6133ae565b600a546001600160a01b0390811691161461184b5760405162461bcd60e51b8152600401610a9490614f0f565b6000828152600f60205260409020600e54831180159061186b5750600083115b6118875760405162461bcd60e51b8152600401610a9490614964565b60005b60048201548110156119cb57826001600160a01b03168260040182815481106118af57fe5b6000918252602090912001546001600160a01b031614156119c35760048201805460001981019081106118de57fe5b6000918252602090912001546004830180546001600160a01b03909216918390811061190657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508160040180548061194157fe5b600082815260209020810160001990810180546001600160a01b03191690559081019091556005830180549091810190811061197957fe5b906000526020600020015482600501828154811061199357fe5b600091825260209091200155600582018054806119ac57fe5b600190038181906000526020600020016000905590555b60010161188a565b50505050565b6000818152600f6020908152604091829020600401805483518184028101840190945280845260609392830182828015610e5e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a165750505050509050919050565b6103e881565b611a4d6133ae565b600a546001600160a01b03908116911614611a7a5760405162461bcd60e51b8152600401610a9490614f0f565b600c55565b600a546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a635780601f10610a3857610100808354040283529160200191610a63565b611af76133ae565b600a546001600160a01b03908116911614611b245760405162461bcd60e51b8152600401610a9490614f0f565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b3360009081526014602052604090205460ff1680611b855750611b70611a7f565b6001600160a01b0316336001600160a01b0316145b611ba15760405162461bcd60e51b8152600401610a9490615073565b600e548211158015611bb35750600082115b611bcf5760405162461bcd60e51b8152600401610a9490614964565b600091825260116020526040909120805460ff1916911515919091179055565b611bf76133ae565b6001600160a01b0316826001600160a01b03161415611c285760405162461bcd60e51b8152600401610a9490614bf5565b8060056000611c356133ae565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611c796133ae565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cb19190614904565b60405180910390a35050565b60146020526000908152604090205460ff1681565b6000828152600f6020526040902060028101548154600e546001600160801b039283169262010000909204909116908511801590611d105750600085115b611d2c5760405162461bcd60e51b8152600401610a9490614964565b60008581526011602052604090205460ff1615611d5b5760405162461bcd60e51b8152600401610a9490614caf565b60038301543490611d75906001600160801b038716613558565b14611d925760405162461bcd60e51b8152600401610a9490614c2c565b806001600160801b03168483016001600160801b03161115611dc65760405162461bcd60e51b8152600401610a9490614a23565b60018301546001600160981b03166001600160801b0385161115611dfc5760405162461bcd60e51b8152600401610a94906150b7565b60005b846001600160801b0316816001600160801b03161015611e3557611e2d8387836001600160801b0316613592565b600101611dff565b506002830180546fffffffffffffffffffffffffffffffff1981166001600160801b0391821687018216179091558181168386019091161415611e7e57825460ff191660011783555b5050505050565b60008060006060806060806060611e9a61405f565b506000898152601060209081526040918290208251808401909352805483526001015490820152611ec9614079565b81516000908152600f602090815260409182902082516101a081018452815460ff8082168352610100820416828501526001600160801b036201000090910481168286015260018301546001600160981b031660608301526002830154166080820152600382015460a08201526004820180548551818602810186019096528086529194929360c08601939290830182828015611f8f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f71575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611fe757602002820191906000526020600020905b815481526020019060010190808311611fd3575b505050918352505060068201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561207b5780601f106120505761010080835404028352916020019161207b565b820191906000526020600020905b81548152906001019060200180831161205e57829003601f168201915b505050918352505060078201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561210f5780601f106120e45761010080835404028352916020019161210f565b820191906000526020600020905b8154815290600101906020018083116120f257829003601f168201915b505050918352505060088201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156121a35780601f10612178576101008083540402835291602001916121a3565b820191906000526020600020905b81548152906001019060200180831161218657829003601f168201915b505050918352505060098201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156122375780601f1061220c57610100808354040283529160200191612237565b820191906000526020600020905b81548152906001019060200180831161221a57829003601f168201915b5050509183525050600a8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156122cb5780601f106122a0576101008083540402835291602001916122cb565b820191906000526020600020905b8154815290600101906020018083116122ae57829003601f168201915b5050505050815250509050816000015182602001518260400151836101000151846101200151856101400151866101600151876101800151995099509950995099509950995099505050919395975091939597565b600e5481565b6123376123316133ae565b8361342b565b6123535760405162461bcd60e51b8152600401610a94906150fc565b6119cb84848484613649565b606080600b60009054906101000a90046001600160a01b03168160008151811061238557fe5b6001600160a01b03909216602092830291909101909101529050919050565b6123ac6133ae565b600a546001600160a01b039081169116146123d95760405162461bcd60e51b8152600401610a9490614f0f565b6123e28161367c565b50565b60606123f0826133a1565b61240c5760405162461bcd60e51b8152600401610a9490614f8d565b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156124a15780601f10612476576101008083540402835291602001916124a1565b820191906000526020600020905b81548152906001019060200180831161248457829003601f168201915b5050600954939450505050600260001961010060018416150201909116046124ca5790506109d2565b8051156124fc576009816040516020016124e59291906147de565b6040516020818303038152906040529150506109d2565b60096125078461368f565b6040516020016125189291906147de565b604051602081830303815290604052915050919050565b6125376133ae565b600a546001600160a01b039081169116146125645760405162461bcd60e51b8152600401610a9490614f0f565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60008160405160200161259991906147b9565b604051602081830303815290604052805190602001209050919050565b606080600e5483111580156125cb5750600083115b6125e75760405162461bcd60e51b8152600401610a9490614964565b6125ef614079565b6000848152600f602090815260409182902082516101a081018452815460ff8082168352610100820416828501526001600160801b036201000090910481168286015260018301546001600160981b031660608301526002830154166080820152600382015460a08201526004820180548551818602810186019096528086529194929360c086019392908301828280156126b357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612695575b505050505081526020016005820180548060200260200160405190810160405280929190818152602001828054801561270b57602002820191906000526020600020905b8154815260200190600101908083116126f7575b505050918352505060068201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561279f5780601f106127745761010080835404028352916020019161279f565b820191906000526020600020905b81548152906001019060200180831161278257829003601f168201915b505050918352505060078201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156128335780601f1061280857610100808354040283529160200191612833565b820191906000526020600020905b81548152906001019060200180831161281657829003601f168201915b505050918352505060088201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156128c75780601f1061289c576101008083540402835291602001916128c7565b820191906000526020600020905b8154815290600101906020018083116128aa57829003601f168201915b505050918352505060098201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561295b5780601f106129305761010080835404028352916020019161295b565b820191906000526020600020905b81548152906001019060200180831161293e57829003601f168201915b5050509183525050600a8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156129ef5780601f106129c4576101008083540402835291602001916129ef565b820191906000526020600020905b8154815290600101906020018083116129d257829003601f168201915b50505050508152505090508060c0015192508060e00151915050915091565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b612a446133ae565b600a546001600160a01b03908116911614612a715760405162461bcd60e51b8152600401610a9490614f0f565b6103e8811115612a935760405162461bcd60e51b8152600401610a9490615184565b60005b601354811015610b4c57826001600160a01b031660138281548110612ab757fe5b6000918252602090912001546001600160a01b03161415612aee576001600160a01b03831660009081526012602052604090208290555b600101612a96565b612afe6133ae565b600a546001600160a01b03908116911614612b2b5760405162461bcd60e51b8152600401610a9490614f0f565b6001600160a01b038116612b515760405162461bcd60e51b8152600401610a9490614ab6565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526014602052604090205460ff1680612be35750612bce611a7f565b6001600160a01b0316336001600160a01b0316145b612bff5760405162461bcd60e51b8152600401610a9490615073565b612c07614079565b6000868152600f602090815260409182902082516101a081018452815460ff8082168352610100820416828501526001600160801b036201000090910481168286015260018301546001600160981b031660608301526002830154166080820152600382015460a08201526004820180548551818602810186019096528086529194929360c08601939290830182828015612ccb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612cad575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015612d2357602002820191906000526020600020905b815481526020019060010190808311612d0f575b505050918352505060068201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612db75780601f10612d8c57610100808354040283529160200191612db7565b820191906000526020600020905b815481529060010190602001808311612d9a57829003601f168201915b505050918352505060078201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612e4b5780601f10612e2057610100808354040283529160200191612e4b565b820191906000526020600020905b815481529060010190602001808311612e2e57829003601f168201915b505050918352505060088201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612edf5780601f10612eb457610100808354040283529160200191612edf565b820191906000526020600020905b815481529060010190602001808311612ec257829003601f168201915b505050918352505060098201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612f735780601f10612f4857610100808354040283529160200191612f73565b820191906000526020600020905b815481529060010190602001808311612f5657829003601f168201915b5050509183525050600a8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156130075780601f10612fdc57610100808354040283529160200191613007565b820191906000526020600020905b815481529060010190602001808311612fea57829003601f168201915b5050505050815250509050806000015160ff166001146130395760405162461bcd60e51b8152600401610a9490614fdc565b81858560008161304557fe5b90506020028101906130579190615333565b9050146130765760405162461bcd60e51b8152600401610a9490614ce6565b60005b848110156131715760005b8686600081811061309157fe5b90506020028101906130a39190615333565b905081101561316857600d546001600160a01b031663e56e34798686848181106130c957fe5b905060200201358989868181106130dc57fe5b90506020028101906130ee9190615333565b858181106130f857fe5b905060200201602081019061310d91906142cd565b6040518363ffffffff1660e01b815260040161312a9291906151c6565b600060405180830381600087803b15801561314457600080fd5b505af1158015613158573d6000803e3d6000fd5b5050600190920191506130849050565b50600101613079565b50505050505050565b60126020526000908152604090205481565b6000818152600f60205260409020600e5482118015906131ac5750600082115b6131c85760405162461bcd60e51b8152600401610a9490614964565b805460ff1660011480156131e357508054610100900460ff16155b6131ff5760405162461bcd60e51b8152600401610a9490614e06565b6132088261376a565b6132245760405162461bcd60e51b8152600401610a9490614afc565b805461ff00191661010017815560038101546002820154600091613251916001600160801b031690613558565b90506000805b601354811015613305576132ad6103e86132a7601260006013868154811061327b57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548690613558565b90613821565b9150601381815481106132bc57fe5b60009182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f193505050501580156132fc573d6000803e3d6000fd5b50600101613257565b5060005b6004840154811015611e7e576133476103e86132a786600501848154811061332d57fe5b90600052602060002001548661355890919063ffffffff16565b915083600401818154811061335857fe5b60009182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f19350505050158015613398573d6000803e3d6000fd5b50600101613309565b6000610f4f600283613863565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906133e7826116c5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f4f8261386f565b6000613436826133a1565b6134525760405162461bcd60e51b8152600401610a9490614c63565b600061345d836116c5565b9050806001600160a01b0316846001600160a01b031614806134985750836001600160a01b031661348d84610a6d565b6001600160a01b0316145b806134a857506134a88185612a0e565b949350505050565b6134b861405f565b5060008181526010602090815260408083208151808301835281548082526001909201548185015290845260119092529091205460ff161561350c5760405162461bcd60e51b8152600401610a9490614caf565b6119cb848484613873565b6000610f4c8383613981565b600080808061353286866139c6565b909450925050505b9250929050565b600061354e848484613a22565b90505b9392505050565b60008261356757506000610f4f565b8282028284828161357457fe5b0414610f4c5760405162461bcd60e51b8152600401610a9490614e82565b604051806040016040528083815260200182856001600160801b031601600101815250601060006135c1610d95565b60010181526020019081526020016000206000820151816000015560208201518160010155905050817f5420392aab8a9f3a70c0145321ff58bc86c3da3596336224396de59f430fc0f582856001600160801b03160161361f610d95565b60405161362d9291906151dd565b60405180910390a2610b4c33613641610d95565b600101613a81565b6136548484846134b0565b61366084848484613b45565b6119cb5760405162461bcd60e51b8152600401610a9490614a64565b8051610d91906009906020840190613ff2565b6060816136b457506040805180820190915260018152600360fc1b60208201526109d2565b8160005b81156136cc57600101600a820491506136b8565b60608167ffffffffffffffff811180156136e557600080fd5b506040519080825280601f01601f191660200182016040528015613710576020820181803683370190505b50859350905060001982015b831561376157600a840660300160f81b8282806001900393508151811061373f57fe5b60200101906001600160f81b031916908160001a905350600a8404935061371c565b50949350505050565b6000818152600f6020526040812081805b6013548110156137cf576137c5601260006013848154811061379957fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613c24565b915060010161377b565b5060005b60058301548110156138155761380b8360050182815481106137f157fe5b906000526020600020015483613c2490919063ffffffff16565b91506001016137d3565b506103e8149392505050565b6000610f4c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c49565b6000610f4c8383613c80565b5490565b826001600160a01b0316613886826116c5565b6001600160a01b0316146138ac5760405162461bcd60e51b8152600401610a9490614f44565b6001600160a01b0382166138d25760405162461bcd60e51b8152600401610a9490614bb1565b6138dd838383610b4c565b6138e86000826133b2565b6001600160a01b038316600090815260016020526040902061390a9082613c98565b506001600160a01b038216600090815260016020526040902061392d9082613ca4565b5061393a60028284613cb0565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b815460009082106139a45760405162461bcd60e51b8152600401610a9490614922565b8260000182815481106139b357fe5b9060005260206000200154905092915050565b8154600090819083106139eb5760405162461bcd60e51b8152600401610a9490614dc4565b60008460000184815481106139fc57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281613a525760405162461bcd60e51b8152600401610a94919061490f565b50846000016001820381548110613a6557fe5b9060005260206000209060020201600101549150509392505050565b6001600160a01b038216613aa75760405162461bcd60e51b8152600401610a9490614e4d565b613ab0816133a1565b15613acd5760405162461bcd60e51b8152600401610a9490614b43565b613ad960008383610b4c565b6001600160a01b0382166000908152600160205260409020613afb9082613ca4565b50613b0860028284613cb0565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613b59846001600160a01b0316613cc6565b613b65575060016134a8565b6060613bed630a85bd0160e11b613b7a6133ae565b888787604051602401613b909493929190614873565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001615419603291396001600160a01b0388169190613ccc565b9050600081806020019051810190613c05919061445b565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b600082820183811015610f4c5760405162461bcd60e51b8152600401610a9490614b7a565b60008183613c6a5760405162461bcd60e51b8152600401610a94919061490f565b506000838581613c7657fe5b0495945050505050565b60009081526001919091016020526040902054151590565b6000610f4c8383613cdb565b6000610f4c8383613da1565b600061354e84846001600160a01b038516613deb565b3b151590565b606061354e8484600085613e82565b60008181526001830160205260408120548015613d975783546000198083019190810190600090879083908110613d0e57fe5b9060005260206000200154905080876000018481548110613d2b57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080613d5b57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f4f565b6000915050610f4f565b6000613dad8383613c80565b613de357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f4f565b506000610f4f565b600082815260018401602052604081205480613e50575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613551565b82856000016001830381548110613e6357fe5b9060005260206000209060020201600101819055506000915050613551565b6060613e8d85613cc6565b613ea95760405162461bcd60e51b8152600401610a949061514d565b60006060866001600160a01b03168587604051613ec691906147c2565b60006040518083038185875af1925050503d8060008114613f03576040519150601f19603f3d011682016040523d82523d6000602084013e613f08565b606091505b50915091508115613f1c5791506134a89050565b805115613f2c5780518082602001fd5b8360405162461bcd60e51b8152600401610a94919061490f565b828054828255906000526020600020908101928215613f9b579160200282015b82811115613f9b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613f66565b50613fa7929150614102565b5090565b828054828255906000526020600020908101928215613fe6579160200282015b82811115613fe6578251825591602001919060010190613fcb565b50613fa7929150614121565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061403357805160ff1916838001178555613fe6565b82800160010185558215613fe65791820182811115613fe6578251825591602001919060010190613fcb565b604051806040016040528060008152602001600081525090565b604051806101a00160405280600060ff168152602001600060ff16815260200160006001600160801b0316815260200160006001600160981b0316815260200160006001600160801b0316815260200160008152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b5b80821115613fa75780546001600160a01b0319168155600101614103565b5b80821115613fa75760008155600101614122565b600082601f830112614146578081fd5b8135614159614154826153a1565b61537a565b81815291506020808301908481018184028601820187101561417a57600080fd5b60005b848110156141a2578135614190816153ed565b8452928201929082019060010161417d565b505050505092915050565b60008083601f8401126141be578081fd5b50813567ffffffffffffffff8111156141d5578182fd5b602083019150836020808302850101111561353a57600080fd5b600082601f8301126141ff578081fd5b813561420d614154826153a1565b81815291506020808301908481018184028601820187101561422e57600080fd5b60005b848110156141a257813584529282019290820190600101614231565b600082601f83011261425d578081fd5b813567ffffffffffffffff811115614273578182fd5b614286601f8201601f191660200161537a565b915080825283602082850101111561429d57600080fd5b8060208401602084013760009082016020015292915050565b80356001600160801b0381168114610f4f57600080fd5b6000602082840312156142de578081fd5b8135610f4c816153ed565b600080604083850312156142fb578081fd5b8235614306816153ed565b91506020830135614316816153ed565b809150509250929050565b600080600060608486031215614335578081fd5b8335614340816153ed565b92506020840135614350816153ed565b929592945050506040919091013590565b60008060008060808587031215614376578081fd5b8435614381816153ed565b93506020850135614391816153ed565b925060408501359150606085013567ffffffffffffffff8111156143b3578182fd5b6143bf8782880161424d565b91505092959194509250565b600080604083850312156143dd578182fd5b82356143e8816153ed565b915060208301358015158114614316578182fd5b6000806040838503121561440e578182fd5b8235614419816153ed565b946020939093013593505050565b600060208284031215614438578081fd5b5035919050565b600060208284031215614450578081fd5b8135610f4c81615402565b60006020828403121561446c578081fd5b8151610f4c81615402565b600060208284031215614488578081fd5b813567ffffffffffffffff81111561449e578182fd5b6134a88482850161424d565b6000806000806000806000806000806101408b8d0312156144c9578788fd5b6144d38c8c6142b6565b99506144e28c60208d016142b6565b985060408b0135975060608b013567ffffffffffffffff80821115614505578788fd5b6145118e838f01614136565b985060808d0135915080821115614526578788fd5b6145328e838f016141ef565b975060a08d0135915080821115614547578687fd5b6145538e838f0161424d565b965060c08d0135915080821115614568578586fd5b6145748e838f0161424d565b955060e08d0135915080821115614589578485fd5b6145958e838f0161424d565b94506101008d01359150808211156145ab578384fd5b6145b78e838f0161424d565b93506101208d01359150808211156145cd578283fd5b506145da8d828e0161424d565b9150509295989b9194979a5092959850565b600080604083850312156145fe578182fd5b823591506020830135614316816153ed565b600080600060608486031215614624578081fd5b833592506020840135614350816153ed565b60008060008060006060868803121561464d578283fd5b85359450602086013567ffffffffffffffff8082111561466b578485fd5b61467789838a016141ad565b9096509450604088013591508082111561468f578283fd5b5061469c888289016141ad565b969995985093965092949392505050565b600080604083850312156146bf578182fd5b8235915060208301358015158114614316578182fd5b600080604083850312156146e7578182fd5b823591506146f884602085016142b6565b90509250929050565b6000815180845260208085019450808401835b838110156147395781516001600160a01b031687529582019590820190600101614714565b509495945050505050565b6000815180845260208085019450808401835b8381101561473957815187529582019590820190600101614757565b6000815180845261478b8160208601602086016153c1565b601f01601f19169290920160200192915050565b6001600160801b03169052565b6001600160981b03169052565b90815260200190565b600082516147d48184602087016153c1565b9190910192915050565b60008084546001808216600081146147fd576001811461481457614843565b60ff198316865260028304607f1686019350614843565b600283048886526020808720875b8381101561483b5781548a820152908501908201614822565b505050860193505b50505083516148568183602088016153c1565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906148a690830184614773565b9695505050505050565b600060208252610f4c6020830184614701565b6000604082526148d66040830185614701565b82810360208401526148e88185614744565b95945050505050565b600060208252610f4c6020830184614744565b901515815260200190565b600060208252610f4c6020830184614773565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526022908201527f4e4654426f7865733a204d6f756c6420494420646f6573206e6f7420657869736040820152613a1760f11b606082015260800190565b6020808252818101527f4e4654426f7865733a206d656d626572732065786973747320616c7265616479604082015260600190565b60208082526028908201527f4e4654426f7865733a2061727261797320617265206e6f74206f662073616d65604082015267103632b733ba341760c11b606082015260800190565b60208082526021908201527f4e4654426f7865733a204d696e74696e6720746f6f206d616e7920626f7865736040820152601760f91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526027908201527f4e4654426f7865733a2073686172657320646f206e6f742061646420757020746040820152663790189818129760c91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601c908201527f4e4654426f7865733a2057726f6e6720746f74616c2070726963652e00000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f4e4654426f7865733a20426f78206973206c6f636b6564000000000000000000604082015260600190565b6020808252601b908201527f4e4654426f7865733a2057726f6e672061727261792073697a652e0000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526027908201527f4e4654426f7865733a2063616e6e6f742064697374726962757465207368617260408201526632b9903cb2ba1760c91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526036908201527f4e5446426f7865733a20426f78206973207374696c6c206c6976652c2063616e6040820152753737ba1039ba30b93a103234b9ba3934b13aba34b7b760511b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526024908201527f4e4654426f7865733a204e6f7420617574686f726973656420746f20657865636040820152633aba329760e11b606082015260800190565b60208082526025908201527f4e4654426f7865733a2043616e6e6f74206275792074686973206d616e79206260408201526437bc32b99760d91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526022908201527f4e4654426f7865733a207368617265206d7573742062652062656c6f77203130604082015261030360f41b606082015260800190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b60006101008a83528960208401526001600160801b038916604084015280606084015261521a81840189614773565b9050828103608084015261522e8188614773565b905082810360a08401526152428187614773565b905082810360c08401526152568186614773565b905082810360e084015261526a8185614773565b9b9a5050505050505050505050565b600061016060ff8e16835260ff8d1660208401526001600160801b038c1660408401526152a9606084018c6147ac565b6152b6608084018b61479f565b8860a08401528060c08401526152ce81840189614773565b905082810360e08401526152e28188614773565b90508281036101008401526152f78187614773565b905082810361012084015261530c8186614773565b90508281036101408401526153218185614773565b9e9d5050505050505050505050505050565b6000808335601e19843603018112615349578283fd5b83018035915067ffffffffffffffff821115615363578283fd5b602090810192508102360382131561353a57600080fd5b60405181810167ffffffffffffffff8111828210171561539957600080fd5b604052919050565b600067ffffffffffffffff8211156153b7578081fd5b5060209081020190565b60005b838110156153dc5781810151838201526020016153c4565b838111156119cb5750506000910152565b6001600160a01b03811681146123e257600080fd5b6001600160e01b0319811681146123e257600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220300f8bd3147e42515567f34f0e50507be41eb85368948b634e92d5761629af6864736f6c634300060c003368747470733a2f2f6e6674626f786573626f782e617a75726577656273697465732e6e65742f6170692f48747470547269676765723f69643d

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c8063783abc8e11610190578063b88d4fde116100dc578063d9db4adb11610095578063f2fde38b1161006f578063f2fde38b14610934578063f5f0cebd14610954578063f769046f14610974578063fb4a255814610994576102ff565b8063d9db4adb146108c6578063e985e9c5146108f4578063eba2389d14610914576102ff565b8063b88d4fde14610806578063b9c4d9fb14610826578063c30f4a5a14610846578063c87b56dd14610866578063cb67558e14610886578063d6829d69146108a6576102ff565b80639cae6eae11610149578063a74772c811610123578063a74772c81461078a578063aef078bc146107aa578063b3ed1da4146107bd578063b5a3f84f146107f1576102ff565b80639cae6eae1461072a5780639e4189261461074a578063a22cb4651461076a576102ff565b8063783abc8e1461067e578063811dd0e21461069e57806385e3f997146106cb578063894ca535146106e05780638da5cb5b1461070057806395d89b4114610715576102ff565b80632f745c591161024f5780634ccc6b5f116102085780636352211e116101e25780636352211e146106145780636c0360eb1461063457806370a0823114610649578063715018a614610669576102ff565b80634ccc6b5f146105a65780634ed3faf2146105c65780634f6ccce7146105f4576102ff565b80632f745c59146104da57806333c1da70146104fa5780633eb2b5ad14610531578063424f4fef1461055157806342842e0e1461056657806346fd552214610586576102ff565b806314eb76ac116102bc578063197ebd5311610296578063197ebd531461045a57806323b872dd1461047a578063263030561461049a5780632b28bc99146104ba576102ff565b806314eb76ac146103f857806314eba0261461041857806318160ddd14610438576102ff565b806301ffc9a71461030457806306fdde031461033a578063081812fc1461035c578063095ea7b3146103895780630ebd4c7f146103ab5780630fceb9ab146103d8575b600080fd5b34801561031057600080fd5b5061032461031f36600461443f565b6109b4565b6040516103319190614904565b60405180910390f35b34801561034657600080fd5b5061034f6109d7565b604051610331919061490f565b34801561036857600080fd5b5061037c610377366004614427565b610a6d565b604051610331919061485f565b34801561039557600080fd5b506103a96103a43660046143fc565b610ab9565b005b3480156103b757600080fd5b506103cb6103c6366004614427565b610b51565b60405161033191906148f1565b3480156103e457600080fd5b506103a96103f3366004614427565b610b75565b34801561040457600080fd5b506103a96104133660046142cd565b610c11565b34801561042457600080fd5b506103a96104333660046142cd565b610c68565b34801561044457600080fd5b5061044d610d95565b60405161033191906147b9565b34801561046657600080fd5b5061037c610475366004614427565b610da6565b34801561048657600080fd5b506103a9610495366004614321565b610dcd565b3480156104a657600080fd5b506103cb6104b5366004614427565b610e05565b3480156104c657600080fd5b506103a96104d5366004614610565b610e6a565b3480156104e657600080fd5b5061044d6104f53660046143fc565b610f2a565b34801561050657600080fd5b5061051a610515366004614427565b610f55565b6040516103319b9a99989796959493929190615279565b34801561053d57600080fd5b506103a961054c3660046142cd565b611278565b34801561055d57600080fd5b5061037c611359565b34801561057257600080fd5b506103a9610581366004614321565b611368565b34801561059257600080fd5b506103a96105a13660046144aa565b611383565b3480156105b257600080fd5b506103246105c1366004614427565b611681565b3480156105d257600080fd5b506105e66105e1366004614427565b611696565b6040516103319291906151dd565b34801561060057600080fd5b5061044d61060f366004614427565b6116af565b34801561062057600080fd5b5061037c61062f366004614427565b6116c5565b34801561064057600080fd5b5061034f6116ed565b34801561065557600080fd5b5061044d6106643660046142cd565b61174e565b34801561067557600080fd5b506103a9611797565b34801561068a57600080fd5b506103a96106993660046145ec565b611816565b3480156106aa57600080fd5b506106be6106b9366004614427565b6119d1565b60405161033191906148b0565b3480156106d757600080fd5b5061044d611a3f565b3480156106ec57600080fd5b506103a96106fb366004614427565b611a45565b34801561070c57600080fd5b5061037c611a7f565b34801561072157600080fd5b5061034f611a8e565b34801561073657600080fd5b506103a96107453660046143cb565b611aef565b34801561075657600080fd5b506103a96107653660046146ad565b611b4f565b34801561077657600080fd5b506103a96107853660046143cb565b611bef565b34801561079657600080fd5b506103246107a53660046142cd565b611cbd565b6103a96107b83660046146d5565b611cd2565b3480156107c957600080fd5b506107dd6107d8366004614427565b611e85565b6040516103319897969594939291906151eb565b3480156107fd57600080fd5b5061044d612320565b34801561081257600080fd5b506103a9610821366004614361565b612326565b34801561083257600080fd5b506106be610841366004614427565b61235f565b34801561085257600080fd5b506103a9610861366004614477565b6123a4565b34801561087257600080fd5b5061034f610881366004614427565b6123e5565b34801561089257600080fd5b506103a96108a13660046142cd565b61252f565b3480156108b257600080fd5b5061044d6108c1366004614427565b612586565b3480156108d257600080fd5b506108e66108e1366004614427565b6125b6565b6040516103319291906148c3565b34801561090057600080fd5b5061032461090f3660046142e9565b612a0e565b34801561092057600080fd5b506103a961092f3660046143fc565b612a3c565b34801561094057600080fd5b506103a961094f3660046142cd565b612af6565b34801561096057600080fd5b506103a961096f366004614636565b612bad565b34801561098057600080fd5b5061044d61098f3660046142cd565b61317a565b3480156109a057600080fd5b506103a96109af366004614427565b61318c565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a635780601f10610a3857610100808354040283529160200191610a63565b820191906000526020600020905b815481529060010190602001808311610a4657829003601f168201915b5050505050905090565b6000610a78826133a1565b610a9d5760405162461bcd60e51b8152600401610a9490614ec3565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610ac4826116c5565b9050806001600160a01b0316836001600160a01b03161415610af85760405162461bcd60e51b8152600401610a9490615032565b806001600160a01b0316610b0a6133ae565b6001600160a01b03161480610b265750610b268161090f6133ae565b610b425760405162461bcd60e51b8152600401610a9490614d1d565b610b4c83836133b2565b505050565b606080600c5481600081518110610b6457fe5b602090810291909101015292915050565b3360009081526014602052604090205460ff1680610bab5750610b96611a7f565b6001600160a01b0316336001600160a01b0316145b610bc75760405162461bcd60e51b8152600401610a9490615073565b6000818152600f60205260409020600e548211801590610be75750600082115b610c035760405162461bcd60e51b8152600401610a9490614964565b805460ff1916600117905550565b610c196133ae565b600a546001600160a01b03908116911614610c465760405162461bcd60e51b8152600401610a9490614f0f565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b610c706133ae565b600a546001600160a01b03908116911614610c9d5760405162461bcd60e51b8152600401610a9490614f0f565b60005b601354811015610d9157816001600160a01b031660138281548110610cc157fe5b6000918252602090912001546001600160a01b03161415610d89576001600160a01b038216600090815260126020526040812055601380546000198101908110610d0757fe5b600091825260209091200154601380546001600160a01b039092169183908110610d2d57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506013805480610d6657fe5b600082815260209020810160001990810180546001600160a01b03191690550190555b600101610ca0565b5050565b6000610da16002613420565b905090565b60138181548110610db357fe5b6000918252602090912001546001600160a01b0316905081565b610dde610dd86133ae565b8261342b565b610dfa5760405162461bcd60e51b8152600401610a94906150fc565b610b4c8383836134b0565b6000818152600f6020908152604091829020600501805483518184028101840190945280845260609392830182828015610e5e57602002820191906000526020600020905b815481526020019060010190808311610e4a575b50505050509050919050565b610e726133ae565b600a546001600160a01b03908116911614610e9f5760405162461bcd60e51b8152600401610a9490614f0f565b6000838152600f60205260409020600e548411801590610ebf5750600084115b610edb5760405162461bcd60e51b8152600401610a9490614964565b600481018054600180820183556000928352602080842090920180546001600160a01b0319166001600160a01b0397909716969096179095556005909201805494850181558152209091015550565b6001600160a01b0382166000908152600160205260408120610f4c9083613517565b90505b92915050565b600f60209081526000918252604091829020805460018083015460028085015460038601546006870180548a516101009782161588026000190190911694909404601f81018a90048a0285018a01909a5289845260ff8088169a9688041698620100009097046001600160801b03908116986001600160981b03909616979316959194939290919083018282801561102e5780601f106110035761010080835404028352916020019161102e565b820191906000526020600020905b81548152906001019060200180831161101157829003601f168201915b5050505060078301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156110be5780601f10611093576101008083540402835291602001916110be565b820191906000526020600020905b8154815290600101906020018083116110a157829003601f168201915b5050505060088301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561114e5780601f106111235761010080835404028352916020019161114e565b820191906000526020600020905b81548152906001019060200180831161113157829003601f168201915b5050505060098301805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529495949350908301828280156111de5780601f106111b3576101008083540402835291602001916111de565b820191906000526020600020905b8154815290600101906020018083116111c157829003601f168201915b50505050600a8301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561126e5780601f106112435761010080835404028352916020019161126e565b820191906000526020600020905b81548152906001019060200180831161125157829003601f168201915b505050505090508b565b6112806133ae565b600a546001600160a01b039081169116146112ad5760405162461bcd60e51b8152600401610a9490614f0f565b60005b60135481101561130657601381815481106112c757fe5b6000918252602090912001546001600160a01b03838116911614156112fe5760405162461bcd60e51b8152600401610a94906149a6565b6001016112b0565b50601380546001810182556000919091527f66de8ffda797e3de9c05e8fc57b3bf0ec28a930d40b0d285d93c06501cf6a0900180546001600160a01b0319166001600160a01b0392909216919091179055565b600d546001600160a01b031681565b610b4c83838360405180602001604052806000815250612326565b61138b6133ae565b600a546001600160a01b039081169116146113b85760405162461bcd60e51b8152600401610a9490614f0f565b85518751146113d95760405162461bcd60e51b8152600401610a94906149db565b604051806101a00160405280600060ff168152602001600060ff1681526020018b6001600160801b031681526020018a6001600160801b03166001600160981b0316815260200160006001600160801b0316815260200189815260200188815260200187815260200186815260200185815260200184815260200183815260200182815250600f6000600e54600101815260200190815260200160002060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a8154816001600160801b0302191690836001600160801b0316021790555060608201518160010160006101000a8154816001600160981b0302191690836001600160981b0316021790555060808201518160020160006101000a8154816001600160801b0302191690836001600160801b0316021790555060a0820151816003015560c0820151816004019080519060200190611565929190613f46565b5060e08201518051611581916005840191602090910190613fab565b50610100820151805161159e916006840191602090910190613ff2565b5061012082015180516115bb916007840191602090910190613ff2565b5061014082015180516115d8916008840191602090910190613ff2565b5061016082015180516115f5916009840191602090910190613ff2565b50610180820151805161161291600a840191602090910190613ff2565b5050600e8054600190810180835560009081526011602052604090819020805460ff1916909217909155905490517f77628c9166aca2fc4ccb8b7681fa345c93f54fb929f857d05cfebbfb665bad02925061166d91906147b9565b60405180910390a150505050505050505050565b60116020526000908152604090205460ff1681565b6010602052600090815260409020805460019091015482565b6000806116bd600284613523565b509392505050565b6000610f4f8260405180606001604052806029815260200161544b6029913960029190613541565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a635780601f10610a3857610100808354040283529160200191610a63565b60006001600160a01b0382166117765760405162461bcd60e51b8152600401610a9490614d7a565b6001600160a01b0382166000908152600160205260409020610f4f90613420565b61179f6133ae565b600a546001600160a01b039081169116146117cc5760405162461bcd60e51b8152600401610a9490614f0f565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b61181e6133ae565b600a546001600160a01b0390811691161461184b5760405162461bcd60e51b8152600401610a9490614f0f565b6000828152600f60205260409020600e54831180159061186b5750600083115b6118875760405162461bcd60e51b8152600401610a9490614964565b60005b60048201548110156119cb57826001600160a01b03168260040182815481106118af57fe5b6000918252602090912001546001600160a01b031614156119c35760048201805460001981019081106118de57fe5b6000918252602090912001546004830180546001600160a01b03909216918390811061190657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508160040180548061194157fe5b600082815260209020810160001990810180546001600160a01b03191690559081019091556005830180549091810190811061197957fe5b906000526020600020015482600501828154811061199357fe5b600091825260209091200155600582018054806119ac57fe5b600190038181906000526020600020016000905590555b60010161188a565b50505050565b6000818152600f6020908152604091829020600401805483518184028101840190945280845260609392830182828015610e5e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a165750505050509050919050565b6103e881565b611a4d6133ae565b600a546001600160a01b03908116911614611a7a5760405162461bcd60e51b8152600401610a9490614f0f565b600c55565b600a546001600160a01b031690565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a635780601f10610a3857610100808354040283529160200191610a63565b611af76133ae565b600a546001600160a01b03908116911614611b245760405162461bcd60e51b8152600401610a9490614f0f565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b3360009081526014602052604090205460ff1680611b855750611b70611a7f565b6001600160a01b0316336001600160a01b0316145b611ba15760405162461bcd60e51b8152600401610a9490615073565b600e548211158015611bb35750600082115b611bcf5760405162461bcd60e51b8152600401610a9490614964565b600091825260116020526040909120805460ff1916911515919091179055565b611bf76133ae565b6001600160a01b0316826001600160a01b03161415611c285760405162461bcd60e51b8152600401610a9490614bf5565b8060056000611c356133ae565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611c796133ae565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611cb19190614904565b60405180910390a35050565b60146020526000908152604090205460ff1681565b6000828152600f6020526040902060028101548154600e546001600160801b039283169262010000909204909116908511801590611d105750600085115b611d2c5760405162461bcd60e51b8152600401610a9490614964565b60008581526011602052604090205460ff1615611d5b5760405162461bcd60e51b8152600401610a9490614caf565b60038301543490611d75906001600160801b038716613558565b14611d925760405162461bcd60e51b8152600401610a9490614c2c565b806001600160801b03168483016001600160801b03161115611dc65760405162461bcd60e51b8152600401610a9490614a23565b60018301546001600160981b03166001600160801b0385161115611dfc5760405162461bcd60e51b8152600401610a94906150b7565b60005b846001600160801b0316816001600160801b03161015611e3557611e2d8387836001600160801b0316613592565b600101611dff565b506002830180546fffffffffffffffffffffffffffffffff1981166001600160801b0391821687018216179091558181168386019091161415611e7e57825460ff191660011783555b5050505050565b60008060006060806060806060611e9a61405f565b506000898152601060209081526040918290208251808401909352805483526001015490820152611ec9614079565b81516000908152600f602090815260409182902082516101a081018452815460ff8082168352610100820416828501526001600160801b036201000090910481168286015260018301546001600160981b031660608301526002830154166080820152600382015460a08201526004820180548551818602810186019096528086529194929360c08601939290830182828015611f8f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611f71575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015611fe757602002820191906000526020600020905b815481526020019060010190808311611fd3575b505050918352505060068201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561207b5780601f106120505761010080835404028352916020019161207b565b820191906000526020600020905b81548152906001019060200180831161205e57829003601f168201915b505050918352505060078201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561210f5780601f106120e45761010080835404028352916020019161210f565b820191906000526020600020905b8154815290600101906020018083116120f257829003601f168201915b505050918352505060088201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156121a35780601f10612178576101008083540402835291602001916121a3565b820191906000526020600020905b81548152906001019060200180831161218657829003601f168201915b505050918352505060098201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156122375780601f1061220c57610100808354040283529160200191612237565b820191906000526020600020905b81548152906001019060200180831161221a57829003601f168201915b5050509183525050600a8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156122cb5780601f106122a0576101008083540402835291602001916122cb565b820191906000526020600020905b8154815290600101906020018083116122ae57829003601f168201915b5050505050815250509050816000015182602001518260400151836101000151846101200151856101400151866101600151876101800151995099509950995099509950995099505050919395975091939597565b600e5481565b6123376123316133ae565b8361342b565b6123535760405162461bcd60e51b8152600401610a94906150fc565b6119cb84848484613649565b606080600b60009054906101000a90046001600160a01b03168160008151811061238557fe5b6001600160a01b03909216602092830291909101909101529050919050565b6123ac6133ae565b600a546001600160a01b039081169116146123d95760405162461bcd60e51b8152600401610a9490614f0f565b6123e28161367c565b50565b60606123f0826133a1565b61240c5760405162461bcd60e51b8152600401610a9490614f8d565b60008281526008602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156124a15780601f10612476576101008083540402835291602001916124a1565b820191906000526020600020905b81548152906001019060200180831161248457829003601f168201915b5050600954939450505050600260001961010060018416150201909116046124ca5790506109d2565b8051156124fc576009816040516020016124e59291906147de565b6040516020818303038152906040529150506109d2565b60096125078461368f565b6040516020016125189291906147de565b604051602081830303815290604052915050919050565b6125376133ae565b600a546001600160a01b039081169116146125645760405162461bcd60e51b8152600401610a9490614f0f565b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b60008160405160200161259991906147b9565b604051602081830303815290604052805190602001209050919050565b606080600e5483111580156125cb5750600083115b6125e75760405162461bcd60e51b8152600401610a9490614964565b6125ef614079565b6000848152600f602090815260409182902082516101a081018452815460ff8082168352610100820416828501526001600160801b036201000090910481168286015260018301546001600160981b031660608301526002830154166080820152600382015460a08201526004820180548551818602810186019096528086529194929360c086019392908301828280156126b357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612695575b505050505081526020016005820180548060200260200160405190810160405280929190818152602001828054801561270b57602002820191906000526020600020905b8154815260200190600101908083116126f7575b505050918352505060068201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561279f5780601f106127745761010080835404028352916020019161279f565b820191906000526020600020905b81548152906001019060200180831161278257829003601f168201915b505050918352505060078201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156128335780601f1061280857610100808354040283529160200191612833565b820191906000526020600020905b81548152906001019060200180831161281657829003601f168201915b505050918352505060088201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156128c75780601f1061289c576101008083540402835291602001916128c7565b820191906000526020600020905b8154815290600101906020018083116128aa57829003601f168201915b505050918352505060098201805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815293820193929183018282801561295b5780601f106129305761010080835404028352916020019161295b565b820191906000526020600020905b81548152906001019060200180831161293e57829003601f168201915b5050509183525050600a8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156129ef5780601f106129c4576101008083540402835291602001916129ef565b820191906000526020600020905b8154815290600101906020018083116129d257829003601f168201915b50505050508152505090508060c0015192508060e00151915050915091565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b612a446133ae565b600a546001600160a01b03908116911614612a715760405162461bcd60e51b8152600401610a9490614f0f565b6103e8811115612a935760405162461bcd60e51b8152600401610a9490615184565b60005b601354811015610b4c57826001600160a01b031660138281548110612ab757fe5b6000918252602090912001546001600160a01b03161415612aee576001600160a01b03831660009081526012602052604090208290555b600101612a96565b612afe6133ae565b600a546001600160a01b03908116911614612b2b5760405162461bcd60e51b8152600401610a9490614f0f565b6001600160a01b038116612b515760405162461bcd60e51b8152600401610a9490614ab6565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526014602052604090205460ff1680612be35750612bce611a7f565b6001600160a01b0316336001600160a01b0316145b612bff5760405162461bcd60e51b8152600401610a9490615073565b612c07614079565b6000868152600f602090815260409182902082516101a081018452815460ff8082168352610100820416828501526001600160801b036201000090910481168286015260018301546001600160981b031660608301526002830154166080820152600382015460a08201526004820180548551818602810186019096528086529194929360c08601939290830182828015612ccb57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612cad575b5050505050815260200160058201805480602002602001604051908101604052809291908181526020018280548015612d2357602002820191906000526020600020905b815481526020019060010190808311612d0f575b505050918352505060068201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612db75780601f10612d8c57610100808354040283529160200191612db7565b820191906000526020600020905b815481529060010190602001808311612d9a57829003601f168201915b505050918352505060078201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612e4b5780601f10612e2057610100808354040283529160200191612e4b565b820191906000526020600020905b815481529060010190602001808311612e2e57829003601f168201915b505050918352505060088201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612edf5780601f10612eb457610100808354040283529160200191612edf565b820191906000526020600020905b815481529060010190602001808311612ec257829003601f168201915b505050918352505060098201805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152938201939291830182828015612f735780601f10612f4857610100808354040283529160200191612f73565b820191906000526020600020905b815481529060010190602001808311612f5657829003601f168201915b5050509183525050600a8201805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529382019392918301828280156130075780601f10612fdc57610100808354040283529160200191613007565b820191906000526020600020905b815481529060010190602001808311612fea57829003601f168201915b5050505050815250509050806000015160ff166001146130395760405162461bcd60e51b8152600401610a9490614fdc565b81858560008161304557fe5b90506020028101906130579190615333565b9050146130765760405162461bcd60e51b8152600401610a9490614ce6565b60005b848110156131715760005b8686600081811061309157fe5b90506020028101906130a39190615333565b905081101561316857600d546001600160a01b031663e56e34798686848181106130c957fe5b905060200201358989868181106130dc57fe5b90506020028101906130ee9190615333565b858181106130f857fe5b905060200201602081019061310d91906142cd565b6040518363ffffffff1660e01b815260040161312a9291906151c6565b600060405180830381600087803b15801561314457600080fd5b505af1158015613158573d6000803e3d6000fd5b5050600190920191506130849050565b50600101613079565b50505050505050565b60126020526000908152604090205481565b6000818152600f60205260409020600e5482118015906131ac5750600082115b6131c85760405162461bcd60e51b8152600401610a9490614964565b805460ff1660011480156131e357508054610100900460ff16155b6131ff5760405162461bcd60e51b8152600401610a9490614e06565b6132088261376a565b6132245760405162461bcd60e51b8152600401610a9490614afc565b805461ff00191661010017815560038101546002820154600091613251916001600160801b031690613558565b90506000805b601354811015613305576132ad6103e86132a7601260006013868154811061327b57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548690613558565b90613821565b9150601381815481106132bc57fe5b60009182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f193505050501580156132fc573d6000803e3d6000fd5b50600101613257565b5060005b6004840154811015611e7e576133476103e86132a786600501848154811061332d57fe5b90600052602060002001548661355890919063ffffffff16565b915083600401818154811061335857fe5b60009182526020822001546040516001600160a01b039091169184156108fc02918591818181858888f19350505050158015613398573d6000803e3d6000fd5b50600101613309565b6000610f4f600283613863565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906133e7826116c5565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000610f4f8261386f565b6000613436826133a1565b6134525760405162461bcd60e51b8152600401610a9490614c63565b600061345d836116c5565b9050806001600160a01b0316846001600160a01b031614806134985750836001600160a01b031661348d84610a6d565b6001600160a01b0316145b806134a857506134a88185612a0e565b949350505050565b6134b861405f565b5060008181526010602090815260408083208151808301835281548082526001909201548185015290845260119092529091205460ff161561350c5760405162461bcd60e51b8152600401610a9490614caf565b6119cb848484613873565b6000610f4c8383613981565b600080808061353286866139c6565b909450925050505b9250929050565b600061354e848484613a22565b90505b9392505050565b60008261356757506000610f4f565b8282028284828161357457fe5b0414610f4c5760405162461bcd60e51b8152600401610a9490614e82565b604051806040016040528083815260200182856001600160801b031601600101815250601060006135c1610d95565b60010181526020019081526020016000206000820151816000015560208201518160010155905050817f5420392aab8a9f3a70c0145321ff58bc86c3da3596336224396de59f430fc0f582856001600160801b03160161361f610d95565b60405161362d9291906151dd565b60405180910390a2610b4c33613641610d95565b600101613a81565b6136548484846134b0565b61366084848484613b45565b6119cb5760405162461bcd60e51b8152600401610a9490614a64565b8051610d91906009906020840190613ff2565b6060816136b457506040805180820190915260018152600360fc1b60208201526109d2565b8160005b81156136cc57600101600a820491506136b8565b60608167ffffffffffffffff811180156136e557600080fd5b506040519080825280601f01601f191660200182016040528015613710576020820181803683370190505b50859350905060001982015b831561376157600a840660300160f81b8282806001900393508151811061373f57fe5b60200101906001600160f81b031916908160001a905350600a8404935061371c565b50949350505050565b6000818152600f6020526040812081805b6013548110156137cf576137c5601260006013848154811061379957fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020548390613c24565b915060010161377b565b5060005b60058301548110156138155761380b8360050182815481106137f157fe5b906000526020600020015483613c2490919063ffffffff16565b91506001016137d3565b506103e8149392505050565b6000610f4c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c49565b6000610f4c8383613c80565b5490565b826001600160a01b0316613886826116c5565b6001600160a01b0316146138ac5760405162461bcd60e51b8152600401610a9490614f44565b6001600160a01b0382166138d25760405162461bcd60e51b8152600401610a9490614bb1565b6138dd838383610b4c565b6138e86000826133b2565b6001600160a01b038316600090815260016020526040902061390a9082613c98565b506001600160a01b038216600090815260016020526040902061392d9082613ca4565b5061393a60028284613cb0565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b815460009082106139a45760405162461bcd60e51b8152600401610a9490614922565b8260000182815481106139b357fe5b9060005260206000200154905092915050565b8154600090819083106139eb5760405162461bcd60e51b8152600401610a9490614dc4565b60008460000184815481106139fc57fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008281526001840160205260408120548281613a525760405162461bcd60e51b8152600401610a94919061490f565b50846000016001820381548110613a6557fe5b9060005260206000209060020201600101549150509392505050565b6001600160a01b038216613aa75760405162461bcd60e51b8152600401610a9490614e4d565b613ab0816133a1565b15613acd5760405162461bcd60e51b8152600401610a9490614b43565b613ad960008383610b4c565b6001600160a01b0382166000908152600160205260409020613afb9082613ca4565b50613b0860028284613cb0565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613b59846001600160a01b0316613cc6565b613b65575060016134a8565b6060613bed630a85bd0160e11b613b7a6133ae565b888787604051602401613b909493929190614873565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001615419603291396001600160a01b0388169190613ccc565b9050600081806020019051810190613c05919061445b565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b600082820183811015610f4c5760405162461bcd60e51b8152600401610a9490614b7a565b60008183613c6a5760405162461bcd60e51b8152600401610a94919061490f565b506000838581613c7657fe5b0495945050505050565b60009081526001919091016020526040902054151590565b6000610f4c8383613cdb565b6000610f4c8383613da1565b600061354e84846001600160a01b038516613deb565b3b151590565b606061354e8484600085613e82565b60008181526001830160205260408120548015613d975783546000198083019190810190600090879083908110613d0e57fe5b9060005260206000200154905080876000018481548110613d2b57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080613d5b57fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610f4f565b6000915050610f4f565b6000613dad8383613c80565b613de357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f4f565b506000610f4f565b600082815260018401602052604081205480613e50575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055613551565b82856000016001830381548110613e6357fe5b9060005260206000209060020201600101819055506000915050613551565b6060613e8d85613cc6565b613ea95760405162461bcd60e51b8152600401610a949061514d565b60006060866001600160a01b03168587604051613ec691906147c2565b60006040518083038185875af1925050503d8060008114613f03576040519150601f19603f3d011682016040523d82523d6000602084013e613f08565b606091505b50915091508115613f1c5791506134a89050565b805115613f2c5780518082602001fd5b8360405162461bcd60e51b8152600401610a94919061490f565b828054828255906000526020600020908101928215613f9b579160200282015b82811115613f9b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613f66565b50613fa7929150614102565b5090565b828054828255906000526020600020908101928215613fe6579160200282015b82811115613fe6578251825591602001919060010190613fcb565b50613fa7929150614121565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061403357805160ff1916838001178555613fe6565b82800160010185558215613fe65791820182811115613fe6578251825591602001919060010190613fcb565b604051806040016040528060008152602001600081525090565b604051806101a00160405280600060ff168152602001600060ff16815260200160006001600160801b0316815260200160006001600160981b0316815260200160006001600160801b0316815260200160008152602001606081526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b5b80821115613fa75780546001600160a01b0319168155600101614103565b5b80821115613fa75760008155600101614122565b600082601f830112614146578081fd5b8135614159614154826153a1565b61537a565b81815291506020808301908481018184028601820187101561417a57600080fd5b60005b848110156141a2578135614190816153ed565b8452928201929082019060010161417d565b505050505092915050565b60008083601f8401126141be578081fd5b50813567ffffffffffffffff8111156141d5578182fd5b602083019150836020808302850101111561353a57600080fd5b600082601f8301126141ff578081fd5b813561420d614154826153a1565b81815291506020808301908481018184028601820187101561422e57600080fd5b60005b848110156141a257813584529282019290820190600101614231565b600082601f83011261425d578081fd5b813567ffffffffffffffff811115614273578182fd5b614286601f8201601f191660200161537a565b915080825283602082850101111561429d57600080fd5b8060208401602084013760009082016020015292915050565b80356001600160801b0381168114610f4f57600080fd5b6000602082840312156142de578081fd5b8135610f4c816153ed565b600080604083850312156142fb578081fd5b8235614306816153ed565b91506020830135614316816153ed565b809150509250929050565b600080600060608486031215614335578081fd5b8335614340816153ed565b92506020840135614350816153ed565b929592945050506040919091013590565b60008060008060808587031215614376578081fd5b8435614381816153ed565b93506020850135614391816153ed565b925060408501359150606085013567ffffffffffffffff8111156143b3578182fd5b6143bf8782880161424d565b91505092959194509250565b600080604083850312156143dd578182fd5b82356143e8816153ed565b915060208301358015158114614316578182fd5b6000806040838503121561440e578182fd5b8235614419816153ed565b946020939093013593505050565b600060208284031215614438578081fd5b5035919050565b600060208284031215614450578081fd5b8135610f4c81615402565b60006020828403121561446c578081fd5b8151610f4c81615402565b600060208284031215614488578081fd5b813567ffffffffffffffff81111561449e578182fd5b6134a88482850161424d565b6000806000806000806000806000806101408b8d0312156144c9578788fd5b6144d38c8c6142b6565b99506144e28c60208d016142b6565b985060408b0135975060608b013567ffffffffffffffff80821115614505578788fd5b6145118e838f01614136565b985060808d0135915080821115614526578788fd5b6145328e838f016141ef565b975060a08d0135915080821115614547578687fd5b6145538e838f0161424d565b965060c08d0135915080821115614568578586fd5b6145748e838f0161424d565b955060e08d0135915080821115614589578485fd5b6145958e838f0161424d565b94506101008d01359150808211156145ab578384fd5b6145b78e838f0161424d565b93506101208d01359150808211156145cd578283fd5b506145da8d828e0161424d565b9150509295989b9194979a5092959850565b600080604083850312156145fe578182fd5b823591506020830135614316816153ed565b600080600060608486031215614624578081fd5b833592506020840135614350816153ed565b60008060008060006060868803121561464d578283fd5b85359450602086013567ffffffffffffffff8082111561466b578485fd5b61467789838a016141ad565b9096509450604088013591508082111561468f578283fd5b5061469c888289016141ad565b969995985093965092949392505050565b600080604083850312156146bf578182fd5b8235915060208301358015158114614316578182fd5b600080604083850312156146e7578182fd5b823591506146f884602085016142b6565b90509250929050565b6000815180845260208085019450808401835b838110156147395781516001600160a01b031687529582019590820190600101614714565b509495945050505050565b6000815180845260208085019450808401835b8381101561473957815187529582019590820190600101614757565b6000815180845261478b8160208601602086016153c1565b601f01601f19169290920160200192915050565b6001600160801b03169052565b6001600160981b03169052565b90815260200190565b600082516147d48184602087016153c1565b9190910192915050565b60008084546001808216600081146147fd576001811461481457614843565b60ff198316865260028304607f1686019350614843565b600283048886526020808720875b8381101561483b5781548a820152908501908201614822565b505050860193505b50505083516148568183602088016153c1565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906148a690830184614773565b9695505050505050565b600060208252610f4c6020830184614701565b6000604082526148d66040830185614701565b82810360208401526148e88185614744565b95945050505050565b600060208252610f4c6020830184614744565b901515815260200190565b600060208252610f4c6020830184614773565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526022908201527f4e4654426f7865733a204d6f756c6420494420646f6573206e6f7420657869736040820152613a1760f11b606082015260800190565b6020808252818101527f4e4654426f7865733a206d656d626572732065786973747320616c7265616479604082015260600190565b60208082526028908201527f4e4654426f7865733a2061727261797320617265206e6f74206f662073616d65604082015267103632b733ba341760c11b606082015260800190565b60208082526021908201527f4e4654426f7865733a204d696e74696e6720746f6f206d616e7920626f7865736040820152601760f91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526027908201527f4e4654426f7865733a2073686172657320646f206e6f742061646420757020746040820152663790189818129760c91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601c908201527f4e4654426f7865733a2057726f6e6720746f74616c2070726963652e00000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526017908201527f4e4654426f7865733a20426f78206973206c6f636b6564000000000000000000604082015260600190565b6020808252601b908201527f4e4654426f7865733a2057726f6e672061727261792073697a652e0000000000604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526027908201527f4e4654426f7865733a2063616e6e6f742064697374726962757465207368617260408201526632b9903cb2ba1760c91b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526036908201527f4e5446426f7865733a20426f78206973207374696c6c206c6976652c2063616e6040820152753737ba1039ba30b93a103234b9ba3934b13aba34b7b760511b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526024908201527f4e4654426f7865733a204e6f7420617574686f726973656420746f20657865636040820152633aba329760e11b606082015260800190565b60208082526025908201527f4e4654426f7865733a2043616e6e6f74206275792074686973206d616e79206260408201526437bc32b99760d91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526022908201527f4e4654426f7865733a207368617265206d7573742062652062656c6f77203130604082015261030360f41b606082015260800190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b60006101008a83528960208401526001600160801b038916604084015280606084015261521a81840189614773565b9050828103608084015261522e8188614773565b905082810360a08401526152428187614773565b905082810360c08401526152568186614773565b905082810360e084015261526a8185614773565b9b9a5050505050505050505050565b600061016060ff8e16835260ff8d1660208401526001600160801b038c1660408401526152a9606084018c6147ac565b6152b6608084018b61479f565b8860a08401528060c08401526152ce81840189614773565b905082810360e08401526152e28188614773565b90508281036101008401526152f78187614773565b905082810361012084015261530c8186614773565b90508281036101408401526153218185614773565b9e9d5050505050505050505050505050565b6000808335601e19843603018112615349578283fd5b83018035915067ffffffffffffffff821115615363578283fd5b602090810192508102360382131561353a57600080fd5b60405181810167ffffffffffffffff8111828210171561539957600080fd5b604052919050565b600067ffffffffffffffff8211156153b7578081fd5b5060209081020190565b60005b838110156153dc5781810151838201526020016153c4565b838111156119cb5750506000910152565b6001600160a01b03811681146123e257600080fd5b6001600160e01b0319811681146123e257600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220300f8bd3147e42515567f34f0e50507be41eb85368948b634e92d5761629af6864736f6c634300060c0033

Deployed Bytecode Sourcemap

59062:9726:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10655:142;;;;;;;;;;-1:-1:-1;10655:142:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43334:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46021:213::-;;;;;;;;;;-1:-1:-1;46021:213:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;45565:390::-;;;;;;;;;;-1:-1:-1;45565:390:0;;;;;:::i;:::-;;:::i;:::-;;58875:175;;;;;;;;;;-1:-1:-1;58875:175:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;65358:215::-;;;;;;;;;;-1:-1:-1;65358:215:0;;;;;:::i;:::-;;:::i;67803:123::-;;;;;;;;;;-1:-1:-1;67803:123:0;;;;;:::i;:::-;;:::i;61472:243::-;;;;;;;;;;-1:-1:-1;61472:243:0;;;;;:::i;:::-;;:::i;45059:203::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59887:29::-;;;;;;;;;;-1:-1:-1;59887:29:0;;;;;:::i;:::-;;:::i;46895:305::-;;;;;;;;;;-1:-1:-1;46895:305:0;;;;;:::i;:::-;;:::i;67678:117::-;;;;;;;;;;-1:-1:-1;67678:117:0;;;;;:::i;:::-;;:::i;63569:296::-;;;;;;;;;;-1:-1:-1;63569:296:0;;;;;:::i;:::-;;:::i;44829:154::-;;;;;;;;;;-1:-1:-1;44829:154:0;;;;;:::i;:::-;;:::i;59700:45::-;;;;;;;;;;-1:-1:-1;59700:45:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;61257:210::-;;;;;;;;;;-1:-1:-1;61257:210:0;;;;;:::i;:::-;;:::i;59574:37::-;;;;;;;;;;;;;:::i;47271:151::-;;;;;;;;;;-1:-1:-1;47271:151:0;;;;;:::i;:::-;;:::i;62171:859::-;;;;;;;;;;-1:-1:-1;62171:859:0;;;;;:::i;:::-;;:::i;59790:43::-;;;;;;;;;;-1:-1:-1;59790:43:0;;;;;:::i;:::-;;:::i;59749:37::-;;;;;;;;;;-1:-1:-1;59749:37:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;45339:164::-;;;;;;;;;;-1:-1:-1;45339:164:0;;;;;:::i;:::-;;:::i;43098:169::-;;;;;;;;;;-1:-1:-1;43098:169:0;;;;;:::i;:::-;;:::i;44656:89::-;;;;;;;;;;;;;:::i;42821:215::-;;;;;;;;;;-1:-1:-1;42821:215:0;;;;;:::i;:::-;;:::i;57605:148::-;;;;;;;;;;;;;:::i;63035:528::-;;;;;;;;;;-1:-1:-1;63035:528:0;;;;;:::i;:::-;;:::i;67553:120::-;;;;;;;;;;-1:-1:-1;67553:120:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59651:43::-;;;;;;;;;;;;;:::i;67938:123::-;;;;;;;;;;-1:-1:-1;67938:123:0;;;;;:::i;:::-;;:::i;56963:79::-;;;;;;;;;;;;;:::i;43495:96::-;;;;;;;;;;;;;:::i;61140:112::-;;;;;;;;;;-1:-1:-1;61140:112:0;;;;;:::i;:::-;;:::i;61982:184::-;;;;;;;;;;-1:-1:-1;61982:184:0;;;;;:::i;:::-;;:::i;46306:295::-;;;;;;;;;;-1:-1:-1;46306:295:0;;;;;:::i;:::-;;:::i;59922:48::-;;;;;;;;;;-1:-1:-1;59922:48:0;;;;;:::i;:::-;;:::i;64228:818::-;;;;;;:::i;:::-;;:::i;68069:485::-;;;;;;;;;;-1:-1:-1;68069:485:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;:::i;59615:30::-;;;;;;;;;;;;;:::i;47493:285::-;;;;;;;;;;-1:-1:-1;47493:285:0;;;;;:::i;:::-;;:::i;58653:210::-;;;;;;;;;;-1:-1:-1;58653:210:0;;;;;:::i;:::-;;:::i;60903:87::-;;;;;;;;;;-1:-1:-1;60903:87:0;;;;;:::i;:::-;;:::i;43662:755::-;;;;;;;;;;-1:-1:-1;43662:755:0;;;;;:::i;:::-;;:::i;65578:116::-;;;;;;;;;;-1:-1:-1;65578:116:0;;;;;:::i;:::-;;:::i;67431:117::-;;;;;;;;;;-1:-1:-1;67431:117:0;;;;;:::i;:::-;;:::i;63900:323::-;;;;;;;;;;-1:-1:-1;63900:323:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;46672:156::-;;;;;;;;;;-1:-1:-1;46672:156:0;;;;;:::i;:::-;;:::i;61720:257::-;;;;;;;;;;-1:-1:-1;61720:257:0;;;;;:::i;:::-;;:::i;57908:244::-;;;;;;;;;;-1:-1:-1;57908:244:0;;;;;:::i;:::-;;:::i;65699:590::-;;;;;;;;;;-1:-1:-1;65699:590:0;;;;;:::i;:::-;;:::i;59839:44::-;;;;;;;;;;-1:-1:-1;59839:44:0;;;;;:::i;:::-;;:::i;66294:773::-;;;;;;;;;;-1:-1:-1;66294:773:0;;;;;:::i;:::-;;:::i;10655:142::-;-1:-1:-1;;;;;;10756:33:0;;10732:4;10756:33;;;;;;;;;;;;;10655:142;;;;:::o;43334:92::-;43413:5;43406:12;;;;;;;;-1:-1:-1;;43406:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43380:13;;43406:12;;43413:5;;43406:12;;43413:5;43406:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43334:92;:::o;46021:213::-;46089:7;46117:16;46125:7;46117;:16::i;:::-;46109:73;;;;-1:-1:-1;;;46109:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;46202:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;46202:24:0;;46021:213::o;45565:390::-;45646:13;45662:16;45670:7;45662;:16::i;:::-;45646:32;;45703:5;-1:-1:-1;;;;;45697:11:0;:2;-1:-1:-1;;;;;45697:11:0;;;45689:57;;;;-1:-1:-1;;;45689:57:0;;;;;;;:::i;:::-;45783:5;-1:-1:-1;;;;;45767:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;45767:21:0;;:62;;;;45792:37;45809:5;45816:12;:10;:12::i;45792:37::-;45759:154;;;;-1:-1:-1;;;45759:154:0;;;;;;;:::i;:::-;45926:21;45935:2;45939:7;45926:8;:21::i;:::-;45565:390;;;:::o;58875:175::-;58927:13;58952:22;58999:16;;58985:8;58994:1;58985:11;;;;;;;;;;;;;;;;;:30;59034:8;58875:175;-1:-1:-1;;58875:175:0:o;65358:215::-;61047:10;61030:28;;;;:16;:28;;;;;;;;;:53;;;61076:7;:5;:7::i;:::-;-1:-1:-1;;;;;61062:21:0;:10;-1:-1:-1;;;;;61062:21:0;;61030:53;61022:102;;;;-1:-1:-1;;;61022:102:0;;;;;;;:::i;:::-;65414:25:::1;65442:14:::0;;;:9:::1;:14;::::0;;;;65476:13:::1;::::0;65469:20;::::1;::::0;::::1;::::0;:31:::1;;;65499:1;65493:3;:7;65469:31;65461:78;;;;-1:-1:-1::0;;;65461:78:0::1;;;;;;;:::i;:::-;65544:24:::0;;-1:-1:-1;;65544:24:0::1;65566:1;65544:24;::::0;;-1:-1:-1;65358:215:0:o;67803:123::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;67890:11:::1;:28:::0;;-1:-1:-1;;;;;;67890:28:0::1;-1:-1:-1::0;;;;;67890:28:0;;;::::1;::::0;;;::::1;::::0;;67803:123::o;61472:243::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;61552:9:::1;61547:164;61571:4;:11:::0;61567:15;::::1;61547:164;;;61608:7;-1:-1:-1::0;;;;;61597:18:0::1;:4;61602:1;61597:7;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;61597:7:0::1;:18;61593:118;;;-1:-1:-1::0;;;;;61631:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;61624:25;61666:4:::1;61671:11:::0;;-1:-1:-1;;61671:15:0;;;61666:21;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;61656:4:::1;:7:::0;;-1:-1:-1;;;;;61666:21:0;;::::1;::::0;61661:1;;61656:7;::::1;;;;;;;;;;;;;:31;;;;;-1:-1:-1::0;;;;;61656:31:0::1;;;;;-1:-1:-1::0;;;;;61656:31:0::1;;;;;;61694:4;:10;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;61694:10:0;;;;;-1:-1:-1;;;;;;61694:10:0::1;::::0;;;;;61593:118:::1;61584:3;;61547:164;;;;61472:243:::0;:::o;45059:203::-;45112:7;45233:21;:12;:19;:21::i;:::-;45226:28;;45059:203;:::o;59887:29::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59887:29:0;;-1:-1:-1;59887:29:0;:::o;46895:305::-;47056:41;47075:12;:10;:12::i;:::-;47089:7;47056:18;:41::i;:::-;47048:103;;;;-1:-1:-1;;;47048:103:0;;;;;;;:::i;:::-;47164:28;47174:4;47180:2;47184:7;47164:9;:28::i;67678:117::-;67769:14;;;;:9;:14;;;;;;;;;:21;;67762:28;;;;;;;;;;;;;;;;;67739:16;;67762:28;;;67769:21;67762:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67678:117;;;:::o;63569:296::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;63667:25:::1;63695:14:::0;;;:9:::1;:14;::::0;;;;63729:13:::1;::::0;63722:20;::::1;::::0;::::1;::::0;:31:::1;;;63752:1;63746:3;:7;63722:31;63714:78;;;;-1:-1:-1::0;;;63714:78:0::1;;;;;;;:::i;:::-;63797:16;::::0;::::1;:30:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;63797:30:0;;;::::1;::::0;;;;;::::1;::::0;;-1:-1:-1;;;;;;63797:30:0::1;-1:-1:-1::0;;;;;63797:30:0;;;::::1;::::0;;;::::1;::::0;;;63832:15:::1;::::0;;::::1;:28:::0;;;;::::1;::::0;;;;;;;::::1;::::0;-1:-1:-1;63569:296:0:o;44829:154::-;-1:-1:-1;;;;;44945:20:0;;44918:7;44945:20;;;:13;:20;;;;;:30;;44969:5;44945:23;:30::i;:::-;44938:37;;44829:154;;;;;:::o;59700:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;59700:45:0;;;;-1:-1:-1;;;;;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;59700:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;59700:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;59700:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;59700:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;61257:210::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;61334:9:::1;61329:110;61353:4;:11:::0;61349:15;::::1;61329:110;;;61395:4;61400:1;61395:7;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;61384:18:0;;::::1;61395:7:::0;::::1;61384:18;;61375:64;;;;-1:-1:-1::0;;;61375:64:0::1;;;;;;;:::i;:::-;61366:3;;61329:110;;;-1:-1:-1::0;61444:4:0::1;:18:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61444:18:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;61444:18:0::1;-1:-1:-1::0;;;;;61444:18:0;;;::::1;::::0;;;::::1;::::0;;61257:210::o;59574:37::-;;;-1:-1:-1;;;;;59574:37:0;;:::o;47271:151::-;47375:39;47392:4;47398:2;47402:7;47375:39;;;;;;;;;;;;:16;:39::i;62171:859::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;62516:7:::1;:14;62497:8;:15;:33;62489:86;;;;-1:-1:-1::0;;;62489:86:0::1;;;;;;;:::i;:::-;62611:316;;;;;;;;62638:1;62611:316;;;;;;62660:1;62611:316;;;;;;62680:4;-1:-1:-1::0;;;;;62611:316:0::1;;;;;62704:13;-1:-1:-1::0;;;;;62611:316:0::1;-1:-1:-1::0;;;;;62611:316:0::1;;;;;62744:1;-1:-1:-1::0;;;;;62611:316:0::1;;;;;62758:6;62611:316;;;;62779:8;62611:316;;;;62801:7;62611:316;;;;62820:5;62611:316;;;;62839:7;62611:316;;;;62859:6;62611:316;;;;62881:9;62611:316;;;;62909:12;62611:316;;::::0;62580:9:::1;:28;62590:13;;62606:1;62590:17;62580:28;;;;;;;;;;;:347;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;62580:347:0::1;;;;;-1:-1:-1::0;;;;;62580:347:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;62580:347:0::1;;;;;-1:-1:-1::0;;;;;62580:347:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;62580:347:0::1;;;;;-1:-1:-1::0;;;;;62580:347:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;62580:347:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;62580:347:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;62580:347:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;62580:347:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;62580:347:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;62580:347:0::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;62932:13:0::1;:15:::0;;::::1;::::0;;::::1;::::0;;;:13:::1;62952:26:::0;;;:11:::1;:26;::::0;;;;;;:33;;-1:-1:-1;;62952:33:0::1;::::0;;::::1;::::0;;;63011:13;;62995:30;;::::1;::::0;-1:-1:-1;62995:30:0::1;::::0;63011:13;62995:30:::1;:::i;:::-;;;;;;;;62171:859:::0;;;;;;;;;;:::o;59790:43::-;;;;;;;;;;;;;;;:::o;59749:37::-;;;;;;;;;;;;;;;;;;;:::o;45339:164::-;45406:7;;45448:22;:12;45464:5;45448:15;:22::i;:::-;-1:-1:-1;45426:44:0;45339:164;-1:-1:-1;;;45339:164:0:o;43098:169::-;43162:7;43189:70;43206:7;43189:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;44656:89::-;44729:8;44722:15;;;;;;;;-1:-1:-1;;44722:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44696:13;;44722:15;;44729:8;;44722:15;;44729:8;44722:15;;;;;;;;;;;;;;;;;;;;;;;;42821:215;42885:7;-1:-1:-1;;;;;42913:19:0;;42905:74;;;;-1:-1:-1;;;42905:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;42999:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;57605:148::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;57696:6:::1;::::0;57675:40:::1;::::0;57712:1:::1;::::0;-1:-1:-1;;;;;57696:6:0::1;::::0;57675:40:::1;::::0;57712:1;;57675:40:::1;57726:6;:19:::0;;-1:-1:-1;;;;;;57726:19:0::1;::::0;;57605:148::o;63035:528::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;63119:25:::1;63147:14:::0;;;:9:::1;:14;::::0;;;;63181:13:::1;::::0;63174:20;::::1;::::0;::::1;::::0;:31:::1;;;63204:1;63198:3;:7;63174:31;63166:78;;;;-1:-1:-1::0;;;63166:78:0::1;;;;;;;:::i;:::-;63254:9;63249:310;63273:16;::::0;::::1;:23:::0;63269:27;::::1;63249:310;;;63336:7;-1:-1:-1::0;;;;;63313:30:0::1;:8;:16;;63330:1;63313:19;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;63313:19:0::1;:30;63309:245;;;63374:16;::::0;::::1;63391:23:::0;;-1:-1:-1;;63391:27:0;;;63374:45;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;63352:16:::1;::::0;::::1;:19:::0;;-1:-1:-1;;;;;63374:45:0;;::::1;::::0;63369:1;;63352:19;::::1;;;;;;;;;;;;;:67;;;;;-1:-1:-1::0;;;;;63352:67:0::1;;;;;-1:-1:-1::0;;;;;63352:67:0::1;;;;;;63426:8;:16;;:22;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;63426:22:0;;;;;-1:-1:-1;;;;;;63426:22:0::1;::::0;;;;;;;;63476:15:::1;::::0;::::1;63492:22:::0;;63476:15;;63492:26;;;63476:43;::::1;;;;;;;;;;;;;63455:8;:15;;63471:1;63455:18;;;;;;;;;::::0;;;::::1;::::0;;;::::1;:64:::0;63526:15:::1;::::0;::::1;:21:::0;;;::::1;;;;;;;;;;;;;;;;;;;;;63309:245;63298:3;;63249:310;;;;57245:1;63035:528:::0;;:::o;67553:120::-;67646:14;;;;:9;:14;;;;;;;;;:22;;67639:29;;;;;;;;;;;;;;;;;67608:24;;67639:29;;;67646:22;67639:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67639:29:0;;;;;;;;;;;;;;;;;;;;;;67553:120;;;:::o;59651:43::-;59690:4;59651:43;:::o;67938:123::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;68019:16:::1;:34:::0;67938:123::o;56963:79::-;57028:6;;-1:-1:-1;;;;;57028:6:0;56963:79;:::o;43495:96::-;43576:7;43569:14;;;;;;;;-1:-1:-1;;43569:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43543:13;;43569:14;;43576:7;;43569:14;;43576:7;43569:14;;;;;;;;;;;;;;;;;;;;;;;;61140:112;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;61213:25:0;;;::::1;;::::0;;;:16:::1;:25;::::0;;;;:34;;-1:-1:-1;;61213:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61140:112::o;61982:184::-;61047:10;61030:28;;;;:16;:28;;;;;;;;;:53;;;61076:7;:5;:7::i;:::-;-1:-1:-1;;;;;61062:21:0;:10;-1:-1:-1;;;;;61062:21:0;;61030:53;61022:102;;;;-1:-1:-1;;;61022:102:0;;;;;;;:::i;:::-;62069:13:::1;;62062:3;:20;;:31;;;;;62092:1;62086:3;:7;62062:31;62054:78;;;;-1:-1:-1::0;;;62054:78:0::1;;;;;;;:::i;:::-;62137:16;::::0;;;:11:::1;:16;::::0;;;;;:24;;-1:-1:-1;;62137:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;61982:184::o;46306:295::-;46421:12;:10;:12::i;:::-;-1:-1:-1;;;;;46409:24:0;:8;-1:-1:-1;;;;;46409:24:0;;;46401:62;;;;-1:-1:-1;;;46401:62:0;;;;;;;:::i;:::-;46521:8;46476:18;:32;46495:12;:10;:12::i;:::-;-1:-1:-1;;;;;46476:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;46476:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;46476:53:0;;;;;;;;;;;46560:12;:10;:12::i;:::-;-1:-1:-1;;;;;46545:48:0;;46584:8;46545:48;;;;;;:::i;:::-;;;;;;;;46306:295;;:::o;59922:48::-;;;;;;;;;;;;;;;:::o;64228:818::-;64304:25;64332:14;;;:9;:14;;;;;64376:28;;;;64423:19;;64462:13;;-1:-1:-1;;;;;64376:28:0;;;;64423:19;;;;;;;;64455:20;;;;;:31;;;64485:1;64479:3;:7;64455:31;64447:78;;;;-1:-1:-1;;;64447:78:0;;;;;;;:::i;:::-;64539:16;;;;:11;:16;;;;;;;;64538:17;64530:53;;;;-1:-1:-1;;;64530:53:0;;;;;;;:::i;:::-;64596:14;;;;64629:9;;64596:29;;-1:-1:-1;;;;;64596:29:0;;:18;:29::i;:::-;:42;64588:83;;;;-1:-1:-1;;;64588:83:0;;;;;;;:::i;:::-;64714:3;-1:-1:-1;;;;;64684:33:0;64701:9;64684:14;:26;-1:-1:-1;;;;;64684:33:0;;;64676:79;;;;-1:-1:-1;;;64676:79:0;;;;;;;:::i;:::-;64781:21;;;;-1:-1:-1;;;;;64781:21:0;-1:-1:-1;;;;;64768:34:0;;;;64760:84;;;;-1:-1:-1;;;64760:84:0;;;;;;;:::i;:::-;64856:9;64851:72;64875:9;-1:-1:-1;;;;;64871:13:0;:1;-1:-1:-1;;;;;64871:13:0;;64851:72;;;64895:28;64900:14;64916:3;64921:1;-1:-1:-1;;;;;64895:28:0;:4;:28::i;:::-;64886:3;;64851:72;;;-1:-1:-1;64928:28:0;;;:41;;-1:-1:-1;;64928:41:0;;-1:-1:-1;;;;;64928:41:0;;;;;;;;;;;64978:33;;;:26;;;:33;;;;64974:67;;;65017:24;;-1:-1:-1;;65017:24:0;65039:1;65017:24;;;64974:67;64228:818;;;;;:::o;68069:485::-;68135:13;68150:18;68170:14;68186:21;68209:23;68234:22;68258:25;68285:28;68326:14;;:::i;:::-;-1:-1:-1;68343:10:0;;;;:5;:10;;;;;;;;;68326:27;;;;;;;;;;;;;;;;;;;68364:21;;:::i;:::-;68398:11;;68388:22;;;;:9;:22;;;;;;;;;68364:46;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68364:46:0;;;;;;;;;;;;;;-1:-1:-1;;;;;68364:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68388:22;;68364:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68364:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68364:46:0;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68364:46:0;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68364:46:0;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68364:46:0;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68364:46:0;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;-1:-1:-1;;68364:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68429:3;:11;;;68442:3;:11;;;68455:5;:16;;;68473:5;:10;;;68485:5;:12;;;68499:5;:11;;;68512:5;:14;;;68528:5;:17;;;68421:125;;;;;;;;;;;;;;;;;;68069:485;;;;;;;;;:::o;59615:30::-;;;;:::o;47493:285::-;47625:41;47644:12;:10;:12::i;:::-;47658:7;47625:18;:41::i;:::-;47617:103;;;;-1:-1:-1;;;47617:103:0;;;;;;;:::i;:::-;47731:39;47745:4;47751:2;47755:7;47764:5;47731:13;:39::i;58653:210::-;58712:24;58748:37;58814:11;;;;;;;;;-1:-1:-1;;;;;58814:11:0;58796:12;58809:1;58796:15;;;;;;;;-1:-1:-1;;;;;58796:29:0;;;:15;;;;;;;;;;;:29;58843:12;-1:-1:-1;58653:210:0;;;:::o;60903:87::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;60966:19:::1;60978:6;60966:11;:19::i;:::-;60903:87:::0;:::o;43662:755::-;43727:13;43761:16;43769:7;43761;:16::i;:::-;43753:76;;;;-1:-1:-1;;;43753:76:0;;;;;;;:::i;:::-;43868:19;;;;:10;:19;;;;;;;;;43842:45;;;;;;-1:-1:-1;;43842:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;43868:19;43842:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43969:8:0;43963:22;43842:45;;-1:-1:-1;;;;43963:22:0;-1:-1:-1;;43963:22:0;;;;;;;;;;;43959:76;;44014:9;-1:-1:-1;44007:16:0;;43959:76;44139:23;;:27;44135:112;;44214:8;44224:9;44197:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44183:52;;;;;44135:112;44379:8;44389:18;:7;:16;:18::i;:::-;44362:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44348:61;;;43662:755;;;:::o;65578:116::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;65647:14:::1;:42:::0;;-1:-1:-1;;;;;;65647:42:0::1;-1:-1:-1::0;;;;;65647:42:0;;;::::1;::::0;;;::::1;::::0;;65578:116::o;67431:117::-;67488:7;67536:5;67519:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;67509:34;;;;;;67502:41;;67431:117;;;:::o;63900:323::-;63964:32;63998:26;64046:13;;64039:3;:20;;:31;;;;;64069:1;64063:3;:7;64039:31;64031:78;;;;-1:-1:-1;;;64031:78:0;;;;;;;:::i;:::-;64114:24;;:::i;:::-;64141:14;;;;:9;:14;;;;;;;;;64114:41;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64114:41:0;;;;;;;;;;;;;;-1:-1:-1;;;;;64114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64141:14;;64114:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64114:41:0;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64114:41:0;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64114:41:0;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64114:41:0;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64114:41:0;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;-1:-1:-1;;64114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64170:8;:16;;;64160:26;;64203:8;:15;;;64191:27;;63900:323;;;;:::o;46672:156::-;-1:-1:-1;;;;;46785:25:0;;;46761:4;46785:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;46672:156::o;61720:257::-;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;59690:4:::1;61804:6;:22;;61796:69;;;;-1:-1:-1::0;;;61796:69:0::1;;;;;;;:::i;:::-;61875:9;61870:102;61894:4;:11:::0;61890:15;::::1;61870:102;;;61931:7;-1:-1:-1::0;;;;;61920:18:0::1;:4;61925:1;61920:7;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;61920:7:0::1;:18;61916:56;;;-1:-1:-1::0;;;;;61945:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;:27;;;61916:56:::1;61907:3;;61870:102;;57908:244:::0;57185:12;:10;:12::i;:::-;57175:6;;-1:-1:-1;;;;;57175:6:0;;;:22;;;57167:67;;;;-1:-1:-1;;;57167:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;57997:22:0;::::1;57989:73;;;;-1:-1:-1::0;;;57989:73:0::1;;;;;;;:::i;:::-;58099:6;::::0;58078:38:::1;::::0;-1:-1:-1;;;;;58078:38:0;;::::1;::::0;58099:6:::1;::::0;58078:38:::1;::::0;58099:6:::1;::::0;58078:38:::1;58127:6;:17:::0;;-1:-1:-1;;;;;;58127:17:0::1;-1:-1:-1::0;;;;;58127:17:0;;;::::1;::::0;;;::::1;::::0;;57908:244::o;65699:590::-;61047:10;61030:28;;;;:16;:28;;;;;;;;;:53;;;61076:7;:5;:7::i;:::-;-1:-1:-1;;;;;61062:21:0;:10;-1:-1:-1;;;;;61062:21:0;;61030:53;61022:102;;;;-1:-1:-1;;;61022:102:0;;;;;;;:::i;:::-;65824:24:::1;;:::i;:::-;65850:14;::::0;;;:9:::1;:14;::::0;;;;;;;;65824:40;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;;::::0;;::::1;::::0;-1:-1:-1;;;;;65824:40:0;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;-1:-1:-1;;;;;65824:40:0::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;;;;65850:14;;65824:40;;;;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;65824:40:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;65824:40:0;;;-1:-1:-1;;65824:40:0::1;::::0;::::1;::::0;;::::1;::::0;;::::1;;;::::0;::::1;;;;-1:-1:-1::0;;65824:40:0;;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;65824:40:0;;;-1:-1:-1;;65824:40:0::1;::::0;::::1;::::0;;::::1;::::0;;::::1;;;::::0;::::1;;;;-1:-1:-1::0;;65824:40:0;;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;65824:40:0;;;-1:-1:-1;;65824:40:0::1;::::0;::::1;::::0;;::::1;::::0;;::::1;;;::::0;::::1;;;;-1:-1:-1::0;;65824:40:0;;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;65824:40:0;;;-1:-1:-1;;65824:40:0::1;::::0;::::1;::::0;;::::1;::::0;;::::1;;;::::0;::::1;;;;-1:-1:-1::0;;65824:40:0;;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;65824:40:0;;;-1:-1:-1;;65824:40:0::1;::::0;::::1;::::0;;::::1;::::0;;::::1;;;::::0;::::1;;;;-1:-1:-1::0;;65824:40:0;;;::::1;::::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;65877:8;:13;;;:18;;65894:1;65877:18;65869:85;;;;-1:-1:-1::0;;;65869:85:0::1;;;;;;;:::i;:::-;65993:4:::0;65968:11;;65980:1:::1;65968:14:::0;::::1;;;;;;;;;;;;;;;:::i;:::-;:21;;:36;65959:77;;;;-1:-1:-1::0;;;65959:77:0::1;;;;;;;:::i;:::-;66072:9;66067:218;66087:22:::0;;::::1;66067:218;;;66171:9;66166:113;66190:11;;66202:1;66190:14;;;;;;;;;;;;;;;;;;:::i;:::-;:21;;66185:1;:26;66166:113;;;66223:14;::::0;-1:-1:-1;;;;;66223:14:0::1;:28;66252:4:::0;;66257:1;66252:7;;::::1;;;;;;;;;;;66261:11;;66273:1;66261:14;;;;;;;;;;;;;;;;;;:::i;:::-;66276:1;66261:17;;;;;;;;;;;;;;;;;;;;:::i;:::-;66223:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;66213:3:0::1;::::0;;::::1;::::0;-1:-1:-1;66166:113:0::1;::::0;-1:-1:-1;66166:113:0::1;;-1:-1:-1::0;66111:3:0::1;;66067:218;;;;61129:1;65699:590:::0;;;;;:::o;59839:44::-;;;;;;;;;;;;;:::o;66294:773::-;66347:25;66374:14;;;:9;:14;;;;;66408:13;;66401:20;;;;;:31;;;66431:1;66425:3;:7;66401:31;66393:78;;;;-1:-1:-1;;;66393:78:0;;;;;;;:::i;:::-;66484:13;;;;;:18;:42;;;;-1:-1:-1;66506:15:0;;;;;;;:20;66484:42;66476:95;;;;-1:-1:-1;;;66476:95:0;;;;;;;:::i;:::-;66584:10;66590:3;66584:5;:10::i;:::-;66576:62;;;;-1:-1:-1;;;66576:62:0;;;;;;;:::i;:::-;66645:19;;-1:-1:-1;;66645:19:0;;;;;66725:14;;;;66691:28;;;;66645:15;;66683:57;;-1:-1:-1;;;;;66691:28:0;;66683:41;:57::i;:::-;66669:71;-1:-1:-1;66745:13:0;;66763:136;66787:4;:11;66783:15;;66763:136;;;66819:45;59690:4;66819:27;66827:9;:18;66837:4;66842:1;66837:7;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;66837:7:0;66827:18;;;;;;;;;;;;;66819:3;;:7;:27::i;:::-;:31;;:45::i;:::-;66811:53;;66870:4;66875:1;66870:7;;;;;;;;;;;;;;;;;:23;;-1:-1:-1;;;;;66870:7:0;;;;:23;;;;;66887:5;;66870:23;:7;:23;66887:5;66870:7;:23;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66800:3:0;;66763:136;;;;66908:9;66903:160;66927:16;;;:23;66923:27;;66903:160;;;66971:45;59690:4;66971:27;66979:8;:15;;66995:1;66979:18;;;;;;;;;;;;;;;;66971:3;:7;;:27;;;;:::i;:45::-;66963:53;;67022:8;:16;;67039:1;67022:19;;;;;;;;;;;;;;;;;:35;;-1:-1:-1;;;;;67022:19:0;;;;:35;;;;;67051:5;;67022:35;:19;:35;67051:5;67022:19;:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66952:3:0;;66903:160;;49245:119;49302:4;49326:30;:12;49348:7;49326:21;:30::i;1361:106::-;1449:10;1361:106;:::o;55072:158::-;55138:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;55138:29:0;-1:-1:-1;;;;;55138:29:0;;;;;;;;:24;;55192:16;55138:24;55192:7;:16::i;:::-;-1:-1:-1;;;;;55183:39:0;;;;;;;;;;;55072:158;;:::o;37838:123::-;37907:7;37934:19;37942:3;37934:7;:19::i;49531:333::-;49616:4;49641:16;49649:7;49641;:16::i;:::-;49633:73;;;;-1:-1:-1;;;49633:73:0;;;;;;;:::i;:::-;49717:13;49733:16;49741:7;49733;:16::i;:::-;49717:32;;49779:5;-1:-1:-1;;;;;49768:16:0;:7;-1:-1:-1;;;;;49768:16:0;;:51;;;;49812:7;-1:-1:-1;;;;;49788:31:0;:20;49800:7;49788:11;:20::i;:::-;-1:-1:-1;;;;;49788:31:0;;49768:51;:87;;;;49823:32;49840:5;49847:7;49823:16;:32::i;:::-;49760:96;49531:333;-1:-1:-1;;;;49531:333:0:o;68559:226::-;68644:14;;:::i;:::-;-1:-1:-1;68661:14:0;;;;:5;:14;;;;;;;;68644:31;;;;;;;;;;;;;;;;;;;;;68689:24;;;:11;:24;;;;;;;;;68688:25;68680:61;;;;-1:-1:-1;;;68680:61:0;;;;;;;:::i;:::-;68746:34;68762:4;68768:2;68772:7;68746:15;:34::i;30524:137::-;30595:7;30630:22;30634:3;30646:5;30630:3;:22::i;38300:227::-;38380:7;;;;38440:22;38444:3;38456:5;38440:3;:22::i;:::-;38409:53;;-1:-1:-1;38409:53:0;-1:-1:-1;;;38300:227:0;;;;;;:::o;38962:204::-;39069:7;39112:44;39117:3;39137;39143:12;39112:4;:44::i;:::-;39104:53;-1:-1:-1;38962:204:0;;;;;;:::o;13614:471::-;13672:7;13917:6;13913:47;;-1:-1:-1;13947:1:0;13940:8;;13913:47;13984:5;;;13988:1;13984;:5;:1;14008:5;;;;;:10;14000:56;;;;-1:-1:-1;;;14000:56:0;;;;;;;:::i;65051:268::-;65158:36;;;;;;;;65162:3;65158:36;;;;65185:4;65167:15;-1:-1:-1;;;;;65167:22:0;;65192:1;65167:26;65158:36;;;65131:5;:24;65137:13;:11;:13::i;:::-;65153:1;65137:17;65131:24;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;;65230:3;65220:53;65253:4;65235:15;-1:-1:-1;;;;;65235:22:0;;65259:13;:11;:13::i;:::-;65220:53;;;;;;;:::i;:::-;;;;;;;;65278:36;65284:10;65296:13;:11;:13::i;:::-;65312:1;65296:17;65278:5;:36::i;48660:272::-;48774:28;48784:4;48790:2;48794:7;48774:9;:28::i;:::-;48821:48;48844:4;48850:2;48854:7;48863:5;48821:22;:48::i;:::-;48813:111;;;;-1:-1:-1;;;48813:111:0;;;;;;;:::i;53795:100::-;53868:19;;;;:8;;:19;;;;;:::i;1872:744::-;1928:13;2149:10;2145:53;;-1:-1:-1;2176:10:0;;;;;;;;;;;;-1:-1:-1;;;2176:10:0;;;;;;2145:53;2223:5;2208:12;2264:78;2271:9;;2264:78;;2297:8;;2328:2;2320:10;;;;2264:78;;;2352:19;2384:6;2374:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2374:17:0;-1:-1:-1;2446:5:0;;-1:-1:-1;2352:39:0;-1:-1:-1;;;2418:10:0;;2462:115;2469:9;;2462:115;;2536:2;2529:4;:9;2524:2;:14;2513:27;;2495:6;2502:7;;;;;;;2495:15;;;;;;;;;;;:45;-1:-1:-1;;;;;2495:45:0;;;;;;;;-1:-1:-1;2563:2:0;2555:10;;;;2462:115;;;-1:-1:-1;2601:6:0;1872:744;-1:-1:-1;;;;1872:744:0:o;67072:354::-;67117:4;67155:14;;;:9;:14;;;;;67117:4;;67192:91;67216:4;:11;67212:15;;67192:91;;;67248:29;67258:9;:18;67268:4;67273:1;67268:7;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67268:7:0;67258:18;;;;;;;;;;;;;67248:5;;:9;:29::i;:::-;67240:37;-1:-1:-1;67229:3:0;;67192:91;;;;67292:9;67287:102;67311:15;;;:22;67307:26;;67287:102;;;67354:29;67364:8;:15;;67380:1;67364:18;;;;;;;;;;;;;;;;67354:5;:9;;:29;;;;:::i;:::-;67346:37;-1:-1:-1;67335:3:0;;67287:102;;;-1:-1:-1;59690:4:0;67400:21;;67072:354;-1:-1:-1;;;67072:354:0:o;14561:132::-;14619:7;14646:39;14650:1;14653;14646:39;;;;;;;;;;;;;;;;;:3;:39::i;37599:151::-;37683:4;37707:35;37717:3;37737;37707:9;:35::i;35221:110::-;35304:19;;35221:110::o;52620:574::-;52738:4;-1:-1:-1;;;;;52718:24:0;:16;52726:7;52718;:16::i;:::-;-1:-1:-1;;;;;52718:24:0;;52710:78;;;;-1:-1:-1;;;52710:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52807:16:0;;52799:65;;;;-1:-1:-1;;;52799:65:0;;;;;;;:::i;:::-;52877:39;52898:4;52904:2;52908:7;52877:20;:39::i;:::-;52981:29;52998:1;53002:7;52981:8;:29::i;:::-;-1:-1:-1;;;;;53023:19:0;;;;;;:13;:19;;;;;:35;;53050:7;53023:26;:35::i;:::-;-1:-1:-1;;;;;;53069:17:0;;;;;;:13;:17;;;;;:30;;53091:7;53069:21;:30::i;:::-;-1:-1:-1;53112:29:0;:12;53129:7;53138:2;53112:16;:29::i;:::-;;53178:7;53174:2;-1:-1:-1;;;;;53159:27:0;53168:4;-1:-1:-1;;;;;53159:27:0;;;;;;;;;;;52620:574;;;:::o;27188:204::-;27283:18;;27255:7;;27283:26;-1:-1:-1;27275:73:0;;;;-1:-1:-1;;;27275:73:0;;;;;;;:::i;:::-;27366:3;:11;;27378:5;27366:18;;;;;;;;;;;;;;;;27359:25;;27188:204;;;;:::o;35686:279::-;35790:19;;35753:7;;;;35790:27;-1:-1:-1;35782:74:0;;;;-1:-1:-1;;;35782:74:0;;;;;;;:::i;:::-;35869:22;35894:3;:12;;35907:5;35894:19;;;;;;;;;;;;;;;;;;35869:44;;35932:5;:10;;;35944:5;:12;;;35924:33;;;;;35686:279;;;;;:::o;36388:319::-;36482:7;36521:17;;;:12;;;:17;;;;;;36572:12;36557:13;36549:36;;;;-1:-1:-1;;;36549:36:0;;;;;;;;:::i;:::-;;36639:3;:12;;36663:1;36652:8;:12;36639:26;;;;;;;;;;;;;;;;;;:33;;;36632:40;;;36388:319;;;;;:::o;51130:404::-;-1:-1:-1;;;;;51210:16:0;;51202:61;;;;-1:-1:-1;;;51202:61:0;;;;;;;:::i;:::-;51283:16;51291:7;51283;:16::i;:::-;51282:17;51274:58;;;;-1:-1:-1;;;51274:58:0;;;;;;;:::i;:::-;51345:45;51374:1;51378:2;51382:7;51345:20;:45::i;:::-;-1:-1:-1;;;;;51403:17:0;;;;;;:13;:17;;;;;:30;;51425:7;51403:21;:30::i;:::-;-1:-1:-1;51446:29:0;:12;51463:7;51472:2;51446:16;:29::i;:::-;-1:-1:-1;51493:33:0;;51518:7;;-1:-1:-1;;;;;51493:33:0;;;51510:1;;51493:33;;51510:1;;51493:33;51130:404;;:::o;54460:604::-;54581:4;54608:15;:2;-1:-1:-1;;;;;54608:13:0;;:15::i;:::-;54603:60;;-1:-1:-1;54647:4:0;54640:11;;54603:60;54673:23;54699:252;-1:-1:-1;;;54812:12:0;:10;:12::i;:::-;54839:4;54858:7;54880:5;54715:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;54715:181:0;;;;;;;-1:-1:-1;;;;;54715:181:0;;;;;;;;;;;54699:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;54699:15:0;;;:252;:15;:252::i;:::-;54673:278;;54962:13;54989:10;54978:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;55029:26:0;-1:-1:-1;;;55029:26:0;;-1:-1:-1;;;54460:604:0;;;;;;:::o;12260:181::-;12318:7;12350:5;;;12374:6;;;;12366:46;;;;-1:-1:-1;;;12366:46:0;;;;;;;:::i;15189:278::-;15275:7;15310:12;15303:5;15295:28;;;;-1:-1:-1;;;15295:28:0;;;;;;;;:::i;:::-;;15334:9;15350:1;15346;:5;;;;;;;15189:278;-1:-1:-1;;;;;15189:278:0:o;35001:125::-;35072:4;35096:17;;;:12;;;;;:17;;;;;;:22;;;35001:125::o;29611:137::-;29681:4;29705:35;29713:3;29733:5;29705:7;:35::i;29304:131::-;29371:4;29395:32;29400:3;29420:5;29395:4;:32::i;37031:176::-;37120:4;37144:55;37149:3;37169;-1:-1:-1;;;;;37183:14:0;;37144:4;:55::i;17409:422::-;17776:20;17815:8;;;17409:422::o;20327:196::-;20430:12;20462:53;20485:6;20493:4;20499:1;20502:12;20462:22;:53::i;24890:1544::-;24956:4;25095:19;;;:12;;;:19;;;;;;25131:15;;25127:1300;;25566:18;;-1:-1:-1;;25517:14:0;;;;25566:22;;;;25493:21;;25566:3;;:22;;25853;;;;;;;;;;;;;;25833:42;;25999:9;25970:3;:11;;25982:13;25970:26;;;;;;;;;;;;;;;;;;;:38;;;;26076:23;;;26118:1;26076:12;;;:23;;;;;;26102:17;;;26076:43;;26228:17;;26076:3;;26228:17;;;;;;;;;;;;;;;;;;;;;;26323:3;:12;;:19;26336:5;26323:19;;;;;;;;;;;26316:26;;;26366:4;26359:11;;;;;;;;25127:1300;26410:5;26403:12;;;;;24300:414;24363:4;24385:21;24395:3;24400:5;24385:9;:21::i;:::-;24380:327;;-1:-1:-1;24423:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;24606:18;;24584:19;;;:12;;;:19;;;;;;:40;;;;24639:11;;24380:327;-1:-1:-1;24690:5:0;24683:12;;32501:692;32577:4;32712:17;;;:12;;;:17;;;;;;32746:13;32742:444;;-1:-1:-1;;32831:38:0;;;;;;;;;;;;;;;;;;32813:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;33028:19;;33008:17;;;:12;;;:17;;;;;;;:39;33062:11;;32742:444;33142:5;33106:3;:12;;33130:1;33119:8;:12;33106:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;33169:5;33162:12;;;;;21704:979;21834:12;21867:18;21878:6;21867:10;:18::i;:::-;21859:60;;;;-1:-1:-1;;;21859:60:0;;;;;;;:::i;:::-;21993:12;22007:23;22034:6;-1:-1:-1;;;;;22034:11:0;22054:8;22065:4;22034:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21992:78;;;;22085:7;22081:595;;;22116:10;-1:-1:-1;22109:17:0;;-1:-1:-1;22109:17:0;22081:595;22230:17;;:21;22226:439;;22493:10;22487:17;22554:15;22541:10;22537:2;22533:19;22526:44;22441:148;22636:12;22629:20;;-1:-1:-1;;;22629:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;321:731;;446:3;439:4;431:6;427:17;423:27;413:2;;-1:-1;;454:12;413:2;501:6;488:20;523:88;538:72;603:6;538:72;:::i;:::-;523:88;:::i;:::-;639:21;;;514:97;-1:-1;683:4;696:14;;;;671:17;;;785;;;776:27;;;;773:36;-1:-1;770:2;;;822:1;;812:12;770:2;847:1;832:214;857:6;854:1;851:13;832:214;;;230:6;217:20;242:41;277:5;242:41;:::i;:::-;925:58;;997:14;;;;1025;;;;879:1;872:9;832:214;;;836:14;;;;;406:646;;;;:::o;1080:379::-;;;1237:3;1230:4;1222:6;1218:17;1214:27;1204:2;;-1:-1;;1245:12;1204:2;-1:-1;1275:20;;1315:18;1304:30;;1301:2;;;-1:-1;;1337:12;1301:2;1381:4;1373:6;1369:17;1357:29;;1432:3;1381:4;;1416:6;1412:17;1373:6;1398:32;;1395:41;1392:2;;;1449:1;;1439:12;1863:707;;1980:3;1973:4;1965:6;1961:17;1957:27;1947:2;;-1:-1;;1988:12;1947:2;2035:6;2022:20;2057:80;2072:64;2129:6;2072:64;:::i;2057:80::-;2165:21;;;2048:89;-1:-1;2209:4;2222:14;;;;2197:17;;;2311;;;2302:27;;;;2299:36;-1:-1;2296:2;;;2348:1;;2338:12;2296:2;2373:1;2358:206;2383:6;2380:1;2377:13;2358:206;;;4224:20;;2451:50;;2515:14;;;;2543;;;;2405:1;2398:9;2358:206;;3121:440;;3222:3;3215:4;3207:6;3203:17;3199:27;3189:2;;-1:-1;;3230:12;3189:2;3277:6;3264:20;55601:18;55593:6;55590:30;55587:2;;;-1:-1;;55623:12;55587:2;3299:64;55696:9;55677:17;;-1:-1;;55673:33;55764:4;55754:15;3299:64;:::i;:::-;3290:73;;3383:6;3376:5;3369:21;3487:3;55764:4;3478:6;3411;3469:16;;3466:25;3463:2;;;3504:1;;3494:12;3463:2;59888:6;55764:4;3411:6;3407:17;55764:4;3445:5;3441:16;59865:30;59944:1;59926:16;;;55764:4;59926:16;59919:27;3445:5;3182:379;-1:-1;;3182:379::o;4020:130::-;4087:20;;-1:-1;;;;;59015:46;;61110:35;;61100:2;;61159:1;;61149:12;4294:241;;4398:2;4386:9;4377:7;4373:23;4369:32;4366:2;;;-1:-1;;4404:12;4366:2;85:6;72:20;97:33;124:5;97:33;:::i;4806:366::-;;;4927:2;4915:9;4906:7;4902:23;4898:32;4895:2;;;-1:-1;;4933:12;4895:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4985:63;-1:-1;5085:2;5124:22;;72:20;97:33;72:20;97:33;:::i;:::-;5093:63;;;;4889:283;;;;;:::o;5179:491::-;;;;5317:2;5305:9;5296:7;5292:23;5288:32;5285:2;;;-1:-1;;5323:12;5285:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5375:63;-1:-1;5475:2;5514:22;;72:20;97:33;72:20;97:33;:::i;:::-;5279:391;;5483:63;;-1:-1;;;5583:2;5622:22;;;;4224:20;;5279:391::o;5677:721::-;;;;;5841:3;5829:9;5820:7;5816:23;5812:33;5809:2;;;-1:-1;;5848:12;5809:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5900:63;-1:-1;6000:2;6039:22;;72:20;97:33;72:20;97:33;:::i;:::-;6008:63;-1:-1;6108:2;6147:22;;4224:20;;-1:-1;6244:2;6229:18;;6216:32;6268:18;6257:30;;6254:2;;;-1:-1;;6290:12;6254:2;6320:62;6374:7;6365:6;6354:9;6350:22;6320:62;:::i;:::-;6310:72;;;5803:595;;;;;;;:::o;6405:360::-;;;6523:2;6511:9;6502:7;6498:23;6494:32;6491:2;;;-1:-1;;6529:12;6491:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6581:63;-1:-1;6681:2;6717:22;;2642:20;58697:13;;58690:21;60743:32;;60733:2;;-1:-1;;60779:12;6772:366;;;6893:2;6881:9;6872:7;6868:23;6864:32;6861:2;;;-1:-1;;6899:12;6861:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6951:63;7051:2;7090:22;;;;4224:20;;-1:-1;;;6855:283::o;7145:241::-;;7249:2;7237:9;7228:7;7224:23;7220:32;7217:2;;;-1:-1;;7255:12;7217:2;-1:-1;2776:20;;7211:175;-1:-1;7211:175::o;7393:239::-;;7496:2;7484:9;7475:7;7471:23;7467:32;7464:2;;;-1:-1;;7502:12;7464:2;2925:6;2912:20;2937:32;2963:5;2937:32;:::i;7639:261::-;;7753:2;7741:9;7732:7;7728:23;7724:32;7721:2;;;-1:-1;;7759:12;7721:2;3064:6;3058:13;3076:32;3102:5;3076:32;:::i;7907:347::-;;8021:2;8009:9;8000:7;7996:23;7992:32;7989:2;;;-1:-1;;8027:12;7989:2;8085:17;8072:31;8123:18;8115:6;8112:30;8109:2;;;-1:-1;;8145:12;8109:2;8175:63;8230:7;8221:6;8210:9;8206:22;8175:63;:::i;8261:2191::-;;;;;;;;;;;8626:3;8614:9;8605:7;8601:23;8597:33;8594:2;;;-1:-1;;8633:12;8594:2;8695:53;8740:7;8716:22;8695:53;:::i;:::-;8685:63;;8803:53;8848:7;8785:2;8828:9;8824:22;8803:53;:::i;:::-;8793:63;;8893:2;8936:9;8932:22;4224:20;8901:63;;9029:2;9018:9;9014:18;9001:32;9053:18;;9045:6;9042:30;9039:2;;;-1:-1;;9075:12;9039:2;9105:86;9183:7;9174:6;9163:9;9159:22;9105:86;:::i;:::-;9095:96;;9256:3;9245:9;9241:19;9228:33;9214:47;;9053:18;9273:6;9270:30;9267:2;;;-1:-1;;9303:12;9267:2;9333:78;9403:7;9394:6;9383:9;9379:22;9333:78;:::i;:::-;9323:88;;9476:3;9465:9;9461:19;9448:33;9434:47;;9053:18;9493:6;9490:30;9487:2;;;-1:-1;;9523:12;9487:2;9553:63;9608:7;9599:6;9588:9;9584:22;9553:63;:::i;:::-;9543:73;;9681:3;9670:9;9666:19;9653:33;9639:47;;9053:18;9698:6;9695:30;9692:2;;;-1:-1;;9728:12;9692:2;9758:63;9813:7;9804:6;9793:9;9789:22;9758:63;:::i;:::-;9748:73;;9886:3;9875:9;9871:19;9858:33;9844:47;;9053:18;9903:6;9900:30;9897:2;;;-1:-1;;9933:12;9897:2;9963:63;10018:7;10009:6;9998:9;9994:22;9963:63;:::i;:::-;9953:73;;10091:3;10080:9;10076:19;10063:33;10049:47;;9053:18;10108:6;10105:30;10102:2;;;-1:-1;;10138:12;10102:2;10168:63;10223:7;10214:6;10203:9;10199:22;10168:63;:::i;:::-;10158:73;;10296:3;10285:9;10281:19;10268:33;10254:47;;9053:18;10313:6;10310:30;10307:2;;;-1:-1;;10343:12;10307:2;;10373:63;10428:7;10419:6;10408:9;10404:22;10373:63;:::i;:::-;10363:73;;;8588:1864;;;;;;;;;;;;;:::o;10707:382::-;;;10836:2;10824:9;10815:7;10811:23;10807:32;10804:2;;;-1:-1;;10842:12;10804:2;4237:6;4224:20;10894:63;;10994:2;11045:9;11041:22;217:20;242:41;277:5;242:41;:::i;11096:507::-;;;;11242:2;11230:9;11221:7;11217:23;11213:32;11210:2;;;-1:-1;;11248:12;11210:2;4237:6;4224:20;11300:63;;11400:2;11451:9;11447:22;217:20;242:41;277:5;242:41;:::i;11610:857::-;;;;;;11845:2;11833:9;11824:7;11820:23;11816:32;11813:2;;;-1:-1;;11851:12;11813:2;4237:6;4224:20;11903:63;;12031:2;12020:9;12016:18;12003:32;12055:18;;12047:6;12044:30;12041:2;;;-1:-1;;12077:12;12041:2;12115:107;12214:7;12205:6;12194:9;12190:22;12115:107;:::i;:::-;12097:125;;-1:-1;12097:125;-1:-1;12287:2;12272:18;;12259:32;;-1:-1;12300:30;;;12297:2;;;-1:-1;;12333:12;12297:2;;12371:80;12443:7;12434:6;12423:9;12419:22;12371:80;:::i;:::-;11807:660;;;;-1:-1;11807:660;;-1:-1;12353:98;;;11807:660;-1:-1;;;11807:660::o;12474:360::-;;;12592:2;12580:9;12571:7;12567:23;12563:32;12560:2;;;-1:-1;;12598:12;12560:2;4237:6;4224:20;12650:63;;12750:2;12790:9;12786:22;2642:20;60768:5;58697:13;58690:21;60746:5;60743:32;60733:2;;-1:-1;;60779:12;12841:366;;;12962:2;12950:9;12941:7;12937:23;12933:32;12930:2;;;-1:-1;;12968:12;12930:2;4237:6;4224:20;13020:63;;13138:53;13183:7;13120:2;13163:9;13159:22;13138:53;:::i;:::-;13128:63;;12924:283;;;;;:::o;14055:754::-;;14272:5;56715:12;57534:6;57529:3;57522:19;57571:4;;57566:3;57562:14;14284:101;;57571:4;14464:5;56238:14;-1:-1;14503:284;14528:6;14525:1;14522:13;14503:284;;;14589:13;;-1:-1;;;;;59261:54;13687:45;;13400:14;;;;57254;;;;1315:18;14543:9;14503:284;;;-1:-1;14793:10;;14195:614;-1:-1;;;;;14195:614::o;14848:690::-;;15041:5;56715:12;57534:6;57529:3;57522:19;57571:4;;57566:3;57562:14;15053:93;;57571:4;15217:5;56238:14;-1:-1;15256:260;15281:6;15278:1;15275:13;15256:260;;;15342:13;;15728:37;;13582:14;;;;57254;;;;15303:1;15296:9;15256:260;;15936:343;;16078:5;56715:12;57534:6;57529:3;57522:19;16171:52;16216:6;57571:4;57566:3;57562:14;57571:4;16197:5;16193:16;16171:52;:::i;:::-;55696:9;60386:14;-1:-1;;60382:28;16235:39;;;;57571:4;16235:39;;16026:253;-1:-1;;16026:253::o;30724:113::-;-1:-1;;;;;59015:46;30795:37;;30789:48::o;30844:113::-;-1:-1;;;;;59135:52;30915:37;;30909:48::o;31308:253::-;15728:37;;;31533:2;31524:12;;31424:137::o;31568:271::-;;16446:5;56715:12;16557:52;16602:6;16597:3;16590:4;16583:5;16579:16;16557:52;:::i;:::-;16621:16;;;;;31702:137;-1:-1;;31702:137::o;31846:430::-;;-1:-1;17711:5;17705:12;17745:1;;17734:9;17730:17;17758:1;17753:268;;;;18032:1;18027:425;;;;17723:729;;17753:268;-1:-1;;17958:25;;17946:38;;17827:1;17812:17;;17831:4;17808:28;17998:16;;;-1:-1;17753:268;;18027:425;18096:1;18085:9;18081:17;56544:3;-1:-1;56534:14;56576:4;;-1:-1;56563:18;-1:-1;18285:130;18299:6;18296:1;18293:13;18285:130;;;18358:14;;18345:11;;;18338:35;18392:15;;;;18314:12;;18285:130;;;-1:-1;;;18429:16;;;-1:-1;17723:729;;;;16446:5;56715:12;16557:52;16602:6;16597:3;16590:4;16583:5;16579:16;16557:52;:::i;:::-;16621:16;;32027:249;-1:-1;;;;32027:249::o;32283:222::-;-1:-1;;;;;59261:54;;;;13687:45;;32410:2;32395:18;;32381:124::o;32773:672::-;-1:-1;;;;;59261:54;;;13687:45;;59261:54;;33199:2;33184:18;;13687:45;33282:2;33267:18;;15728:37;;;33018:3;33319:2;33304:18;;33297:48;;;32773:672;;33359:76;;33003:19;;33421:6;33359:76;:::i;:::-;33351:84;32989:456;-1:-1;;;;;;32989:456::o;33452:402::-;;33645:2;33666:17;33659:47;33720:124;33645:2;33634:9;33630:18;33830:6;33720:124;:::i;33861:661::-;;34132:2;34153:17;34146:47;34207:124;34132:2;34121:9;34117:18;34317:6;34207:124;:::i;:::-;34379:9;34373:4;34369:20;34364:2;34353:9;34349:18;34342:48;34404:108;34507:4;34498:6;34404:108;:::i;:::-;34396:116;34103:419;-1:-1;;;;;34103:419::o;34529:370::-;;34706:2;34727:17;34720:47;34781:108;34706:2;34695:9;34691:18;34875:6;34781:108;:::i;34906:210::-;58697:13;;58690:21;15611:34;;35027:2;35012:18;;34998:118::o;35627:310::-;;35774:2;35795:17;35788:47;35849:78;35774:2;35763:9;35759:18;35913:6;35849:78;:::i;35944:416::-;36144:2;36158:47;;;18691:2;36129:18;;;57522:19;18727:34;57562:14;;;18707:55;-1:-1;;;18782:12;;;18775:26;18820:12;;;36115:245::o;36367:416::-;36567:2;36581:47;;;19071:2;36552:18;;;57522:19;19107:34;57562:14;;;19087:55;-1:-1;;;19162:12;;;19155:26;19200:12;;;36538:245::o;36790:416::-;36990:2;37004:47;;;36975:18;;;57522:19;19487:34;57562:14;;;19467:55;19541:12;;;36961:245::o;37213:416::-;37413:2;37427:47;;;19792:2;37398:18;;;57522:19;19828:34;57562:14;;;19808:55;-1:-1;;;19883:12;;;19876:32;19927:12;;;37384:245::o;37636:416::-;37836:2;37850:47;;;20178:2;37821:18;;;57522:19;20214:34;57562:14;;;20194:55;-1:-1;;;20269:12;;;20262:25;20306:12;;;37807:245::o;38059:416::-;38259:2;38273:47;;;20557:2;38244:18;;;57522:19;20593:34;57562:14;;;20573:55;-1:-1;;;20648:12;;;20641:42;20702:12;;;38230:245::o;38482:416::-;38682:2;38696:47;;;20953:2;38667:18;;;57522:19;20989:34;57562:14;;;20969:55;-1:-1;;;21044:12;;;21037:30;21086:12;;;38653:245::o;38905:416::-;39105:2;39119:47;;;21337:2;39090:18;;;57522:19;21373:34;57562:14;;;21353:55;-1:-1;;;21428:12;;;21421:31;21471:12;;;39076:245::o;39328:416::-;39528:2;39542:47;;;21722:2;39513:18;;;57522:19;21758:30;57562:14;;;21738:51;21808:12;;;39499:245::o;39751:416::-;39951:2;39965:47;;;22059:2;39936:18;;;57522:19;22095:29;57562:14;;;22075:50;22144:12;;;39922:245::o;40174:416::-;40374:2;40388:47;;;22395:2;40359:18;;;57522:19;22431:34;57562:14;;;22411:55;-1:-1;;;22486:12;;;22479:28;22526:12;;;40345:245::o;40597:416::-;40797:2;40811:47;;;22777:2;40782:18;;;57522:19;22813:27;57562:14;;;22793:48;22860:12;;;40768:245::o;41020:416::-;41220:2;41234:47;;;23111:2;41205:18;;;57522:19;23147:30;57562:14;;;23127:51;23197:12;;;41191:245::o;41443:416::-;41643:2;41657:47;;;23448:2;41628:18;;;57522:19;23484:34;57562:14;;;23464:55;-1:-1;;;23539:12;;;23532:36;23587:12;;;41614:245::o;41866:416::-;42066:2;42080:47;;;23838:2;42051:18;;;57522:19;23874:25;57562:14;;;23854:46;23919:12;;;42037:245::o;42289:416::-;42489:2;42503:47;;;24170:2;42474:18;;;57522:19;24206:29;57562:14;;;24186:50;24255:12;;;42460:245::o;42712:416::-;42912:2;42926:47;;;24506:2;42897:18;;;57522:19;24542:34;57562:14;;;24522:55;24611:26;24597:12;;;24590:48;24657:12;;;42883:245::o;43135:416::-;43335:2;43349:47;;;24908:2;43320:18;;;57522:19;24944:34;57562:14;;;24924:55;-1:-1;;;24999:12;;;24992:34;25045:12;;;43306:245::o;43558:416::-;43758:2;43772:47;;;25296:2;43743:18;;;57522:19;25332:34;57562:14;;;25312:55;-1:-1;;;25387:12;;;25380:26;25425:12;;;43729:245::o;43981:416::-;44181:2;44195:47;;;25676:2;44166:18;;;57522:19;25712:34;57562:14;;;25692:55;-1:-1;;;25767:12;;;25760:31;25810:12;;;44152:245::o;44404:416::-;44604:2;44618:47;;;44589:18;;;57522:19;26097:34;57562:14;;;26077:55;26151:12;;;44575:245::o;44827:416::-;45027:2;45041:47;;;26402:2;45012:18;;;57522:19;26438:34;57562:14;;;26418:55;-1:-1;;;26493:12;;;26486:25;26530:12;;;44998:245::o;45250:416::-;45450:2;45464:47;;;26781:2;45435:18;;;57522:19;26817:34;57562:14;;;26797:55;-1:-1;;;26872:12;;;26865:36;26920:12;;;45421:245::o;45673:416::-;45873:2;45887:47;;;45858:18;;;57522:19;27207:34;57562:14;;;27187:55;27261:12;;;45844:245::o;46096:416::-;46296:2;46310:47;;;27512:2;46281:18;;;57522:19;27548:34;57562:14;;;27528:55;-1:-1;;;27603:12;;;27596:33;27648:12;;;46267:245::o;46519:416::-;46719:2;46733:47;;;27899:2;46704:18;;;57522:19;27935:34;57562:14;;;27915:55;-1:-1;;;27990:12;;;27983:39;28041:12;;;46690:245::o;46942:416::-;47142:2;47156:47;;;28292:2;47127:18;;;57522:19;28328:34;57562:14;;;28308:55;-1:-1;;;28383:12;;;28376:46;28441:12;;;47113:245::o;47365:416::-;47565:2;47579:47;;;28692:2;47550:18;;;57522:19;28728:34;57562:14;;;28708:55;-1:-1;;;28783:12;;;28776:25;28820:12;;;47536:245::o;47788:416::-;47988:2;48002:47;;;29071:2;47973:18;;;57522:19;29107:34;57562:14;;;29087:55;-1:-1;;;29162:12;;;29155:28;29202:12;;;47959:245::o;48211:416::-;48411:2;48425:47;;;29453:2;48396:18;;;57522:19;29489:34;57562:14;;;29469:55;-1:-1;;;29544:12;;;29537:29;29585:12;;;48382:245::o;48634:416::-;48834:2;48848:47;;;29836:2;48819:18;;;57522:19;29872:34;57562:14;;;29852:55;-1:-1;;;29927:12;;;29920:41;29980:12;;;48805:245::o;49057:416::-;49257:2;49271:47;;;30231:2;49242:18;;;57522:19;30267:31;57562:14;;;30247:52;30318:12;;;49228:245::o;49480:416::-;49680:2;49694:47;;;30569:2;49665:18;;;57522:19;30605:34;57562:14;;;30585:55;-1:-1;;;30660:12;;;30653:26;30698:12;;;49651:245::o;50132:333::-;15728:37;;;-1:-1;;;;;59261:54;50451:2;50436:18;;13687:45;50287:2;50272:18;;50258:207::o;50472:333::-;15728:37;;;50791:2;50776:18;;15728:37;50627:2;50612:18;;50598:207::o;50812:1444::-;;51235:3;15758:5;15735:3;15728:37;15758:5;51400:2;51389:9;51385:18;15728:37;-1:-1;;;;;30825:5;59015:46;51483:2;51472:9;51468:18;30795:37;51235:3;51520:2;51509:9;51505:18;51498:48;51560:78;51235:3;51224:9;51220:19;51624:6;51560:78;:::i;:::-;51552:86;;51687:9;51681:4;51677:20;51671:3;51660:9;51656:19;51649:49;51712:78;51785:4;51776:6;51712:78;:::i;:::-;51704:86;;51839:9;51833:4;51829:20;51823:3;51812:9;51808:19;51801:49;51864:78;51937:4;51928:6;51864:78;:::i;:::-;51856:86;;51991:9;51985:4;51981:20;51975:3;51964:9;51960:19;51953:49;52016:78;52089:4;52080:6;52016:78;:::i;:::-;52008:86;;52143:9;52137:4;52133:20;52127:3;52116:9;52112:19;52105:49;52168:78;52241:4;52232:6;52168:78;:::i;:::-;52160:86;51206:1050;-1:-1;;;;;;;;;;;51206:1050::o;52263:1766::-;;52763:3;59477:4;31289:5;59466:16;31268:3;31261:35;59477:4;31289:5;59466:16;52920:2;52909:9;52905:18;31261:35;-1:-1;;;;;30825:5;59015:46;53003:2;52992:9;52988:18;30795:37;53018:72;53086:2;53075:9;53071:18;53062:6;53018:72;:::i;:::-;53101:73;53169:3;53158:9;53154:19;53145:6;53101:73;:::i;:::-;15758:5;53253:3;53242:9;53238:19;15728:37;52763:3;53291;53280:9;53276:19;53269:49;53332:78;52763:3;52752:9;52748:19;53396:6;53332:78;:::i;:::-;53324:86;;53459:9;53453:4;53449:20;53443:3;53432:9;53428:19;53421:49;53484:78;53557:4;53548:6;53484:78;:::i;:::-;53476:86;;53611:9;53605:4;53601:20;53595:3;53584:9;53580:19;53573:49;53636:78;53709:4;53700:6;53636:78;:::i;:::-;53628:86;;53763:9;53757:4;53753:20;53747:3;53736:9;53732:19;53725:49;53788:78;53861:4;53852:6;53788:78;:::i;:::-;53780:86;;53915:9;53909:4;53905:20;53899:3;53888:9;53884:19;53877:49;53940:79;54014:4;54004:7;53940:79;:::i;:::-;53932:87;52734:1295;-1:-1;;;;;;;;;;;;;;52734:1295::o;54036:522::-;;;54187:11;54174:25;54238:48;;54262:8;54246:14;54242:29;54238:48;54218:18;54214:73;54204:2;;-1:-1;;54291:12;54204:2;54318:33;;54372:18;;;-1:-1;54410:18;54399:30;;54396:2;;;-1:-1;;54432:12;54396:2;54277:4;54460:13;;;;-1:-1;54512:17;;54246:14;54492:38;54482:49;;54479:2;;;54544:1;;54534:12;54565:256;54627:2;54621:9;54653:17;;;54728:18;54713:34;;54749:22;;;54710:62;54707:2;;;54785:1;;54775:12;54707:2;54627;54794:22;54605:216;;-1:-1;54605:216::o;54828:312::-;;54995:18;54987:6;54984:30;54981:2;;;-1:-1;;55017:12;54981:2;-1:-1;55062:4;55050:17;;;55115:15;;54918:222::o;59961:268::-;60026:1;60033:101;60047:6;60044:1;60041:13;60033:101;;;60114:11;;;60108:18;60095:11;;;60088:39;60069:2;60062:10;60033:101;;;60149:6;60146:1;60143:13;60140:2;;;-1:-1;;60026:1;60196:16;;60189:27;60010:219::o;60423:117::-;-1:-1;;;;;59261:54;;60482:35;;60472:2;;60531:1;;60521:12;60929:115;-1:-1;;;;;;58863:78;;60987:34;;60977:2;;61035:1;;61025:12

Swarm Source

ipfs://300f8bd3147e42515567f34f0e50507be41eb85368948b634e92d5761629af68
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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