ETH Price: $2,870.19 (+6.67%)
 

Overview

Max Total Supply

1,012 The0xffice

Holders

224

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
3 The0xffice
0x95c690116b4e5c878ec72dc7a4f0c05ac217ae51
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Oxffice

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-08
*/

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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: contracts/utils/MerkleProof.sol



pragma solidity >=0.8.7;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }
    
    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}
// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`.
        uint24 extraData;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

    // ==============================
    //            IERC721
    // ==============================

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

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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

    // ==============================
    //            IERC2309
    // ==============================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`,
     * as defined in the ERC2309 standard. See `_mintERC2309` for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard,
 * including the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at `_startTokenId()`
 * (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with `_mintERC2309`.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309`
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The tokenId of the next token to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to `_startTokenId()`
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA);
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, BITMASK_ADDRESS)
            // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

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

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`.
            result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-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 {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     *   {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 tokenId = startTokenId;
            uint256 end = startTokenId + quantity;
            do {
                emit Transfer(address(0), to, tokenId++);
            } while (tokenId < end);

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals;
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            // Compute the slot.
            mstore(0x00, tokenId)
            mstore(0x20, tokenApprovalsPtr.slot)
            approvedAddressSlot := keccak256(0x00, 0x40)
            // Load the slot's value from storage.
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    /**
     * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`.
     */
    function _isOwnerOrApproved(
        address approvedAddress,
        address from,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean.
            from := and(from, BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, BITMASK_ADDRESS)
            // `msgSender == from || msgSender == approvedAddress`.
            result := or(eq(msgSender, from), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred.
     * This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred.
     * This includes minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

// File: contracts/0xffice.sol



pragma solidity >=0.8.0;





/**
 * @dev contract module which defines Cannaverse NFT Collection
 * and all the interactions it uses
 */
contract Oxffice is ERC721A, Ownable {

    //@dev constants
    uint256 internal constant WORKER = 0;
    uint256 internal constant MANAGER = 1;
    uint256 internal constant BOSS = 2;

    //@dev Attributes for NFT configuration
    string internal baseURI;
    string internal corpBaseURI;
    uint256 public cost = 68000000000000000;
    uint256 public maxSupply = 4444;
    uint256 public managersMaxSupply = 100;
    uint256 public corporateMaxSupply = 20;
    uint256 public maxWhitelistPerWallet = 3;
    uint public managersCount;
    uint public bossCount;
    string public hiddenMetadataUri;
    // uint public workersCount;
    uint256 public maxMintAmount = 7;
    uint256 public maxPreMintAmount = 201;
    mapping(uint256 => string) private _tokenURIs;
    bool public recruitmentOver;
    bytes32 public merkleRoot;
    uint public startTimestamp;
    uint public whitelistEnd;
    uint public managerPrice = 10;
    uint public bossPrice = 20;
    bool public revealed = false;

    // @dev inner attributes of the contract

    /**
     * @dev Create an instance of Oxffice contract
     */
    constructor(
        string memory _tokenName,
        string memory _tokenSymbol,
        string memory _hiddenMetadataUri
    ) ERC721A(_tokenName, _tokenSymbol) {
        setHiddenMetadataUri(_hiddenMetadataUri);
    }

    /**
     * @dev set start timestamp
     */
     function setStartOfSale(uint _timestamp) external onlyOwner {
        startTimestamp = _timestamp;
        whitelistEnd = startTimestamp + 14400; //4hour
     }

    // Merkle tree whitelisting
    function setWhitelistMerkleRoot(bytes32 _whitelistMerkleRoot) external onlyOwner {
        merkleRoot = _whitelistMerkleRoot;
    }

    function _leaf(address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof) internal view returns (bool) {
        return MerkleProof.verify(proof, merkleRoot, leaf);
    }


    function endRecruitement(bool _state) external onlyOwner {
        recruitmentOver = _state;
    }

    /**
     * @dev get base URI for NFT metadata
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    /**
     * @dev Mint edition to a wallet
     * @param _to wallet receiving the edition(s).
     * @param _mintAmount number of editions to mint.
     */
    function mint(address _to, uint256 _mintAmount) payable external {
        require(block.timestamp > whitelistEnd, "Public sale hasn't started yet");
        require(!recruitmentOver, "Recruitement is over");
        uint256 supply = totalSupply();
        require(
            supply + _mintAmount <= maxSupply,
            "Not enough mintable editions !"
        );
        require(_mintAmount <= maxMintAmount, "Exceeds max mint amount.");
        require(msg.value == cost * _mintAmount, "Incorrect ETH value");
        _safeMint(_to, _mintAmount);
        // workersCount += _mintAmount;
        // for(uint i = 1; i < _mintAmount; i++)
        //     workerIdsToWallet[msg.sender].push(supply + i);
    }

    /**
     * @dev Pre Mint fixed edition to owner wallet as reserve
     * @param _mintAmount number of editions to mint.
     */
    function premint(uint256 _mintAmount) external onlyOwner {
        uint256 supply = totalSupply();
        require(
            supply + _mintAmount <= maxPreMintAmount,
            "Not enough pre mintable editions !"
        );
        _safeMint(msg.sender, _mintAmount);

        if(supply + _mintAmount == maxPreMintAmount){
            _burn(0);
        }

    }

    function whitelistMint(uint256 amount, bytes32[] calldata proof) external payable {
        uint256 supply = totalSupply();
        require(!recruitmentOver, "Recruitement is over.");
        require(block.timestamp >= startTimestamp, "Sale hasn't started yet");
        require(block.timestamp <= whitelistEnd, "Whitelist sale is over.");
        require(supply + amount <= maxSupply, "Exceeds max supply.");
        require(_numberMinted(msg.sender) + amount <= maxWhitelistPerWallet, "Exceeds max per whitelist.");
        require(_verify(_leaf(msg.sender), proof), "Invalid Merkle Tree proof.");
        require(amount * cost == msg.value, "Invalid funds provided.");

        _safeMint(msg.sender, amount);
        // workersCount += amount;
        // for(uint i = 1; i <= amount; i++)
        //     workerIdsToWallet[msg.sender].push(supply + i);
    }

    /**
     * @dev change cost of NFT
     * @param _newCost new cost of each edition
     */
    function setCost(uint256 _newCost) external onlyOwner {
        cost = _newCost;
    }

    /**
     * @dev restrict max mintable amount of edition at a time
     * @param _newmaxMintAmount new max mintable amount
     */
    function setmaxMintAmount(uint256 _newmaxMintAmount) external onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }

    function setMaxSupply(uint _maxSupply) external onlyOwner{
        maxSupply = _maxSupply;
    }
    /**
     * @dev restrict max mintable amount of edition at a time
     * @param _maxManager new max mintable amount
     * @param _maxBoss new max mintable amount
     */
    function setMaxCorpSupply(uint _maxManager, uint _maxBoss) external onlyOwner {
        managersMaxSupply = _maxManager;
        corporateMaxSupply = _maxBoss;
    }

    /**
     * @dev restrict max mintable amount of edition at a time
     * @param _managerPrice new manager price
     * @param _bossPrice new boss price
     */
    function setCorpPrice(uint _managerPrice, uint _bossPrice) external onlyOwner {
        managerPrice = _managerPrice;
        bossPrice = _bossPrice;
    }

    /**
     * @dev change metadata uri
     * @param _newBaseURI new URI for metadata
     */
    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    }

    /**
     * @dev change metadata uri
     * @param _newBaseURI new URI for metadata
     */
    function setBaseURICorp(string memory _newBaseURI) external onlyOwner{
        corpBaseURI = _newBaseURI;
    }

    /**
     * @dev mint a manager or a boss
     * @param _managerOrBoss employee
     * @param _tokenIDs to burn
     */
    function mintCorp(uint _managerOrBoss, uint[] memory _tokenIDs) external {
        require(recruitmentOver && totalSupply() >= maxSupply, "Corp minting not started");
        require(_managerOrBoss == MANAGER || _managerOrBoss == BOSS, "Incorrect value");
        if(_managerOrBoss == MANAGER){
            require(_tokenIDs.length == managerPrice );
            require(managersCount + 1 <= managersMaxSupply, "All managers minted");
            for(uint i = 0; i < _tokenIDs.length; i++){
                _burn(_tokenIDs[i]);
                // delete workerIdsToWallet[msg.sender][i];
            }
            managersCount++;
            _safeMint(msg.sender, 1);
        }
        else{
            require(_tokenIDs.length == bossPrice );
            require(bossCount + 1 <= corporateMaxSupply, "All bosses minted");
            for(uint i = 0; i < _tokenIDs.length; i++){
                _burn(_tokenIDs[i]);
                // delete workerIdsToWallet[msg.sender][i];
            }

            bossCount++;
            _safeMint(msg.sender, 1);
        }
    }

    function mintBossFromManager(uint[] memory _tokenIDs) external {
        require(bossCount + 1 <= corporateMaxSupply, "All bosses minted");
        require(_tokenIDs.length == 2, "Not enough managers");
        for(uint i = 0; i < _tokenIDs.length; i++){
            require(_tokenIDs[i] > maxSupply, "Not a manager"); //managers range
            _burn(_tokenIDs[i]);
            // delete managerIdsToWallet[msg.sender][i];
        }

        managersCount -= 2;
        bossCount++;
        _safeMint(msg.sender, 1);
    }

    /**
     * @dev Get token URI
     * @param tokenId ID of the token to retrieve
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "URI query for nonexistent token"
        );

        if (revealed == false) {
            return hiddenMetadataUri;
        }

        if (bytes(_tokenURIs[tokenId]).length == 0) {
            string memory currentBaseURI;
            if(tokenId <= maxSupply)
                currentBaseURI = _baseURI();
            else
                currentBaseURI = corpBaseURI;

            return
                bytes(currentBaseURI).length > 0
                    ? string(
                        abi.encodePacked(
                            currentBaseURI,
                            Strings.toString(tokenId),
                            ".json"
                        )
                    )
                    : "";
        } else return _tokenURIs[tokenId];
    }

    function setRevealed(bool _state) public onlyOwner {
        revealed = _state;
    }

    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    function withdraw() external payable onlyOwner {
        // This will payout the owner 100% of the contract balance.
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bossCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bossPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"corporateMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"endRecruitement","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":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managersMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPreMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"}],"name":"mintBossFromManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_managerOrBoss","type":"uint256"},{"internalType":"uint256[]","name":"_tokenIDs","type":"uint256[]"}],"name":"mintCorp","outputs":[],"stateMutability":"nonpayable","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":"_mintAmount","type":"uint256"}],"name":"premint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recruitmentOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURICorp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_managerPrice","type":"uint256"},{"internalType":"uint256","name":"_bossPrice","type":"uint256"}],"name":"setCorpPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxManager","type":"uint256"},{"internalType":"uint256","name":"_maxBoss","type":"uint256"}],"name":"setMaxCorpSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setStartOfSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_whitelistMerkleRoot","type":"bytes32"}],"name":"setWhitelistMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405266f195a3c4ba0000600b5561115c600c556064600d556014600e556003600f55600760135560c9601455600a601a556014601b556000601c60006101000a81548160ff0219169083151502179055503480156200006057600080fd5b50604051620051c0380380620051c08339818101604052810190620000869190620003f4565b82828160029080519060200190620000a0929190620002c6565b508060039080519060200190620000b9929190620002c6565b50620000ca6200010c60201b60201c565b6000819055505050620000f2620000e66200011160201b60201c565b6200011960201b60201c565b6200010381620001df60201b60201c565b505050620006b4565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ef6200020b60201b60201c565b806012908051906020019062000207929190620002c6565b5050565b6200021b6200011160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002416200029c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200029a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029190620004d4565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620002d4906200059c565b90600052602060002090601f016020900481019282620002f8576000855562000344565b82601f106200031357805160ff191683800117855562000344565b8280016001018555821562000344579182015b828111156200034357825182559160200191906001019062000326565b5b50905062000353919062000357565b5090565b5b808211156200037257600081600090555060010162000358565b5090565b60006200038d62000387846200051f565b620004f6565b905082815260208101848484011115620003ac57620003ab6200066b565b5b620003b984828562000566565b509392505050565b600082601f830112620003d957620003d862000666565b5b8151620003eb84826020860162000376565b91505092915050565b60008060006060848603121562000410576200040f62000675565b5b600084015167ffffffffffffffff81111562000431576200043062000670565b5b6200043f86828701620003c1565b935050602084015167ffffffffffffffff81111562000463576200046262000670565b5b6200047186828701620003c1565b925050604084015167ffffffffffffffff81111562000495576200049462000670565b5b620004a386828701620003c1565b9150509250925092565b6000620004bc60208362000555565b9150620004c9826200068b565b602082019050919050565b60006020820190508181036000830152620004ef81620004ad565b9050919050565b60006200050262000515565b9050620005108282620005d2565b919050565b6000604051905090565b600067ffffffffffffffff8211156200053d576200053c62000637565b5b62000548826200067a565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200058657808201518184015260208101905062000569565b8381111562000596576000848401525b50505050565b60006002820490506001821680620005b557607f821691505b60208210811415620005cc57620005cb62000608565b5b50919050565b620005dd826200067a565b810181811067ffffffffffffffff82111715620005ff57620005fe62000637565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614afc80620006c46000396000f3fe6080604052600436106102ff5760003560e01c8063855e8e4b11610190578063bfb6e0e7116100dc578063d67a88ed11610095578063e6fd48bc1161006f578063e6fd48bc14610af5578063e985e9c514610b20578063f2fde38b14610b5d578063f405748114610b86576102ff565b8063d67a88ed14610a7a578063d8b8670b14610aa3578063e0a8085314610acc576102ff565b8063bfb6e0e714610975578063c87b56dd146109a0578063ca0ac2fe146109dd578063cbf099c514610a08578063d2cab05614610a33578063d5abeb0114610a4f576102ff565b80639d5aef3011610149578063a45ba8e711610123578063a45ba8e7146108cd578063b47fbd17146108f8578063b88d4fde14610923578063bd32fb661461094c576102ff565b80639d5aef30146108525780639ddb6ab61461087b578063a22cb465146108a4576102ff565b8063855e8e4b146107545780638a1e723e1461077d5780638bcdfa1d146107a85780638da5cb5b146107d357806395d89b41146107fe57806397e7db2014610829576102ff565b806342842e0e1161024f5780636308ae65116102085780636f8b44b0116101e25780636f8b44b0146106ae57806370a08231146106d7578063715018a6146107145780637f00c7a61461072b576102ff565b80636308ae651461061b5780636352211e146106465780636aa981c314610683576102ff565b806342842e0e1461052157806344a0d68a1461054a5780634fdd43cb14610573578063518302271461059c578063539840f1146105c757806355f804b3146105f2576102ff565b8063239c70ae116102bc57806329ec5a301161029657806329ec5a30146104a75780632eb4a7ab146104d05780633ccfd60b146104fb57806340c10f1914610505576102ff565b8063239c70ae1461042857806323b872dd1461045357806324e2c53a1461047c576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a957806313faede6146103d257806318160ddd146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613707565b610baf565b6040516103389190613e1a565b60405180910390f35b34801561034d57600080fd5b50610356610c41565b6040516103639190613e50565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e91906137aa565b610cd3565b6040516103a09190613db3565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190613624565b610d4f565b005b3480156103de57600080fd5b506103e7610e90565b6040516103f49190614132565b60405180910390f35b34801561040957600080fd5b50610412610e96565b60405161041f9190614132565b60405180910390f35b34801561043457600080fd5b5061043d610ead565b60405161044a9190614132565b60405180910390f35b34801561045f57600080fd5b5061047a6004803603810190610475919061350e565b610eb3565b005b34801561048857600080fd5b506104916111d8565b60405161049e9190614132565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613893565b6111de565b005b3480156104dc57600080fd5b506104e56111f8565b6040516104f29190613e35565b60405180910390f35b6105036111fe565b005b61051f600480360381019061051a9190613624565b611286565b005b34801561052d57600080fd5b506105486004803603810190610543919061350e565b611419565b005b34801561055657600080fd5b50610571600480360381019061056c91906137aa565b611439565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613761565b61144b565b005b3480156105a857600080fd5b506105b161146d565b6040516105be9190613e1a565b60405180910390f35b3480156105d357600080fd5b506105dc611480565b6040516105e99190614132565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613761565b611486565b005b34801561062757600080fd5b506106306114a8565b60405161063d9190614132565b60405180910390f35b34801561065257600080fd5b5061066d600480360381019061066891906137aa565b6114ae565b60405161067a9190613db3565b60405180910390f35b34801561068f57600080fd5b506106986114c0565b6040516106a59190614132565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d091906137aa565b6114c6565b005b3480156106e357600080fd5b506106fe60048036038101906106f991906134a1565b6114d8565b60405161070b9190614132565b60405180910390f35b34801561072057600080fd5b50610729611591565b005b34801561073757600080fd5b50610752600480360381019061074d91906137aa565b6115a5565b005b34801561076057600080fd5b5061077b60048036038101906107769190613761565b6115b7565b005b34801561078957600080fd5b506107926115d9565b60405161079f9190614132565b60405180910390f35b3480156107b457600080fd5b506107bd6115df565b6040516107ca9190613e1a565b60405180910390f35b3480156107df57600080fd5b506107e86115f2565b6040516107f59190613db3565b60405180910390f35b34801561080a57600080fd5b5061081361161c565b6040516108209190613e50565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613664565b6116ae565b005b34801561085e57600080fd5b50610879600480360381019061087491906137aa565b611826565b005b34801561088757600080fd5b506108a2600480360381019061089d9190613893565b6118b8565b005b3480156108b057600080fd5b506108cb60048036038101906108c691906135e4565b6118d2565b005b3480156108d957600080fd5b506108e2611a4a565b6040516108ef9190613e50565b60405180910390f35b34801561090457600080fd5b5061090d611ad8565b60405161091a9190614132565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613561565b611ade565b005b34801561095857600080fd5b50610973600480360381019061096e91906136da565b611b51565b005b34801561098157600080fd5b5061098a611b63565b6040516109979190614132565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c291906137aa565b611b69565b6040516109d49190613e50565b60405180910390f35b3480156109e957600080fd5b506109f2611e26565b6040516109ff9190614132565b60405180910390f35b348015610a1457600080fd5b50610a1d611e2c565b604051610a2a9190614132565b60405180910390f35b610a4d6004803603810190610a4891906137d7565b611e32565b005b348015610a5b57600080fd5b50610a646120b1565b604051610a719190614132565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c9190613837565b6120b7565b005b348015610aaf57600080fd5b50610aca6004803603810190610ac591906137aa565b61230c565b005b348015610ad857600080fd5b50610af36004803603810190610aee91906136ad565b612334565b005b348015610b0157600080fd5b50610b0a612359565b604051610b179190614132565b60405180910390f35b348015610b2c57600080fd5b50610b476004803603810190610b4291906134ce565b61235f565b604051610b549190613e1a565b60405180910390f35b348015610b6957600080fd5b50610b846004803603810190610b7f91906134a1565b6123f3565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906136ad565b612477565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610c5090614423565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90614423565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b5050505050905090565b6000610cde8261249c565b610d14576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5a826114ae565b90508073ffffffffffffffffffffffffffffffffffffffff16610d7b6124fb565b73ffffffffffffffffffffffffffffffffffffffff1614610dde57610da781610da26124fb565b61235f565b610ddd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610ea0612503565b6001546000540303905090565b60135481565b6000610ebe82612508565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f25576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f31846125d6565b91509150610f478187610f426124fb565b6125f8565b610f9357610f5c86610f576124fb565b61235f565b610f92576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ffa576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611007868686600161263c565b801561101257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110e0856110bc888887612642565b7c02000000000000000000000000000000000000000000000000000000001761266a565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611168576000600185019050600060046000838152602001908152602001600020541415611166576000548114611165578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111d08686866001612695565b505050505050565b60115481565b6111e661269b565b81601a8190555080601b819055505050565b60175481565b61120661269b565b60006112106115f2565b73ffffffffffffffffffffffffffffffffffffffff164760405161123390613d9e565b60006040518083038185875af1925050503d8060008114611270576040519150601f19603f3d011682016040523d82523d6000602084013e611275565b606091505b505090508061128357600080fd5b50565b60195442116112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c1906140f2565b60405180910390fd5b601660009054906101000a900460ff161561131a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611311906140b2565b60405180910390fd5b6000611324610e96565b9050600c548282611335919061424e565b1115611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90614072565b60405180910390fd5b6013548211156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290613e92565b60405180910390fd5b81600b546113c991906142d5565b341461140a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611401906140d2565b60405180910390fd5b6114148383612719565b505050565b61143483838360405180602001604052806000815250611ade565b505050565b61144161269b565b80600b8190555050565b61145361269b565b80601290805190602001906114699291906131ac565b5050565b601c60009054906101000a900460ff1681565b600f5481565b61148e61269b565b80600990805190602001906114a49291906131ac565b5050565b60105481565b60006114b982612508565b9050919050565b600e5481565b6114ce61269b565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611540576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61159961269b565b6115a36000612737565b565b6115ad61269b565b8060138190555050565b6115bf61269b565b80600a90805190602001906115d59291906131ac565b5050565b601a5481565b601660009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461162b90614423565b80601f016020809104026020016040519081016040528092919081815260200182805461165790614423565b80156116a45780601f10611679576101008083540402835291602001916116a4565b820191906000526020600020905b81548152906001019060200180831161168757829003601f168201915b5050505050905090565b600e5460016011546116c0919061424e565b1115611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613f52565b60405180910390fd5b6002815114611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90613fd2565b60405180910390fd5b60005b81518110156117e557600c54828281518110611767576117666145bb565b5b6020026020010151116117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613f72565b60405180910390fd5b6117d28282815181106117c5576117c46145bb565b5b60200260200101516127fd565b80806117dd90614486565b915050611748565b506002601060008282546117f9919061432f565b925050819055506011600081548092919061181390614486565b9190505550611823336001612719565b50565b61182e61269b565b6000611838610e96565b90506014548282611849919061424e565b111561188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188190613f12565b60405180910390fd5b6118943383612719565b60145482826118a3919061424e565b14156118b4576118b360006127fd565b5b5050565b6118c061269b565b81600d8190555080600e819055505050565b6118da6124fb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061194c6124fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119f96124fb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a3e9190613e1a565b60405180910390a35050565b60128054611a5790614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8390614423565b8015611ad05780601f10611aa557610100808354040283529160200191611ad0565b820191906000526020600020905b815481529060010190602001808311611ab357829003601f168201915b505050505081565b60145481565b611ae9848484610eb3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b4b57611b148484848461280b565b611b4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b5961269b565b8060178190555050565b60195481565b6060611b748261249c565b611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90613e72565b60405180910390fd5b60001515601c60009054906101000a900460ff1615151415611c615760128054611bdc90614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890614423565b8015611c555780601f10611c2a57610100808354040283529160200191611c55565b820191906000526020600020905b815481529060010190602001808311611c3857829003601f168201915b50505050509050611e21565b6000601560008481526020019081526020016000208054611c8190614423565b90501415611d82576060600c548311611ca357611c9c61296b565b9050611d31565b600a8054611cb090614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdc90614423565b8015611d295780601f10611cfe57610100808354040283529160200191611d29565b820191906000526020600020905b815481529060010190602001808311611d0c57829003601f168201915b505050505090505b6000815111611d4f5760405180602001604052806000815250611d7a565b80611d59846129fd565b604051602001611d6a929190613d6f565b6040516020818303038152906040525b915050611e21565b601560008381526020019081526020016000208054611da090614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611dcc90614423565b8015611e195780601f10611dee57610100808354040283529160200191611e19565b820191906000526020600020905b815481529060010190602001808311611dfc57829003601f168201915b505050505090505b919050565b600d5481565b601b5481565b6000611e3c610e96565b9050601660009054906101000a900460ff1615611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8590613fb2565b60405180910390fd5b601854421015611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca90614012565b60405180910390fd5b601954421115611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90614052565b60405180910390fd5b600c548482611f27919061424e565b1115611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90614032565b60405180910390fd5b600f5484611f7533612b5e565b611f7f919061424e565b1115611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614112565b60405180910390fd5b612013611fcc33612bb5565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612be5565b612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613eb2565b60405180910390fd5b34600b548561206191906142d5565b146120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890613f32565b60405180910390fd5b6120ab3385612719565b50505050565b600c5481565b601660009054906101000a900460ff1680156120dc5750600c546120d9610e96565b10155b61211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290614092565b60405180910390fd5b600182148061212a5750600282145b612169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216090613f92565b60405180910390fd5b600182141561223f57601a5481511461218157600080fd5b600d546001601054612193919061424e565b11156121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb90613ef2565b60405180910390fd5b60005b8151811015612216576122038282815181106121f6576121f56145bb565b5b60200260200101516127fd565b808061220e90614486565b9150506121d7565b506010600081548092919061222a90614486565b919050555061223a336001612719565b612308565b601b5481511461224e57600080fd5b600e546001601154612260919061424e565b11156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613f52565b60405180910390fd5b60005b81518110156122e3576122d08282815181106122c3576122c26145bb565b5b60200260200101516127fd565b80806122db90614486565b9150506122a4565b50601160008154809291906122f790614486565b9190505550612307336001612719565b5b5050565b61231461269b565b8060188190555061384060185461232b919061424e565b60198190555050565b61233c61269b565b80601c60006101000a81548160ff02191690831515021790555050565b60185481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123fb61269b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246290613ed2565b60405180910390fd5b61247481612737565b50565b61247f61269b565b80601660006101000a81548160ff02191690831515021790555050565b6000816124a7612503565b111580156124b6575060005482105b80156124f4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612517612503565b1161259f5760005481101561259e5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561259c575b6000811415612592576004600083600190039350838152602001908152602001600020549050612567565b80925050506125d1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612659868684612bfc565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6126a3612c05565b73ffffffffffffffffffffffffffffffffffffffff166126c16115f2565b73ffffffffffffffffffffffffffffffffffffffff1614612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90613ff2565b60405180910390fd5b565b612733828260405180602001604052806000815250612c0d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612808816000612caa565b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128316124fb565b8786866040518563ffffffff1660e01b81526004016128539493929190613dce565b602060405180830381600087803b15801561286d57600080fd5b505af192505050801561289e57506040513d601f19601f8201168201806040525081019061289b9190613734565b60015b612918573d80600081146128ce576040519150601f19603f3d011682016040523d82523d6000602084013e6128d3565b606091505b50600081511415612910576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461297a90614423565b80601f01602080910402602001604051908101604052809291908181526020018280546129a690614423565b80156129f35780601f106129c8576101008083540402835291602001916129f3565b820191906000526020600020905b8154815290600101906020018083116129d657829003601f168201915b5050505050905090565b60606000821415612a45576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b59565b600082905060005b60008214612a77578080612a6090614486565b915050600a82612a7091906142a4565b9150612a4d565b60008167ffffffffffffffff811115612a9357612a926145ea565b5b6040519080825280601f01601f191660200182016040528015612ac55781602001600182028036833780820191505090505b5090505b60008514612b5257600182612ade919061432f565b9150600a85612aed91906144fd565b6030612af9919061424e565b60f81b818381518110612b0f57612b0e6145bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b4b91906142a4565b9450612ac9565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600081604051602001612bc89190613d28565b604051602081830303815290604052805190602001209050919050565b6000612bf48260175485612efe565b905092915050565b60009392505050565b600033905090565b612c178383612f15565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ca557600080549050600083820390505b612c57600086838060010194508661280b565b612c8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c44578160005414612ca257600080fd5b50505b505050565b6000612cb583612508565b90506000819050600080612cc8866125d6565b915091508415612d3157612ce48184612cdf6124fb565b6125f8565b612d3057612cf983612cf46124fb565b61235f565b612d2f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612d3f83600088600161263c565b8015612d4a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612df283612daf85600088612642565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761266a565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415612e7a576000600187019050600060046000838152602001908152602001600020541415612e78576000548114612e77578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ee4836000886001612695565b600160008154809291906001019190505550505050505050565b600082612f0b85846130e9565b1490509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f82576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612fbd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fca600084838561263c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613041836130326000866000612642565b61303b8561319c565b1761266a565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613065578060008190555050506130e46000848385612695565b505050565b60008082905060005b84518110156131915760008582815181106131105761310f6145bb565b5b60200260200101519050808311613151578281604051602001613134929190613d43565b60405160208183030381529060405280519060200120925061317d565b8083604051602001613164929190613d43565b6040516020818303038152906040528051906020012092505b50808061318990614486565b9150506130f2565b508091505092915050565b60006001821460e11b9050919050565b8280546131b890614423565b90600052602060002090601f0160209004810192826131da5760008555613221565b82601f106131f357805160ff1916838001178555613221565b82800160010185558215613221579182015b82811115613220578251825591602001919060010190613205565b5b50905061322e9190613232565b5090565b5b8082111561324b576000816000905550600101613233565b5090565b600061326261325d84614172565b61414d565b9050808382526020820190508285602086028201111561328557613284614623565b5b60005b858110156132b5578161329b888261348c565b845260208401935060208301925050600181019050613288565b5050509392505050565b60006132d26132cd8461419e565b61414d565b9050828152602081018484840111156132ee576132ed614628565b5b6132f98482856143e1565b509392505050565b600061331461330f846141cf565b61414d565b9050828152602081018484840111156133305761332f614628565b5b61333b8482856143e1565b509392505050565b60008135905061335281614a53565b92915050565b60008083601f84011261336e5761336d61461e565b5b8235905067ffffffffffffffff81111561338b5761338a614619565b5b6020830191508360208202830111156133a7576133a6614623565b5b9250929050565b600082601f8301126133c3576133c261461e565b5b81356133d384826020860161324f565b91505092915050565b6000813590506133eb81614a6a565b92915050565b60008135905061340081614a81565b92915050565b60008135905061341581614a98565b92915050565b60008151905061342a81614a98565b92915050565b600082601f8301126134455761344461461e565b5b81356134558482602086016132bf565b91505092915050565b600082601f8301126134735761347261461e565b5b8135613483848260208601613301565b91505092915050565b60008135905061349b81614aaf565b92915050565b6000602082840312156134b7576134b6614632565b5b60006134c584828501613343565b91505092915050565b600080604083850312156134e5576134e4614632565b5b60006134f385828601613343565b925050602061350485828601613343565b9150509250929050565b60008060006060848603121561352757613526614632565b5b600061353586828701613343565b935050602061354686828701613343565b92505060406135578682870161348c565b9150509250925092565b6000806000806080858703121561357b5761357a614632565b5b600061358987828801613343565b945050602061359a87828801613343565b93505060406135ab8782880161348c565b925050606085013567ffffffffffffffff8111156135cc576135cb61462d565b5b6135d887828801613430565b91505092959194509250565b600080604083850312156135fb576135fa614632565b5b600061360985828601613343565b925050602061361a858286016133dc565b9150509250929050565b6000806040838503121561363b5761363a614632565b5b600061364985828601613343565b925050602061365a8582860161348c565b9150509250929050565b60006020828403121561367a57613679614632565b5b600082013567ffffffffffffffff8111156136985761369761462d565b5b6136a4848285016133ae565b91505092915050565b6000602082840312156136c3576136c2614632565b5b60006136d1848285016133dc565b91505092915050565b6000602082840312156136f0576136ef614632565b5b60006136fe848285016133f1565b91505092915050565b60006020828403121561371d5761371c614632565b5b600061372b84828501613406565b91505092915050565b60006020828403121561374a57613749614632565b5b60006137588482850161341b565b91505092915050565b60006020828403121561377757613776614632565b5b600082013567ffffffffffffffff8111156137955761379461462d565b5b6137a18482850161345e565b91505092915050565b6000602082840312156137c0576137bf614632565b5b60006137ce8482850161348c565b91505092915050565b6000806000604084860312156137f0576137ef614632565b5b60006137fe8682870161348c565b935050602084013567ffffffffffffffff81111561381f5761381e61462d565b5b61382b86828701613358565b92509250509250925092565b6000806040838503121561384e5761384d614632565b5b600061385c8582860161348c565b925050602083013567ffffffffffffffff81111561387d5761387c61462d565b5b613889858286016133ae565b9150509250929050565b600080604083850312156138aa576138a9614632565b5b60006138b88582860161348c565b92505060206138c98582860161348c565b9150509250929050565b6138dc81614363565b82525050565b6138f36138ee82614363565b6144cf565b82525050565b61390281614375565b82525050565b61391181614381565b82525050565b61392861392382614381565b6144e1565b82525050565b600061393982614200565b6139438185614216565b93506139538185602086016143f0565b61395c81614637565b840191505092915050565b60006139728261420b565b61397c8185614232565b935061398c8185602086016143f0565b61399581614637565b840191505092915050565b60006139ab8261420b565b6139b58185614243565b93506139c58185602086016143f0565b80840191505092915050565b60006139de601f83614232565b91506139e982614655565b602082019050919050565b6000613a01601883614232565b9150613a0c8261467e565b602082019050919050565b6000613a24601a83614232565b9150613a2f826146a7565b602082019050919050565b6000613a47602683614232565b9150613a52826146d0565b604082019050919050565b6000613a6a601383614232565b9150613a758261471f565b602082019050919050565b6000613a8d602283614232565b9150613a9882614748565b604082019050919050565b6000613ab0601783614232565b9150613abb82614797565b602082019050919050565b6000613ad3601183614232565b9150613ade826147c0565b602082019050919050565b6000613af6600d83614232565b9150613b01826147e9565b602082019050919050565b6000613b19600f83614232565b9150613b2482614812565b602082019050919050565b6000613b3c600583614243565b9150613b478261483b565b600582019050919050565b6000613b5f601583614232565b9150613b6a82614864565b602082019050919050565b6000613b82601383614232565b9150613b8d8261488d565b602082019050919050565b6000613ba5602083614232565b9150613bb0826148b6565b602082019050919050565b6000613bc8601783614232565b9150613bd3826148df565b602082019050919050565b6000613beb601383614232565b9150613bf682614908565b602082019050919050565b6000613c0e601783614232565b9150613c1982614931565b602082019050919050565b6000613c31601e83614232565b9150613c3c8261495a565b602082019050919050565b6000613c54600083614227565b9150613c5f82614983565b600082019050919050565b6000613c77601883614232565b9150613c8282614986565b602082019050919050565b6000613c9a601483614232565b9150613ca5826149af565b602082019050919050565b6000613cbd601383614232565b9150613cc8826149d8565b602082019050919050565b6000613ce0601e83614232565b9150613ceb82614a01565b602082019050919050565b6000613d03601a83614232565b9150613d0e82614a2a565b602082019050919050565b613d22816143d7565b82525050565b6000613d3482846138e2565b60148201915081905092915050565b6000613d4f8285613917565b602082019150613d5f8284613917565b6020820191508190509392505050565b6000613d7b82856139a0565b9150613d8782846139a0565b9150613d9282613b2f565b91508190509392505050565b6000613da982613c47565b9150819050919050565b6000602082019050613dc860008301846138d3565b92915050565b6000608082019050613de360008301876138d3565b613df060208301866138d3565b613dfd6040830185613d19565b8181036060830152613e0f818461392e565b905095945050505050565b6000602082019050613e2f60008301846138f9565b92915050565b6000602082019050613e4a6000830184613908565b92915050565b60006020820190508181036000830152613e6a8184613967565b905092915050565b60006020820190508181036000830152613e8b816139d1565b9050919050565b60006020820190508181036000830152613eab816139f4565b9050919050565b60006020820190508181036000830152613ecb81613a17565b9050919050565b60006020820190508181036000830152613eeb81613a3a565b9050919050565b60006020820190508181036000830152613f0b81613a5d565b9050919050565b60006020820190508181036000830152613f2b81613a80565b9050919050565b60006020820190508181036000830152613f4b81613aa3565b9050919050565b60006020820190508181036000830152613f6b81613ac6565b9050919050565b60006020820190508181036000830152613f8b81613ae9565b9050919050565b60006020820190508181036000830152613fab81613b0c565b9050919050565b60006020820190508181036000830152613fcb81613b52565b9050919050565b60006020820190508181036000830152613feb81613b75565b9050919050565b6000602082019050818103600083015261400b81613b98565b9050919050565b6000602082019050818103600083015261402b81613bbb565b9050919050565b6000602082019050818103600083015261404b81613bde565b9050919050565b6000602082019050818103600083015261406b81613c01565b9050919050565b6000602082019050818103600083015261408b81613c24565b9050919050565b600060208201905081810360008301526140ab81613c6a565b9050919050565b600060208201905081810360008301526140cb81613c8d565b9050919050565b600060208201905081810360008301526140eb81613cb0565b9050919050565b6000602082019050818103600083015261410b81613cd3565b9050919050565b6000602082019050818103600083015261412b81613cf6565b9050919050565b60006020820190506141476000830184613d19565b92915050565b6000614157614168565b90506141638282614455565b919050565b6000604051905090565b600067ffffffffffffffff82111561418d5761418c6145ea565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141b9576141b86145ea565b5b6141c282614637565b9050602081019050919050565b600067ffffffffffffffff8211156141ea576141e96145ea565b5b6141f382614637565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614259826143d7565b9150614264836143d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142995761429861452e565b5b828201905092915050565b60006142af826143d7565b91506142ba836143d7565b9250826142ca576142c961455d565b5b828204905092915050565b60006142e0826143d7565b91506142eb836143d7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143245761432361452e565b5b828202905092915050565b600061433a826143d7565b9150614345836143d7565b9250828210156143585761435761452e565b5b828203905092915050565b600061436e826143b7565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561440e5780820151818401526020810190506143f3565b8381111561441d576000848401525b50505050565b6000600282049050600182168061443b57607f821691505b6020821081141561444f5761444e61458c565b5b50919050565b61445e82614637565b810181811067ffffffffffffffff8211171561447d5761447c6145ea565b5b80604052505050565b6000614491826143d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144c4576144c361452e565b5b600182019050919050565b60006144da826144eb565b9050919050565b6000819050919050565b60006144f682614648565b9050919050565b6000614508826143d7565b9150614513836143d7565b9250826145235761452261455d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f45786365656473206d6178206d696e7420616d6f756e742e0000000000000000600082015250565b7f496e76616c6964204d65726b6c6520547265652070726f6f662e000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416c6c206d616e6167657273206d696e74656400000000000000000000000000600082015250565b7f4e6f7420656e6f75676820707265206d696e7461626c652065646974696f6e7360008201527f2021000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642066756e64732070726f76696465642e000000000000000000600082015250565b7f416c6c20626f73736573206d696e746564000000000000000000000000000000600082015250565b7f4e6f742061206d616e6167657200000000000000000000000000000000000000600082015250565b7f496e636f72726563742076616c75650000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f52656372756974656d656e74206973206f7665722e0000000000000000000000600082015250565b7f4e6f7420656e6f756768206d616e616765727300000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206861736e2774207374617274656420796574000000000000000000600082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f57686974656c6973742073616c65206973206f7665722e000000000000000000600082015250565b7f4e6f7420656e6f756768206d696e7461626c652065646974696f6e7320210000600082015250565b50565b7f436f7270206d696e74696e67206e6f7420737461727465640000000000000000600082015250565b7f52656372756974656d656e74206973206f766572000000000000000000000000600082015250565b7f496e636f7272656374204554482076616c756500000000000000000000000000600082015250565b7f5075626c69632073616c65206861736e27742073746172746564207965740000600082015250565b7f45786365656473206d6178207065722077686974656c6973742e000000000000600082015250565b614a5c81614363565b8114614a6757600080fd5b50565b614a7381614375565b8114614a7e57600080fd5b50565b614a8a81614381565b8114614a9557600080fd5b50565b614aa18161438b565b8114614aac57600080fd5b50565b614ab8816143d7565b8114614ac357600080fd5b5056fea2646970667358221220e45abe68e1c1600e9a73fdc43f7a3073d479d2e44843e8f5ddf0874914b4c2c364736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a5468653078666669636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5468653078666669636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f307866666963652e6d7970696e6174612e636c6f75642f697066732f516d503179313765666b47527542573746656a666e6e43646b6b35564632767231623756355263456868786478660000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c8063855e8e4b11610190578063bfb6e0e7116100dc578063d67a88ed11610095578063e6fd48bc1161006f578063e6fd48bc14610af5578063e985e9c514610b20578063f2fde38b14610b5d578063f405748114610b86576102ff565b8063d67a88ed14610a7a578063d8b8670b14610aa3578063e0a8085314610acc576102ff565b8063bfb6e0e714610975578063c87b56dd146109a0578063ca0ac2fe146109dd578063cbf099c514610a08578063d2cab05614610a33578063d5abeb0114610a4f576102ff565b80639d5aef3011610149578063a45ba8e711610123578063a45ba8e7146108cd578063b47fbd17146108f8578063b88d4fde14610923578063bd32fb661461094c576102ff565b80639d5aef30146108525780639ddb6ab61461087b578063a22cb465146108a4576102ff565b8063855e8e4b146107545780638a1e723e1461077d5780638bcdfa1d146107a85780638da5cb5b146107d357806395d89b41146107fe57806397e7db2014610829576102ff565b806342842e0e1161024f5780636308ae65116102085780636f8b44b0116101e25780636f8b44b0146106ae57806370a08231146106d7578063715018a6146107145780637f00c7a61461072b576102ff565b80636308ae651461061b5780636352211e146106465780636aa981c314610683576102ff565b806342842e0e1461052157806344a0d68a1461054a5780634fdd43cb14610573578063518302271461059c578063539840f1146105c757806355f804b3146105f2576102ff565b8063239c70ae116102bc57806329ec5a301161029657806329ec5a30146104a75780632eb4a7ab146104d05780633ccfd60b146104fb57806340c10f1914610505576102ff565b8063239c70ae1461042857806323b872dd1461045357806324e2c53a1461047c576102ff565b806301ffc9a71461030457806306fdde0314610341578063081812fc1461036c578063095ea7b3146103a957806313faede6146103d257806318160ddd146103fd575b600080fd5b34801561031057600080fd5b5061032b60048036038101906103269190613707565b610baf565b6040516103389190613e1a565b60405180910390f35b34801561034d57600080fd5b50610356610c41565b6040516103639190613e50565b60405180910390f35b34801561037857600080fd5b50610393600480360381019061038e91906137aa565b610cd3565b6040516103a09190613db3565b60405180910390f35b3480156103b557600080fd5b506103d060048036038101906103cb9190613624565b610d4f565b005b3480156103de57600080fd5b506103e7610e90565b6040516103f49190614132565b60405180910390f35b34801561040957600080fd5b50610412610e96565b60405161041f9190614132565b60405180910390f35b34801561043457600080fd5b5061043d610ead565b60405161044a9190614132565b60405180910390f35b34801561045f57600080fd5b5061047a6004803603810190610475919061350e565b610eb3565b005b34801561048857600080fd5b506104916111d8565b60405161049e9190614132565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190613893565b6111de565b005b3480156104dc57600080fd5b506104e56111f8565b6040516104f29190613e35565b60405180910390f35b6105036111fe565b005b61051f600480360381019061051a9190613624565b611286565b005b34801561052d57600080fd5b506105486004803603810190610543919061350e565b611419565b005b34801561055657600080fd5b50610571600480360381019061056c91906137aa565b611439565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613761565b61144b565b005b3480156105a857600080fd5b506105b161146d565b6040516105be9190613e1a565b60405180910390f35b3480156105d357600080fd5b506105dc611480565b6040516105e99190614132565b60405180910390f35b3480156105fe57600080fd5b5061061960048036038101906106149190613761565b611486565b005b34801561062757600080fd5b506106306114a8565b60405161063d9190614132565b60405180910390f35b34801561065257600080fd5b5061066d600480360381019061066891906137aa565b6114ae565b60405161067a9190613db3565b60405180910390f35b34801561068f57600080fd5b506106986114c0565b6040516106a59190614132565b60405180910390f35b3480156106ba57600080fd5b506106d560048036038101906106d091906137aa565b6114c6565b005b3480156106e357600080fd5b506106fe60048036038101906106f991906134a1565b6114d8565b60405161070b9190614132565b60405180910390f35b34801561072057600080fd5b50610729611591565b005b34801561073757600080fd5b50610752600480360381019061074d91906137aa565b6115a5565b005b34801561076057600080fd5b5061077b60048036038101906107769190613761565b6115b7565b005b34801561078957600080fd5b506107926115d9565b60405161079f9190614132565b60405180910390f35b3480156107b457600080fd5b506107bd6115df565b6040516107ca9190613e1a565b60405180910390f35b3480156107df57600080fd5b506107e86115f2565b6040516107f59190613db3565b60405180910390f35b34801561080a57600080fd5b5061081361161c565b6040516108209190613e50565b60405180910390f35b34801561083557600080fd5b50610850600480360381019061084b9190613664565b6116ae565b005b34801561085e57600080fd5b50610879600480360381019061087491906137aa565b611826565b005b34801561088757600080fd5b506108a2600480360381019061089d9190613893565b6118b8565b005b3480156108b057600080fd5b506108cb60048036038101906108c691906135e4565b6118d2565b005b3480156108d957600080fd5b506108e2611a4a565b6040516108ef9190613e50565b60405180910390f35b34801561090457600080fd5b5061090d611ad8565b60405161091a9190614132565b60405180910390f35b34801561092f57600080fd5b5061094a60048036038101906109459190613561565b611ade565b005b34801561095857600080fd5b50610973600480360381019061096e91906136da565b611b51565b005b34801561098157600080fd5b5061098a611b63565b6040516109979190614132565b60405180910390f35b3480156109ac57600080fd5b506109c760048036038101906109c291906137aa565b611b69565b6040516109d49190613e50565b60405180910390f35b3480156109e957600080fd5b506109f2611e26565b6040516109ff9190614132565b60405180910390f35b348015610a1457600080fd5b50610a1d611e2c565b604051610a2a9190614132565b60405180910390f35b610a4d6004803603810190610a4891906137d7565b611e32565b005b348015610a5b57600080fd5b50610a646120b1565b604051610a719190614132565b60405180910390f35b348015610a8657600080fd5b50610aa16004803603810190610a9c9190613837565b6120b7565b005b348015610aaf57600080fd5b50610aca6004803603810190610ac591906137aa565b61230c565b005b348015610ad857600080fd5b50610af36004803603810190610aee91906136ad565b612334565b005b348015610b0157600080fd5b50610b0a612359565b604051610b179190614132565b60405180910390f35b348015610b2c57600080fd5b50610b476004803603810190610b4291906134ce565b61235f565b604051610b549190613e1a565b60405180910390f35b348015610b6957600080fd5b50610b846004803603810190610b7f91906134a1565b6123f3565b005b348015610b9257600080fd5b50610bad6004803603810190610ba891906136ad565b612477565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c0a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c3a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610c5090614423565b80601f0160208091040260200160405190810160405280929190818152602001828054610c7c90614423565b8015610cc95780601f10610c9e57610100808354040283529160200191610cc9565b820191906000526020600020905b815481529060010190602001808311610cac57829003601f168201915b5050505050905090565b6000610cde8261249c565b610d14576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d5a826114ae565b90508073ffffffffffffffffffffffffffffffffffffffff16610d7b6124fb565b73ffffffffffffffffffffffffffffffffffffffff1614610dde57610da781610da26124fb565b61235f565b610ddd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600b5481565b6000610ea0612503565b6001546000540303905090565b60135481565b6000610ebe82612508565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610f25576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610f31846125d6565b91509150610f478187610f426124fb565b6125f8565b610f9357610f5c86610f576124fb565b61235f565b610f92576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610ffa576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611007868686600161263c565b801561101257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506110e0856110bc888887612642565b7c02000000000000000000000000000000000000000000000000000000001761266a565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611168576000600185019050600060046000838152602001908152602001600020541415611166576000548114611165578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46111d08686866001612695565b505050505050565b60115481565b6111e661269b565b81601a8190555080601b819055505050565b60175481565b61120661269b565b60006112106115f2565b73ffffffffffffffffffffffffffffffffffffffff164760405161123390613d9e565b60006040518083038185875af1925050503d8060008114611270576040519150601f19603f3d011682016040523d82523d6000602084013e611275565b606091505b505090508061128357600080fd5b50565b60195442116112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c1906140f2565b60405180910390fd5b601660009054906101000a900460ff161561131a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611311906140b2565b60405180910390fd5b6000611324610e96565b9050600c548282611335919061424e565b1115611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d90614072565b60405180910390fd5b6013548211156113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290613e92565b60405180910390fd5b81600b546113c991906142d5565b341461140a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611401906140d2565b60405180910390fd5b6114148383612719565b505050565b61143483838360405180602001604052806000815250611ade565b505050565b61144161269b565b80600b8190555050565b61145361269b565b80601290805190602001906114699291906131ac565b5050565b601c60009054906101000a900460ff1681565b600f5481565b61148e61269b565b80600990805190602001906114a49291906131ac565b5050565b60105481565b60006114b982612508565b9050919050565b600e5481565b6114ce61269b565b80600c8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611540576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61159961269b565b6115a36000612737565b565b6115ad61269b565b8060138190555050565b6115bf61269b565b80600a90805190602001906115d59291906131ac565b5050565b601a5481565b601660009054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461162b90614423565b80601f016020809104026020016040519081016040528092919081815260200182805461165790614423565b80156116a45780601f10611679576101008083540402835291602001916116a4565b820191906000526020600020905b81548152906001019060200180831161168757829003601f168201915b5050505050905090565b600e5460016011546116c0919061424e565b1115611701576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f890613f52565b60405180910390fd5b6002815114611745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173c90613fd2565b60405180910390fd5b60005b81518110156117e557600c54828281518110611767576117666145bb565b5b6020026020010151116117af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a690613f72565b60405180910390fd5b6117d28282815181106117c5576117c46145bb565b5b60200260200101516127fd565b80806117dd90614486565b915050611748565b506002601060008282546117f9919061432f565b925050819055506011600081548092919061181390614486565b9190505550611823336001612719565b50565b61182e61269b565b6000611838610e96565b90506014548282611849919061424e565b111561188a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188190613f12565b60405180910390fd5b6118943383612719565b60145482826118a3919061424e565b14156118b4576118b360006127fd565b5b5050565b6118c061269b565b81600d8190555080600e819055505050565b6118da6124fb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561193f576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061194c6124fb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119f96124fb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a3e9190613e1a565b60405180910390a35050565b60128054611a5790614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8390614423565b8015611ad05780601f10611aa557610100808354040283529160200191611ad0565b820191906000526020600020905b815481529060010190602001808311611ab357829003601f168201915b505050505081565b60145481565b611ae9848484610eb3565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b4b57611b148484848461280b565b611b4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b5961269b565b8060178190555050565b60195481565b6060611b748261249c565b611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90613e72565b60405180910390fd5b60001515601c60009054906101000a900460ff1615151415611c615760128054611bdc90614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611c0890614423565b8015611c555780601f10611c2a57610100808354040283529160200191611c55565b820191906000526020600020905b815481529060010190602001808311611c3857829003601f168201915b50505050509050611e21565b6000601560008481526020019081526020016000208054611c8190614423565b90501415611d82576060600c548311611ca357611c9c61296b565b9050611d31565b600a8054611cb090614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611cdc90614423565b8015611d295780601f10611cfe57610100808354040283529160200191611d29565b820191906000526020600020905b815481529060010190602001808311611d0c57829003601f168201915b505050505090505b6000815111611d4f5760405180602001604052806000815250611d7a565b80611d59846129fd565b604051602001611d6a929190613d6f565b6040516020818303038152906040525b915050611e21565b601560008381526020019081526020016000208054611da090614423565b80601f0160208091040260200160405190810160405280929190818152602001828054611dcc90614423565b8015611e195780601f10611dee57610100808354040283529160200191611e19565b820191906000526020600020905b815481529060010190602001808311611dfc57829003601f168201915b505050505090505b919050565b600d5481565b601b5481565b6000611e3c610e96565b9050601660009054906101000a900460ff1615611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8590613fb2565b60405180910390fd5b601854421015611ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eca90614012565b60405180910390fd5b601954421115611f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0f90614052565b60405180910390fd5b600c548482611f27919061424e565b1115611f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5f90614032565b60405180910390fd5b600f5484611f7533612b5e565b611f7f919061424e565b1115611fc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb790614112565b60405180910390fd5b612013611fcc33612bb5565b848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050612be5565b612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613eb2565b60405180910390fd5b34600b548561206191906142d5565b146120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890613f32565b60405180910390fd5b6120ab3385612719565b50505050565b600c5481565b601660009054906101000a900460ff1680156120dc5750600c546120d9610e96565b10155b61211b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211290614092565b60405180910390fd5b600182148061212a5750600282145b612169576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216090613f92565b60405180910390fd5b600182141561223f57601a5481511461218157600080fd5b600d546001601054612193919061424e565b11156121d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cb90613ef2565b60405180910390fd5b60005b8151811015612216576122038282815181106121f6576121f56145bb565b5b60200260200101516127fd565b808061220e90614486565b9150506121d7565b506010600081548092919061222a90614486565b919050555061223a336001612719565b612308565b601b5481511461224e57600080fd5b600e546001601154612260919061424e565b11156122a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229890613f52565b60405180910390fd5b60005b81518110156122e3576122d08282815181106122c3576122c26145bb565b5b60200260200101516127fd565b80806122db90614486565b9150506122a4565b50601160008154809291906122f790614486565b9190505550612307336001612719565b5b5050565b61231461269b565b8060188190555061384060185461232b919061424e565b60198190555050565b61233c61269b565b80601c60006101000a81548160ff02191690831515021790555050565b60185481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123fb61269b565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561246b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246290613ed2565b60405180910390fd5b61247481612737565b50565b61247f61269b565b80601660006101000a81548160ff02191690831515021790555050565b6000816124a7612503565b111580156124b6575060005482105b80156124f4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080612517612503565b1161259f5760005481101561259e5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561259c575b6000811415612592576004600083600190039350838152602001908152602001600020549050612567565b80925050506125d1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612659868684612bfc565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6126a3612c05565b73ffffffffffffffffffffffffffffffffffffffff166126c16115f2565b73ffffffffffffffffffffffffffffffffffffffff1614612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e90613ff2565b60405180910390fd5b565b612733828260405180602001604052806000815250612c0d565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612808816000612caa565b50565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128316124fb565b8786866040518563ffffffff1660e01b81526004016128539493929190613dce565b602060405180830381600087803b15801561286d57600080fd5b505af192505050801561289e57506040513d601f19601f8201168201806040525081019061289b9190613734565b60015b612918573d80600081146128ce576040519150601f19603f3d011682016040523d82523d6000602084013e6128d3565b606091505b50600081511415612910576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606009805461297a90614423565b80601f01602080910402602001604051908101604052809291908181526020018280546129a690614423565b80156129f35780601f106129c8576101008083540402835291602001916129f3565b820191906000526020600020905b8154815290600101906020018083116129d657829003601f168201915b5050505050905090565b60606000821415612a45576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b59565b600082905060005b60008214612a77578080612a6090614486565b915050600a82612a7091906142a4565b9150612a4d565b60008167ffffffffffffffff811115612a9357612a926145ea565b5b6040519080825280601f01601f191660200182016040528015612ac55781602001600182028036833780820191505090505b5090505b60008514612b5257600182612ade919061432f565b9150600a85612aed91906144fd565b6030612af9919061424e565b60f81b818381518110612b0f57612b0e6145bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b4b91906142a4565b9450612ac9565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600081604051602001612bc89190613d28565b604051602081830303815290604052805190602001209050919050565b6000612bf48260175485612efe565b905092915050565b60009392505050565b600033905090565b612c178383612f15565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ca557600080549050600083820390505b612c57600086838060010194508661280b565b612c8d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612c44578160005414612ca257600080fd5b50505b505050565b6000612cb583612508565b90506000819050600080612cc8866125d6565b915091508415612d3157612ce48184612cdf6124fb565b6125f8565b612d3057612cf983612cf46124fb565b61235f565b612d2f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612d3f83600088600161263c565b8015612d4a57600082555b600160806001901b03600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612df283612daf85600088612642565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761266a565b600460008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085161415612e7a576000600187019050600060046000838152602001908152602001600020541415612e78576000548114612e77578460046000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ee4836000886001612695565b600160008154809291906001019190505550505050505050565b600082612f0b85846130e9565b1490509392505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f82576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612fbd576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612fca600084838561263c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613041836130326000866000612642565b61303b8561319c565b1761266a565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613065578060008190555050506130e46000848385612695565b505050565b60008082905060005b84518110156131915760008582815181106131105761310f6145bb565b5b60200260200101519050808311613151578281604051602001613134929190613d43565b60405160208183030381529060405280519060200120925061317d565b8083604051602001613164929190613d43565b6040516020818303038152906040528051906020012092505b50808061318990614486565b9150506130f2565b508091505092915050565b60006001821460e11b9050919050565b8280546131b890614423565b90600052602060002090601f0160209004810192826131da5760008555613221565b82601f106131f357805160ff1916838001178555613221565b82800160010185558215613221579182015b82811115613220578251825591602001919060010190613205565b5b50905061322e9190613232565b5090565b5b8082111561324b576000816000905550600101613233565b5090565b600061326261325d84614172565b61414d565b9050808382526020820190508285602086028201111561328557613284614623565b5b60005b858110156132b5578161329b888261348c565b845260208401935060208301925050600181019050613288565b5050509392505050565b60006132d26132cd8461419e565b61414d565b9050828152602081018484840111156132ee576132ed614628565b5b6132f98482856143e1565b509392505050565b600061331461330f846141cf565b61414d565b9050828152602081018484840111156133305761332f614628565b5b61333b8482856143e1565b509392505050565b60008135905061335281614a53565b92915050565b60008083601f84011261336e5761336d61461e565b5b8235905067ffffffffffffffff81111561338b5761338a614619565b5b6020830191508360208202830111156133a7576133a6614623565b5b9250929050565b600082601f8301126133c3576133c261461e565b5b81356133d384826020860161324f565b91505092915050565b6000813590506133eb81614a6a565b92915050565b60008135905061340081614a81565b92915050565b60008135905061341581614a98565b92915050565b60008151905061342a81614a98565b92915050565b600082601f8301126134455761344461461e565b5b81356134558482602086016132bf565b91505092915050565b600082601f8301126134735761347261461e565b5b8135613483848260208601613301565b91505092915050565b60008135905061349b81614aaf565b92915050565b6000602082840312156134b7576134b6614632565b5b60006134c584828501613343565b91505092915050565b600080604083850312156134e5576134e4614632565b5b60006134f385828601613343565b925050602061350485828601613343565b9150509250929050565b60008060006060848603121561352757613526614632565b5b600061353586828701613343565b935050602061354686828701613343565b92505060406135578682870161348c565b9150509250925092565b6000806000806080858703121561357b5761357a614632565b5b600061358987828801613343565b945050602061359a87828801613343565b93505060406135ab8782880161348c565b925050606085013567ffffffffffffffff8111156135cc576135cb61462d565b5b6135d887828801613430565b91505092959194509250565b600080604083850312156135fb576135fa614632565b5b600061360985828601613343565b925050602061361a858286016133dc565b9150509250929050565b6000806040838503121561363b5761363a614632565b5b600061364985828601613343565b925050602061365a8582860161348c565b9150509250929050565b60006020828403121561367a57613679614632565b5b600082013567ffffffffffffffff8111156136985761369761462d565b5b6136a4848285016133ae565b91505092915050565b6000602082840312156136c3576136c2614632565b5b60006136d1848285016133dc565b91505092915050565b6000602082840312156136f0576136ef614632565b5b60006136fe848285016133f1565b91505092915050565b60006020828403121561371d5761371c614632565b5b600061372b84828501613406565b91505092915050565b60006020828403121561374a57613749614632565b5b60006137588482850161341b565b91505092915050565b60006020828403121561377757613776614632565b5b600082013567ffffffffffffffff8111156137955761379461462d565b5b6137a18482850161345e565b91505092915050565b6000602082840312156137c0576137bf614632565b5b60006137ce8482850161348c565b91505092915050565b6000806000604084860312156137f0576137ef614632565b5b60006137fe8682870161348c565b935050602084013567ffffffffffffffff81111561381f5761381e61462d565b5b61382b86828701613358565b92509250509250925092565b6000806040838503121561384e5761384d614632565b5b600061385c8582860161348c565b925050602083013567ffffffffffffffff81111561387d5761387c61462d565b5b613889858286016133ae565b9150509250929050565b600080604083850312156138aa576138a9614632565b5b60006138b88582860161348c565b92505060206138c98582860161348c565b9150509250929050565b6138dc81614363565b82525050565b6138f36138ee82614363565b6144cf565b82525050565b61390281614375565b82525050565b61391181614381565b82525050565b61392861392382614381565b6144e1565b82525050565b600061393982614200565b6139438185614216565b93506139538185602086016143f0565b61395c81614637565b840191505092915050565b60006139728261420b565b61397c8185614232565b935061398c8185602086016143f0565b61399581614637565b840191505092915050565b60006139ab8261420b565b6139b58185614243565b93506139c58185602086016143f0565b80840191505092915050565b60006139de601f83614232565b91506139e982614655565b602082019050919050565b6000613a01601883614232565b9150613a0c8261467e565b602082019050919050565b6000613a24601a83614232565b9150613a2f826146a7565b602082019050919050565b6000613a47602683614232565b9150613a52826146d0565b604082019050919050565b6000613a6a601383614232565b9150613a758261471f565b602082019050919050565b6000613a8d602283614232565b9150613a9882614748565b604082019050919050565b6000613ab0601783614232565b9150613abb82614797565b602082019050919050565b6000613ad3601183614232565b9150613ade826147c0565b602082019050919050565b6000613af6600d83614232565b9150613b01826147e9565b602082019050919050565b6000613b19600f83614232565b9150613b2482614812565b602082019050919050565b6000613b3c600583614243565b9150613b478261483b565b600582019050919050565b6000613b5f601583614232565b9150613b6a82614864565b602082019050919050565b6000613b82601383614232565b9150613b8d8261488d565b602082019050919050565b6000613ba5602083614232565b9150613bb0826148b6565b602082019050919050565b6000613bc8601783614232565b9150613bd3826148df565b602082019050919050565b6000613beb601383614232565b9150613bf682614908565b602082019050919050565b6000613c0e601783614232565b9150613c1982614931565b602082019050919050565b6000613c31601e83614232565b9150613c3c8261495a565b602082019050919050565b6000613c54600083614227565b9150613c5f82614983565b600082019050919050565b6000613c77601883614232565b9150613c8282614986565b602082019050919050565b6000613c9a601483614232565b9150613ca5826149af565b602082019050919050565b6000613cbd601383614232565b9150613cc8826149d8565b602082019050919050565b6000613ce0601e83614232565b9150613ceb82614a01565b602082019050919050565b6000613d03601a83614232565b9150613d0e82614a2a565b602082019050919050565b613d22816143d7565b82525050565b6000613d3482846138e2565b60148201915081905092915050565b6000613d4f8285613917565b602082019150613d5f8284613917565b6020820191508190509392505050565b6000613d7b82856139a0565b9150613d8782846139a0565b9150613d9282613b2f565b91508190509392505050565b6000613da982613c47565b9150819050919050565b6000602082019050613dc860008301846138d3565b92915050565b6000608082019050613de360008301876138d3565b613df060208301866138d3565b613dfd6040830185613d19565b8181036060830152613e0f818461392e565b905095945050505050565b6000602082019050613e2f60008301846138f9565b92915050565b6000602082019050613e4a6000830184613908565b92915050565b60006020820190508181036000830152613e6a8184613967565b905092915050565b60006020820190508181036000830152613e8b816139d1565b9050919050565b60006020820190508181036000830152613eab816139f4565b9050919050565b60006020820190508181036000830152613ecb81613a17565b9050919050565b60006020820190508181036000830152613eeb81613a3a565b9050919050565b60006020820190508181036000830152613f0b81613a5d565b9050919050565b60006020820190508181036000830152613f2b81613a80565b9050919050565b60006020820190508181036000830152613f4b81613aa3565b9050919050565b60006020820190508181036000830152613f6b81613ac6565b9050919050565b60006020820190508181036000830152613f8b81613ae9565b9050919050565b60006020820190508181036000830152613fab81613b0c565b9050919050565b60006020820190508181036000830152613fcb81613b52565b9050919050565b60006020820190508181036000830152613feb81613b75565b9050919050565b6000602082019050818103600083015261400b81613b98565b9050919050565b6000602082019050818103600083015261402b81613bbb565b9050919050565b6000602082019050818103600083015261404b81613bde565b9050919050565b6000602082019050818103600083015261406b81613c01565b9050919050565b6000602082019050818103600083015261408b81613c24565b9050919050565b600060208201905081810360008301526140ab81613c6a565b9050919050565b600060208201905081810360008301526140cb81613c8d565b9050919050565b600060208201905081810360008301526140eb81613cb0565b9050919050565b6000602082019050818103600083015261410b81613cd3565b9050919050565b6000602082019050818103600083015261412b81613cf6565b9050919050565b60006020820190506141476000830184613d19565b92915050565b6000614157614168565b90506141638282614455565b919050565b6000604051905090565b600067ffffffffffffffff82111561418d5761418c6145ea565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156141b9576141b86145ea565b5b6141c282614637565b9050602081019050919050565b600067ffffffffffffffff8211156141ea576141e96145ea565b5b6141f382614637565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614259826143d7565b9150614264836143d7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142995761429861452e565b5b828201905092915050565b60006142af826143d7565b91506142ba836143d7565b9250826142ca576142c961455d565b5b828204905092915050565b60006142e0826143d7565b91506142eb836143d7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156143245761432361452e565b5b828202905092915050565b600061433a826143d7565b9150614345836143d7565b9250828210156143585761435761452e565b5b828203905092915050565b600061436e826143b7565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561440e5780820151818401526020810190506143f3565b8381111561441d576000848401525b50505050565b6000600282049050600182168061443b57607f821691505b6020821081141561444f5761444e61458c565b5b50919050565b61445e82614637565b810181811067ffffffffffffffff8211171561447d5761447c6145ea565b5b80604052505050565b6000614491826143d7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144c4576144c361452e565b5b600182019050919050565b60006144da826144eb565b9050919050565b6000819050919050565b60006144f682614648565b9050919050565b6000614508826143d7565b9150614513836143d7565b9250826145235761452261455d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b7f45786365656473206d6178206d696e7420616d6f756e742e0000000000000000600082015250565b7f496e76616c6964204d65726b6c6520547265652070726f6f662e000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416c6c206d616e6167657273206d696e74656400000000000000000000000000600082015250565b7f4e6f7420656e6f75676820707265206d696e7461626c652065646974696f6e7360008201527f2021000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c69642066756e64732070726f76696465642e000000000000000000600082015250565b7f416c6c20626f73736573206d696e746564000000000000000000000000000000600082015250565b7f4e6f742061206d616e6167657200000000000000000000000000000000000000600082015250565b7f496e636f72726563742076616c75650000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f52656372756974656d656e74206973206f7665722e0000000000000000000000600082015250565b7f4e6f7420656e6f756768206d616e616765727300000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f53616c65206861736e2774207374617274656420796574000000000000000000600082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f57686974656c6973742073616c65206973206f7665722e000000000000000000600082015250565b7f4e6f7420656e6f756768206d696e7461626c652065646974696f6e7320210000600082015250565b50565b7f436f7270206d696e74696e67206e6f7420737461727465640000000000000000600082015250565b7f52656372756974656d656e74206973206f766572000000000000000000000000600082015250565b7f496e636f7272656374204554482076616c756500000000000000000000000000600082015250565b7f5075626c69632073616c65206861736e27742073746172746564207965740000600082015250565b7f45786365656473206d6178207065722077686974656c6973742e000000000000600082015250565b614a5c81614363565b8114614a6757600080fd5b50565b614a7381614375565b8114614a7e57600080fd5b50565b614a8a81614381565b8114614a9557600080fd5b50565b614aa18161438b565b8114614aac57600080fd5b50565b614ab8816143d7565b8114614ac357600080fd5b5056fea2646970667358221220e45abe68e1c1600e9a73fdc43f7a3073d479d2e44843e8f5ddf0874914b4c2c364736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000a5468653078666669636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a5468653078666669636500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f307866666963652e6d7970696e6174612e636c6f75642f697066732f516d503179313765666b47527542573746656a666e6e43646b6b35564632767231623756355263456868786478660000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): The0xffice
Arg [1] : _tokenSymbol (string): The0xffice
Arg [2] : _hiddenMetadataUri (string): https://0xffice.mypinata.cloud/ipfs/QmP1y17efkGRuBW7FejfnnCdkk5VF2vr1b7V5RcEhhxdxf

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [4] : 5468653078666669636500000000000000000000000000000000000000000000
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [6] : 5468653078666669636500000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [8] : 68747470733a2f2f307866666963652e6d7970696e6174612e636c6f75642f69
Arg [9] : 7066732f516d503179313765666b47527542573746656a666e6e43646b6b3556
Arg [10] : 4632767231623756355263456868786478660000000000000000000000000000


Deployed Bytecode Sourcemap

53073:9791:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22755:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28402:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30348:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29896:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53380:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21809:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53733:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39613:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53633:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58831:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53902:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62545:316;;;:::i;:::-;;55599:725;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31238:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57836:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62399:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54067:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53554:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59096:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53601:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28191:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53509:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58202:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23434:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7346:103;;;;;;;;;;;;;:::i;:::-;;58070:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59309:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53998:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53868:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6698:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28571:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60661:537;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56468:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58486:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30624:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53661:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53772:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31494:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54713:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53967:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61302:994;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53464:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54034:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56855:874;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53426:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59558:1095;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54509:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62304:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53934:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31003:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7604:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55151:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22755:615;22840:4;23155:10;23140:25;;:11;:25;;;;:102;;;;23232:10;23217:25;;:11;:25;;;;23140:102;:179;;;;23309:10;23294:25;;:11;:25;;;;23140:179;23120:199;;22755:615;;;:::o;28402:100::-;28456:13;28489:5;28482:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28402:100;:::o;30348:204::-;30416:7;30441:16;30449:7;30441;:16::i;:::-;30436:64;;30466:34;;;;;;;;;;;;;;30436:64;30520:15;:24;30536:7;30520:24;;;;;;;;;;;;;;;;;;;;;30513:31;;30348:204;;;:::o;29896:386::-;29969:13;29985:16;29993:7;29985;:16::i;:::-;29969:32;;30041:5;30018:28;;:19;:17;:19::i;:::-;:28;;;30014:175;;30066:44;30083:5;30090:19;:17;:19::i;:::-;30066:16;:44::i;:::-;30061:128;;30138:35;;;;;;;;;;;;;;30061:128;30014:175;30228:2;30201:15;:24;30217:7;30201:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30266:7;30262:2;30246:28;;30255:5;30246:28;;;;;;;;;;;;29958:324;29896:386;;:::o;53380:39::-;;;;:::o;21809:315::-;21862:7;22090:15;:13;:15::i;:::-;22075:12;;22059:13;;:28;:46;22052:53;;21809:315;:::o;53733:32::-;;;;:::o;39613:2800::-;39747:27;39777;39796:7;39777:18;:27::i;:::-;39747:57;;39862:4;39821:45;;39837:19;39821:45;;;39817:86;;39875:28;;;;;;;;;;;;;;39817:86;39917:27;39946:23;39973:28;39993:7;39973:19;:28::i;:::-;39916:85;;;;40101:62;40120:15;40137:4;40143:19;:17;:19::i;:::-;40101:18;:62::i;:::-;40096:174;;40183:43;40200:4;40206:19;:17;:19::i;:::-;40183:16;:43::i;:::-;40178:92;;40235:35;;;;;;;;;;;;;;40178:92;40096:174;40301:1;40287:16;;:2;:16;;;40283:52;;;40312:23;;;;;;;;;;;;;;40283:52;40348:43;40370:4;40376:2;40380:7;40389:1;40348:21;:43::i;:::-;40484:15;40481:160;;;40624:1;40603:19;40596:30;40481:160;41019:18;:24;41038:4;41019:24;;;;;;;;;;;;;;;;41017:26;;;;;;;;;;;;41088:18;:22;41107:2;41088:22;;;;;;;;;;;;;;;;41086:24;;;;;;;;;;;41410:145;41447:2;41495:45;41510:4;41516:2;41520:19;41495:14;:45::i;:::-;19037:8;41468:72;41410:18;:145::i;:::-;41381:17;:26;41399:7;41381:26;;;;;;;;;;;:174;;;;41725:1;19037:8;41675:19;:46;:51;41671:626;;;41747:19;41779:1;41769:7;:11;41747:33;;41936:1;41902:17;:30;41920:11;41902:30;;;;;;;;;;;;:35;41898:384;;;42040:13;;42025:11;:28;42021:242;;42220:19;42187:17;:30;42205:11;42187:30;;;;;;;;;;;:52;;;;42021:242;41898:384;41728:569;41671:626;42344:7;42340:2;42325:27;;42334:4;42325:27;;;;;;;;;;;;42363:42;42384:4;42390:2;42394:7;42403:1;42363:20;:42::i;:::-;39736:2677;;;39613:2800;;;:::o;53633:21::-;;;;:::o;58831:158::-;6584:13;:11;:13::i;:::-;58935::::1;58920:12;:28;;;;58971:10;58959:9;:22;;;;58831:158:::0;;:::o;53902:25::-;;;;:::o;62545:316::-;6584:13;:11;:13::i;:::-;62763:7:::1;62784;:5;:7::i;:::-;62776:21;;62805;62776:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62762:69;;;62850:2;62842:11;;;::::0;::::1;;62592:269;62545:316::o:0;55599:725::-;55701:12;;55683:15;:30;55675:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;55768:15;;;;;;;;;;;55767:16;55759:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55819:14;55836:13;:11;:13::i;:::-;55819:30;;55906:9;;55891:11;55882:6;:20;;;;:::i;:::-;:33;;55860:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;56007:13;;55992:11;:28;;55984:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;56088:11;56081:4;;:18;;;;:::i;:::-;56068:9;:31;56060:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;56134:27;56144:3;56149:11;56134:9;:27::i;:::-;55664:660;55599:725;;:::o;31238:185::-;31376:39;31393:4;31399:2;31403:7;31376:39;;;;;;;;;;;;:16;:39::i;:::-;31238:185;;;:::o;57836:88::-;6584:13;:11;:13::i;:::-;57908:8:::1;57901:4;:15;;;;57836:88:::0;:::o;62399:138::-;6584:13;:11;:13::i;:::-;62511:18:::1;62491:17;:38;;;;;;;;;;;;:::i;:::-;;62399:138:::0;:::o;54067:28::-;;;;;;;;;;;;;:::o;53554:40::-;;;;:::o;59096:106::-;6584:13;:11;:13::i;:::-;59183:11:::1;59173:7;:21;;;;;;;;;;;;:::i;:::-;;59096:106:::0;:::o;53601:25::-;;;;:::o;28191:144::-;28255:7;28298:27;28317:7;28298:18;:27::i;:::-;28275:52;;28191:144;;;:::o;53509:38::-;;;;:::o;58202:98::-;6584:13;:11;:13::i;:::-;58282:10:::1;58270:9;:22;;;;58202:98:::0;:::o;23434:224::-;23498:7;23539:1;23522:19;;:5;:19;;;23518:60;;;23550:28;;;;;;;;;;;;;;23518:60;17989:13;23596:18;:25;23615:5;23596:25;;;;;;;;;;;;;;;;:54;23589:61;;23434:224;;;:::o;7346:103::-;6584:13;:11;:13::i;:::-;7411:30:::1;7438:1;7411:18;:30::i;:::-;7346:103::o:0;58070:124::-;6584:13;:11;:13::i;:::-;58169:17:::1;58153:13;:33;;;;58070:124:::0;:::o;59309:113::-;6584:13;:11;:13::i;:::-;59403:11:::1;59389;:25;;;;;;;;;;;;:::i;:::-;;59309:113:::0;:::o;53998:29::-;;;;:::o;53868:27::-;;;;;;;;;;;;;:::o;6698:87::-;6744:7;6771:6;;;;;;;;;;;6764:13;;6698:87;:::o;28571:104::-;28627:13;28660:7;28653:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28571:104;:::o;60661:537::-;60760:18;;60755:1;60743:9;;:13;;;;:::i;:::-;:35;;60735:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60839:1;60819:9;:16;:21;60811:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60879:6;60875:228;60895:9;:16;60891:1;:20;60875:228;;;60955:9;;60940;60950:1;60940:12;;;;;;;;:::i;:::-;;;;;;;;:24;60932:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;61014:19;61020:9;61030:1;61020:12;;;;;;;;:::i;:::-;;;;;;;;61014:5;:19::i;:::-;60913:3;;;;;:::i;:::-;;;;60875:228;;;;61132:1;61115:13;;:18;;;;;;;:::i;:::-;;;;;;;;61144:9;;:11;;;;;;;;;:::i;:::-;;;;;;61166:24;61176:10;61188:1;61166:9;:24::i;:::-;60661:537;:::o;56468:379::-;6584:13;:11;:13::i;:::-;56536:14:::1;56553:13;:11;:13::i;:::-;56536:30;;56623:16;;56608:11;56599:6;:20;;;;:::i;:::-;:40;;56577:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;56712:34;56722:10;56734:11;56712:9;:34::i;:::-;56786:16;;56771:11;56762:6;:20;;;;:::i;:::-;:40;56759:79;;;56818:8;56824:1;56818:5;:8::i;:::-;56759:79;56525:322;56468:379:::0;:::o;58486:168::-;6584:13;:11;:13::i;:::-;58595:11:::1;58575:17;:31;;;;58638:8;58617:18;:29;;;;58486:168:::0;;:::o;30624:308::-;30735:19;:17;:19::i;:::-;30723:31;;:8;:31;;;30719:61;;;30763:17;;;;;;;;;;;;;;30719:61;30845:8;30793:18;:39;30812:19;:17;:19::i;:::-;30793:39;;;;;;;;;;;;;;;:49;30833:8;30793:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;30905:8;30869:55;;30884:19;:17;:19::i;:::-;30869:55;;;30915:8;30869:55;;;;;;:::i;:::-;;;;;;;;30624:308;;:::o;53661:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;53772:37::-;;;;:::o;31494:399::-;31661:31;31674:4;31680:2;31684:7;31661:12;:31::i;:::-;31725:1;31707:2;:14;;;:19;31703:183;;31746:56;31777:4;31783:2;31787:7;31796:5;31746:30;:56::i;:::-;31741:145;;31830:40;;;;;;;;;;;;;;31741:145;31703:183;31494:399;;;;:::o;54713:133::-;6584:13;:11;:13::i;:::-;54818:20:::1;54805:10;:33;;;;54713:133:::0;:::o;53967:24::-;;;;:::o;61302:994::-;61420:13;61473:16;61481:7;61473;:16::i;:::-;61451:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;61577:5;61565:17;;:8;;;;;;;;;;;:17;;;61561:74;;;61606:17;61599:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61561:74;61688:1;61657:10;:19;61668:7;61657:19;;;;;;;;;;;61651:33;;;;;:::i;:::-;;;:38;61647:641;;;61706:28;61763:9;;61752:7;:20;61749:134;;61808:10;:8;:10::i;:::-;61791:27;;61749:134;;;61872:11;61855:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61749:134;61955:1;61930:14;61924:28;:32;:320;;;;;;;;;;;;;;;;;62060:14;62105:25;62122:7;62105:16;:25::i;:::-;62013:182;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61924:320;61900:344;;;;;61647:641;62269:10;:19;62280:7;62269:19;;;;;;;;;;;62262:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61302:994;;;;:::o;53464:38::-;;;;:::o;54034:26::-;;;;:::o;56855:874::-;56948:14;56965:13;:11;:13::i;:::-;56948:30;;56998:15;;;;;;;;;;;56997:16;56989:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;57077:14;;57058:15;:33;;57050:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;57157:12;;57138:15;:31;;57130:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;57235:9;;57225:6;57216;:15;;;;:::i;:::-;:28;;57208:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;57325:21;;57315:6;57287:25;57301:10;57287:13;:25::i;:::-;:34;;;;:::i;:::-;:59;;57279:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;57396:33;57404:17;57410:10;57404:5;:17::i;:::-;57423:5;;57396:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:7;:33::i;:::-;57388:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;57496:9;57488:4;;57479:6;:13;;;;:::i;:::-;:26;57471:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57546:29;57556:10;57568:6;57546:9;:29::i;:::-;56937:792;56855:874;;;:::o;53426:31::-;;;;:::o;59558:1095::-;59650:15;;;;;;;;;;;:45;;;;;59686:9;;59669:13;:11;:13::i;:::-;:26;;59650:45;59642:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;53220:1;59743:14;:25;:51;;;;53261:1;59772:14;:22;59743:51;59735:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;53220:1;59828:14;:25;59825:821;;;59897:12;;59877:9;:16;:32;59869:42;;;;;;59955:17;;59950:1;59934:13;;:17;;;;:::i;:::-;:38;;59926:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60015:6;60011:157;60031:9;:16;60027:1;:20;60011:157;;;60072:19;60078:9;60088:1;60078:12;;;;;;;;:::i;:::-;;;;;;;;60072:5;:19::i;:::-;60049:3;;;;;:::i;:::-;;;;60011:157;;;;60182:13;;:15;;;;;;;;;:::i;:::-;;;;;;60212:24;60222:10;60234:1;60212:9;:24::i;:::-;59825:821;;;60305:9;;60285;:16;:29;60277:39;;;;;;60356:18;;60351:1;60339:9;;:13;;;;:::i;:::-;:35;;60331:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60415:6;60411:157;60431:9;:16;60427:1;:20;60411:157;;;60472:19;60478:9;60488:1;60478:12;;;;;;;;:::i;:::-;;;;;;;;60472:5;:19::i;:::-;60449:3;;;;;:::i;:::-;;;;60411:157;;;;60584:9;;:11;;;;;;;;;:::i;:::-;;;;;;60610:24;60620:10;60632:1;60610:9;:24::i;:::-;59825:821;59558:1095;;:::o;54509:163::-;6584:13;:11;:13::i;:::-;54597:10:::1;54580:14;:27;;;;54650:5;54633:14;;:22;;;;:::i;:::-;54618:12;:37;;;;54509:163:::0;:::o;62304:87::-;6584:13;:11;:13::i;:::-;62377:6:::1;62366:8;;:17;;;;;;;;;;;;;;;;;;62304:87:::0;:::o;53934:26::-;;;;:::o;31003:164::-;31100:4;31124:18;:25;31143:5;31124:25;;;;;;;;;;;;;;;:35;31150:8;31124:35;;;;;;;;;;;;;;;;;;;;;;;;;31117:42;;31003:164;;;;:::o;7604:201::-;6584:13;:11;:13::i;:::-;7713:1:::1;7693:22;;:8;:22;;;;7685:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7769:28;7788:8;7769:18;:28::i;:::-;7604:201:::0;:::o;55151:100::-;6584:13;:11;:13::i;:::-;55237:6:::1;55219:15;;:24;;;;;;;;;;;;;;;;;;55151:100:::0;:::o;32148:273::-;32205:4;32261:7;32242:15;:13;:15::i;:::-;:26;;:66;;;;;32295:13;;32285:7;:23;32242:66;:152;;;;;32393:1;18759:8;32346:17;:26;32364:7;32346:26;;;;;;;;;;;;:43;:48;32242:152;32222:172;;32148:273;;;:::o;50709:105::-;50769:7;50796:10;50789:17;;50709:105;:::o;21333:92::-;21389:7;21333:92;:::o;25108:1129::-;25175:7;25195:12;25210:7;25195:22;;25278:4;25259:15;:13;:15::i;:::-;:23;25255:915;;25312:13;;25305:4;:20;25301:869;;;25350:14;25367:17;:23;25385:4;25367:23;;;;;;;;;;;;25350:40;;25483:1;18759:8;25456:6;:23;:28;25452:699;;;25975:113;25992:1;25982:6;:11;25975:113;;;26035:17;:25;26053:6;;;;;;;26035:25;;;;;;;;;;;;26026:34;;25975:113;;;26121:6;26114:13;;;;;;25452:699;25327:843;25301:869;25255:915;26198:31;;;;;;;;;;;;;;25108:1129;;;;:::o;37949:652::-;38044:27;38073:23;38114:53;38170:15;38114:71;;38356:7;38350:4;38343:21;38391:22;38385:4;38378:36;38467:4;38461;38451:21;38428:44;;38563:19;38557:26;38538:45;;38294:300;37949:652;;;:::o;38714:645::-;38856:11;39018:15;39012:4;39008:26;39000:34;;39177:15;39166:9;39162:31;39149:44;;39324:15;39313:9;39310:30;39303:4;39292:9;39289:19;39286:55;39276:65;;38714:645;;;;;:::o;49542:159::-;;;;;:::o;47854:309::-;47989:7;48009:16;19160:3;48035:19;:40;;48009:67;;19160:3;48102:31;48113:4;48119:2;48123:9;48102:10;:31::i;:::-;48094:40;;:61;;48087:68;;;47854:309;;;;;:::o;27682:447::-;27762:14;27930:15;27923:5;27919:27;27910:36;;28104:5;28090:11;28066:22;28062:40;28059:51;28052:5;28049:62;28039:72;;27682:447;;;;:::o;50360:158::-;;;;;:::o;6863:132::-;6938:12;:10;:12::i;:::-;6927:23;;:7;:5;:7::i;:::-;:23;;;6919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6863:132::o;32505:104::-;32574:27;32584:2;32588:8;32574:27;;;;;;;;;;;;:9;:27::i;:::-;32505:104;;:::o;7965:191::-;8039:16;8058:6;;;;;;;;;;;8039:25;;8084:8;8075:6;;:17;;;;;;;;;;;;;;;;;;8139:8;8108:40;;8129:8;8108:40;;;;;;;;;;;;8028:128;7965:191;:::o;42491:89::-;42551:21;42557:7;42566:5;42551;:21::i;:::-;42491:89;:::o;46364:716::-;46527:4;46573:2;46548:45;;;46594:19;:17;:19::i;:::-;46615:4;46621:7;46630:5;46548:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46544:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46848:1;46831:6;:13;:18;46827:235;;;46877:40;;;;;;;;;;;;;;46827:235;47020:6;47014:13;47005:6;47001:2;46997:15;46990:38;46544:529;46717:54;;;46707:64;;;:6;:64;;;;46700:71;;;46364:716;;;;;;:::o;55320:108::-;55380:13;55413:7;55406:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55320:108;:::o;430:723::-;486:13;716:1;707:5;:10;703:53;;;734:10;;;;;;;;;;;;;;;;;;;;;703:53;766:12;781:5;766:20;;797:14;822:78;837:1;829:4;:9;822:78;;855:8;;;;;:::i;:::-;;;;886:2;878:10;;;;;:::i;:::-;;;822:78;;;910:19;942:6;932:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:39;;960:154;976:1;967:5;:10;960:154;;1004:1;994:11;;;;;:::i;:::-;;;1071:2;1063:5;:10;;;;:::i;:::-;1050:2;:24;;;;:::i;:::-;1037:39;;1020:6;1027;1020:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1100:2;1091:11;;;;;:::i;:::-;;;960:154;;;1138:6;1124:21;;;;;430:723;;;;:::o;23740:176::-;23801:7;17989:13;18126:2;23829:18;:25;23848:5;23829:25;;;;;;;;;;;;;;;;:49;;23828:80;23821:87;;23740:176;;;:::o;54854:126::-;54909:7;54963;54946:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;54936:36;;;;;;54929:43;;54854:126;;;:::o;54988:153::-;55066:4;55090:43;55109:5;55116:10;;55128:4;55090:18;:43::i;:::-;55083:50;;54988:153;;;;:::o;48739:147::-;48876:6;48739:147;;;;;:::o;5249:98::-;5302:7;5329:10;5322:17;;5249:98;:::o;33025:681::-;33148:19;33154:2;33158:8;33148:5;:19::i;:::-;33227:1;33209:2;:14;;;:19;33205:483;;33249:11;33263:13;;33249:27;;33295:13;33317:8;33311:3;:14;33295:30;;33344:233;33375:62;33414:1;33418:2;33422:7;;;;;;33431:5;33375:30;:62::i;:::-;33370:167;;33473:40;;;;;;;;;;;;;;33370:167;33572:3;33564:5;:11;33344:233;;33659:3;33642:13;;:20;33638:34;;33664:8;;;33638:34;33230:458;;33205:483;33025:681;;;:::o;42809:3063::-;42889:27;42919;42938:7;42919:18;:27::i;:::-;42889:57;;42959:12;42990:19;42959:52;;43025:27;43054:23;43081:28;43101:7;43081:19;:28::i;:::-;43024:85;;;;43126:13;43122:310;;;43247:62;43266:15;43283:4;43289:19;:17;:19::i;:::-;43247:18;:62::i;:::-;43242:178;;43333:43;43350:4;43356:19;:17;:19::i;:::-;43333:16;:43::i;:::-;43328:92;;43385:35;;;;;;;;;;;;;;43328:92;43242:178;43122:310;43444:51;43466:4;43480:1;43484:7;43493:1;43444:21;:51::i;:::-;43588:15;43585:160;;;43728:1;43707:19;43700:30;43585:160;44404:1;18252:3;44375:1;:25;;44374:31;44346:18;:24;44365:4;44346:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;44672:174;44709:4;44778:53;44793:4;44807:1;44811:19;44778:14;:53::i;:::-;19037:8;18759;44733:41;44732:99;44672:18;:174::i;:::-;44643:17;:26;44661:7;44643:26;;;;;;;;;;;:203;;;;45016:1;19037:8;44966:19;:46;:51;44962:626;;;45038:19;45070:1;45060:7;:11;45038:33;;45227:1;45193:17;:30;45211:11;45193:30;;;;;;;;;;;;:35;45189:384;;;45331:13;;45316:11;:28;45312:242;;45511:19;45478:17;:30;45496:11;45478:30;;;;;;;;;;;:52;;;;45312:242;45189:384;45019:569;44962:626;45643:7;45639:1;45616:35;;45625:4;45616:35;;;;;;;;;;;;45662:50;45683:4;45697:1;45701:7;45710:1;45662:20;:50::i;:::-;45839:12;;:14;;;;;;;;;;;;;42878:2994;;;;42809:3063;;:::o;3308:190::-;3433:4;3486;3457:25;3470:5;3477:4;3457:12;:25::i;:::-;:33;3450:40;;3308:190;;;;;:::o;33979:1529::-;34044:20;34067:13;;34044:36;;34109:1;34095:16;;:2;:16;;;34091:48;;;34120:19;;;;;;;;;;;;;;34091:48;34166:1;34154:8;:13;34150:44;;;34176:18;;;;;;;;;;;;;;34150:44;34207:61;34237:1;34241:2;34245:12;34259:8;34207:21;:61::i;:::-;34750:1;18126:2;34721:1;:25;;34720:31;34708:8;:44;34682:18;:22;34701:2;34682:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;35029:139;35066:2;35120:33;35143:1;35147:2;35151:1;35120:14;:33::i;:::-;35087:30;35108:8;35087:20;:30::i;:::-;:66;35029:18;:139::i;:::-;34995:17;:31;35013:12;34995:31;;;;;;;;;;;:173;;;;35185:15;35203:12;35185:30;;35230:11;35259:8;35244:12;:23;35230:37;;35282:101;35334:9;;;;;;35330:2;35309:35;;35326:1;35309:35;;;;;;;;;;;;35378:3;35368:7;:13;35282:101;;35415:3;35399:13;:19;;;;34456:974;;35440:60;35469:1;35473:2;35477:12;35491:8;35440:20;:60::i;:::-;34033:1475;33979:1529;;:::o;3864:701::-;3947:7;3967:20;3990:4;3967:27;;4010:9;4005:523;4029:5;:12;4025:1;:16;4005:523;;;4063:20;4086:5;4092:1;4086:8;;;;;;;;:::i;:::-;;;;;;;;4063:31;;4129:12;4113;:28;4109:408;;4283:12;4297;4266:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4256:55;;;;;;4241:70;;4109:408;;;4473:12;4487;4456:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4446:55;;;;;;4431:70;;4109:408;4048:480;4043:3;;;;;:::i;:::-;;;;4005:523;;;;4545:12;4538:19;;;3864:701;;;;:::o;29512:322::-;29582:14;29813:1;29803:8;29800:15;29775:23;29771:45;29761:55;;29512:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:139::-;2900:5;2938:6;2925:20;2916:29;;2954:33;2981:5;2954:33;:::i;:::-;2854:139;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;2999:137;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3142:141;;;;:::o;3302:338::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:122;;3414:79;;:::i;:::-;3373:122;3531:6;3518:20;3556:78;3630:3;3622:6;3615:4;3607:6;3603:17;3556:78;:::i;:::-;3547:87;;3363:277;3302:338;;;;:::o;3660:340::-;3716:5;3765:3;3758:4;3750:6;3746:17;3742:27;3732:122;;3773:79;;:::i;:::-;3732:122;3890:6;3877:20;3915:79;3990:3;3982:6;3975:4;3967:6;3963:17;3915:79;:::i;:::-;3906:88;;3722:278;3660:340;;;;:::o;4006:139::-;4052:5;4090:6;4077:20;4068:29;;4106:33;4133:5;4106:33;:::i;:::-;4006:139;;;;:::o;4151:329::-;4210:6;4259:2;4247:9;4238:7;4234:23;4230:32;4227:119;;;4265:79;;:::i;:::-;4227:119;4385:1;4410:53;4455:7;4446:6;4435:9;4431:22;4410:53;:::i;:::-;4400:63;;4356:117;4151:329;;;;:::o;4486:474::-;4554:6;4562;4611:2;4599:9;4590:7;4586:23;4582:32;4579:119;;;4617:79;;:::i;:::-;4579:119;4737:1;4762:53;4807:7;4798:6;4787:9;4783:22;4762:53;:::i;:::-;4752:63;;4708:117;4864:2;4890:53;4935:7;4926:6;4915:9;4911:22;4890:53;:::i;:::-;4880:63;;4835:118;4486:474;;;;;:::o;4966:619::-;5043:6;5051;5059;5108:2;5096:9;5087:7;5083:23;5079:32;5076:119;;;5114:79;;:::i;:::-;5076:119;5234:1;5259:53;5304:7;5295:6;5284:9;5280:22;5259:53;:::i;:::-;5249:63;;5205:117;5361:2;5387:53;5432:7;5423:6;5412:9;5408:22;5387:53;:::i;:::-;5377:63;;5332:118;5489:2;5515:53;5560:7;5551:6;5540:9;5536:22;5515:53;:::i;:::-;5505:63;;5460:118;4966:619;;;;;:::o;5591:943::-;5686:6;5694;5702;5710;5759:3;5747:9;5738:7;5734:23;5730:33;5727:120;;;5766:79;;:::i;:::-;5727:120;5886:1;5911:53;5956:7;5947:6;5936:9;5932:22;5911:53;:::i;:::-;5901:63;;5857:117;6013:2;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5984:118;6141:2;6167:53;6212:7;6203:6;6192:9;6188:22;6167:53;:::i;:::-;6157:63;;6112:118;6297:2;6286:9;6282:18;6269:32;6328:18;6320:6;6317:30;6314:117;;;6350:79;;:::i;:::-;6314:117;6455:62;6509:7;6500:6;6489:9;6485:22;6455:62;:::i;:::-;6445:72;;6240:287;5591:943;;;;;;;:::o;6540:468::-;6605:6;6613;6662:2;6650:9;6641:7;6637:23;6633:32;6630:119;;;6668:79;;:::i;:::-;6630:119;6788:1;6813:53;6858:7;6849:6;6838:9;6834:22;6813:53;:::i;:::-;6803:63;;6759:117;6915:2;6941:50;6983:7;6974:6;6963:9;6959:22;6941:50;:::i;:::-;6931:60;;6886:115;6540:468;;;;;:::o;7014:474::-;7082:6;7090;7139:2;7127:9;7118:7;7114:23;7110:32;7107:119;;;7145:79;;:::i;:::-;7107:119;7265:1;7290:53;7335:7;7326:6;7315:9;7311:22;7290:53;:::i;:::-;7280:63;;7236:117;7392:2;7418:53;7463:7;7454:6;7443:9;7439:22;7418:53;:::i;:::-;7408:63;;7363:118;7014:474;;;;;:::o;7494:539::-;7578:6;7627:2;7615:9;7606:7;7602:23;7598:32;7595:119;;;7633:79;;:::i;:::-;7595:119;7781:1;7770:9;7766:17;7753:31;7811:18;7803:6;7800:30;7797:117;;;7833:79;;:::i;:::-;7797:117;7938:78;8008:7;7999:6;7988:9;7984:22;7938:78;:::i;:::-;7928:88;;7724:302;7494:539;;;;:::o;8039:323::-;8095:6;8144:2;8132:9;8123:7;8119:23;8115:32;8112:119;;;8150:79;;:::i;:::-;8112:119;8270:1;8295:50;8337:7;8328:6;8317:9;8313:22;8295:50;:::i;:::-;8285:60;;8241:114;8039:323;;;;:::o;8368:329::-;8427:6;8476:2;8464:9;8455:7;8451:23;8447:32;8444:119;;;8482:79;;:::i;:::-;8444:119;8602:1;8627:53;8672:7;8663:6;8652:9;8648:22;8627:53;:::i;:::-;8617:63;;8573:117;8368:329;;;;:::o;8703:327::-;8761:6;8810:2;8798:9;8789:7;8785:23;8781:32;8778:119;;;8816:79;;:::i;:::-;8778:119;8936:1;8961:52;9005:7;8996:6;8985:9;8981:22;8961:52;:::i;:::-;8951:62;;8907:116;8703:327;;;;:::o;9036:349::-;9105:6;9154:2;9142:9;9133:7;9129:23;9125:32;9122:119;;;9160:79;;:::i;:::-;9122:119;9280:1;9305:63;9360:7;9351:6;9340:9;9336:22;9305:63;:::i;:::-;9295:73;;9251:127;9036:349;;;;:::o;9391:509::-;9460:6;9509:2;9497:9;9488:7;9484:23;9480:32;9477:119;;;9515:79;;:::i;:::-;9477:119;9663:1;9652:9;9648:17;9635:31;9693:18;9685:6;9682:30;9679:117;;;9715:79;;:::i;:::-;9679:117;9820:63;9875:7;9866:6;9855:9;9851:22;9820:63;:::i;:::-;9810:73;;9606:287;9391:509;;;;:::o;9906:329::-;9965:6;10014:2;10002:9;9993:7;9989:23;9985:32;9982:119;;;10020:79;;:::i;:::-;9982:119;10140:1;10165:53;10210:7;10201:6;10190:9;10186:22;10165:53;:::i;:::-;10155:63;;10111:117;9906:329;;;;:::o;10241:704::-;10336:6;10344;10352;10401:2;10389:9;10380:7;10376:23;10372:32;10369:119;;;10407:79;;:::i;:::-;10369:119;10527:1;10552:53;10597:7;10588:6;10577:9;10573:22;10552:53;:::i;:::-;10542:63;;10498:117;10682:2;10671:9;10667:18;10654:32;10713:18;10705:6;10702:30;10699:117;;;10735:79;;:::i;:::-;10699:117;10848:80;10920:7;10911:6;10900:9;10896:22;10848:80;:::i;:::-;10830:98;;;;10625:313;10241:704;;;;;:::o;10951:684::-;11044:6;11052;11101:2;11089:9;11080:7;11076:23;11072:32;11069:119;;;11107:79;;:::i;:::-;11069:119;11227:1;11252:53;11297:7;11288:6;11277:9;11273:22;11252:53;:::i;:::-;11242:63;;11198:117;11382:2;11371:9;11367:18;11354:32;11413:18;11405:6;11402:30;11399:117;;;11435:79;;:::i;:::-;11399:117;11540:78;11610:7;11601:6;11590:9;11586:22;11540:78;:::i;:::-;11530:88;;11325:303;10951:684;;;;;:::o;11641:474::-;11709:6;11717;11766:2;11754:9;11745:7;11741:23;11737:32;11734:119;;;11772:79;;:::i;:::-;11734:119;11892:1;11917:53;11962:7;11953:6;11942:9;11938:22;11917:53;:::i;:::-;11907:63;;11863:117;12019:2;12045:53;12090:7;12081:6;12070:9;12066:22;12045:53;:::i;:::-;12035:63;;11990:118;11641:474;;;;;:::o;12121:118::-;12208:24;12226:5;12208:24;:::i;:::-;12203:3;12196:37;12121:118;;:::o;12245:157::-;12350:45;12370:24;12388:5;12370:24;:::i;:::-;12350:45;:::i;:::-;12345:3;12338:58;12245:157;;:::o;12408:109::-;12489:21;12504:5;12489:21;:::i;:::-;12484:3;12477:34;12408:109;;:::o;12523:118::-;12610:24;12628:5;12610:24;:::i;:::-;12605:3;12598:37;12523:118;;:::o;12647:157::-;12752:45;12772:24;12790:5;12772:24;:::i;:::-;12752:45;:::i;:::-;12747:3;12740:58;12647:157;;:::o;12810:360::-;12896:3;12924:38;12956:5;12924:38;:::i;:::-;12978:70;13041:6;13036:3;12978:70;:::i;:::-;12971:77;;13057:52;13102:6;13097:3;13090:4;13083:5;13079:16;13057:52;:::i;:::-;13134:29;13156:6;13134:29;:::i;:::-;13129:3;13125:39;13118:46;;12900:270;12810:360;;;;:::o;13176:364::-;13264:3;13292:39;13325:5;13292:39;:::i;:::-;13347:71;13411:6;13406:3;13347:71;:::i;:::-;13340:78;;13427:52;13472:6;13467:3;13460:4;13453:5;13449:16;13427:52;:::i;:::-;13504:29;13526:6;13504:29;:::i;:::-;13499:3;13495:39;13488:46;;13268:272;13176:364;;;;:::o;13546:377::-;13652:3;13680:39;13713:5;13680:39;:::i;:::-;13735:89;13817:6;13812:3;13735:89;:::i;:::-;13728:96;;13833:52;13878:6;13873:3;13866:4;13859:5;13855:16;13833:52;:::i;:::-;13910:6;13905:3;13901:16;13894:23;;13656:267;13546:377;;;;:::o;13929:366::-;14071:3;14092:67;14156:2;14151:3;14092:67;:::i;:::-;14085:74;;14168:93;14257:3;14168:93;:::i;:::-;14286:2;14281:3;14277:12;14270:19;;13929:366;;;:::o;14301:::-;14443:3;14464:67;14528:2;14523:3;14464:67;:::i;:::-;14457:74;;14540:93;14629:3;14540:93;:::i;:::-;14658:2;14653:3;14649:12;14642:19;;14301:366;;;:::o;14673:::-;14815:3;14836:67;14900:2;14895:3;14836:67;:::i;:::-;14829:74;;14912:93;15001:3;14912:93;:::i;:::-;15030:2;15025:3;15021:12;15014:19;;14673:366;;;:::o;15045:::-;15187:3;15208:67;15272:2;15267:3;15208:67;:::i;:::-;15201:74;;15284:93;15373:3;15284:93;:::i;:::-;15402:2;15397:3;15393:12;15386:19;;15045:366;;;:::o;15417:::-;15559:3;15580:67;15644:2;15639:3;15580:67;:::i;:::-;15573:74;;15656:93;15745:3;15656:93;:::i;:::-;15774:2;15769:3;15765:12;15758:19;;15417:366;;;:::o;15789:::-;15931:3;15952:67;16016:2;16011:3;15952:67;:::i;:::-;15945:74;;16028:93;16117:3;16028:93;:::i;:::-;16146:2;16141:3;16137:12;16130:19;;15789:366;;;:::o;16161:::-;16303:3;16324:67;16388:2;16383:3;16324:67;:::i;:::-;16317:74;;16400:93;16489:3;16400:93;:::i;:::-;16518:2;16513:3;16509:12;16502:19;;16161:366;;;:::o;16533:::-;16675:3;16696:67;16760:2;16755:3;16696:67;:::i;:::-;16689:74;;16772:93;16861:3;16772:93;:::i;:::-;16890:2;16885:3;16881:12;16874:19;;16533:366;;;:::o;16905:::-;17047:3;17068:67;17132:2;17127:3;17068:67;:::i;:::-;17061:74;;17144:93;17233:3;17144:93;:::i;:::-;17262:2;17257:3;17253:12;17246:19;;16905:366;;;:::o;17277:::-;17419:3;17440:67;17504:2;17499:3;17440:67;:::i;:::-;17433:74;;17516:93;17605:3;17516:93;:::i;:::-;17634:2;17629:3;17625:12;17618:19;;17277:366;;;:::o;17649:400::-;17809:3;17830:84;17912:1;17907:3;17830:84;:::i;:::-;17823:91;;17923:93;18012:3;17923:93;:::i;:::-;18041:1;18036:3;18032:11;18025:18;;17649:400;;;:::o;18055:366::-;18197:3;18218:67;18282:2;18277:3;18218:67;:::i;:::-;18211:74;;18294:93;18383:3;18294:93;:::i;:::-;18412:2;18407:3;18403:12;18396:19;;18055:366;;;:::o;18427:::-;18569:3;18590:67;18654:2;18649:3;18590:67;:::i;:::-;18583:74;;18666:93;18755:3;18666:93;:::i;:::-;18784:2;18779:3;18775:12;18768:19;;18427:366;;;:::o;18799:::-;18941:3;18962:67;19026:2;19021:3;18962:67;:::i;:::-;18955:74;;19038:93;19127:3;19038:93;:::i;:::-;19156:2;19151:3;19147:12;19140:19;;18799:366;;;:::o;19171:::-;19313:3;19334:67;19398:2;19393:3;19334:67;:::i;:::-;19327:74;;19410:93;19499:3;19410:93;:::i;:::-;19528:2;19523:3;19519:12;19512:19;;19171:366;;;:::o;19543:::-;19685:3;19706:67;19770:2;19765:3;19706:67;:::i;:::-;19699:74;;19782:93;19871:3;19782:93;:::i;:::-;19900:2;19895:3;19891:12;19884:19;;19543:366;;;:::o;19915:::-;20057:3;20078:67;20142:2;20137:3;20078:67;:::i;:::-;20071:74;;20154:93;20243:3;20154:93;:::i;:::-;20272:2;20267:3;20263:12;20256:19;;19915:366;;;:::o;20287:::-;20429:3;20450:67;20514:2;20509:3;20450:67;:::i;:::-;20443:74;;20526:93;20615:3;20526:93;:::i;:::-;20644:2;20639:3;20635:12;20628:19;;20287:366;;;:::o;20659:398::-;20818:3;20839:83;20920:1;20915:3;20839:83;:::i;:::-;20832:90;;20931:93;21020:3;20931:93;:::i;:::-;21049:1;21044:3;21040:11;21033:18;;20659:398;;;:::o;21063:366::-;21205:3;21226:67;21290:2;21285:3;21226:67;:::i;:::-;21219:74;;21302:93;21391:3;21302:93;:::i;:::-;21420:2;21415:3;21411:12;21404:19;;21063:366;;;:::o;21435:::-;21577:3;21598:67;21662:2;21657:3;21598:67;:::i;:::-;21591:74;;21674:93;21763:3;21674:93;:::i;:::-;21792:2;21787:3;21783:12;21776:19;;21435:366;;;:::o;21807:::-;21949:3;21970:67;22034:2;22029:3;21970:67;:::i;:::-;21963:74;;22046:93;22135:3;22046:93;:::i;:::-;22164:2;22159:3;22155:12;22148:19;;21807:366;;;:::o;22179:::-;22321:3;22342:67;22406:2;22401:3;22342:67;:::i;:::-;22335:74;;22418:93;22507:3;22418:93;:::i;:::-;22536:2;22531:3;22527:12;22520:19;;22179:366;;;:::o;22551:::-;22693:3;22714:67;22778:2;22773:3;22714:67;:::i;:::-;22707:74;;22790:93;22879:3;22790:93;:::i;:::-;22908:2;22903:3;22899:12;22892:19;;22551:366;;;:::o;22923:118::-;23010:24;23028:5;23010:24;:::i;:::-;23005:3;22998:37;22923:118;;:::o;23047:256::-;23159:3;23174:75;23245:3;23236:6;23174:75;:::i;:::-;23274:2;23269:3;23265:12;23258:19;;23294:3;23287:10;;23047:256;;;;:::o;23309:397::-;23449:3;23464:75;23535:3;23526:6;23464:75;:::i;:::-;23564:2;23559:3;23555:12;23548:19;;23577:75;23648:3;23639:6;23577:75;:::i;:::-;23677:2;23672:3;23668:12;23661:19;;23697:3;23690:10;;23309:397;;;;;:::o;23712:701::-;23993:3;24015:95;24106:3;24097:6;24015:95;:::i;:::-;24008:102;;24127:95;24218:3;24209:6;24127:95;:::i;:::-;24120:102;;24239:148;24383:3;24239:148;:::i;:::-;24232:155;;24404:3;24397:10;;23712:701;;;;;:::o;24419:379::-;24603:3;24625:147;24768:3;24625:147;:::i;:::-;24618:154;;24789:3;24782:10;;24419:379;;;:::o;24804:222::-;24897:4;24935:2;24924:9;24920:18;24912:26;;24948:71;25016:1;25005:9;25001:17;24992:6;24948:71;:::i;:::-;24804:222;;;;:::o;25032:640::-;25227:4;25265:3;25254:9;25250:19;25242:27;;25279:71;25347:1;25336:9;25332:17;25323:6;25279:71;:::i;:::-;25360:72;25428:2;25417:9;25413:18;25404:6;25360:72;:::i;:::-;25442;25510:2;25499:9;25495:18;25486:6;25442:72;:::i;:::-;25561:9;25555:4;25551:20;25546:2;25535:9;25531:18;25524:48;25589:76;25660:4;25651:6;25589:76;:::i;:::-;25581:84;;25032:640;;;;;;;:::o;25678:210::-;25765:4;25803:2;25792:9;25788:18;25780:26;;25816:65;25878:1;25867:9;25863:17;25854:6;25816:65;:::i;:::-;25678:210;;;;:::o;25894:222::-;25987:4;26025:2;26014:9;26010:18;26002:26;;26038:71;26106:1;26095:9;26091:17;26082:6;26038:71;:::i;:::-;25894:222;;;;:::o;26122:313::-;26235:4;26273:2;26262:9;26258:18;26250:26;;26322:9;26316:4;26312:20;26308:1;26297:9;26293:17;26286:47;26350:78;26423:4;26414:6;26350:78;:::i;:::-;26342:86;;26122:313;;;;:::o;26441:419::-;26607:4;26645:2;26634:9;26630:18;26622:26;;26694:9;26688:4;26684:20;26680:1;26669:9;26665:17;26658:47;26722:131;26848:4;26722:131;:::i;:::-;26714:139;;26441:419;;;:::o;26866:::-;27032:4;27070:2;27059:9;27055:18;27047:26;;27119:9;27113:4;27109:20;27105:1;27094:9;27090:17;27083:47;27147:131;27273:4;27147:131;:::i;:::-;27139:139;;26866:419;;;:::o;27291:::-;27457:4;27495:2;27484:9;27480:18;27472:26;;27544:9;27538:4;27534:20;27530:1;27519:9;27515:17;27508:47;27572:131;27698:4;27572:131;:::i;:::-;27564:139;;27291:419;;;:::o;27716:::-;27882:4;27920:2;27909:9;27905:18;27897:26;;27969:9;27963:4;27959:20;27955:1;27944:9;27940:17;27933:47;27997:131;28123:4;27997:131;:::i;:::-;27989:139;;27716:419;;;:::o;28141:::-;28307:4;28345:2;28334:9;28330:18;28322:26;;28394:9;28388:4;28384:20;28380:1;28369:9;28365:17;28358:47;28422:131;28548:4;28422:131;:::i;:::-;28414:139;;28141:419;;;:::o;28566:::-;28732:4;28770:2;28759:9;28755:18;28747:26;;28819:9;28813:4;28809:20;28805:1;28794:9;28790:17;28783:47;28847:131;28973:4;28847:131;:::i;:::-;28839:139;;28566:419;;;:::o;28991:::-;29157:4;29195:2;29184:9;29180:18;29172:26;;29244:9;29238:4;29234:20;29230:1;29219:9;29215:17;29208:47;29272:131;29398:4;29272:131;:::i;:::-;29264:139;;28991:419;;;:::o;29416:::-;29582:4;29620:2;29609:9;29605:18;29597:26;;29669:9;29663:4;29659:20;29655:1;29644:9;29640:17;29633:47;29697:131;29823:4;29697:131;:::i;:::-;29689:139;;29416:419;;;:::o;29841:::-;30007:4;30045:2;30034:9;30030:18;30022:26;;30094:9;30088:4;30084:20;30080:1;30069:9;30065:17;30058:47;30122:131;30248:4;30122:131;:::i;:::-;30114:139;;29841:419;;;:::o;30266:::-;30432:4;30470:2;30459:9;30455:18;30447:26;;30519:9;30513:4;30509:20;30505:1;30494:9;30490:17;30483:47;30547:131;30673:4;30547:131;:::i;:::-;30539:139;;30266:419;;;:::o;30691:::-;30857:4;30895:2;30884:9;30880:18;30872:26;;30944:9;30938:4;30934:20;30930:1;30919:9;30915:17;30908:47;30972:131;31098:4;30972:131;:::i;:::-;30964:139;;30691:419;;;:::o;31116:::-;31282:4;31320:2;31309:9;31305:18;31297:26;;31369:9;31363:4;31359:20;31355:1;31344:9;31340:17;31333:47;31397:131;31523:4;31397:131;:::i;:::-;31389:139;;31116:419;;;:::o;31541:::-;31707:4;31745:2;31734:9;31730:18;31722:26;;31794:9;31788:4;31784:20;31780:1;31769:9;31765:17;31758:47;31822:131;31948:4;31822:131;:::i;:::-;31814:139;;31541:419;;;:::o;31966:::-;32132:4;32170:2;32159:9;32155:18;32147:26;;32219:9;32213:4;32209:20;32205:1;32194:9;32190:17;32183:47;32247:131;32373:4;32247:131;:::i;:::-;32239:139;;31966:419;;;:::o;32391:::-;32557:4;32595:2;32584:9;32580:18;32572:26;;32644:9;32638:4;32634:20;32630:1;32619:9;32615:17;32608:47;32672:131;32798:4;32672:131;:::i;:::-;32664:139;;32391:419;;;:::o;32816:::-;32982:4;33020:2;33009:9;33005:18;32997:26;;33069:9;33063:4;33059:20;33055:1;33044:9;33040:17;33033:47;33097:131;33223:4;33097:131;:::i;:::-;33089:139;;32816:419;;;:::o;33241:::-;33407:4;33445:2;33434:9;33430:18;33422:26;;33494:9;33488:4;33484:20;33480:1;33469:9;33465:17;33458:47;33522:131;33648:4;33522:131;:::i;:::-;33514:139;;33241:419;;;:::o;33666:::-;33832:4;33870:2;33859:9;33855:18;33847:26;;33919:9;33913:4;33909:20;33905:1;33894:9;33890:17;33883:47;33947:131;34073:4;33947:131;:::i;:::-;33939:139;;33666:419;;;:::o;34091:::-;34257:4;34295:2;34284:9;34280:18;34272:26;;34344:9;34338:4;34334:20;34330:1;34319:9;34315:17;34308:47;34372:131;34498:4;34372:131;:::i;:::-;34364:139;;34091:419;;;:::o;34516:::-;34682:4;34720:2;34709:9;34705:18;34697:26;;34769:9;34763:4;34759:20;34755:1;34744:9;34740:17;34733:47;34797:131;34923:4;34797:131;:::i;:::-;34789:139;;34516:419;;;:::o;34941:::-;35107:4;35145:2;35134:9;35130:18;35122:26;;35194:9;35188:4;35184:20;35180:1;35169:9;35165:17;35158:47;35222:131;35348:4;35222:131;:::i;:::-;35214:139;;34941:419;;;:::o;35366:::-;35532:4;35570:2;35559:9;35555:18;35547:26;;35619:9;35613:4;35609:20;35605:1;35594:9;35590:17;35583:47;35647:131;35773:4;35647:131;:::i;:::-;35639:139;;35366:419;;;:::o;35791:222::-;35884:4;35922:2;35911:9;35907:18;35899:26;;35935:71;36003:1;35992:9;35988:17;35979:6;35935:71;:::i;:::-;35791:222;;;;:::o;36019:129::-;36053:6;36080:20;;:::i;:::-;36070:30;;36109:33;36137:4;36129:6;36109:33;:::i;:::-;36019:129;;;:::o;36154:75::-;36187:6;36220:2;36214:9;36204:19;;36154:75;:::o;36235:311::-;36312:4;36402:18;36394:6;36391:30;36388:56;;;36424:18;;:::i;:::-;36388:56;36474:4;36466:6;36462:17;36454:25;;36534:4;36528;36524:15;36516:23;;36235:311;;;:::o;36552:307::-;36613:4;36703:18;36695:6;36692:30;36689:56;;;36725:18;;:::i;:::-;36689:56;36763:29;36785:6;36763:29;:::i;:::-;36755:37;;36847:4;36841;36837:15;36829:23;;36552:307;;;:::o;36865:308::-;36927:4;37017:18;37009:6;37006:30;37003:56;;;37039:18;;:::i;:::-;37003:56;37077:29;37099:6;37077:29;:::i;:::-;37069:37;;37161:4;37155;37151:15;37143:23;;36865:308;;;:::o;37179:98::-;37230:6;37264:5;37258:12;37248:22;;37179:98;;;:::o;37283:99::-;37335:6;37369:5;37363:12;37353:22;;37283:99;;;:::o;37388:168::-;37471:11;37505:6;37500:3;37493:19;37545:4;37540:3;37536:14;37521:29;;37388:168;;;;:::o;37562:147::-;37663:11;37700:3;37685:18;;37562:147;;;;:::o;37715:169::-;37799:11;37833:6;37828:3;37821:19;37873:4;37868:3;37864:14;37849:29;;37715:169;;;;:::o;37890:148::-;37992:11;38029:3;38014:18;;37890:148;;;;:::o;38044:305::-;38084:3;38103:20;38121:1;38103:20;:::i;:::-;38098:25;;38137:20;38155:1;38137:20;:::i;:::-;38132:25;;38291:1;38223:66;38219:74;38216:1;38213:81;38210:107;;;38297:18;;:::i;:::-;38210:107;38341:1;38338;38334:9;38327:16;;38044:305;;;;:::o;38355:185::-;38395:1;38412:20;38430:1;38412:20;:::i;:::-;38407:25;;38446:20;38464:1;38446:20;:::i;:::-;38441:25;;38485:1;38475:35;;38490:18;;:::i;:::-;38475:35;38532:1;38529;38525:9;38520:14;;38355:185;;;;:::o;38546:348::-;38586:7;38609:20;38627:1;38609:20;:::i;:::-;38604:25;;38643:20;38661:1;38643:20;:::i;:::-;38638:25;;38831:1;38763:66;38759:74;38756:1;38753:81;38748:1;38741:9;38734:17;38730:105;38727:131;;;38838:18;;:::i;:::-;38727:131;38886:1;38883;38879:9;38868:20;;38546:348;;;;:::o;38900:191::-;38940:4;38960:20;38978:1;38960:20;:::i;:::-;38955:25;;38994:20;39012:1;38994:20;:::i;:::-;38989:25;;39033:1;39030;39027:8;39024:34;;;39038:18;;:::i;:::-;39024:34;39083:1;39080;39076:9;39068:17;;38900:191;;;;:::o;39097:96::-;39134:7;39163:24;39181:5;39163:24;:::i;:::-;39152:35;;39097:96;;;:::o;39199:90::-;39233:7;39276:5;39269:13;39262:21;39251:32;;39199:90;;;:::o;39295:77::-;39332:7;39361:5;39350:16;;39295:77;;;:::o;39378:149::-;39414:7;39454:66;39447:5;39443:78;39432:89;;39378:149;;;:::o;39533:126::-;39570:7;39610:42;39603:5;39599:54;39588:65;;39533:126;;;:::o;39665:77::-;39702:7;39731:5;39720:16;;39665:77;;;:::o;39748:154::-;39832:6;39827:3;39822;39809:30;39894:1;39885:6;39880:3;39876:16;39869:27;39748:154;;;:::o;39908:307::-;39976:1;39986:113;40000:6;39997:1;39994:13;39986:113;;;40085:1;40080:3;40076:11;40070:18;40066:1;40061:3;40057:11;40050:39;40022:2;40019:1;40015:10;40010:15;;39986:113;;;40117:6;40114:1;40111:13;40108:101;;;40197:1;40188:6;40183:3;40179:16;40172:27;40108:101;39957:258;39908:307;;;:::o;40221:320::-;40265:6;40302:1;40296:4;40292:12;40282:22;;40349:1;40343:4;40339:12;40370:18;40360:81;;40426:4;40418:6;40414:17;40404:27;;40360:81;40488:2;40480:6;40477:14;40457:18;40454:38;40451:84;;;40507:18;;:::i;:::-;40451:84;40272:269;40221:320;;;:::o;40547:281::-;40630:27;40652:4;40630:27;:::i;:::-;40622:6;40618:40;40760:6;40748:10;40745:22;40724:18;40712:10;40709:34;40706:62;40703:88;;;40771:18;;:::i;:::-;40703:88;40811:10;40807:2;40800:22;40590:238;40547:281;;:::o;40834:233::-;40873:3;40896:24;40914:5;40896:24;:::i;:::-;40887:33;;40942:66;40935:5;40932:77;40929:103;;;41012:18;;:::i;:::-;40929:103;41059:1;41052:5;41048:13;41041:20;;40834:233;;;:::o;41073:100::-;41112:7;41141:26;41161:5;41141:26;:::i;:::-;41130:37;;41073:100;;;:::o;41179:79::-;41218:7;41247:5;41236:16;;41179:79;;;:::o;41264:94::-;41303:7;41332:20;41346:5;41332:20;:::i;:::-;41321:31;;41264:94;;;:::o;41364:176::-;41396:1;41413:20;41431:1;41413:20;:::i;:::-;41408:25;;41447:20;41465:1;41447:20;:::i;:::-;41442:25;;41486:1;41476:35;;41491:18;;:::i;:::-;41476:35;41532:1;41529;41525:9;41520:14;;41364:176;;;;:::o;41546:180::-;41594:77;41591:1;41584:88;41691:4;41688:1;41681:15;41715:4;41712:1;41705:15;41732:180;41780:77;41777:1;41770:88;41877:4;41874:1;41867:15;41901:4;41898:1;41891:15;41918:180;41966:77;41963:1;41956:88;42063:4;42060:1;42053:15;42087:4;42084:1;42077:15;42104:180;42152:77;42149:1;42142:88;42249:4;42246:1;42239:15;42273:4;42270:1;42263:15;42290:180;42338:77;42335:1;42328:88;42435:4;42432:1;42425:15;42459:4;42456:1;42449:15;42476:117;42585:1;42582;42575:12;42599:117;42708:1;42705;42698:12;42722:117;42831:1;42828;42821:12;42845:117;42954:1;42951;42944:12;42968:117;43077:1;43074;43067:12;43091:117;43200:1;43197;43190:12;43214:102;43255:6;43306:2;43302:7;43297:2;43290:5;43286:14;43282:28;43272:38;;43214:102;;;:::o;43322:94::-;43355:8;43403:5;43399:2;43395:14;43374:35;;43322:94;;;:::o;43422:181::-;43562:33;43558:1;43550:6;43546:14;43539:57;43422:181;:::o;43609:174::-;43749:26;43745:1;43737:6;43733:14;43726:50;43609:174;:::o;43789:176::-;43929:28;43925:1;43917:6;43913:14;43906:52;43789:176;:::o;43971:225::-;44111:34;44107:1;44099:6;44095:14;44088:58;44180:8;44175:2;44167:6;44163:15;44156:33;43971:225;:::o;44202:169::-;44342:21;44338:1;44330:6;44326:14;44319:45;44202:169;:::o;44377:221::-;44517:34;44513:1;44505:6;44501:14;44494:58;44586:4;44581:2;44573:6;44569:15;44562:29;44377:221;:::o;44604:173::-;44744:25;44740:1;44732:6;44728:14;44721:49;44604:173;:::o;44783:167::-;44923:19;44919:1;44911:6;44907:14;44900:43;44783:167;:::o;44956:163::-;45096:15;45092:1;45084:6;45080:14;45073:39;44956:163;:::o;45125:165::-;45265:17;45261:1;45253:6;45249:14;45242:41;45125:165;:::o;45296:155::-;45436:7;45432:1;45424:6;45420:14;45413:31;45296:155;:::o;45457:171::-;45597:23;45593:1;45585:6;45581:14;45574:47;45457:171;:::o;45634:169::-;45774:21;45770:1;45762:6;45758:14;45751:45;45634:169;:::o;45809:182::-;45949:34;45945:1;45937:6;45933:14;45926:58;45809:182;:::o;45997:173::-;46137:25;46133:1;46125:6;46121:14;46114:49;45997:173;:::o;46176:169::-;46316:21;46312:1;46304:6;46300:14;46293:45;46176:169;:::o;46351:173::-;46491:25;46487:1;46479:6;46475:14;46468:49;46351:173;:::o;46530:180::-;46670:32;46666:1;46658:6;46654:14;46647:56;46530:180;:::o;46716:114::-;;:::o;46836:174::-;46976:26;46972:1;46964:6;46960:14;46953:50;46836:174;:::o;47016:170::-;47156:22;47152:1;47144:6;47140:14;47133:46;47016:170;:::o;47192:169::-;47332:21;47328:1;47320:6;47316:14;47309:45;47192:169;:::o;47367:180::-;47507:32;47503:1;47495:6;47491:14;47484:56;47367:180;:::o;47553:176::-;47693:28;47689:1;47681:6;47677:14;47670:52;47553:176;:::o;47735:122::-;47808:24;47826:5;47808:24;:::i;:::-;47801:5;47798:35;47788:63;;47847:1;47844;47837:12;47788:63;47735:122;:::o;47863:116::-;47933:21;47948:5;47933:21;:::i;:::-;47926:5;47923:32;47913:60;;47969:1;47966;47959:12;47913:60;47863:116;:::o;47985:122::-;48058:24;48076:5;48058:24;:::i;:::-;48051:5;48048:35;48038:63;;48097:1;48094;48087:12;48038:63;47985:122;:::o;48113:120::-;48185:23;48202:5;48185:23;:::i;:::-;48178:5;48175:34;48165:62;;48223:1;48220;48213:12;48165:62;48113:120;:::o;48239:122::-;48312:24;48330:5;48312:24;:::i;:::-;48305:5;48302:35;48292:63;;48351:1;48348;48341:12;48292:63;48239:122;:::o

Swarm Source

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