ETH Price: $3,922.83 (+3.70%)

Token

Llama Pass (LLP)
 

Overview

Max Total Supply

4,006 LLP

Holders

423

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x48193776062991c2fe024d9c99c35576a51dade0
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

LlamaPass vision is to reward pass holders as our genesis collection.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LlamaPass

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 5000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.6;

interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}


contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address account,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address account,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][account] = accountBalance - amount;
            }
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


/**
 * @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() {
        _setOwner(_msgSender());
    }

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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


contract LlamaPass is ERC1155, Ownable {
    // TODO: Will generate a new one for real deployment
    address private passwordSigner = 0xbBaA67D208F4c5fCa149060ff584DD0E88852C95;

    uint private constant GOLD_PASS_ID = 1;
    uint private constant SILVER_PASS_ID = 2;

    string public name = "Llama Pass";
    string public symbol = "LLP";

    uint16 private maxGoldPasses = 500;
    uint16 private maxSilverPasses = 3500;

    uint16 private currentGoldPassCount = 0;
    uint16 private currentSilverPassCount = 0;

    uint private silverPassPrice = 0.75 ether;
    uint private goldPassPrice = 5 ether;

    bool public sale = false;

    string private baseUri = "ipfs://QmZEMXDzfHDtEiYbHcUtyQ7gVmnvMT6VoNfDX7Ztsdc7b2/";

    mapping (address => bool) public alreadyMinted;

    constructor() ERC1155("") {}

    function withdrawEther(address payable _to, uint _amount) public onlyOwner {
        _to.transfer(_amount);
    }

    function setBaseURI(string memory newBaseUri) external onlyOwner {
        baseUri = newBaseUri;
    }

    function uri(uint id) public view virtual override returns (string memory) {
        return string(abi.encodePacked(baseUri, Strings.toString(id)));
    }

    function buy(uint16 tokenId) public payable {
        require(sale, "Sale not open");
        require(tokenId == GOLD_PASS_ID ? currentGoldPassCount + 1 <= maxGoldPasses : currentSilverPassCount + 1 <= maxSilverPasses, "Max supply");
        require(!alreadyMinted[msg.sender], "Double mint");
        require(tokenId == GOLD_PASS_ID || tokenId == SILVER_PASS_ID, "Bad ID");
        require(msg.value >= getPassPrice(tokenId), "Wrong amt");

        tokenId == GOLD_PASS_ID ? currentGoldPassCount++ : currentSilverPassCount++;         
        alreadyMinted[msg.sender] = true;

        _mint(msg.sender, tokenId, 1, "");
    }

    function setSale() external onlyOwner {
        sale = !sale;
    }

    function mint(uint16 tokenId, bytes memory signature) public {
        require(tokenId == 1 || tokenId == 2, "Bad ID");
        require(tokenId == GOLD_PASS_ID ? currentGoldPassCount + 1 <= maxGoldPasses : currentSilverPassCount + 1 <= maxSilverPasses, "Max supply");

        require(isWhitelisted(msg.sender, tokenId, signature), "Not whitelisted");
        require(!alreadyMinted[msg.sender], "Double mint");

        tokenId == GOLD_PASS_ID ? currentGoldPassCount++ : currentSilverPassCount++; 
        alreadyMinted[msg.sender] = true;

        _mint(msg.sender, tokenId, 1, "");
    }

    function claimToAdmin(uint16 tokenId, uint16 tokenAmt) public onlyOwner {
        _mint(msg.sender, tokenId, tokenAmt, "");
        tokenId == GOLD_PASS_ID ? currentGoldPassCount+=tokenAmt : currentSilverPassCount+=tokenAmt;     
    }

    function isWhitelisted(address user, uint16 tokenId, bytes memory signature) public view returns (bool) {
        bytes32 messageHash = keccak256(abi.encode(user, tokenId));
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

        return recoverSigner(ethSignedMessageHash, signature) == passwordSigner;
    }

    function getEthSignedMessageHash(bytes32 _messageHash) private pure returns (bytes32) {
        /*
        Signature is produced by signing a keccak256 hash with the following format:
        "\x19Ethereum Signed Message\n" + len(msg) + msg
        */
        return
        keccak256(
            abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash)
        );
    }

    function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) private pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(sig.length == 65, "sig invalid");

        assembly {
        /*
        First 32 bytes stores the length of the signature

        add(sig, 32) = pointer of sig + 32
        effectively, skips first 32 bytes of signature

        mload(p) loads next 32 bytes starting at the memory address p into memory
        */

        // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
        // second 32 bytes
            s := mload(add(sig, 64))
        // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        // implicitly return (r, s, v)
    }
    
    function getPassTotalSupply(uint tokenId) public view returns (uint256) {
        if(tokenId == GOLD_PASS_ID) {
            return maxGoldPasses;
        }
        return maxSilverPasses;
    }
    
    function getPassSupply(uint tokenId) public view returns (uint256) {
        if(tokenId == GOLD_PASS_ID) {
            return currentGoldPassCount;
        }
        return currentSilverPassCount;
    }
    
    function getPassPrice(uint tokenId) public view returns (uint256) {
        if(tokenId == GOLD_PASS_ID) {
            return goldPassPrice;
        }
        return silverPassPrice;
    }
    
    function setPassPrice(uint tokenId, uint price) external onlyOwner {
        if(tokenId == GOLD_PASS_ID)
            goldPassPrice = price;
        else
            silverPassPrice = price;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"alreadyMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"uint16","name":"tokenAmt","type":"uint16"}],"name":"claimToAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPassPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPassSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPassTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPassPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600480546001600160a01b03191673bbaa67d208f4c5fca149060ff584dd0e88852c9517905560c0604052600a6080819052694c6c616d61205061737360b01b60a09081526200005391600591906200018e565b506040805180820190915260038082526204c4c560ec1b602090920191825262000080916006916200018e565b50600780546001600160401b031916630dac01f4179055670a688906bd8b0000600855674563918244f40000600955600a805460ff191690556040805160608101909152603680825262002fa960208301398051620000e891600b916020909101906200018e565b50348015620000f657600080fd5b50604080516020810190915260008152620001118162000123565b506200011d336200013c565b62000271565b8051620001389060029060208401906200018e565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200019c9062000234565b90600052602060002090601f016020900481019282620001c057600085556200020b565b82601f10620001db57805160ff19168380011785556200020b565b828001600101855582156200020b579182015b828111156200020b578251825591602001919060010190620001ee565b50620002199291506200021d565b5090565b5b808211156200021957600081556001016200021e565b600181811c908216806200024957607f821691505b602082108114156200026b57634e487b7160e01b600052602260045260246000fd5b50919050565b612d2880620002816000396000f3fe6080604052600436106101a05760003560e01c806355f804b3116100e15780639652f8fa1161008a578063d2e2496511610064578063d2e249651461047d578063e985e9c51461049d578063f242432a146104e6578063f2fde38b1461050657600080fd5b80639652f8fa1461041d578063a22cb4651461043d578063bb5ed2411461045d57600080fd5b80637d2bfa6d116100bb5780637d2bfa6d146103c05780638da5cb5b146103e057806395d89b411461040857600080fd5b806355f804b3146103715780636ad1fe0214610391578063715018a6146103ab57600080fd5b80631d9cfd6d1161014e5780632eb2c2d6116101285780632eb2c2d6146102e45780633a3df0d5146103045780634e1273f414610324578063522f68151461035157600080fd5b80631d9cfd6d1461029c5780631eabc116146102b15780632556f758146102c457600080fd5b80630a398b881161017f5780630a398b881461022a5780630e89341c1461025a5780631ab6b3091461027a57600080fd5b8062fdd58e146101a557806301ffc9a7146101d857806306fdde0314610208575b600080fd5b3480156101b157600080fd5b506101c56101c0366004612212565b610526565b6040519081526020015b60405180910390f35b3480156101e457600080fd5b506101f86101f336600461226c565b6105cf565b60405190151581526020016101cf565b34801561021457600080fd5b5061021d6106b4565b6040516101cf91906122ec565b34801561023657600080fd5b506101f86102453660046122ff565b600c6020526000908152604090205460ff1681565b34801561026657600080fd5b5061021d61027536600461231c565b610742565b34801561028657600080fd5b5061029a61029536600461234c565b610776565b005b3480156102a857600080fd5b5061029a610860565b61029a6102bf36600461237f565b6108ce565b3480156102d057600080fd5b506101c56102df36600461231c565b610bad565b3480156102f057600080fd5b5061029a6102ff366004612509565b610bd6565b34801561031057600080fd5b506101c561031f36600461231c565b610c78565b34801561033057600080fd5b5061034461033f3660046125b7565b610cad565b6040516101cf91906126bf565b34801561035d57600080fd5b5061029a61036c366004612212565b610deb565b34801561037d57600080fd5b5061029a61038c3660046126d2565b610e7b565b34801561039d57600080fd5b50600a546101f89060ff1681565b3480156103b757600080fd5b5061029a610eec565b3480156103cc57600080fd5b506101c56103db36600461231c565b610f52565b3480156103ec57600080fd5b506003546040516001600160a01b0390911681526020016101cf565b34801561041457600080fd5b5061021d610f6d565b34801561042957600080fd5b506101f861043836600461271b565b610f7a565b34801561044957600080fd5b5061029a61045836600461277b565b61101e565b34801561046957600080fd5b5061029a6104783660046127b9565b611109565b34801561048957600080fd5b5061029a6104983660046127db565b611178565b3480156104a957600080fd5b506101f86104b836600461281f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156104f257600080fd5b5061029a61050136600461284d565b6113fd565b34801561051257600080fd5b5061029a6105213660046122ff565b611498565b60006001600160a01b0383166105a95760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061066257507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806106ae57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600580546106c1906128b6565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed906128b6565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b505050505081565b6060600b61074f83611577565b604051602001610760929190612926565b6040516020818303038152906040529050919050565b6003546001600160a01b031633146107d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b6107f3338361ffff168361ffff16604051806020016040528060008152506116b1565b60018261ffff161461083c5780600760068282829054906101000a900461ffff1661081e9190612a15565b92506101000a81548161ffff021916908361ffff1602179055505050565b80600760048282829054906101000a900461ffff1661081e9190612a15565b505050565b6003546001600160a01b031633146108ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b600a805460ff19811660ff90911615179055565b600a5460ff166109205760405162461bcd60e51b815260206004820152600d60248201527f53616c65206e6f74206f70656e0000000000000000000000000000000000000060448201526064016105a0565b60018161ffff161461095d5760075461ffff620100008204811691610952916601000000000000909104166001612a15565b61ffff161115610983565b60075461ffff8082169161097c91640100000000909104166001612a15565b61ffff1611155b6109cf5760405162461bcd60e51b815260206004820152600a60248201527f4d617820737570706c790000000000000000000000000000000000000000000060448201526064016105a0565b336000908152600c602052604090205460ff1615610a2f5760405162461bcd60e51b815260206004820152600b60248201527f446f75626c65206d696e7400000000000000000000000000000000000000000060448201526064016105a0565b60018161ffff161480610a46575060028161ffff16145b610a925760405162461bcd60e51b815260206004820152600660248201527f426164204944000000000000000000000000000000000000000000000000000060448201526064016105a0565b610a9f8161ffff16610f52565b341015610aee5760405162461bcd60e51b815260206004820152600960248201527f57726f6e6720616d74000000000000000000000000000000000000000000000060448201526064016105a0565b60018161ffff1614610b3757600780546601000000000000900461ffff16906006610b1883612a3b565b91906101000a81548161ffff021916908361ffff160217905550610b6e565b60078054640100000000900461ffff16906004610b5383612a3b565b91906101000a81548161ffff021916908361ffff1602179055505b50336000818152600c60209081526040808320805460ff191660019081179091558151928301909152918152610baa929161ffff8516916116b1565b50565b60006001821415610bc457505060075461ffff1690565b505060075462010000900461ffff1690565b6001600160a01b038516331480610bf25750610bf285336104b8565b610c645760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016105a0565b610c7185858585856117d7565b5050505050565b60006001821415610c97575050600754640100000000900461ffff1690565b50506007546601000000000000900461ffff1690565b60608151835114610d265760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016105a0565b6000835167ffffffffffffffff811115610d4257610d4261239a565b604051908082528060200260200182016040528015610d6b578160200160208202803683370190505b50905060005b8451811015610de357610db6858281518110610d8f57610d8f612a5d565b6020026020010151858381518110610da957610da9612a5d565b6020026020010151610526565b828281518110610dc857610dc8612a5d565b6020908102919091010152610ddc81612a8c565b9050610d71565b509392505050565b6003546001600160a01b03163314610e455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561085b573d6000803e3d6000fd5b6003546001600160a01b03163314610ed55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b8051610ee890600b906020840190612164565b5050565b6003546001600160a01b03163314610f465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b610f506000611a75565b565b60006001821415610f6557505060095490565b505060085490565b600680546106c1906128b6565b604080516001600160a01b0385811660208084019190915261ffff8616838501528351808403850181526060840185528051908201207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c8085018290528551808603909101815260bc9094019094528251920191909120600454600093921661100a8286611adf565b6001600160a01b0316149695505050505050565b336001600160a01b038316141561109d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016105a0565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146111635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b60018214156111725760095550565b60085550565b8161ffff166001148061118f57508161ffff166002145b6111db5760405162461bcd60e51b815260206004820152600660248201527f426164204944000000000000000000000000000000000000000000000000000060448201526064016105a0565b60018261ffff16146112185760075461ffff62010000820481169161120d916601000000000000909104166001612a15565b61ffff16111561123e565b60075461ffff8082169161123791640100000000909104166001612a15565b61ffff1611155b61128a5760405162461bcd60e51b815260206004820152600a60248201527f4d617820737570706c790000000000000000000000000000000000000000000060448201526064016105a0565b611295338383610f7a565b6112e15760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c6973746564000000000000000000000000000000000060448201526064016105a0565b336000908152600c602052604090205460ff16156113415760405162461bcd60e51b815260206004820152600b60248201527f446f75626c65206d696e7400000000000000000000000000000000000000000060448201526064016105a0565b60018261ffff161461138a57600780546601000000000000900461ffff1690600661136b83612a3b565b91906101000a81548161ffff021916908361ffff1602179055506113c1565b60078054640100000000900461ffff169060046113a683612a3b565b91906101000a81548161ffff021916908361ffff1602179055505b50336000818152600c60209081526040808320805460ff191660019081179091558151928301909152918152610ee8929161ffff8616916116b1565b6001600160a01b038516331480611419575061141985336104b8565b61148b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016105a0565b610c718585858585611b5e565b6003546001600160a01b031633146114f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b6001600160a01b03811661156e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105a0565b610baa81611a75565b6060816115b757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156115e157806115cb81612a8c565b91506115da9050600a83612af4565b91506115bb565b60008167ffffffffffffffff8111156115fc576115fc61239a565b6040519080825280601f01601f191660200182016040528015611626576020820181803683370190505b5090505b84156116a95761163b600183612b08565b9150611648600a86612b1f565b611653906030612b33565b60f81b81838151811061166857611668612a5d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506116a2600a86612af4565b945061162a565b949350505050565b6001600160a01b03841661172d5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105a0565b336117478160008761173e88611d27565b610c7188611d27565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611777908490612b33565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c7181600087878787611d72565b815183511461184e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d6174636800000000000000000000000000000000000000000000000060648201526084016105a0565b6001600160a01b0384166118ca5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105a0565b3360005b8451811015611a075760008582815181106118eb576118eb612a5d565b60200260200101519050600085838151811061190957611909612a5d565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119af5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e736665720000000000000000000000000000000000000000000060648201526084016105a0565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906119ec908490612b33565b9250508190555050505080611a0090612a8c565b90506118ce565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a57929190612b4b565b60405180910390a4611a6d818787878787611f86565b505050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600080611aee856120f0565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611b49573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6001600160a01b038416611bda5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105a0565b33611bea81878761173e88611d27565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611c815760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e736665720000000000000000000000000000000000000000000060648201526084016105a0565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611cbe908490612b33565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d1e828888888888611d72565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611d6157611d61612a5d565b602090810291909101015292915050565b6001600160a01b0384163b15611a6d576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611dcf9089908990889088908890600401612b70565b602060405180830381600087803b158015611de957600080fd5b505af1925050508015611e19575060408051601f3d908101601f19168201909252611e1691810190612bb3565b60015b611ecf57611e25612bd0565b806308c379a01415611e5f5750611e3a612bec565b80611e455750611e61565b8060405162461bcd60e51b81526004016105a091906122ec565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016105a0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611d1e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e7300000000000000000000000000000000000000000000000060648201526084016105a0565b6001600160a01b0384163b15611a6d576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190611fe39089908990889088908890600401612c94565b602060405180830381600087803b158015611ffd57600080fd5b505af192505050801561202d575060408051601f3d908101601f1916820190925261202a91810190612bb3565b60015b61203957611e25612bd0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611d1e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e7300000000000000000000000000000000000000000000000060648201526084016105a0565b600080600083516041146121465760405162461bcd60e51b815260206004820152600b60248201527f73696720696e76616c696400000000000000000000000000000000000000000060448201526064016105a0565b50505060208101516040820151606090920151909260009190911a90565b828054612170906128b6565b90600052602060002090601f01602090048101928261219257600085556121d8565b82601f106121ab57805160ff19168380011785556121d8565b828001600101855582156121d8579182015b828111156121d85782518255916020019190600101906121bd565b506121e49291506121e8565b5090565b5b808211156121e457600081556001016121e9565b6001600160a01b0381168114610baa57600080fd5b6000806040838503121561222557600080fd5b8235612230816121fd565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610baa57600080fd5b60006020828403121561227e57600080fd5b81356122898161223e565b9392505050565b60005b838110156122ab578181015183820152602001612293565b838111156122ba576000848401525b50505050565b600081518084526122d8816020860160208601612290565b601f01601f19169290920160200192915050565b60208152600061228960208301846122c0565b60006020828403121561231157600080fd5b8135612289816121fd565b60006020828403121561232e57600080fd5b5035919050565b803561ffff8116811461234757600080fd5b919050565b6000806040838503121561235f57600080fd5b61236883612335565b915061237660208401612335565b90509250929050565b60006020828403121561239157600080fd5b61228982612335565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156123ef576123ef61239a565b6040525050565b600067ffffffffffffffff8211156124105761241061239a565b5060051b60200190565b600082601f83011261242b57600080fd5b81356020612438826123f6565b60405161244582826123c9565b83815260059390931b850182019282810191508684111561246557600080fd5b8286015b848110156124805780358352918301918301612469565b509695505050505050565b600067ffffffffffffffff8311156124a5576124a561239a565b6040516124bc6020601f19601f87011601826123c9565b8091508381528484840111156124d157600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126124fa57600080fd5b6122898383356020850161248b565b600080600080600060a0868803121561252157600080fd5b853561252c816121fd565b9450602086013561253c816121fd565b9350604086013567ffffffffffffffff8082111561255957600080fd5b61256589838a0161241a565b9450606088013591508082111561257b57600080fd5b61258789838a0161241a565b9350608088013591508082111561259d57600080fd5b506125aa888289016124e9565b9150509295509295909350565b600080604083850312156125ca57600080fd5b823567ffffffffffffffff808211156125e257600080fd5b818501915085601f8301126125f657600080fd5b81356020612603826123f6565b60405161261082826123c9565b83815260059390931b850182019282810191508984111561263057600080fd5b948201945b83861015612657578535612648816121fd565b82529482019490820190612635565b9650508601359250508082111561266d57600080fd5b5061267a8582860161241a565b9150509250929050565b600081518084526020808501945080840160005b838110156126b457815187529582019590820190600101612698565b509495945050505050565b6020815260006122896020830184612684565b6000602082840312156126e457600080fd5b813567ffffffffffffffff8111156126fb57600080fd5b8201601f8101841361270c57600080fd5b6116a98482356020840161248b565b60008060006060848603121561273057600080fd5b833561273b816121fd565b925061274960208501612335565b9150604084013567ffffffffffffffff81111561276557600080fd5b612771868287016124e9565b9150509250925092565b6000806040838503121561278e57600080fd5b8235612799816121fd565b9150602083013580151581146127ae57600080fd5b809150509250929050565b600080604083850312156127cc57600080fd5b50508035926020909101359150565b600080604083850312156127ee57600080fd5b6127f783612335565b9150602083013567ffffffffffffffff81111561281357600080fd5b61267a858286016124e9565b6000806040838503121561283257600080fd5b823561283d816121fd565b915060208301356127ae816121fd565b600080600080600060a0868803121561286557600080fd5b8535612870816121fd565b94506020860135612880816121fd565b93506040860135925060608601359150608086013567ffffffffffffffff8111156128aa57600080fd5b6125aa888289016124e9565b600181811c908216806128ca57607f821691505b60208210811415612904577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000815161291c818560208601612290565b9290920192915050565b600080845481600182811c91508083168061294257607f831692505b602080841082141561297b577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561298f57600181146129a0576129cd565b60ff198616895284890196506129cd565b60008b81526020902060005b868110156129c55781548b8201529085019083016129ac565b505084890196505b5050505050506129dd818561290a565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061ffff808316818516808303821115612a3257612a326129e6565b01949350505050565b600061ffff80831681811415612a5357612a536129e6565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abe6129e6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b0357612b03612ac5565b500490565b600082821015612b1a57612b1a6129e6565b500390565b600082612b2e57612b2e612ac5565b500690565b60008219821115612b4657612b466129e6565b500190565b604081526000612b5e6040830185612684565b82810360208401526129dd8185612684565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612ba860a08301846122c0565b979650505050505050565b600060208284031215612bc557600080fd5b81516122898161223e565b600060033d1115612be95760046000803e5060005160e01c5b90565b600060443d1015612bfa5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715612c4857505050505090565b8285019150815181811115612c605750505050505090565b843d8701016020828501011115612c7a5750505050505090565b612c89602082860101876123c9565b509095945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152612cc060a0830186612684565b8281036060840152612cd28186612684565b90508281036080840152612ce681856122c0565b9897505050505050505056fea2646970667358221220802542c6986f65fc2ea4727b77b03ad8e9c54a29077fc776a031c28f1404a06e64736f6c63430008090033697066733a2f2f516d5a454d58447a66484474456959624863557479513767566d6e764d5436566f4e664458375a747364633762322f

Deployed Bytecode

0x6080604052600436106101a05760003560e01c806355f804b3116100e15780639652f8fa1161008a578063d2e2496511610064578063d2e249651461047d578063e985e9c51461049d578063f242432a146104e6578063f2fde38b1461050657600080fd5b80639652f8fa1461041d578063a22cb4651461043d578063bb5ed2411461045d57600080fd5b80637d2bfa6d116100bb5780637d2bfa6d146103c05780638da5cb5b146103e057806395d89b411461040857600080fd5b806355f804b3146103715780636ad1fe0214610391578063715018a6146103ab57600080fd5b80631d9cfd6d1161014e5780632eb2c2d6116101285780632eb2c2d6146102e45780633a3df0d5146103045780634e1273f414610324578063522f68151461035157600080fd5b80631d9cfd6d1461029c5780631eabc116146102b15780632556f758146102c457600080fd5b80630a398b881161017f5780630a398b881461022a5780630e89341c1461025a5780631ab6b3091461027a57600080fd5b8062fdd58e146101a557806301ffc9a7146101d857806306fdde0314610208575b600080fd5b3480156101b157600080fd5b506101c56101c0366004612212565b610526565b6040519081526020015b60405180910390f35b3480156101e457600080fd5b506101f86101f336600461226c565b6105cf565b60405190151581526020016101cf565b34801561021457600080fd5b5061021d6106b4565b6040516101cf91906122ec565b34801561023657600080fd5b506101f86102453660046122ff565b600c6020526000908152604090205460ff1681565b34801561026657600080fd5b5061021d61027536600461231c565b610742565b34801561028657600080fd5b5061029a61029536600461234c565b610776565b005b3480156102a857600080fd5b5061029a610860565b61029a6102bf36600461237f565b6108ce565b3480156102d057600080fd5b506101c56102df36600461231c565b610bad565b3480156102f057600080fd5b5061029a6102ff366004612509565b610bd6565b34801561031057600080fd5b506101c561031f36600461231c565b610c78565b34801561033057600080fd5b5061034461033f3660046125b7565b610cad565b6040516101cf91906126bf565b34801561035d57600080fd5b5061029a61036c366004612212565b610deb565b34801561037d57600080fd5b5061029a61038c3660046126d2565b610e7b565b34801561039d57600080fd5b50600a546101f89060ff1681565b3480156103b757600080fd5b5061029a610eec565b3480156103cc57600080fd5b506101c56103db36600461231c565b610f52565b3480156103ec57600080fd5b506003546040516001600160a01b0390911681526020016101cf565b34801561041457600080fd5b5061021d610f6d565b34801561042957600080fd5b506101f861043836600461271b565b610f7a565b34801561044957600080fd5b5061029a61045836600461277b565b61101e565b34801561046957600080fd5b5061029a6104783660046127b9565b611109565b34801561048957600080fd5b5061029a6104983660046127db565b611178565b3480156104a957600080fd5b506101f86104b836600461281f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156104f257600080fd5b5061029a61050136600461284d565b6113fd565b34801561051257600080fd5b5061029a6105213660046122ff565b611498565b60006001600160a01b0383166105a95760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061066257507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b806106ae57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600580546106c1906128b6565b80601f01602080910402602001604051908101604052809291908181526020018280546106ed906128b6565b801561073a5780601f1061070f5761010080835404028352916020019161073a565b820191906000526020600020905b81548152906001019060200180831161071d57829003601f168201915b505050505081565b6060600b61074f83611577565b604051602001610760929190612926565b6040516020818303038152906040529050919050565b6003546001600160a01b031633146107d05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b6107f3338361ffff168361ffff16604051806020016040528060008152506116b1565b60018261ffff161461083c5780600760068282829054906101000a900461ffff1661081e9190612a15565b92506101000a81548161ffff021916908361ffff1602179055505050565b80600760048282829054906101000a900461ffff1661081e9190612a15565b505050565b6003546001600160a01b031633146108ba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b600a805460ff19811660ff90911615179055565b600a5460ff166109205760405162461bcd60e51b815260206004820152600d60248201527f53616c65206e6f74206f70656e0000000000000000000000000000000000000060448201526064016105a0565b60018161ffff161461095d5760075461ffff620100008204811691610952916601000000000000909104166001612a15565b61ffff161115610983565b60075461ffff8082169161097c91640100000000909104166001612a15565b61ffff1611155b6109cf5760405162461bcd60e51b815260206004820152600a60248201527f4d617820737570706c790000000000000000000000000000000000000000000060448201526064016105a0565b336000908152600c602052604090205460ff1615610a2f5760405162461bcd60e51b815260206004820152600b60248201527f446f75626c65206d696e7400000000000000000000000000000000000000000060448201526064016105a0565b60018161ffff161480610a46575060028161ffff16145b610a925760405162461bcd60e51b815260206004820152600660248201527f426164204944000000000000000000000000000000000000000000000000000060448201526064016105a0565b610a9f8161ffff16610f52565b341015610aee5760405162461bcd60e51b815260206004820152600960248201527f57726f6e6720616d74000000000000000000000000000000000000000000000060448201526064016105a0565b60018161ffff1614610b3757600780546601000000000000900461ffff16906006610b1883612a3b565b91906101000a81548161ffff021916908361ffff160217905550610b6e565b60078054640100000000900461ffff16906004610b5383612a3b565b91906101000a81548161ffff021916908361ffff1602179055505b50336000818152600c60209081526040808320805460ff191660019081179091558151928301909152918152610baa929161ffff8516916116b1565b50565b60006001821415610bc457505060075461ffff1690565b505060075462010000900461ffff1690565b6001600160a01b038516331480610bf25750610bf285336104b8565b610c645760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016105a0565b610c7185858585856117d7565b5050505050565b60006001821415610c97575050600754640100000000900461ffff1690565b50506007546601000000000000900461ffff1690565b60608151835114610d265760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016105a0565b6000835167ffffffffffffffff811115610d4257610d4261239a565b604051908082528060200260200182016040528015610d6b578160200160208202803683370190505b50905060005b8451811015610de357610db6858281518110610d8f57610d8f612a5d565b6020026020010151858381518110610da957610da9612a5d565b6020026020010151610526565b828281518110610dc857610dc8612a5d565b6020908102919091010152610ddc81612a8c565b9050610d71565b509392505050565b6003546001600160a01b03163314610e455760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b6040516001600160a01b0383169082156108fc029083906000818181858888f1935050505015801561085b573d6000803e3d6000fd5b6003546001600160a01b03163314610ed55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b8051610ee890600b906020840190612164565b5050565b6003546001600160a01b03163314610f465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b610f506000611a75565b565b60006001821415610f6557505060095490565b505060085490565b600680546106c1906128b6565b604080516001600160a01b0385811660208084019190915261ffff8616838501528351808403850181526060840185528051908201207f19457468657265756d205369676e6564204d6573736167653a0a3332000000006080850152609c8085018290528551808603909101815260bc9094019094528251920191909120600454600093921661100a8286611adf565b6001600160a01b0316149695505050505050565b336001600160a01b038316141561109d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016105a0565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146111635760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b60018214156111725760095550565b60085550565b8161ffff166001148061118f57508161ffff166002145b6111db5760405162461bcd60e51b815260206004820152600660248201527f426164204944000000000000000000000000000000000000000000000000000060448201526064016105a0565b60018261ffff16146112185760075461ffff62010000820481169161120d916601000000000000909104166001612a15565b61ffff16111561123e565b60075461ffff8082169161123791640100000000909104166001612a15565b61ffff1611155b61128a5760405162461bcd60e51b815260206004820152600a60248201527f4d617820737570706c790000000000000000000000000000000000000000000060448201526064016105a0565b611295338383610f7a565b6112e15760405162461bcd60e51b815260206004820152600f60248201527f4e6f742077686974656c6973746564000000000000000000000000000000000060448201526064016105a0565b336000908152600c602052604090205460ff16156113415760405162461bcd60e51b815260206004820152600b60248201527f446f75626c65206d696e7400000000000000000000000000000000000000000060448201526064016105a0565b60018261ffff161461138a57600780546601000000000000900461ffff1690600661136b83612a3b565b91906101000a81548161ffff021916908361ffff1602179055506113c1565b60078054640100000000900461ffff169060046113a683612a3b565b91906101000a81548161ffff021916908361ffff1602179055505b50336000818152600c60209081526040808320805460ff191660019081179091558151928301909152918152610ee8929161ffff8616916116b1565b6001600160a01b038516331480611419575061141985336104b8565b61148b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016105a0565b610c718585858585611b5e565b6003546001600160a01b031633146114f25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a0565b6001600160a01b03811661156e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105a0565b610baa81611a75565b6060816115b757505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156115e157806115cb81612a8c565b91506115da9050600a83612af4565b91506115bb565b60008167ffffffffffffffff8111156115fc576115fc61239a565b6040519080825280601f01601f191660200182016040528015611626576020820181803683370190505b5090505b84156116a95761163b600183612b08565b9150611648600a86612b1f565b611653906030612b33565b60f81b81838151811061166857611668612a5d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506116a2600a86612af4565b945061162a565b949350505050565b6001600160a01b03841661172d5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105a0565b336117478160008761173e88611d27565b610c7188611d27565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611777908490612b33565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610c7181600087878787611d72565b815183511461184e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d6174636800000000000000000000000000000000000000000000000060648201526084016105a0565b6001600160a01b0384166118ca5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105a0565b3360005b8451811015611a075760008582815181106118eb576118eb612a5d565b60200260200101519050600085838151811061190957611909612a5d565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156119af5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e736665720000000000000000000000000000000000000000000060648201526084016105a0565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906119ec908490612b33565b9250508190555050505080611a0090612a8c565b90506118ce565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611a57929190612b4b565b60405180910390a4611a6d818787878787611f86565b505050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600080611aee856120f0565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611b49573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b6001600160a01b038416611bda5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105a0565b33611bea81878761173e88611d27565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611c815760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e736665720000000000000000000000000000000000000000000060648201526084016105a0565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611cbe908490612b33565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611d1e828888888888611d72565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611d6157611d61612a5d565b602090810291909101015292915050565b6001600160a01b0384163b15611a6d576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e6190611dcf9089908990889088908890600401612b70565b602060405180830381600087803b158015611de957600080fd5b505af1925050508015611e19575060408051601f3d908101601f19168201909252611e1691810190612bb3565b60015b611ecf57611e25612bd0565b806308c379a01415611e5f5750611e3a612bec565b80611e455750611e61565b8060405162461bcd60e51b81526004016105a091906122ec565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016105a0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611d1e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e7300000000000000000000000000000000000000000000000060648201526084016105a0565b6001600160a01b0384163b15611a6d576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c8190611fe39089908990889088908890600401612c94565b602060405180830381600087803b158015611ffd57600080fd5b505af192505050801561202d575060408051601f3d908101601f1916820190925261202a91810190612bb3565b60015b61203957611e25612bd0565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611d1e5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e7300000000000000000000000000000000000000000000000060648201526084016105a0565b600080600083516041146121465760405162461bcd60e51b815260206004820152600b60248201527f73696720696e76616c696400000000000000000000000000000000000000000060448201526064016105a0565b50505060208101516040820151606090920151909260009190911a90565b828054612170906128b6565b90600052602060002090601f01602090048101928261219257600085556121d8565b82601f106121ab57805160ff19168380011785556121d8565b828001600101855582156121d8579182015b828111156121d85782518255916020019190600101906121bd565b506121e49291506121e8565b5090565b5b808211156121e457600081556001016121e9565b6001600160a01b0381168114610baa57600080fd5b6000806040838503121561222557600080fd5b8235612230816121fd565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610baa57600080fd5b60006020828403121561227e57600080fd5b81356122898161223e565b9392505050565b60005b838110156122ab578181015183820152602001612293565b838111156122ba576000848401525b50505050565b600081518084526122d8816020860160208601612290565b601f01601f19169290920160200192915050565b60208152600061228960208301846122c0565b60006020828403121561231157600080fd5b8135612289816121fd565b60006020828403121561232e57600080fd5b5035919050565b803561ffff8116811461234757600080fd5b919050565b6000806040838503121561235f57600080fd5b61236883612335565b915061237660208401612335565b90509250929050565b60006020828403121561239157600080fd5b61228982612335565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff821117156123ef576123ef61239a565b6040525050565b600067ffffffffffffffff8211156124105761241061239a565b5060051b60200190565b600082601f83011261242b57600080fd5b81356020612438826123f6565b60405161244582826123c9565b83815260059390931b850182019282810191508684111561246557600080fd5b8286015b848110156124805780358352918301918301612469565b509695505050505050565b600067ffffffffffffffff8311156124a5576124a561239a565b6040516124bc6020601f19601f87011601826123c9565b8091508381528484840111156124d157600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126124fa57600080fd5b6122898383356020850161248b565b600080600080600060a0868803121561252157600080fd5b853561252c816121fd565b9450602086013561253c816121fd565b9350604086013567ffffffffffffffff8082111561255957600080fd5b61256589838a0161241a565b9450606088013591508082111561257b57600080fd5b61258789838a0161241a565b9350608088013591508082111561259d57600080fd5b506125aa888289016124e9565b9150509295509295909350565b600080604083850312156125ca57600080fd5b823567ffffffffffffffff808211156125e257600080fd5b818501915085601f8301126125f657600080fd5b81356020612603826123f6565b60405161261082826123c9565b83815260059390931b850182019282810191508984111561263057600080fd5b948201945b83861015612657578535612648816121fd565b82529482019490820190612635565b9650508601359250508082111561266d57600080fd5b5061267a8582860161241a565b9150509250929050565b600081518084526020808501945080840160005b838110156126b457815187529582019590820190600101612698565b509495945050505050565b6020815260006122896020830184612684565b6000602082840312156126e457600080fd5b813567ffffffffffffffff8111156126fb57600080fd5b8201601f8101841361270c57600080fd5b6116a98482356020840161248b565b60008060006060848603121561273057600080fd5b833561273b816121fd565b925061274960208501612335565b9150604084013567ffffffffffffffff81111561276557600080fd5b612771868287016124e9565b9150509250925092565b6000806040838503121561278e57600080fd5b8235612799816121fd565b9150602083013580151581146127ae57600080fd5b809150509250929050565b600080604083850312156127cc57600080fd5b50508035926020909101359150565b600080604083850312156127ee57600080fd5b6127f783612335565b9150602083013567ffffffffffffffff81111561281357600080fd5b61267a858286016124e9565b6000806040838503121561283257600080fd5b823561283d816121fd565b915060208301356127ae816121fd565b600080600080600060a0868803121561286557600080fd5b8535612870816121fd565b94506020860135612880816121fd565b93506040860135925060608601359150608086013567ffffffffffffffff8111156128aa57600080fd5b6125aa888289016124e9565b600181811c908216806128ca57607f821691505b60208210811415612904577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000815161291c818560208601612290565b9290920192915050565b600080845481600182811c91508083168061294257607f831692505b602080841082141561297b577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b81801561298f57600181146129a0576129cd565b60ff198616895284890196506129cd565b60008b81526020902060005b868110156129c55781548b8201529085019083016129ac565b505084890196505b5050505050506129dd818561290a565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061ffff808316818516808303821115612a3257612a326129e6565b01949350505050565b600061ffff80831681811415612a5357612a536129e6565b6001019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612abe57612abe6129e6565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b0357612b03612ac5565b500490565b600082821015612b1a57612b1a6129e6565b500390565b600082612b2e57612b2e612ac5565b500690565b60008219821115612b4657612b466129e6565b500190565b604081526000612b5e6040830185612684565b82810360208401526129dd8185612684565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612ba860a08301846122c0565b979650505050505050565b600060208284031215612bc557600080fd5b81516122898161223e565b600060033d1115612be95760046000803e5060005160e01c5b90565b600060443d1015612bfa5790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715612c4857505050505090565b8285019150815181811115612c605750505050505090565b843d8701016020828501011115612c7a5750505050505090565b612c89602082860101876123c9565b509095945050505050565b60006001600160a01b03808816835280871660208401525060a06040830152612cc060a0830186612684565b8281036060840152612cd28186612684565b90508281036080840152612ce681856122c0565b9897505050505050505056fea2646970667358221220802542c6986f65fc2ea4727b77b03ad8e9c54a29077fc776a031c28f1404a06e64736f6c63430008090033

Deployed Bytecode Sourcemap

34545:5440:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17110:231;;;;;;;;;;-1:-1:-1;17110:231:0;;;;;:::i;:::-;;:::i;:::-;;;639:25:1;;;627:2;612:18;17110:231:0;;;;;;;;16133:310;;;;;;;;;;-1:-1:-1;16133:310:0;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;16133:310:0;1107:187:1;34827:33:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35303:46::-;;;;;;;;;;-1:-1:-1;35303:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35629:156;;;;;;;;;;-1:-1:-1;35629:156:0;;;;;:::i;:::-;;:::i;37125:238::-;;;;;;;;;;-1:-1:-1;37125:238:0;;;;;:::i;:::-;;:::i;:::-;;36439:69;;;;;;;;;;;;;:::i;35793:638::-;;;;;;:::i;:::-;;:::i;39149:198::-;;;;;;;;;;-1:-1:-1;39149:198:0;;;;;:::i;:::-;;:::i;19205:442::-;;;;;;;;;;-1:-1:-1;19205:442:0;;;;;:::i;:::-;;:::i;39359:207::-;;;;;;;;;;-1:-1:-1;39359:207:0;;;;;:::i;:::-;;:::i;17507:524::-;;;;;;;;;;-1:-1:-1;17507:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35394:115::-;;;;;;;;;;-1:-1:-1;35394:115:0;;;;;:::i;:::-;;:::i;35517:104::-;;;;;;;;;;-1:-1:-1;35517:104:0;;;;;:::i;:::-;;:::i;35180:24::-;;;;;;;;;;-1:-1:-1;35180:24:0;;;;;;;;31967:94;;;;;;;;;;;;;:::i;39578:192::-;;;;;;;;;;-1:-1:-1;39578:192:0;;;;;:::i;:::-;;:::i;31316:87::-;;;;;;;;;;-1:-1:-1;31389:6:0;;31316:87;;-1:-1:-1;;;;;31389:6:0;;;9351:74:1;;9339:2;9324:18;31316:87:0;9205:226:1;34867:28:0;;;;;;;;;;;;;:::i;37371:343::-;;;;;;;;;;-1:-1:-1;37371:343:0;;;;;:::i;:::-;;:::i;18104:311::-;;;;;;;;;;-1:-1:-1;18104:311:0;;;;;:::i;:::-;;:::i;39782:200::-;;;;;;;;;;-1:-1:-1;39782:200:0;;;;;:::i;:::-;;:::i;36516:601::-;;;;;;;;;;-1:-1:-1;36516:601:0;;;;;:::i;:::-;;:::i;18487:168::-;;;;;;;;;;-1:-1:-1;18487:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;18610:27:0;;;18586:4;18610:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;18487:168;18727:401;;;;;;;;;;-1:-1:-1;18727:401:0;;;;;:::i;:::-;;:::i;32216:192::-;;;;;;;;;;-1:-1:-1;32216:192:0;;;;;:::i;:::-;;:::i;17110:231::-;17196:7;-1:-1:-1;;;;;17224:21:0;;17216:77;;;;-1:-1:-1;;;17216:77:0;;12373:2:1;17216:77:0;;;12355:21:1;12412:2;12392:18;;;12385:30;12451:34;12431:18;;;12424:62;12522:13;12502:18;;;12495:41;12553:19;;17216:77:0;;;;;;;;;-1:-1:-1;17311:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;17311:22:0;;;;;;;;;;;;17110:231::o;16133:310::-;16235:4;16272:41;;;16287:26;16272:41;;:110;;-1:-1:-1;16330:52:0;;;16345:37;16330:52;16272:110;:163;;;-1:-1:-1;15403:25:0;15388:40;;;;16399:36;16252:183;16133:310;-1:-1:-1;;16133:310:0:o;34827:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35629:156::-;35689:13;35746:7;35755:20;35772:2;35755:16;:20::i;:::-;35729:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35715:62;;35629:156;;;:::o;37125:238::-;31389:6;;-1:-1:-1;;;;;31389:6:0;15036:10;31536:23;31528:68;;;;-1:-1:-1;;;31528:68:0;;14837:2:1;31528:68:0;;;14819:21:1;;;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;14967:18;;31528:68:0;14635:356:1;31528:68:0;37208:40:::1;37214:10;37226:7;37208:40;;37235:8;37208:40;;;;;;;;;;;;;::::0;:5:::1;:40::i;:::-;34770:1;37259:7;:23;;;:91;;37342:8;37318:22;;:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;37259:91;37125:238:::0;;:::o;37259:91::-:1;37307:8;37285:20;;:30;;;;;;;;;;;;;;;;:::i;37259:91::-;;37125:238:::0;;:::o;36439:69::-;31389:6;;-1:-1:-1;;;;;31389:6:0;15036:10;31536:23;31528:68;;;;-1:-1:-1;;;31528:68:0;;14837:2:1;31528:68:0;;;14819:21:1;;;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;14967:18;;31528:68:0;14635:356:1;31528:68:0;36496:4:::1;::::0;;-1:-1:-1;;36488:12:0;::::1;36496:4;::::0;;::::1;36495:5;36488:12;::::0;;36439:69::o;35793:638::-;35856:4;;;;35848:30;;;;-1:-1:-1;;;35848:30:0;;15616:2:1;35848:30:0;;;15598:21:1;15655:2;15635:18;;;15628:30;15694:15;15674:18;;;15667:43;15727:18;;35848:30:0;15414:337:1;35848:30:0;34770:1;35897:7;:23;;;:115;;35997:15;;;;;;;;;35967:26;;:22;;;;;35992:1;35967:26;:::i;:::-;:45;;;;35897:115;;;35951:13;;;;;;;35923:24;;:20;;;;;35951:13;35923:24;:::i;:::-;:41;;;;35897:115;35889:138;;;;-1:-1:-1;;;35889:138:0;;15958:2:1;35889:138:0;;;15940:21:1;15997:2;15977:18;;;15970:30;16036:12;16016:18;;;16009:40;16066:18;;35889:138:0;15756:334:1;35889:138:0;36061:10;36047:25;;;;:13;:25;;;;;;;;36046:26;36038:50;;;;-1:-1:-1;;;36038:50:0;;16297:2:1;36038:50:0;;;16279:21:1;16336:2;16316:18;;;16309:30;16375:13;16355:18;;;16348:41;16406:18;;36038:50:0;16095:335:1;36038:50:0;34770:1;36107:7;:23;;;:52;;;;34817:1;36134:7;:25;;;36107:52;36099:71;;;;-1:-1:-1;;;36099:71:0;;16637:2:1;36099:71:0;;;16619:21:1;16676:1;16656:18;;;16649:29;16714:8;16694:18;;;16687:36;16740:18;;36099:71:0;16435:329:1;36099:71:0;36202:21;36215:7;36202:21;;:12;:21::i;:::-;36189:9;:34;;36181:56;;;;-1:-1:-1;;;36181:56:0;;16971:2:1;36181:56:0;;;16953:21:1;17010:1;16990:18;;;16983:29;17048:11;17028:18;;;17021:39;17077:18;;36181:56:0;16769:332:1;36181:56:0;34770:1;36250:7;:23;;;:75;;36301:22;:24;;;;;;;;:22;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36250:75;;;36276:20;:22;;;;;;;;:20;:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36250:75;-1:-1:-1;36359:10:0;36345:25;;;;:13;:25;;;;;;;;:32;;-1:-1:-1;;36345:32:0;36373:4;36345:32;;;;;;36390:33;;;;;;;;;;;;;36359:10;36390:33;;;;:5;:33::i;:::-;35793:638;:::o;39149:198::-;39212:7;34770:1;39235:7;:23;39232:75;;;-1:-1:-1;;39282:13:0;;;;;39149:198::o;39232:75::-;-1:-1:-1;;39324:15:0;;;;;;;;39149:198::o;19205:442::-;-1:-1:-1;;;;;19438:20:0;;15036:10;19438:20;;:60;;-1:-1:-1;19462:36:0;19479:4;15036:10;18487:168;:::i;19462:36::-;19416:160;;;;-1:-1:-1;;;19416:160:0;;17510:2:1;19416:160:0;;;17492:21:1;17549:2;17529:18;;;17522:30;17588:34;17568:18;;;17561:62;17659:20;17639:18;;;17632:48;17697:19;;19416:160:0;17308:414:1;19416:160:0;19587:52;19610:4;19616:2;19620:3;19625:7;19634:4;19587:22;:52::i;:::-;19205:442;;;;;:::o;39359:207::-;39417:7;34770:1;39440:7;:23;39437:82;;;-1:-1:-1;;39487:20:0;;;;;;;;39359:207::o;39437:82::-;-1:-1:-1;;39536:22:0;;;;;;;;39359:207::o;17507:524::-;17663:16;17724:3;:10;17705:8;:15;:29;17697:83;;;;-1:-1:-1;;;17697:83:0;;17929:2:1;17697:83:0;;;17911:21:1;17968:2;17948:18;;;17941:30;18007:34;17987:18;;;17980:62;18078:11;18058:18;;;18051:39;18107:19;;17697:83:0;17727:405:1;17697:83:0;17793:30;17840:8;:15;17826:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17826:30:0;;17793:63;;17874:9;17869:122;17893:8;:15;17889:1;:19;17869:122;;;17949:30;17959:8;17968:1;17959:11;;;;;;;;:::i;:::-;;;;;;;17972:3;17976:1;17972:6;;;;;;;;:::i;:::-;;;;;;;17949:9;:30::i;:::-;17930:13;17944:1;17930:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;17910:3;;;:::i;:::-;;;17869:122;;;-1:-1:-1;18010:13:0;17507:524;-1:-1:-1;;;17507:524:0:o;35394:115::-;31389:6;;-1:-1:-1;;;;;31389:6:0;15036:10;31536:23;31528:68;;;;-1:-1:-1;;;31528:68:0;;14837:2:1;31528:68:0;;;14819:21:1;;;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;14967:18;;31528:68:0;14635:356:1;31528:68:0;35480:21:::1;::::0;-1:-1:-1;;;;;35480:12:0;::::1;::::0;:21;::::1;;;::::0;35493:7;;35480:21:::1;::::0;;;35493:7;35480:12;:21;::::1;;;;;;;;;;;;;::::0;::::1;;;;35517:104:::0;31389:6;;-1:-1:-1;;;;;31389:6:0;15036:10;31536:23;31528:68;;;;-1:-1:-1;;;31528:68:0;;14837:2:1;31528:68:0;;;14819:21:1;;;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;14967:18;;31528:68:0;14635:356:1;31528:68:0;35593:20;;::::1;::::0;:7:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;:::-;;35517:104:::0;:::o;31967:94::-;31389:6;;-1:-1:-1;;;;;31389:6:0;15036:10;31536:23;31528:68;;;;-1:-1:-1;;;31528:68:0;;14837:2:1;31528:68:0;;;14819:21:1;;;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;14967:18;;31528:68:0;14635:356:1;31528:68:0;32032:21:::1;32050:1;32032:9;:21::i;:::-;31967:94::o:0;39578:192::-;39635:7;34770:1;39658:7;:23;39655:75;;;-1:-1:-1;;39705:13:0;;;39578:192::o;39655:75::-;-1:-1:-1;;39747:15:0;;;39578:192::o;34867:28::-;;;;;;;:::i;37371:343::-;37518:25;;;-1:-1:-1;;;;;18716:55:1;;;37518:25:0;;;;18698:74:1;;;;18820:6;18808:19;;18788:18;;;18781:47;37518:25:0;;;;;;;;;18671:18:1;;;37518:25:0;;37508:36;;;;;;23697:66:1;38027::0;;;23685:79:1;23780:12;;;;23773:28;;;38027:66:0;;;;;;;;;;23817:12:1;;;;38027:66:0;;;38003:101;;;;;;;;37692:14;;-1:-1:-1;;37508:36:0;37692:14;37642:46;38003:101;37678:9;37642:13;:46::i;:::-;-1:-1:-1;;;;;37642:64:0;;;37371:343;-1:-1:-1;;;;;;37371:343:0:o;18104:311::-;15036:10;-1:-1:-1;;;;;18207:24:0;;;;18199:78;;;;-1:-1:-1;;;18199:78:0;;19041:2:1;18199:78:0;;;19023:21:1;19080:2;19060:18;;;19053:30;19119:34;19099:18;;;19092:62;19190:11;19170:18;;;19163:39;19219:19;;18199:78:0;18839:405:1;18199:78:0;15036:10;18290:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;18290:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;18290:53:0;;;;;;;;;;18359:48;;1247:41:1;;;18290:42:0;;15036:10;18359:48;;1220:18:1;18359:48:0;;;;;;;18104:311;;:::o;39782:200::-;31389:6;;-1:-1:-1;;;;;31389:6:0;15036:10;31536:23;31528:68;;;;-1:-1:-1;;;31528:68:0;;14837:2:1;31528:68:0;;;14819:21:1;;;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;14967:18;;31528:68:0;14635:356:1;31528:68:0;34770:1:::1;39863:7;:23;39860:114;;;39901:13;:21:::0;-1:-1:-1;35517:104:0:o;39860:114::-:1;39951:15;:23:::0;-1:-1:-1;39782:200:0:o;36516:601::-;36596:7;:12;;36607:1;36596:12;:28;;;;36612:7;:12;;36623:1;36612:12;36596:28;36588:47;;;;-1:-1:-1;;;36588:47:0;;16637:2:1;36588:47:0;;;16619:21:1;16676:1;16656:18;;;16649:29;16714:8;16694:18;;;16687:36;16740:18;;36588:47:0;16435:329:1;36588:47:0;34770:1;36654:7;:23;;;:115;;36754:15;;;;;;;;;36724:26;;:22;;;;;36749:1;36724:26;:::i;:::-;:45;;;;36654:115;;;36708:13;;;;;;;36680:24;;:20;;;;;36708:13;36680:24;:::i;:::-;:41;;;;36654:115;36646:138;;;;-1:-1:-1;;;36646:138:0;;15958:2:1;36646:138:0;;;15940:21:1;15997:2;15977:18;;;15970:30;16036:12;16016:18;;;16009:40;16066:18;;36646:138:0;15756:334:1;36646:138:0;36805:45;36819:10;36831:7;36840:9;36805:13;:45::i;:::-;36797:73;;;;-1:-1:-1;;;36797:73:0;;19451:2:1;36797:73:0;;;19433:21:1;19490:2;19470:18;;;19463:30;19529:17;19509:18;;;19502:45;19564:18;;36797:73:0;19249:339:1;36797:73:0;36904:10;36890:25;;;;:13;:25;;;;;;;;36889:26;36881:50;;;;-1:-1:-1;;;36881:50:0;;16297:2:1;36881:50:0;;;16279:21:1;16336:2;16316:18;;;16309:30;16375:13;16355:18;;;16348:41;16406:18;;36881:50:0;16095:335:1;36881:50:0;34770:1;36944:7;:23;;;:75;;36995:22;:24;;;;;;;;:22;:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36944:75;;;36970:20;:22;;;;;;;;:20;:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36944:75;-1:-1:-1;37045:10:0;37031:25;;;;:13;:25;;;;;;;;:32;;-1:-1:-1;;37031:32:0;37059:4;37031:32;;;;;;37076:33;;;;;;;;;;;;;37045:10;37076:33;;;;:5;:33::i;18727:401::-;-1:-1:-1;;;;;18935:20:0;;15036:10;18935:20;;:60;;-1:-1:-1;18959:36:0;18976:4;15036:10;18487:168;:::i;18959:36::-;18913:151;;;;-1:-1:-1;;;18913:151:0;;19795:2:1;18913:151:0;;;19777:21:1;19834:2;19814:18;;;19807:30;19873:34;19853:18;;;19846:62;19944:11;19924:18;;;19917:39;19973:19;;18913:151:0;19593:405:1;18913:151:0;19075:45;19093:4;19099:2;19103;19107:6;19115:4;19075:17;:45::i;32216:192::-;31389:6;;-1:-1:-1;;;;;31389:6:0;15036:10;31536:23;31528:68;;;;-1:-1:-1;;;31528:68:0;;14837:2:1;31528:68:0;;;14819:21:1;;;14856:18;;;14849:30;14915:34;14895:18;;;14888:62;14967:18;;31528:68:0;14635:356:1;31528:68:0;-1:-1:-1;;;;;32305:22:0;::::1;32297:73;;;::::0;-1:-1:-1;;;32297:73:0;;20205:2:1;32297:73:0::1;::::0;::::1;20187:21:1::0;20244:2;20224:18;;;20217:30;20283:34;20263:18;;;20256:62;20354:8;20334:18;;;20327:36;20380:19;;32297:73:0::1;20003:402:1::0;32297:73:0::1;32381:19;32391:8;32381:9;:19::i;32784:723::-:0;32840:13;33061:10;33057:53;;-1:-1:-1;;33088:10:0;;;;;;;;;;;;;;;;;;32784:723::o;33057:53::-;33135:5;33120:12;33176:78;33183:9;;33176:78;;33209:8;;;;:::i;:::-;;-1:-1:-1;33232:10:0;;-1:-1:-1;33240:2:0;33232:10;;:::i;:::-;;;33176:78;;;33264:19;33296:6;33286:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33286:17:0;;33264:39;;33314:154;33321:10;;33314:154;;33348:11;33358:1;33348:11;;:::i;:::-;;-1:-1:-1;33417:10:0;33425:2;33417:5;:10;:::i;:::-;33404:24;;:2;:24;:::i;:::-;33391:39;;33374:6;33381;33374:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;33445:11:0;33454:2;33445:11;;:::i;:::-;;;33314:154;;;33492:6;32784:723;-1:-1:-1;;;;32784:723:0:o;23696:599::-;-1:-1:-1;;;;;23854:21:0;;23846:67;;;;-1:-1:-1;;;23846:67:0;;21306:2:1;23846:67:0;;;21288:21:1;21345:2;21325:18;;;21318:30;21384:34;21364:18;;;21357:62;21455:3;21435:18;;;21428:31;21476:19;;23846:67:0;21104:397:1;23846:67:0;15036:10;23970:107;15036:10;23926:16;24013:7;24022:21;24040:2;24022:17;:21::i;:::-;24045:25;24063:6;24045:17;:25::i;23970:107::-;24090:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24090:22:0;;;;;;;;;:32;;24116:6;;24090:9;:32;;24116:6;;24090:32;:::i;:::-;;;;-1:-1:-1;;24138:57:0;;;21680:25:1;;;21736:2;21721:18;;21714:34;;;-1:-1:-1;;;;;24138:57:0;;;;24171:1;;24138:57;;;;;;21653:18:1;24138:57:0;;;;;;;24208:79;24239:8;24257:1;24261:7;24270:2;24274:6;24282:4;24208:30;:79::i;21289:1074::-;21516:7;:14;21502:3;:10;:28;21494:81;;;;-1:-1:-1;;;21494:81:0;;21961:2:1;21494:81:0;;;21943:21:1;22000:2;21980:18;;;21973:30;22039:34;22019:18;;;22012:62;22110:10;22090:18;;;22083:38;22138:19;;21494:81:0;21759:404:1;21494:81:0;-1:-1:-1;;;;;21594:16:0;;21586:66;;;;-1:-1:-1;;;21586:66:0;;22370:2:1;21586:66:0;;;22352:21:1;22409:2;22389:18;;;22382:30;22448:34;22428:18;;;22421:62;22519:7;22499:18;;;22492:35;22544:19;;21586:66:0;22168:401:1;21586:66:0;15036:10;21665:16;21782:421;21806:3;:10;21802:1;:14;21782:421;;;21838:10;21851:3;21855:1;21851:6;;;;;;;;:::i;:::-;;;;;;;21838:19;;21872:14;21889:7;21897:1;21889:10;;;;;;;;:::i;:::-;;;;;;;;;;;;21916:19;21938:13;;;;;;;;;;-1:-1:-1;;;;;21938:19:0;;;;;;;;;;;;21889:10;;-1:-1:-1;21980:21:0;;;;21972:76;;;;-1:-1:-1;;;21972:76:0;;22776:2:1;21972:76:0;;;22758:21:1;22815:2;22795:18;;;22788:30;22854:34;22834:18;;;22827:62;22925:12;22905:18;;;22898:40;22955:19;;21972:76:0;22574:406:1;21972:76:0;22092:9;:13;;;;;;;;;;;-1:-1:-1;;;;;22092:19:0;;;;;;;;;;22114:20;;;22092:42;;22164:17;;;;;;;:27;;22114:20;;22092:9;22164:27;;22114:20;;22164:27;:::i;:::-;;;;;;;;21823:380;;;21818:3;;;;:::i;:::-;;;21782:421;;;;22250:2;-1:-1:-1;;;;;22220:47:0;22244:4;-1:-1:-1;;;;;22220:47:0;22234:8;-1:-1:-1;;;;;22220:47:0;;22254:3;22259:7;22220:47;;;;;;;:::i;:::-;;;;;;;;22280:75;22316:8;22326:4;22332:2;22336:3;22341:7;22350:4;22280:35;:75::i;:::-;21483:880;21289:1074;;;;;:::o;32416:173::-;32491:6;;;-1:-1:-1;;;;;32508:17:0;;;;;;;;;;;32541:40;;32491:6;;;32508:17;32491:6;;32541:40;;32472:16;;32541:40;32461:128;32416:173;:::o;38120:248::-;38221:7;38242:9;38253;38264:7;38275:26;38290:10;38275:14;:26::i;:::-;38319:41;;;;;;;;;;;;24067:25:1;;;24140:4;24128:17;;24108:18;;;24101:45;;;;24162:18;;;24155:34;;;24205:18;;;24198:34;;;38241:60:0;;-1:-1:-1;38241:60:0;;-1:-1:-1;38241:60:0;-1:-1:-1;38319:41:0;;24039:19:1;;38319:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38319:41:0;;-1:-1:-1;;38319:41:0;;;38120:248;-1:-1:-1;;;;;;;38120:248:0:o;20111:820::-;-1:-1:-1;;;;;20299:16:0;;20291:66;;;;-1:-1:-1;;;20291:66:0;;22370:2:1;20291:66:0;;;22352:21:1;22409:2;22389:18;;;22382:30;22448:34;22428:18;;;22421:62;22519:7;22499:18;;;22492:35;22544:19;;20291:66:0;22168:401:1;20291:66:0;15036:10;20414:96;15036:10;20445:4;20451:2;20455:21;20473:2;20455:17;:21::i;20414:96::-;20523:19;20545:13;;;;;;;;;;;-1:-1:-1;;;;;20545:19:0;;;;;;;;;;20583:21;;;;20575:76;;;;-1:-1:-1;;;20575:76:0;;22776:2:1;20575:76:0;;;22758:21:1;22815:2;22795:18;;;22788:30;22854:34;22834:18;;;22827:62;22925:12;22905:18;;;22898:40;22955:19;;20575:76:0;22574:406:1;20575:76:0;20687:9;:13;;;;;;;;;;;-1:-1:-1;;;;;20687:19:0;;;;;;;;;;20709:20;;;20687:42;;20751:17;;;;;;;:27;;20709:20;;20687:9;20751:27;;20709:20;;20751:27;:::i;:::-;;;;-1:-1:-1;;20796:46:0;;;21680:25:1;;;21736:2;21721:18;;21714:34;;;-1:-1:-1;;;;;20796:46:0;;;;;;;;;;;;;;21653:18:1;20796:46:0;;;;;;;20855:68;20886:8;20896:4;20902:2;20906;20910:6;20918:4;20855:30;:68::i;:::-;20280:651;;20111:820;;;;;:::o;30199:198::-;30319:16;;;30333:1;30319:16;;;;;;;;;30265;;30294:22;;30319:16;;;;;;;;;;;;-1:-1:-1;30319:16:0;30294:41;;30357:7;30346:5;30352:1;30346:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;30384:5;30199:198;-1:-1:-1;;30199:198:0:o;28626:744::-;-1:-1:-1;;;;;28841:13:0;;7913:20;7961:8;28837:526;;28877:72;;;;;-1:-1:-1;;;;;28877:38:0;;;;;:72;;28916:8;;28926:4;;28932:2;;28936:6;;28944:4;;28877:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28877:72:0;;;;;;;;-1:-1:-1;;28877:72:0;;;;;;;;;;;;:::i;:::-;;;28873:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;29225:6;29218:14;;-1:-1:-1;;;29218:14:0;;;;;;;;:::i;28873:479::-;;;29274:62;;-1:-1:-1;;;29274:62:0;;26219:2:1;29274:62:0;;;26201:21:1;26258:2;26238:18;;;26231:30;26297:34;26277:18;;;26270:62;26368:22;26348:18;;;26341:50;26408:19;;29274:62:0;26017:416:1;28873:479:0;28999:55;;;29011:43;28999:55;28995:154;;29079:50;;-1:-1:-1;;;29079:50:0;;26640:2:1;29079:50:0;;;26622:21:1;26679:2;26659:18;;;26652:30;26718:34;26698:18;;;26691:62;26789:10;26769:18;;;26762:38;26817:19;;29079:50:0;26438:404:1;29378:813:0;-1:-1:-1;;;;;29618:13:0;;7913:20;7961:8;29614:570;;29654:79;;;;;-1:-1:-1;;;;;29654:43:0;;;;;:79;;29698:8;;29708:4;;29714:3;;29719:7;;29728:4;;29654:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29654:79:0;;;;;;;;-1:-1:-1;;29654:79:0;;;;;;;;;;;;:::i;:::-;;;29650:523;;;;:::i;:::-;29815:60;;;29827:48;29815:60;29811:159;;29900:50;;-1:-1:-1;;;29900:50:0;;26640:2:1;29900:50:0;;;26622:21:1;26679:2;26659:18;;;26652:30;26718:34;26698:18;;;26691:62;26789:10;26769:18;;;26762:38;26817:19;;29900:50:0;26438:404:1;38376:761:0;38440:9;38451;38462:7;38490:3;:10;38504:2;38490:16;38482:40;;;;-1:-1:-1;;;38482:40:0;;27915:2:1;38482:40:0;;;27897:21:1;27954:2;27934:18;;;27927:30;27993:13;27973:18;;;27966:41;28024:18;;38482:40:0;27713:335:1;38482:40:0;-1:-1:-1;;;38903:2:0;38894:12;;38888:19;38969:2;38960:12;;38954:19;39072:2;39063:12;;;39057:19;38888;;39054:1;39049:28;;;;;38376:761::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:154:1;-1:-1:-1;;;;;93:5:1;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:315;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;:::-;426:5;478:2;463:18;;;;450:32;;-1:-1:-1;;;173:315:1:o;675:177::-;760:66;753:5;749:78;742:5;739:89;729:117;;842:1;839;832:12;857:245;915:6;968:2;956:9;947:7;943:23;939:32;936:52;;;984:1;981;974:12;936:52;1023:9;1010:23;1042:30;1066:5;1042:30;:::i;:::-;1091:5;857:245;-1:-1:-1;;;857:245:1:o;1299:258::-;1371:1;1381:113;1395:6;1392:1;1389:13;1381:113;;;1471:11;;;1465:18;1452:11;;;1445:39;1417:2;1410:10;1381:113;;;1512:6;1509:1;1506:13;1503:48;;;1547:1;1538:6;1533:3;1529:16;1522:27;1503:48;;1299:258;;;:::o;1562:328::-;1615:3;1653:5;1647:12;1680:6;1675:3;1668:19;1696:63;1752:6;1745:4;1740:3;1736:14;1729:4;1722:5;1718:16;1696:63;:::i;:::-;1804:2;1792:15;-1:-1:-1;;1788:88:1;1779:98;;;;1879:4;1775:109;;1562:328;-1:-1:-1;;1562:328:1:o;1895:231::-;2044:2;2033:9;2026:21;2007:4;2064:56;2116:2;2105:9;2101:18;2093:6;2064:56;:::i;2131:247::-;2190:6;2243:2;2231:9;2222:7;2218:23;2214:32;2211:52;;;2259:1;2256;2249:12;2211:52;2298:9;2285:23;2317:31;2342:5;2317:31;:::i;2383:180::-;2442:6;2495:2;2483:9;2474:7;2470:23;2466:32;2463:52;;;2511:1;2508;2501:12;2463:52;-1:-1:-1;2534:23:1;;2383:180;-1:-1:-1;2383:180:1:o;2568:159::-;2635:20;;2695:6;2684:18;;2674:29;;2664:57;;2717:1;2714;2707:12;2664:57;2568:159;;;:::o;2732:256::-;2798:6;2806;2859:2;2847:9;2838:7;2834:23;2830:32;2827:52;;;2875:1;2872;2865:12;2827:52;2898:28;2916:9;2898:28;:::i;:::-;2888:38;;2945:37;2978:2;2967:9;2963:18;2945:37;:::i;:::-;2935:47;;2732:256;;;;;:::o;2993:184::-;3051:6;3104:2;3092:9;3083:7;3079:23;3075:32;3072:52;;;3120:1;3117;3110:12;3072:52;3143:28;3161:9;3143:28;:::i;3182:184::-;3234:77;3231:1;3224:88;3331:4;3328:1;3321:15;3355:4;3352:1;3345:15;3371:308;-1:-1:-1;;3472:2:1;3466:4;3462:13;3458:86;3450:6;3446:99;3611:6;3599:10;3596:22;3575:18;3563:10;3560:34;3557:62;3554:88;;;3622:18;;:::i;:::-;3658:2;3651:22;-1:-1:-1;;3371:308:1:o;3684:183::-;3744:4;3777:18;3769:6;3766:30;3763:56;;;3799:18;;:::i;:::-;-1:-1:-1;3844:1:1;3840:14;3856:4;3836:25;;3684:183::o;3872:724::-;3926:5;3979:3;3972:4;3964:6;3960:17;3956:27;3946:55;;3997:1;3994;3987:12;3946:55;4033:6;4020:20;4059:4;4082:43;4122:2;4082:43;:::i;:::-;4154:2;4148:9;4166:31;4194:2;4186:6;4166:31;:::i;:::-;4232:18;;;4324:1;4320:10;;;;4308:23;;4304:32;;;4266:15;;;;-1:-1:-1;4348:15:1;;;4345:35;;;4376:1;4373;4366:12;4345:35;4412:2;4404:6;4400:15;4424:142;4440:6;4435:3;4432:15;4424:142;;;4506:17;;4494:30;;4544:12;;;;4457;;4424:142;;;-1:-1:-1;4584:6:1;3872:724;-1:-1:-1;;;;;;3872:724:1:o;4601:527::-;4665:5;4699:18;4691:6;4688:30;4685:56;;;4721:18;;:::i;:::-;4770:2;4764:9;4782:128;4904:4;-1:-1:-1;;4830:2:1;4822:6;4818:15;4814:88;4810:99;4802:6;4782:128;:::i;:::-;4928:6;4919:15;;4958:6;4950;4943:22;4998:3;4989:6;4984:3;4980:16;4977:25;4974:45;;;5015:1;5012;5005:12;4974:45;5065:6;5060:3;5053:4;5045:6;5041:17;5028:44;5120:1;5113:4;5104:6;5096;5092:19;5088:30;5081:41;;4601:527;;;;;:::o;5133:220::-;5175:5;5228:3;5221:4;5213:6;5209:17;5205:27;5195:55;;5246:1;5243;5236:12;5195:55;5268:79;5343:3;5334:6;5321:20;5314:4;5306:6;5302:17;5268:79;:::i;5358:1071::-;5512:6;5520;5528;5536;5544;5597:3;5585:9;5576:7;5572:23;5568:33;5565:53;;;5614:1;5611;5604:12;5565:53;5653:9;5640:23;5672:31;5697:5;5672:31;:::i;:::-;5722:5;-1:-1:-1;5779:2:1;5764:18;;5751:32;5792:33;5751:32;5792:33;:::i;:::-;5844:7;-1:-1:-1;5902:2:1;5887:18;;5874:32;5925:18;5955:14;;;5952:34;;;5982:1;5979;5972:12;5952:34;6005:61;6058:7;6049:6;6038:9;6034:22;6005:61;:::i;:::-;5995:71;;6119:2;6108:9;6104:18;6091:32;6075:48;;6148:2;6138:8;6135:16;6132:36;;;6164:1;6161;6154:12;6132:36;6187:63;6242:7;6231:8;6220:9;6216:24;6187:63;:::i;:::-;6177:73;;6303:3;6292:9;6288:19;6275:33;6259:49;;6333:2;6323:8;6320:16;6317:36;;;6349:1;6346;6339:12;6317:36;;6372:51;6415:7;6404:8;6393:9;6389:24;6372:51;:::i;:::-;6362:61;;;5358:1071;;;;;;;;:::o;6434:1277::-;6552:6;6560;6613:2;6601:9;6592:7;6588:23;6584:32;6581:52;;;6629:1;6626;6619:12;6581:52;6669:9;6656:23;6698:18;6739:2;6731:6;6728:14;6725:34;;;6755:1;6752;6745:12;6725:34;6793:6;6782:9;6778:22;6768:32;;6838:7;6831:4;6827:2;6823:13;6819:27;6809:55;;6860:1;6857;6850:12;6809:55;6896:2;6883:16;6918:4;6941:43;6981:2;6941:43;:::i;:::-;7013:2;7007:9;7025:31;7053:2;7045:6;7025:31;:::i;:::-;7091:18;;;7179:1;7175:10;;;;7167:19;;7163:28;;;7125:15;;;;-1:-1:-1;7203:19:1;;;7200:39;;;7235:1;7232;7225:12;7200:39;7259:11;;;;7279:217;7295:6;7290:3;7287:15;7279:217;;;7375:3;7362:17;7392:31;7417:5;7392:31;:::i;:::-;7436:18;;7312:12;;;;7474;;;;7279:217;;;7515:6;-1:-1:-1;;7559:18:1;;7546:32;;-1:-1:-1;;7590:16:1;;;7587:36;;;7619:1;7616;7609:12;7587:36;;7642:63;7697:7;7686:8;7675:9;7671:24;7642:63;:::i;:::-;7632:73;;;6434:1277;;;;;:::o;7716:435::-;7769:3;7807:5;7801:12;7834:6;7829:3;7822:19;7860:4;7889:2;7884:3;7880:12;7873:19;;7926:2;7919:5;7915:14;7947:1;7957:169;7971:6;7968:1;7965:13;7957:169;;;8032:13;;8020:26;;8066:12;;;;8101:15;;;;7993:1;7986:9;7957:169;;;-1:-1:-1;8142:3:1;;7716:435;-1:-1:-1;;;;;7716:435:1:o;8156:261::-;8335:2;8324:9;8317:21;8298:4;8355:56;8407:2;8396:9;8392:18;8384:6;8355:56;:::i;8750:450::-;8819:6;8872:2;8860:9;8851:7;8847:23;8843:32;8840:52;;;8888:1;8885;8878:12;8840:52;8928:9;8915:23;8961:18;8953:6;8950:30;8947:50;;;8993:1;8990;8983:12;8947:50;9016:22;;9069:4;9061:13;;9057:27;-1:-1:-1;9047:55:1;;9098:1;9095;9088:12;9047:55;9121:73;9186:7;9181:2;9168:16;9163:2;9159;9155:11;9121:73;:::i;9436:527::-;9521:6;9529;9537;9590:2;9578:9;9569:7;9565:23;9561:32;9558:52;;;9606:1;9603;9596:12;9558:52;9645:9;9632:23;9664:31;9689:5;9664:31;:::i;:::-;9714:5;-1:-1:-1;9738:37:1;9771:2;9756:18;;9738:37;:::i;:::-;9728:47;;9826:2;9815:9;9811:18;9798:32;9853:18;9845:6;9842:30;9839:50;;;9885:1;9882;9875:12;9839:50;9908:49;9949:7;9940:6;9929:9;9925:22;9908:49;:::i;:::-;9898:59;;;9436:527;;;;;:::o;9968:416::-;10033:6;10041;10094:2;10082:9;10073:7;10069:23;10065:32;10062:52;;;10110:1;10107;10100:12;10062:52;10149:9;10136:23;10168:31;10193:5;10168:31;:::i;:::-;10218:5;-1:-1:-1;10275:2:1;10260:18;;10247:32;10317:15;;10310:23;10298:36;;10288:64;;10348:1;10345;10338:12;10288:64;10371:7;10361:17;;;9968:416;;;;;:::o;10389:248::-;10457:6;10465;10518:2;10506:9;10497:7;10493:23;10489:32;10486:52;;;10534:1;10531;10524:12;10486:52;-1:-1:-1;;10557:23:1;;;10627:2;10612:18;;;10599:32;;-1:-1:-1;10389:248:1:o;10642:392::-;10718:6;10726;10779:2;10767:9;10758:7;10754:23;10750:32;10747:52;;;10795:1;10792;10785:12;10747:52;10818:28;10836:9;10818:28;:::i;:::-;10808:38;;10897:2;10886:9;10882:18;10869:32;10924:18;10916:6;10913:30;10910:50;;;10956:1;10953;10946:12;10910:50;10979:49;11020:7;11011:6;11000:9;10996:22;10979:49;:::i;11039:388::-;11107:6;11115;11168:2;11156:9;11147:7;11143:23;11139:32;11136:52;;;11184:1;11181;11174:12;11136:52;11223:9;11210:23;11242:31;11267:5;11242:31;:::i;:::-;11292:5;-1:-1:-1;11349:2:1;11334:18;;11321:32;11362:33;11321:32;11362:33;:::i;11432:734::-;11536:6;11544;11552;11560;11568;11621:3;11609:9;11600:7;11596:23;11592:33;11589:53;;;11638:1;11635;11628:12;11589:53;11677:9;11664:23;11696:31;11721:5;11696:31;:::i;:::-;11746:5;-1:-1:-1;11803:2:1;11788:18;;11775:32;11816:33;11775:32;11816:33;:::i;:::-;11868:7;-1:-1:-1;11922:2:1;11907:18;;11894:32;;-1:-1:-1;11973:2:1;11958:18;;11945:32;;-1:-1:-1;12028:3:1;12013:19;;12000:33;12056:18;12045:30;;12042:50;;;12088:1;12085;12078:12;12042:50;12111:49;12152:7;12143:6;12132:9;12128:22;12111:49;:::i;12583:437::-;12662:1;12658:12;;;;12705;;;12726:61;;12780:4;12772:6;12768:17;12758:27;;12726:61;12833:2;12825:6;12822:14;12802:18;12799:38;12796:218;;;12870:77;12867:1;12860:88;12971:4;12968:1;12961:15;12999:4;12996:1;12989:15;12796:218;;12583:437;;;:::o;13151:185::-;13193:3;13231:5;13225:12;13246:52;13291:6;13286:3;13279:4;13272:5;13268:16;13246:52;:::i;:::-;13314:16;;;;;13151:185;-1:-1:-1;;13151:185:1:o;13341:1289::-;13517:3;13546:1;13579:6;13573:13;13609:3;13631:1;13659:9;13655:2;13651:18;13641:28;;13719:2;13708:9;13704:18;13741;13731:61;;13785:4;13777:6;13773:17;13763:27;;13731:61;13811:2;13859;13851:6;13848:14;13828:18;13825:38;13822:222;;;13898:77;13893:3;13886:90;13999:4;13996:1;13989:15;14029:4;14024:3;14017:17;13822:222;14060:18;14087:162;;;;14263:1;14258:320;;;;14053:525;;14087:162;-1:-1:-1;;14124:9:1;14120:82;14115:3;14108:95;14232:6;14227:3;14223:16;14216:23;;14087:162;;14258:320;13098:1;13091:14;;;13135:4;13122:18;;14353:1;14367:165;14381:6;14378:1;14375:13;14367:165;;;14459:14;;14446:11;;;14439:35;14502:16;;;;14396:10;;14367:165;;;14371:3;;14561:6;14556:3;14552:16;14545:23;;14053:525;;;;;;;14594:30;14620:3;14612:6;14594:30;:::i;:::-;14587:37;13341:1289;-1:-1:-1;;;;;13341:1289:1:o;14996:184::-;15048:77;15045:1;15038:88;15145:4;15142:1;15135:15;15169:4;15166:1;15159:15;15185:224;15224:3;15252:6;15285:2;15282:1;15278:10;15315:2;15312:1;15308:10;15346:3;15342:2;15338:12;15333:3;15330:21;15327:47;;;15354:18;;:::i;:::-;15390:13;;15185:224;-1:-1:-1;;;;15185:224:1:o;17106:197::-;17144:3;17172:6;17213:2;17206:5;17202:14;17240:2;17231:7;17228:15;17225:41;;;17246:18;;:::i;:::-;17295:1;17282:15;;17106:197;-1:-1:-1;;;17106:197:1:o;18137:184::-;18189:77;18186:1;18179:88;18286:4;18283:1;18276:15;18310:4;18307:1;18300:15;18326:195;18365:3;18396:66;18389:5;18386:77;18383:103;;;18466:18;;:::i;:::-;-1:-1:-1;18513:1:1;18502:13;;18326:195::o;20410:184::-;20462:77;20459:1;20452:88;20559:4;20556:1;20549:15;20583:4;20580:1;20573:15;20599:120;20639:1;20665;20655:35;;20670:18;;:::i;:::-;-1:-1:-1;20704:9:1;;20599:120::o;20724:125::-;20764:4;20792:1;20789;20786:8;20783:34;;;20797:18;;:::i;:::-;-1:-1:-1;20834:9:1;;20724:125::o;20854:112::-;20886:1;20912;20902:35;;20917:18;;:::i;:::-;-1:-1:-1;20951:9:1;;20854:112::o;20971:128::-;21011:3;21042:1;21038:6;21035:1;21032:13;21029:39;;;21048:18;;:::i;:::-;-1:-1:-1;21084:9:1;;20971:128::o;22985:465::-;23242:2;23231:9;23224:21;23205:4;23268:56;23320:2;23309:9;23305:18;23297:6;23268:56;:::i;:::-;23372:9;23364:6;23360:22;23355:2;23344:9;23340:18;23333:50;23400:44;23437:6;23429;23400:44;:::i;24243:595::-;24465:4;-1:-1:-1;;;;;24575:2:1;24567:6;24563:15;24552:9;24545:34;24627:2;24619:6;24615:15;24610:2;24599:9;24595:18;24588:43;;24667:6;24662:2;24651:9;24647:18;24640:34;24710:6;24705:2;24694:9;24690:18;24683:34;24754:3;24748;24737:9;24733:19;24726:32;24775:57;24827:3;24816:9;24812:19;24804:6;24775:57;:::i;:::-;24767:65;24243:595;-1:-1:-1;;;;;;;24243:595:1:o;24843:249::-;24912:6;24965:2;24953:9;24944:7;24940:23;24936:32;24933:52;;;24981:1;24978;24971:12;24933:52;25013:9;25007:16;25032:30;25056:5;25032:30;:::i;25097:179::-;25132:3;25174:1;25156:16;25153:23;25150:120;;;25220:1;25217;25214;25199:23;-1:-1:-1;25257:1:1;25251:8;25246:3;25242:18;25150:120;25097:179;:::o;25281:731::-;25320:3;25362:4;25344:16;25341:26;25338:39;;;25281:731;:::o;25338:39::-;25404:2;25398:9;25426:66;25547:2;25529:16;25525:25;25522:1;25516:4;25501:50;25580:4;25574:11;25604:16;25639:18;25710:2;25703:4;25695:6;25691:17;25688:25;25683:2;25675:6;25672:14;25669:45;25666:58;;;25717:5;;;;;25281:731;:::o;25666:58::-;25754:6;25748:4;25744:17;25733:28;;25790:3;25784:10;25817:2;25809:6;25806:14;25803:27;;;25823:5;;;;;;25281:731;:::o;25803:27::-;25907:2;25888:16;25882:4;25878:27;25874:36;25867:4;25858:6;25853:3;25849:16;25845:27;25842:69;25839:82;;;25914:5;;;;;;25281:731;:::o;25839:82::-;25930:57;25981:4;25972:6;25964;25960:19;25956:30;25950:4;25930:57;:::i;:::-;-1:-1:-1;26003:3:1;;25281:731;-1:-1:-1;;;;;25281:731:1:o;26847:861::-;27169:4;-1:-1:-1;;;;;27279:2:1;27271:6;27267:15;27256:9;27249:34;27331:2;27323:6;27319:15;27314:2;27303:9;27299:18;27292:43;;27371:3;27366:2;27355:9;27351:18;27344:31;27398:57;27450:3;27439:9;27435:19;27427:6;27398:57;:::i;:::-;27503:9;27495:6;27491:22;27486:2;27475:9;27471:18;27464:50;27537:44;27574:6;27566;27537:44;:::i;:::-;27523:58;;27630:9;27622:6;27618:22;27612:3;27601:9;27597:19;27590:51;27658:44;27695:6;27687;27658:44;:::i;:::-;27650:52;26847:861;-1:-1:-1;;;;;;;;26847:861:1:o

Swarm Source

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