Token Build Token

 

Overview ERC-721

Total Supply:
594 Build

Holders:
28 addresses
Balance
0 Build
0x0000000000000000000000000000000000000000
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Build

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-29
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


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


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

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

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

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

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

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

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

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

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

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

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

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


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


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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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

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


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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


interface IPart is IERC721 {
    function categoryCount() external view returns (uint256);
    function categoryOf(uint256 tokenId) external view returns (uint256);
    function scoreOf(uint256 tokenId) external view returns (uint256);
}


contract Build is ERC721Enumerable, Ownable {

    event Assembled    (address indexed owner, uint256[] parts, uint256 tokenId);
    event Disassembled (address indexed owner, uint256 tokenId, uint256[] parts);

    mapping (uint256 => uint256[]) private _parts;

    IPart public immutable part;

    constructor(IPart part_) ERC721("Build Token", "Build") {
        part = part_;
    }

    receive() external payable {}

    function withdraw() external onlyOwner {
        payable(_msgSender()).transfer(address(this).balance);
    }

    function assemble(uint256[] memory parts) external {
        require(parts.length == part.categoryCount(), "Build: invalid number of parts");
        for (uint256 i = 0; i < parts.length; i++) {
            require(part.categoryOf(parts[i]) == i, "Build: invalid category for part");
        }

        uint256 tokenId = nonce();

        _transferParts(_msgSender(), address(this), parts);
        _safeMint(_msgSender(), tokenId);
        _parts[tokenId] = parts;

        emit Assembled(_msgSender(), parts, tokenId);
    }

    function disassemble(uint256 tokenId) external {
        require(_exists(tokenId), "Build: disassemble for nonexistent token");
        require(ownerOf(tokenId) == _msgSender(), "Build: sender is not the token owner");

        uint256[] memory parts = _parts[tokenId];

        _transferParts(address(this), _msgSender(), parts);
        _burn(tokenId);

        emit Disassembled(_msgSender(), tokenId, parts);
    }

    function _transferParts(address from, address to, uint256[] memory parts) internal {
        for (uint256 i = 0; i < parts.length; i++) {
            part.transferFrom(from, to, parts[i]);
        }
    }

    // Since tokens can be burned, it's not possible to assign token ID
    // based on total supply. Therefore a nonce is used instead.
    uint256 private _nonce = 0;
    function nonce() private returns (uint256) {
        return _nonce++;
    }

    function scoreOf(uint256 tokenId) public view returns (uint256) {
        require(_exists(tokenId), "Build: scoreOf for nonexistent token");
        uint256[] memory parts = _parts[tokenId];
        uint256 sum = 0;
        for (uint256 i = 0; i < parts.length; i++) {
            sum += part.scoreOf(parts[i]);
        }
        return sum;
    }

    function partsOf(uint256 tokenId) public view returns (uint256[] memory) {
        require(_exists(tokenId), "Build: partsOf for nonexistent token");
        return _parts[tokenId];
    }

    string public baseURI;
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
    function setBaseURI(string memory baseURI_) public onlyOwner {
        baseURI = baseURI_;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IPart","name":"part_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"parts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Assembled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"parts","type":"uint256[]"}],"name":"Disassembled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"parts","type":"uint256[]"}],"name":"assemble","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"disassemble","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"part","outputs":[{"internalType":"contract IPart","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"partsOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"scoreOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526000600c553480156200001657600080fd5b5060405162002a9938038062002a998339810160408190526200003991620001ce565b604080518082018252600b81526a213ab4b632102a37b5b2b760a91b602080830191825283518085019094526005845264109d5a5b1960da1b908401528151919291620000899160009162000128565b5080516200009f90600190602084019062000128565b505050620000bc620000b6620000d260201b60201c565b620000d6565b60601b6001600160601b0319166080526200023b565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013690620001fe565b90600052602060002090601f0160209004810192826200015a5760008555620001a5565b82601f106200017557805160ff1916838001178555620001a5565b82800160010185558215620001a5579182015b82811115620001a557825182559160200191906001019062000188565b50620001b3929150620001b7565b5090565b5b80821115620001b35760008155600101620001b8565b600060208284031215620001e0578081fd5b81516001600160a01b0381168114620001f7578182fd5b9392505050565b600181811c908216806200021357607f821691505b602082108114156200023557634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c612823620002766000396000818161037001528181610d2901528181610e2301528181610f1001526117cf01526128236000f3fe6080604052600436106101a05760003560e01c80636352211e116100ec57806396b39da11161008a578063c87b56dd11610064578063c87b56dd146104af578063df12ce88146104cf578063e985e9c5146104ef578063f2fde38b1461053857600080fd5b806396b39da11461044f578063a22cb4651461046f578063b88d4fde1461048f57600080fd5b8063715018a6116100c6578063715018a6146103e7578063752821e9146103fc5780638da5cb5b1461041c57806395d89b411461043a57600080fd5b80636352211e146103925780636c0360eb146103b257806370a08231146103c757600080fd5b80632f745c59116101595780634f6ccce7116101335780634f6ccce7146102f157806355f804b31461031157806360ad378b14610331578063627cf9301461035e57600080fd5b80632f745c591461029c5780633ccfd60b146102bc57806342842e0e146102d157600080fd5b806301ffc9a7146101ac57806306fdde03146101e1578063081812fc14610203578063095ea7b31461023b57806318160ddd1461025d57806323b872dd1461027c57600080fd5b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c73660046123d2565b610558565b60405190151581526020015b60405180910390f35b3480156101ed57600080fd5b506101f6610583565b6040516101d89190612587565b34801561020f57600080fd5b5061022361021e366004612450565b610615565b6040516001600160a01b0390911681526020016101d8565b34801561024757600080fd5b5061025b610256366004612301565b6106a2565b005b34801561026957600080fd5b506008545b6040519081526020016101d8565b34801561028857600080fd5b5061025b610297366004612213565b6107b8565b3480156102a857600080fd5b5061026e6102b7366004612301565b6107e9565b3480156102c857600080fd5b5061025b61087f565b3480156102dd57600080fd5b5061025b6102ec366004612213565b6108d8565b3480156102fd57600080fd5b5061026e61030c366004612450565b6108f3565b34801561031d57600080fd5b5061025b61032c36600461240a565b610994565b34801561033d57600080fd5b5061035161034c366004612450565b6109d5565b6040516101d89190612552565b34801561036a57600080fd5b506102237f000000000000000000000000000000000000000000000000000000000000000081565b34801561039e57600080fd5b506102236103ad366004612450565b610a98565b3480156103be57600080fd5b506101f6610b0f565b3480156103d357600080fd5b5061026e6103e23660046121c7565b610b9d565b3480156103f357600080fd5b5061025b610c24565b34801561040857600080fd5b5061026e610417366004612450565b610c5a565b34801561042857600080fd5b50600a546001600160a01b0316610223565b34801561044657600080fd5b506101f6610e12565b34801561045b57600080fd5b5061025b61046a36600461232a565b610e21565b34801561047b57600080fd5b5061025b61048a3660046122c7565b6110bb565b34801561049b57600080fd5b5061025b6104aa36600461224e565b6110c6565b3480156104bb57600080fd5b506101f66104ca366004612450565b6110fe565b3480156104db57600080fd5b5061025b6104ea366004612450565b6111c9565b3480156104fb57600080fd5b506101cc61050a3660046121e1565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561054457600080fd5b5061025b6105533660046121c7565b61134d565b60006001600160e01b0319821663780e9d6360e01b148061057d575061057d826113e5565b92915050565b6060600080546105929061272b565b80601f01602080910402602001604051908101604052809291908181526020018280546105be9061272b565b801561060b5780601f106105e05761010080835404028352916020019161060b565b820191906000526020600020905b8154815290600101906020018083116105ee57829003601f168201915b5050505050905090565b600061062082611435565b6106865760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006106ad82610a98565b9050806001600160a01b0316836001600160a01b0316141561071b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161067d565b336001600160a01b03821614806107375750610737813361050a565b6107a95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161067d565b6107b38383611452565b505050565b6107c233826114c0565b6107de5760405162461bcd60e51b815260040161067d90612621565b6107b38383836115aa565b60006107f483610b9d565b82106108565760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161067d565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146108a95760405162461bcd60e51b815260040161067d906125ec565b60405133904780156108fc02916000818181858888f193505050501580156108d5573d6000803e3d6000fd5b50565b6107b3838383604051806020016040528060008152506110c6565b60006108fe60085490565b82106109615760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161067d565b6008828154811061098257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146109be5760405162461bcd60e51b815260040161067d906125ec565b80516109d190600d906020840190612080565b5050565b60606109e082611435565b610a385760405162461bcd60e51b8152602060048201526024808201527f4275696c643a2070617274734f6620666f72206e6f6e6578697374656e74207460448201526337b5b2b760e11b606482015260840161067d565b6000828152600b602090815260409182902080548351818402810184019094528084529091830182828015610a8c57602002820191906000526020600020905b815481526020019060010190808311610a78575b50505050509050919050565b6000818152600260205260408120546001600160a01b03168061057d5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161067d565b600d8054610b1c9061272b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b489061272b565b8015610b955780601f10610b6a57610100808354040283529160200191610b95565b820191906000526020600020905b815481529060010190602001808311610b7857829003601f168201915b505050505081565b60006001600160a01b038216610c085760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161067d565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610c4e5760405162461bcd60e51b815260040161067d906125ec565b610c586000611755565b565b6000610c6582611435565b610cbd5760405162461bcd60e51b8152602060048201526024808201527f4275696c643a2073636f72654f6620666f72206e6f6e6578697374656e74207460448201526337b5b2b760e11b606482015260840161067d565b6000828152600b6020908152604080832080548251818502810185019093528083529192909190830182828015610d1357602002820191906000526020600020905b815481526020019060010190808311610cff575b505050505090506000805b8251811015610e0a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663752821e9848381518110610d7657634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610d9c91815260200190565b60206040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec9190612468565b610df690836126bc565b915080610e0281612766565b915050610d1e565b509392505050565b6060600180546105929061272b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632be32dbb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7a57600080fd5b505afa158015610e8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb29190612468565b815114610f015760405162461bcd60e51b815260206004820152601e60248201527f4275696c643a20696e76616c6964206e756d626572206f662070617274730000604482015260640161067d565b60005b815181101561103257807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638ed914cd848481518110610f5d57634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610f8391815260200190565b60206040518083038186803b158015610f9b57600080fd5b505afa158015610faf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd39190612468565b146110205760405162461bcd60e51b815260206004820181905260248201527f4275696c643a20696e76616c69642063617465676f727920666f722070617274604482015260640161067d565b8061102a81612766565b915050610f04565b50600061103d6117a7565b905061104a3330846117c1565b61105433826118a3565b6000818152600b60209081526040909120835161107392850190612104565b50336001600160a01b03167fa74f89b007b81491a5664a14a2397b9f86e11da05c72a5a6040f2366f579e81383836040516110af929190612565565b60405180910390a25050565b6109d13383836118bd565b6110d033836114c0565b6110ec5760405162461bcd60e51b815260040161067d90612621565b6110f88484848461198c565b50505050565b606061110982611435565b61116d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161067d565b60006111776119bf565b9050600081511161119757604051806020016040528060008152506111c2565b806111a1846119ce565b6040516020016111b29291906124e6565b6040516020818303038152906040525b9392505050565b6111d281611435565b61122f5760405162461bcd60e51b815260206004820152602860248201527f4275696c643a20646973617373656d626c6520666f72206e6f6e657869737465604482015267373a103a37b5b2b760c11b606482015260840161067d565b3361123982610a98565b6001600160a01b03161461129b5760405162461bcd60e51b8152602060048201526024808201527f4275696c643a2073656e646572206973206e6f742074686520746f6b656e206f6044820152633bb732b960e11b606482015260840161067d565b6000818152600b60209081526040808320805482518185028101850190935280835291929091908301828280156112f157602002820191906000526020600020905b8154815260200190600101908083116112dd575b50505050509050611309306113033390565b836117c1565b61131282611ae8565b336001600160a01b03167fa5bde7b20e7577b401002315fe49044f22e8f4c165132773b761262a893b503583836040516110af929190612672565b600a546001600160a01b031633146113775760405162461bcd60e51b815260040161067d906125ec565b6001600160a01b0381166113dc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161067d565b6108d581611755565b60006001600160e01b031982166380ac58cd60e01b148061141657506001600160e01b03198216635b5e139f60e01b145b8061057d57506301ffc9a760e01b6001600160e01b031983161461057d565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061148782610a98565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006114cb82611435565b61152c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161067d565b600061153783610a98565b9050806001600160a01b0316846001600160a01b031614806115725750836001600160a01b031661156784610615565b6001600160a01b0316145b806115a257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166115bd82610a98565b6001600160a01b0316146116255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161067d565b6001600160a01b0382166116875760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161067d565b611692838383611b8f565b61169d600082611452565b6001600160a01b03831660009081526003602052604081208054600192906116c69084906126e8565b90915550506001600160a01b03821660009081526003602052604081208054600192906116f49084906126bc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600c8054600091826117b883612766565b91905055905090565b60005b81518110156110f8577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166323b872dd858585858151811061181e57634e487b7160e01b600052603260045260246000fd5b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b15801561187857600080fd5b505af115801561188c573d6000803e3d6000fd5b50505050808061189b90612766565b9150506117c4565b6109d1828260405180602001604052806000815250611c47565b816001600160a01b0316836001600160a01b0316141561191f5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161067d565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119978484846115aa565b6119a384848484611c7a565b6110f85760405162461bcd60e51b815260040161067d9061259a565b6060600d80546105929061272b565b6060816119f25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a1c5780611a0681612766565b9150611a159050600a836126d4565b91506119f6565b60008167ffffffffffffffff811115611a4557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a6f576020820181803683370190505b5090505b84156115a257611a846001836126e8565b9150611a91600a86612781565b611a9c9060306126bc565b60f81b818381518110611abf57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350611ae1600a866126d4565b9450611a73565b6000611af382610a98565b9050611b0181600084611b8f565b611b0c600083611452565b6001600160a01b0381166000908152600360205260408120805460019290611b359084906126e8565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6001600160a01b038316611bea57611be581600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611c0d565b816001600160a01b0316836001600160a01b031614611c0d57611c0d8382611d87565b6001600160a01b038216611c24576107b381611e24565b826001600160a01b0316826001600160a01b0316146107b3576107b38282611efd565b611c518383611f41565b611c5e6000848484611c7a565b6107b35760405162461bcd60e51b815260040161067d9061259a565b60006001600160a01b0384163b15611d7c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611cbe903390899088908890600401612515565b602060405180830381600087803b158015611cd857600080fd5b505af1925050508015611d08575060408051601f3d908101601f19168201909252611d05918101906123ee565b60015b611d62573d808015611d36576040519150601f19603f3d011682016040523d82523d6000602084013e611d3b565b606091505b508051611d5a5760405162461bcd60e51b815260040161067d9061259a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506115a2565b506001949350505050565b60006001611d9484610b9d565b611d9e91906126e8565b600083815260076020526040902054909150808214611df1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611e36906001906126e8565b60008381526009602052604081205460088054939450909284908110611e6c57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110611e9b57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611ee157634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000611f0883610b9d565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216611f975760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161067d565b611fa081611435565b15611fed5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161067d565b611ff960008383611b8f565b6001600160a01b03821660009081526003602052604081208054600192906120229084906126bc565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b82805461208c9061272b565b90600052602060002090601f0160209004810192826120ae57600085556120f4565b82601f106120c757805160ff19168380011785556120f4565b828001600101855582156120f4579182015b828111156120f45782518255916020019190600101906120d9565b5061210092915061213e565b5090565b8280548282559060005260206000209081019282156120f457916020028201828111156120f45782518255916020019190600101906120d9565b5b80821115612100576000815560010161213f565b600067ffffffffffffffff83111561216d5761216d6127c1565b612180601f8401601f191660200161268b565b905082815283838301111561219457600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146121c257600080fd5b919050565b6000602082840312156121d8578081fd5b6111c2826121ab565b600080604083850312156121f3578081fd5b6121fc836121ab565b915061220a602084016121ab565b90509250929050565b600080600060608486031215612227578081fd5b612230846121ab565b925061223e602085016121ab565b9150604084013590509250925092565b60008060008060808587031215612263578081fd5b61226c856121ab565b935061227a602086016121ab565b925060408501359150606085013567ffffffffffffffff81111561229c578182fd5b8501601f810187136122ac578182fd5b6122bb87823560208401612153565b91505092959194509250565b600080604083850312156122d9578182fd5b6122e2836121ab565b9150602083013580151581146122f6578182fd5b809150509250929050565b60008060408385031215612313578182fd5b61231c836121ab565b946020939093013593505050565b6000602080838503121561233c578182fd5b823567ffffffffffffffff80821115612353578384fd5b818501915085601f830112612366578384fd5b813581811115612378576123786127c1565b8060051b915061238984830161268b565b8181528481019084860184860187018a10156123a3578788fd5b8795505b838610156123c55780358352600195909501949186019186016123a7565b5098975050505050505050565b6000602082840312156123e3578081fd5b81356111c2816127d7565b6000602082840312156123ff578081fd5b81516111c2816127d7565b60006020828403121561241b578081fd5b813567ffffffffffffffff811115612431578182fd5b8201601f81018413612441578182fd5b6115a284823560208401612153565b600060208284031215612461578081fd5b5035919050565b600060208284031215612479578081fd5b5051919050565b6000815180845260208085019450808401835b838110156124af57815187529582019590820190600101612493565b509495945050505050565b600081518084526124d28160208601602086016126ff565b601f01601f19169290920160200192915050565b600083516124f88184602088016126ff565b83519083019061250c8183602088016126ff565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612548908301846124ba565b9695505050505050565b6020815260006111c26020830184612480565b6040815260006125786040830185612480565b90508260208301529392505050565b6020815260006111c260208301846124ba565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b8281526040602082015260006115a26040830184612480565b604051601f8201601f1916810167ffffffffffffffff811182821017156126b4576126b46127c1565b604052919050565b600082198211156126cf576126cf612795565b500190565b6000826126e3576126e36127ab565b500490565b6000828210156126fa576126fa612795565b500390565b60005b8381101561271a578181015183820152602001612702565b838111156110f85750506000910152565b600181811c9082168061273f57607f821691505b6020821081141561276057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561277a5761277a612795565b5060010190565b600082612790576127906127ab565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146108d557600080fdfea2646970667358221220d39666dcd8aac7f5d683a69b4b4a9229999b7ec8357943efe018b636d629ec9c64736f6c63430008040033000000000000000000000000689e0205d21337cfebbe0beabf33e1bae2a1ae06

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

000000000000000000000000689e0205d21337cfebbe0beabf33e1bae2a1ae06

-----Decoded View---------------
Arg [0] : part_ (address): 0x689e0205d21337cfebbe0beabf33e1bae2a1ae06

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000689e0205d21337cfebbe0beabf33e1bae2a1ae06


Deployed ByteCode Sourcemap

41373:2822:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33993:224;;;;;;;;;;-1:-1:-1;33993:224:0;;;;;:::i;:::-;;:::i;:::-;;;8202:14:1;;8195:22;8177:41;;8165:2;8150:18;33993:224:0;;;;;;;;20804:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;22363:221::-;;;;;;;;;;-1:-1:-1;22363:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6517:32:1;;;6499:51;;6487:2;6472:18;22363:221:0;6454:102:1;21886:411:0;;;;;;;;;;-1:-1:-1;21886:411:0;;;;;:::i;:::-;;:::i;:::-;;34633:113;;;;;;;;;;-1:-1:-1;34721:10:0;:17;34633:113;;;18372:25:1;;;18360:2;18345:18;34633:113:0;18327:76:1;23113:339:0;;;;;;;;;;-1:-1:-1;23113:339:0;;;;;:::i;:::-;;:::i;34301:256::-;;;;;;;;;;-1:-1:-1;34301:256:0;;;;;:::i;:::-;;:::i;41816:111::-;;;;;;;;;;;;;:::i;23523:185::-;;;;;;;;;;-1:-1:-1;23523:185:0;;;;;:::i;:::-;;:::i;34823:233::-;;;;;;;;;;-1:-1:-1;34823:233:0;;;;;:::i;:::-;;:::i;44094:98::-;;;;;;;;;;-1:-1:-1;44094:98:0;;;;;:::i;:::-;;:::i;43754:190::-;;;;;;;;;;-1:-1:-1;43754:190:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;41648:27::-;;;;;;;;;;;;;;;20498:239;;;;;;;;;;-1:-1:-1;20498:239:0;;;;;:::i;:::-;;:::i;43952:21::-;;;;;;;;;;;;;:::i;20228:208::-;;;;;;;;;;-1:-1:-1;20228:208:0;;;;;:::i;:::-;;:::i;40606:103::-;;;;;;;;;;;;;:::i;43391:355::-;;;;;;;;;;-1:-1:-1;43391:355:0;;;;;:::i;:::-;;:::i;40383:87::-;;;;;;;;;;-1:-1:-1;40456:6:0;;-1:-1:-1;;;;;40456:6:0;40383:87;;20973:104;;;;;;;;;;;;;:::i;41935:539::-;;;;;;;;;;-1:-1:-1;41935:539:0;;;;;:::i;:::-;;:::i;22656:155::-;;;;;;;;;;-1:-1:-1;22656:155:0;;;;;:::i;:::-;;:::i;23779:328::-;;;;;;;;;;-1:-1:-1;23779:328:0;;;;;:::i;:::-;;:::i;21148:334::-;;;;;;;;;;-1:-1:-1;21148:334:0;;;;;:::i;:::-;;:::i;42482:428::-;;;;;;;;;;-1:-1:-1;42482:428:0;;;;;:::i;:::-;;:::i;22882:164::-;;;;;;;;;;-1:-1:-1;22882:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23003:25:0;;;22979:4;23003:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;22882:164;40717:201;;;;;;;;;;-1:-1:-1;40717:201:0;;;;;:::i;:::-;;:::i;33993:224::-;34095:4;-1:-1:-1;;;;;;34119:50:0;;-1:-1:-1;;;34119:50:0;;:90;;;34173:36;34197:11;34173:23;:36::i;:::-;34112:97;33993:224;-1:-1:-1;;33993:224:0:o;20804:100::-;20858:13;20891:5;20884:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20804:100;:::o;22363:221::-;22439:7;22467:16;22475:7;22467;:16::i;:::-;22459:73;;;;-1:-1:-1;;;22459:73:0;;14825:2:1;22459:73:0;;;14807:21:1;14864:2;14844:18;;;14837:30;14903:34;14883:18;;;14876:62;-1:-1:-1;;;14954:18:1;;;14947:42;15006:19;;22459:73:0;;;;;;;;;-1:-1:-1;22552:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;22552:24:0;;22363:221::o;21886:411::-;21967:13;21983:23;21998:7;21983:14;:23::i;:::-;21967:39;;22031:5;-1:-1:-1;;;;;22025:11:0;:2;-1:-1:-1;;;;;22025:11:0;;;22017:57;;;;-1:-1:-1;;;22017:57:0;;16425:2:1;22017:57:0;;;16407:21:1;16464:2;16444:18;;;16437:30;16503:34;16483:18;;;16476:62;-1:-1:-1;;;16554:18:1;;;16547:31;16595:19;;22017:57:0;16397:223:1;22017:57:0;15645:10;-1:-1:-1;;;;;22109:21:0;;;;:62;;-1:-1:-1;22134:37:0;22151:5;15645:10;22882:164;:::i;22134:37::-;22087:168;;;;-1:-1:-1;;;22087:168:0;;12813:2:1;22087:168:0;;;12795:21:1;12852:2;12832:18;;;12825:30;12891:34;12871:18;;;12864:62;12962:26;12942:18;;;12935:54;13006:19;;22087:168:0;12785:246:1;22087:168:0;22268:21;22277:2;22281:7;22268:8;:21::i;:::-;21886:411;;;:::o;23113:339::-;23308:41;15645:10;23341:7;23308:18;:41::i;:::-;23300:103;;;;-1:-1:-1;;;23300:103:0;;;;;;;:::i;:::-;23416:28;23426:4;23432:2;23436:7;23416:9;:28::i;34301:256::-;34398:7;34434:23;34451:5;34434:16;:23::i;:::-;34426:5;:31;34418:87;;;;-1:-1:-1;;;34418:87:0;;9687:2:1;34418:87:0;;;9669:21:1;9726:2;9706:18;;;9699:30;9765:34;9745:18;;;9738:62;-1:-1:-1;;;9816:18:1;;;9809:41;9867:19;;34418:87:0;9659:233:1;34418:87:0;-1:-1:-1;;;;;;34523:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;34301:256::o;41816:111::-;40456:6;;-1:-1:-1;;;;;40456:6:0;15645:10;40518:23;40510:68;;;;-1:-1:-1;;;40510:68:0;;;;;;;:::i;:::-;41866:53:::1;::::0;15645:10;;41897:21:::1;41866:53:::0;::::1;;;::::0;::::1;::::0;;;41897:21;15645:10;41866:53;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;41816:111::o:0;23523:185::-;23661:39;23678:4;23684:2;23688:7;23661:39;;;;;;;;;;;;:16;:39::i;34823:233::-;34898:7;34934:30;34721:10;:17;;34633:113;34934:30;34926:5;:38;34918:95;;;;-1:-1:-1;;;34918:95:0;;17245:2:1;34918:95:0;;;17227:21:1;17284:2;17264:18;;;17257:30;17323:34;17303:18;;;17296:62;-1:-1:-1;;;17374:18:1;;;17367:42;17426:19;;34918:95:0;17217:234:1;34918:95:0;35031:10;35042:5;35031:17;;;;;;-1:-1:-1;;;35031:17:0;;;;;;;;;;;;;;;;;35024:24;;34823:233;;;:::o;44094:98::-;40456:6;;-1:-1:-1;;;;;40456:6:0;15645:10;40518:23;40510:68;;;;-1:-1:-1;;;40510:68:0;;;;;;;:::i;:::-;44166:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44094:98:::0;:::o;43754:190::-;43809:16;43846;43854:7;43846;:16::i;:::-;43838:65;;;;-1:-1:-1;;;43838:65:0;;9282:2:1;43838:65:0;;;9264:21:1;9321:2;9301:18;;;9294:30;9360:34;9340:18;;;9333:62;-1:-1:-1;;;9411:18:1;;;9404:34;9455:19;;43838:65:0;9254:226:1;43838:65:0;43921:15;;;;:6;:15;;;;;;;;;43914:22;;;;;;;;;;;;;;;;;43921:15;;43914:22;;43921:15;43914:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43754:190;;;:::o;20498:239::-;20570:7;20606:16;;;:7;:16;;;;;;-1:-1:-1;;;;;20606:16:0;20641:19;20633:73;;;;-1:-1:-1;;;20633:73:0;;13649:2:1;20633:73:0;;;13631:21:1;13688:2;13668:18;;;13661:30;13727:34;13707:18;;;13700:62;-1:-1:-1;;;13778:18:1;;;13771:39;13827:19;;20633:73:0;13621:231:1;43952:21:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20228:208::-;20300:7;-1:-1:-1;;;;;20328:19:0;;20320:74;;;;-1:-1:-1;;;20320:74:0;;13238:2:1;20320:74:0;;;13220:21:1;13277:2;13257:18;;;13250:30;13316:34;13296:18;;;13289:62;-1:-1:-1;;;13367:18:1;;;13360:40;13417:19;;20320:74:0;13210:232:1;20320:74:0;-1:-1:-1;;;;;;20412:16:0;;;;;:9;:16;;;;;;;20228:208::o;40606:103::-;40456:6;;-1:-1:-1;;;;;40456:6:0;15645:10;40518:23;40510:68;;;;-1:-1:-1;;;40510:68:0;;;;;;;:::i;:::-;40671:30:::1;40698:1;40671:18;:30::i;:::-;40606:103::o:0;43391:355::-;43446:7;43474:16;43482:7;43474;:16::i;:::-;43466:65;;;;-1:-1:-1;;;43466:65:0;;14059:2:1;43466:65:0;;;14041:21:1;14098:2;14078:18;;;14071:30;14137:34;14117:18;;;14110:62;-1:-1:-1;;;14188:18:1;;;14181:34;14232:19;;43466:65:0;14031:226:1;43466:65:0;43542:22;43567:15;;;:6;:15;;;;;;;;43542:40;;;;;;;;;;;;;;;;;;;43567:15;;43542:40;;;43567:15;43542:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43593:11;43624:9;43619:99;43643:5;:12;43639:1;:16;43619:99;;;43684:4;-1:-1:-1;;;;;43684:12:0;;43697:5;43703:1;43697:8;;;;;;-1:-1:-1;;;43697:8:0;;;;;;;;;;;;;;;43684:22;;;;;;;;;;;;;18372:25:1;;18360:2;18345:18;;18327:76;43684:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43677:29;;;;:::i;:::-;;-1:-1:-1;43657:3:0;;;;:::i;:::-;;;;43619:99;;;-1:-1:-1;43735:3:0;43391:355;-1:-1:-1;;;43391:355:0:o;20973:104::-;21029:13;21062:7;21055:14;;;;;:::i;41935:539::-;42021:4;-1:-1:-1;;;;;42021:18:0;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42005:5;:12;:36;41997:79;;;;-1:-1:-1;;;41997:79:0;;10925:2:1;41997:79:0;;;10907:21:1;10964:2;10944:18;;;10937:30;11003:32;10983:18;;;10976:60;11053:18;;41997:79:0;10897:180:1;41997:79:0;42092:9;42087:145;42111:5;:12;42107:1;:16;42087:145;;;42182:1;42153:4;-1:-1:-1;;;;;42153:15:0;;42169:5;42175:1;42169:8;;;;;;-1:-1:-1;;;42169:8:0;;;;;;;;;;;;;;;42153:25;;;;;;;;;;;;;18372::1;;18360:2;18345:18;;18327:76;42153:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;42145:75;;;;-1:-1:-1;;;42145:75:0;;18067:2:1;42145:75:0;;;18049:21:1;;;18086:18;;;18079:30;18145:34;18125:18;;;18118:62;18197:18;;42145:75:0;18039:182:1;42145:75:0;42125:3;;;;:::i;:::-;;;;42087:145;;;;42244:15;42262:7;:5;:7::i;:::-;42244:25;-1:-1:-1;42282:50:0;15645:10;42319:4;42326:5;42282:14;:50::i;:::-;42343:32;15645:10;42367:7;42343:9;:32::i;:::-;42386:15;;;;:6;:15;;;;;;;;:23;;;;;;;;:::i;:::-;-1:-1:-1;15645:10:0;-1:-1:-1;;;;;42427:39:0;;42451:5;42458:7;42427:39;;;;;;;:::i;:::-;;;;;;;;41935:539;;:::o;22656:155::-;22751:52;15645:10;22784:8;22794;22751:18;:52::i;23779:328::-;23954:41;15645:10;23987:7;23954:18;:41::i;:::-;23946:103;;;;-1:-1:-1;;;23946:103:0;;;;;;;:::i;:::-;24060:39;24074:4;24080:2;24084:7;24093:5;24060:13;:39::i;:::-;23779:328;;;;:::o;21148:334::-;21221:13;21255:16;21263:7;21255;:16::i;:::-;21247:76;;;;-1:-1:-1;;;21247:76:0;;16009:2:1;21247:76:0;;;15991:21:1;16048:2;16028:18;;;16021:30;16087:34;16067:18;;;16060:62;-1:-1:-1;;;16138:18:1;;;16131:45;16193:19;;21247:76:0;15981:237:1;21247:76:0;21336:21;21360:10;:8;:10::i;:::-;21336:34;;21412:1;21394:7;21388:21;:25;:86;;;;;;;;;;;;;;;;;21440:7;21449:18;:7;:16;:18::i;:::-;21423:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21388:86;21381:93;21148:334;-1:-1:-1;;;21148:334:0:o;42482:428::-;42548:16;42556:7;42548;:16::i;:::-;42540:69;;;;-1:-1:-1;;;42540:69:0;;17658:2:1;42540:69:0;;;17640:21:1;17697:2;17677:18;;;17670:30;17736:34;17716:18;;;17709:62;-1:-1:-1;;;17787:18:1;;;17780:38;17835:19;;42540:69:0;17630:230:1;42540:69:0;15645:10;42628:16;42636:7;42628;:16::i;:::-;-1:-1:-1;;;;;42628:32:0;;42620:81;;;;-1:-1:-1;;;42620:81:0;;8877:2:1;42620:81:0;;;8859:21:1;8916:2;8896:18;;;8889:30;8955:34;8935:18;;;8928:62;-1:-1:-1;;;9006:18:1;;;8999:34;9050:19;;42620:81:0;8849:226:1;42620:81:0;42714:22;42739:15;;;:6;:15;;;;;;;;42714:40;;;;;;;;;;;;;;;;;;;42739:15;;42714:40;;;42739:15;42714:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42767:50;42790:4;42797:12;15645:10;;15565:98;42797:12;42811:5;42767:14;:50::i;:::-;42828:14;42834:7;42828:5;:14::i;:::-;15645:10;-1:-1:-1;;;;;42860:42:0;;42887:7;42896:5;42860:42;;;;;;;:::i;40717:201::-;40456:6;;-1:-1:-1;;;;;40456:6:0;15645:10;40518:23;40510:68;;;;-1:-1:-1;;;40510:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40806:22:0;::::1;40798:73;;;::::0;-1:-1:-1;;;40798:73:0;;10518:2:1;40798:73:0::1;::::0;::::1;10500:21:1::0;10557:2;10537:18;;;10530:30;10596:34;10576:18;;;10569:62;-1:-1:-1;;;10647:18:1;;;10640:36;10693:19;;40798:73:0::1;10490:228:1::0;40798:73:0::1;40882:28;40901:8;40882:18;:28::i;19859:305::-:0;19961:4;-1:-1:-1;;;;;;19998:40:0;;-1:-1:-1;;;19998:40:0;;:105;;-1:-1:-1;;;;;;;20055:48:0;;-1:-1:-1;;;20055:48:0;19998:105;:158;;;-1:-1:-1;;;;;;;;;;18575:40:0;;;20120:36;18466:157;25617:127;25682:4;25706:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25706:16:0;:30;;;25617:127::o;29599:174::-;29674:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;29674:29:0;-1:-1:-1;;;;;29674:29:0;;;;;;;;:24;;29728:23;29674:24;29728:14;:23::i;:::-;-1:-1:-1;;;;;29719:46:0;;;;;;;;;;;29599:174;;:::o;25911:348::-;26004:4;26029:16;26037:7;26029;:16::i;:::-;26021:73;;;;-1:-1:-1;;;26021:73:0;;12400:2:1;26021:73:0;;;12382:21:1;12439:2;12419:18;;;12412:30;12478:34;12458:18;;;12451:62;-1:-1:-1;;;12529:18:1;;;12522:42;12581:19;;26021:73:0;12372:234:1;26021:73:0;26105:13;26121:23;26136:7;26121:14;:23::i;:::-;26105:39;;26174:5;-1:-1:-1;;;;;26163:16:0;:7;-1:-1:-1;;;;;26163:16:0;;:51;;;;26207:7;-1:-1:-1;;;;;26183:31:0;:20;26195:7;26183:11;:20::i;:::-;-1:-1:-1;;;;;26183:31:0;;26163:51;:87;;;-1:-1:-1;;;;;;23003:25:0;;;22979:4;23003:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26218:32;26155:96;25911:348;-1:-1:-1;;;;25911:348:0:o;28903:578::-;29062:4;-1:-1:-1;;;;;29035:31:0;:23;29050:7;29035:14;:23::i;:::-;-1:-1:-1;;;;;29035:31:0;;29027:85;;;;-1:-1:-1;;;29027:85:0;;15599:2:1;29027:85:0;;;15581:21:1;15638:2;15618:18;;;15611:30;15677:34;15657:18;;;15650:62;-1:-1:-1;;;15728:18:1;;;15721:39;15777:19;;29027:85:0;15571:231:1;29027:85:0;-1:-1:-1;;;;;29131:16:0;;29123:65;;;;-1:-1:-1;;;29123:65:0;;11641:2:1;29123:65:0;;;11623:21:1;11680:2;11660:18;;;11653:30;11719:34;11699:18;;;11692:62;-1:-1:-1;;;11770:18:1;;;11763:34;11814:19;;29123:65:0;11613:226:1;29123:65:0;29201:39;29222:4;29228:2;29232:7;29201:20;:39::i;:::-;29305:29;29322:1;29326:7;29305:8;:29::i;:::-;-1:-1:-1;;;;;29347:15:0;;;;;;:9;:15;;;;;:20;;29366:1;;29347:15;:20;;29366:1;;29347:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29378:13:0;;;;;;:9;:13;;;;;:18;;29395:1;;29378:13;:18;;29395:1;;29378:18;:::i;:::-;;;;-1:-1:-1;;29407:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29407:21:0;-1:-1:-1;;;;;29407:21:0;;;;;;;;;29446:27;;29407:16;;29446:27;;;;;;;28903:578;;;:::o;40926:191::-;41019:6;;;-1:-1:-1;;;;;41036:17:0;;;-1:-1:-1;;;;;;41036:17:0;;;;;;;41069:40;;41019:6;;;41036:17;41019:6;;41069:40;;41000:16;;41069:40;40926:191;;:::o;43306:77::-;43367:6;:8;;43340:7;;;43367:8;;;:::i;:::-;;;;;43360:15;;43306:77;:::o;42918:208::-;43017:9;43012:107;43036:5;:12;43032:1;:16;43012:107;;;43070:4;-1:-1:-1;;;;;43070:17:0;;43088:4;43094:2;43098:5;43104:1;43098:8;;;;;;-1:-1:-1;;;43098:8:0;;;;;;;;;;;;;;;;;;;43070:37;;-1:-1:-1;;;;;;43070:37:0;;;;;;;-1:-1:-1;;;;;6819:15:1;;;43070:37:0;;;6801:34:1;6871:15;;;;6851:18;;;6844:43;6903:18;;;6896:34;6736:18;;43070:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43050:3;;;;;:::i;:::-;;;;43012:107;;26601:110;26677:26;26687:2;26691:7;26677:26;;;;;;;;;;;;:9;:26::i;29915:315::-;30070:8;-1:-1:-1;;;;;30061:17:0;:5;-1:-1:-1;;;;;30061:17:0;;;30053:55;;;;-1:-1:-1;;;30053:55:0;;12046:2:1;30053:55:0;;;12028:21:1;12085:2;12065:18;;;12058:30;12124:27;12104:18;;;12097:55;12169:18;;30053:55:0;12018:175:1;30053:55:0;-1:-1:-1;;;;;30119:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;30119:46:0;;;;;;;;;;30181:41;;8177::1;;;30181::0;;8150:18:1;30181:41:0;;;;;;;29915:315;;;:::o;24989:::-;25146:28;25156:4;25162:2;25166:7;25146:9;:28::i;:::-;25193:48;25216:4;25222:2;25226:7;25235:5;25193:22;:48::i;:::-;25185:111;;;;-1:-1:-1;;;25185:111:0;;;;;;;:::i;43980:108::-;44040:13;44073:7;44066:14;;;;;:::i;16007:723::-;16063:13;16284:10;16280:53;;-1:-1:-1;;16311:10:0;;;;;;;;;;;;-1:-1:-1;;;16311:10:0;;;;;16007:723::o;16280:53::-;16358:5;16343:12;16399:78;16406:9;;16399:78;;16432:8;;;;:::i;:::-;;-1:-1:-1;16455:10:0;;-1:-1:-1;16463:2:0;16455:10;;:::i;:::-;;;16399:78;;;16487:19;16519:6;16509:17;;;;;;-1:-1:-1;;;16509:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16509:17:0;;16487:39;;16537:154;16544:10;;16537:154;;16571:11;16581:1;16571:11;;:::i;:::-;;-1:-1:-1;16640:10:0;16648:2;16640:5;:10;:::i;:::-;16627:24;;:2;:24;:::i;:::-;16614:39;;16597:6;16604;16597:14;;;;;;-1:-1:-1;;;16597:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;16597:56:0;;;;;;;;-1:-1:-1;16668:11:0;16677:2;16668:11;;:::i;:::-;;;16537:154;;28206:360;28266:13;28282:23;28297:7;28282:14;:23::i;:::-;28266:39;;28318:48;28339:5;28354:1;28358:7;28318:20;:48::i;:::-;28407:29;28424:1;28428:7;28407:8;:29::i;:::-;-1:-1:-1;;;;;28449:16:0;;;;;;:9;:16;;;;;:21;;28469:1;;28449:16;:21;;28469:1;;28449:21;:::i;:::-;;;;-1:-1:-1;;28488:16:0;;;;:7;:16;;;;;;28481:23;;-1:-1:-1;;;;;;28481:23:0;;;28522:36;28496:7;;28488:16;-1:-1:-1;;;;;28522:36:0;;;;;28488:16;;28522:36;28206:360;;:::o;35669:589::-;-1:-1:-1;;;;;35875:18:0;;35871:187;;35910:40;35942:7;37085:10;:17;;37058:24;;;;:15;:24;;;;;:44;;;37113:24;;;;;;;;;;;;36981:164;35910:40;35871:187;;;35980:2;-1:-1:-1;;;;;35972:10:0;:4;-1:-1:-1;;;;;35972:10:0;;35968:90;;35999:47;36032:4;36038:7;35999:32;:47::i;:::-;-1:-1:-1;;;;;36072:16:0;;36068:183;;36105:45;36142:7;36105:36;:45::i;36068:183::-;36178:4;-1:-1:-1;;;;;36172:10:0;:2;-1:-1:-1;;;;;36172:10:0;;36168:83;;36199:40;36227:2;36231:7;36199:27;:40::i;26938:321::-;27068:18;27074:2;27078:7;27068:5;:18::i;:::-;27119:54;27150:1;27154:2;27158:7;27167:5;27119:22;:54::i;:::-;27097:154;;;;-1:-1:-1;;;27097:154:0;;;;;;;:::i;30795:799::-;30950:4;-1:-1:-1;;;;;30971:13:0;;8015:20;8063:8;30967:620;;31007:72;;-1:-1:-1;;;31007:72:0;;-1:-1:-1;;;;;31007:36:0;;;;;:72;;15645:10;;31058:4;;31064:7;;31073:5;;31007:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31007:72:0;;;;;;;;-1:-1:-1;;31007:72:0;;;;;;;;;;;;:::i;:::-;;;31003:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31249:13:0;;31245:272;;31292:60;;-1:-1:-1;;;31292:60:0;;;;;;;:::i;31245:272::-;31467:6;31461:13;31452:6;31448:2;31444:15;31437:38;31003:529;-1:-1:-1;;;;;;31130:51:0;-1:-1:-1;;;31130:51:0;;-1:-1:-1;31123:58:0;;30967:620;-1:-1:-1;31571:4:0;30795:799;;;;;;:::o;37772:988::-;38038:22;38088:1;38063:22;38080:4;38063:16;:22::i;:::-;:26;;;;:::i;:::-;38100:18;38121:26;;;:17;:26;;;;;;38038:51;;-1:-1:-1;38254:28:0;;;38250:328;;-1:-1:-1;;;;;38321:18:0;;38299:19;38321:18;;;:12;:18;;;;;;;;:34;;;;;;;;;38372:30;;;;;;:44;;;38489:30;;:17;:30;;;;;:43;;;38250:328;-1:-1:-1;38674:26:0;;;;:17;:26;;;;;;;;38667:33;;;-1:-1:-1;;;;;38718:18:0;;;;;:12;:18;;;;;:34;;;;;;;38711:41;37772:988::o;39055:1079::-;39333:10;:17;39308:22;;39333:21;;39353:1;;39333:21;:::i;:::-;39365:18;39386:24;;;:15;:24;;;;;;39759:10;:26;;39308:46;;-1:-1:-1;39386:24:0;;39308:46;;39759:26;;;;-1:-1:-1;;;39759:26:0;;;;;;;;;;;;;;;;;39737:48;;39823:11;39798:10;39809;39798:22;;;;;;-1:-1:-1;;;39798:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;39903:28;;;:15;:28;;;;;;;:41;;;40075:24;;;;;40068:31;40110:10;:16;;;;;-1:-1:-1;;;40110:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;39055:1079;;;;:::o;36559:221::-;36644:14;36661:20;36678:2;36661:16;:20::i;:::-;-1:-1:-1;;;;;36692:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;36737:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;36559:221:0:o;27595:382::-;-1:-1:-1;;;;;27675:16:0;;27667:61;;;;-1:-1:-1;;;27667:61:0;;14464:2:1;27667:61:0;;;14446:21:1;;;14483:18;;;14476:30;14542:34;14522:18;;;14515:62;14594:18;;27667:61:0;14436:182:1;27667:61:0;27748:16;27756:7;27748;:16::i;:::-;27747:17;27739:58;;;;-1:-1:-1;;;27739:58:0;;11284:2:1;27739:58:0;;;11266:21:1;11323:2;11303:18;;;11296:30;11362;11342:18;;;11335:58;11410:18;;27739:58:0;11256:178:1;27739:58:0;27810:45;27839:1;27843:2;27847:7;27810:20;:45::i;:::-;-1:-1:-1;;;;;27868:13:0;;;;;;:9;:13;;;;;:18;;27885:1;;27868:13;:18;;27885:1;;27868:18;:::i;:::-;;;;-1:-1:-1;;27897:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;27897:21:0;-1:-1:-1;;;;;27897:21:0;;;;;;;;27936:33;;27897:16;;;27936:33;;27897:16;;27936:33;27595:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:2;;588:1;585;578:12;522:2;474:124;;;:::o;603:196::-;662:6;715:2;703:9;694:7;690:23;686:32;683:2;;;736:6;728;721:22;683:2;764:29;783:9;764:29;:::i;804:270::-;872:6;880;933:2;921:9;912:7;908:23;904:32;901:2;;;954:6;946;939:22;901:2;982:29;1001:9;982:29;:::i;:::-;972:39;;1030:38;1064:2;1053:9;1049:18;1030:38;:::i;:::-;1020:48;;891:183;;;;;:::o;1079:338::-;1156:6;1164;1172;1225:2;1213:9;1204:7;1200:23;1196:32;1193:2;;;1246:6;1238;1231:22;1193:2;1274:29;1293:9;1274:29;:::i;:::-;1264:39;;1322:38;1356:2;1345:9;1341:18;1322:38;:::i;:::-;1312:48;;1407:2;1396:9;1392:18;1379:32;1369:42;;1183:234;;;;;:::o;1422:696::-;1517:6;1525;1533;1541;1594:3;1582:9;1573:7;1569:23;1565:33;1562:2;;;1616:6;1608;1601:22;1562:2;1644:29;1663:9;1644:29;:::i;:::-;1634:39;;1692:38;1726:2;1715:9;1711:18;1692:38;:::i;:::-;1682:48;;1777:2;1766:9;1762:18;1749:32;1739:42;;1832:2;1821:9;1817:18;1804:32;1859:18;1851:6;1848:30;1845:2;;;1896:6;1888;1881:22;1845:2;1924:22;;1977:4;1969:13;;1965:27;-1:-1:-1;1955:2:1;;2011:6;2003;1996:22;1955:2;2039:73;2104:7;2099:2;2086:16;2081:2;2077;2073:11;2039:73;:::i;:::-;2029:83;;;1552:566;;;;;;;:::o;2123:367::-;2188:6;2196;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2270:6;2262;2255:22;2217:2;2298:29;2317:9;2298:29;:::i;:::-;2288:39;;2377:2;2366:9;2362:18;2349:32;2424:5;2417:13;2410:21;2403:5;2400:32;2390:2;;2451:6;2443;2436:22;2390:2;2479:5;2469:15;;;2207:283;;;;;:::o;2495:264::-;2563:6;2571;2624:2;2612:9;2603:7;2599:23;2595:32;2592:2;;;2645:6;2637;2630:22;2592:2;2673:29;2692:9;2673:29;:::i;:::-;2663:39;2749:2;2734:18;;;;2721:32;;-1:-1:-1;;;2582:177:1:o;2764:1002::-;2848:6;2879:2;2922;2910:9;2901:7;2897:23;2893:32;2890:2;;;2943:6;2935;2928:22;2890:2;2988:9;2975:23;3017:18;3058:2;3050:6;3047:14;3044:2;;;3079:6;3071;3064:22;3044:2;3122:6;3111:9;3107:22;3097:32;;3167:7;3160:4;3156:2;3152:13;3148:27;3138:2;;3194:6;3186;3179:22;3138:2;3235;3222:16;3257:2;3253;3250:10;3247:2;;;3263:18;;:::i;:::-;3309:2;3306:1;3302:10;3292:20;;3332:28;3356:2;3352;3348:11;3332:28;:::i;:::-;3394:15;;;3425:12;;;;3457:11;;;3487;;;3483:20;;3480:33;-1:-1:-1;3477:2:1;;;3531:6;3523;3516:22;3477:2;3558:6;3549:15;;3573:163;3587:2;3584:1;3581:9;3573:163;;;3644:17;;3632:30;;3605:1;3598:9;;;;;3682:12;;;;3714;;3573:163;;;-1:-1:-1;3755:5:1;2859:907;-1:-1:-1;;;;;;;;2859:907:1:o;3771:255::-;3829:6;3882:2;3870:9;3861:7;3857:23;3853:32;3850:2;;;3903:6;3895;3888:22;3850:2;3947:9;3934:23;3966:30;3990:5;3966:30;:::i;4031:259::-;4100:6;4153:2;4141:9;4132:7;4128:23;4124:32;4121:2;;;4174:6;4166;4159:22;4121:2;4211:9;4205:16;4230:30;4254:5;4230:30;:::i;4295:480::-;4364:6;4417:2;4405:9;4396:7;4392:23;4388:32;4385:2;;;4438:6;4430;4423:22;4385:2;4483:9;4470:23;4516:18;4508:6;4505:30;4502:2;;;4553:6;4545;4538:22;4502:2;4581:22;;4634:4;4626:13;;4622:27;-1:-1:-1;4612:2:1;;4668:6;4660;4653:22;4612:2;4696:73;4761:7;4756:2;4743:16;4738:2;4734;4730:11;4696:73;:::i;4780:190::-;4839:6;4892:2;4880:9;4871:7;4867:23;4863:32;4860:2;;;4913:6;4905;4898:22;4860:2;-1:-1:-1;4941:23:1;;4850:120;-1:-1:-1;4850:120:1:o;4975:194::-;5045:6;5098:2;5086:9;5077:7;5073:23;5069:32;5066:2;;;5119:6;5111;5104:22;5066:2;-1:-1:-1;5147:16:1;;5056:113;-1:-1:-1;5056:113:1:o;5174:437::-;5227:3;5265:5;5259:12;5292:6;5287:3;5280:19;5318:4;5347:2;5342:3;5338:12;5331:19;;5384:2;5377:5;5373:14;5405:3;5417:169;5431:6;5428:1;5425:13;5417:169;;;5492:13;;5480:26;;5526:12;;;;5561:15;;;;5453:1;5446:9;5417:169;;;-1:-1:-1;5602:3:1;;5235:376;-1:-1:-1;;;;;5235:376:1:o;5616:257::-;5657:3;5695:5;5689:12;5722:6;5717:3;5710:19;5738:63;5794:6;5787:4;5782:3;5778:14;5771:4;5764:5;5760:16;5738:63;:::i;:::-;5855:2;5834:15;-1:-1:-1;;5830:29:1;5821:39;;;;5862:4;5817:50;;5665:208;-1:-1:-1;;5665:208:1:o;5878:470::-;6057:3;6095:6;6089:13;6111:53;6157:6;6152:3;6145:4;6137:6;6133:17;6111:53;:::i;:::-;6227:13;;6186:16;;;;6249:57;6227:13;6186:16;6283:4;6271:17;;6249:57;:::i;:::-;6322:20;;6065:283;-1:-1:-1;;;;6065:283:1:o;6941:488::-;-1:-1:-1;;;;;7210:15:1;;;7192:34;;7262:15;;7257:2;7242:18;;7235:43;7309:2;7294:18;;7287:34;;;7357:3;7352:2;7337:18;;7330:31;;;7135:4;;7378:45;;7403:19;;7395:6;7378:45;:::i;:::-;7370:53;7144:285;-1:-1:-1;;;;;;7144:285:1:o;7434:261::-;7613:2;7602:9;7595:21;7576:4;7633:56;7685:2;7674:9;7670:18;7662:6;7633:56;:::i;7700:332::-;7907:2;7896:9;7889:21;7870:4;7927:56;7979:2;7968:9;7964:18;7956:6;7927:56;:::i;:::-;7919:64;;8019:6;8014:2;8003:9;7999:18;7992:34;7879:153;;;;;:::o;8451:219::-;8600:2;8589:9;8582:21;8563:4;8620:44;8660:2;8649:9;8645:18;8637:6;8620:44;:::i;9897:414::-;10099:2;10081:21;;;10138:2;10118:18;;;10111:30;10177:34;10172:2;10157:18;;10150:62;-1:-1:-1;;;10243:2:1;10228:18;;10221:48;10301:3;10286:19;;10071:240::o;15036:356::-;15238:2;15220:21;;;15257:18;;;15250:30;15316:34;15311:2;15296:18;;15289:62;15383:2;15368:18;;15210:182::o;16625:413::-;16827:2;16809:21;;;16866:2;16846:18;;;16839:30;16905:34;16900:2;16885:18;;16878:62;-1:-1:-1;;;16971:2:1;16956:18;;16949:47;17028:3;17013:19;;16799:239::o;18408:332::-;18615:6;18604:9;18597:25;18658:2;18653;18642:9;18638:18;18631:30;18578:4;18678:56;18730:2;18719:9;18715:18;18707:6;18678:56;:::i;18745:275::-;18816:2;18810:9;18881:2;18862:13;;-1:-1:-1;;18858:27:1;18846:40;;18916:18;18901:34;;18937:22;;;18898:62;18895:2;;;18963:18;;:::i;:::-;18999:2;18992:22;18790:230;;-1:-1:-1;18790:230:1:o;19025:128::-;19065:3;19096:1;19092:6;19089:1;19086:13;19083:2;;;19102:18;;:::i;:::-;-1:-1:-1;19138:9:1;;19073:80::o;19158:120::-;19198:1;19224;19214:2;;19229:18;;:::i;:::-;-1:-1:-1;19263:9:1;;19204:74::o;19283:125::-;19323:4;19351:1;19348;19345:8;19342:2;;;19356:18;;:::i;:::-;-1:-1:-1;19393:9:1;;19332:76::o;19413:258::-;19485:1;19495:113;19509:6;19506:1;19503:13;19495:113;;;19585:11;;;19579:18;19566:11;;;19559:39;19531:2;19524:10;19495:113;;;19626:6;19623:1;19620:13;19617:2;;;-1:-1:-1;;19661:1:1;19643:16;;19636:27;19466:205::o;19676:380::-;19755:1;19751:12;;;;19798;;;19819:2;;19873:4;19865:6;19861:17;19851:27;;19819:2;19926;19918:6;19915:14;19895:18;19892:38;19889:2;;;19972:10;19967:3;19963:20;19960:1;19953:31;20007:4;20004:1;19997:15;20035:4;20032:1;20025:15;19889:2;;19731:325;;;:::o;20061:135::-;20100:3;-1:-1:-1;;20121:17:1;;20118:2;;;20141:18;;:::i;:::-;-1:-1:-1;20188:1:1;20177:13;;20108:88::o;20201:112::-;20233:1;20259;20249:2;;20264:18;;:::i;:::-;-1:-1:-1;20298:9:1;;20239:74::o;20318:127::-;20379:10;20374:3;20370:20;20367:1;20360:31;20410:4;20407:1;20400:15;20434:4;20431:1;20424:15;20450:127;20511:10;20506:3;20502:20;20499:1;20492:31;20542:4;20539:1;20532:15;20566:4;20563:1;20556:15;20582:127;20643:10;20638:3;20634:20;20631:1;20624:31;20674:4;20671:1;20664:15;20698:4;20695:1;20688:15;20714:131;-1:-1:-1;;;;;;20788:32:1;;20778:43;;20768:2;;20835:1;20832;20825:12

Swarm Source

ipfs://d39666dcd8aac7f5d683a69b4b4a9229999b7ec8357943efe018b636d629ec9c
Loading