ETH Price: $3,115.18 (+5.58%)
Gas: 4 Gwei

Token

Azurian (AZUR)
 

Overview

Max Total Supply

5,438 AZUR

Holders

971

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
larimar.eth
Balance
1 AZUR
0x9db3ec17bb99b800bc0203f3553a23031d80886c
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Azurian

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 9999 runs

Other Settings:
shanghai EvmVersion, MIT license
File 1 of 14 : Azurian.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;

import {MultiOwnable} from "./MultiOwnable.sol";

import {ERC721} from "solmate/tokens/ERC721.sol";
import {ERC2981} from "openzeppelin-contracts/contracts/token/common/ERC2981.sol";
import {Strings} from "openzeppelin-contracts/contracts/utils/Strings.sol";
import {DefaultOperatorFilterer} from "operator-filter-registry/DefaultOperatorFilterer.sol";

import {IAzurian} from "./AzurRoot.sol";

contract Azurian is IAzurian, DefaultOperatorFilterer, ERC721, ERC2981, MultiOwnable {
    /// @notice The Azur Root contract
    address public immutable ROOT;

    /// @notice Total number of tokens which have minted
    uint256 public totalSupply = 0;

    /// @notice The prefix to attach to the tokenId to get the metadata uri
    string public baseTokenURI;

    /// @notice Whether the minting is open
    bool public mintOpen;

    /// @notice Thrown when the mint is not yet open
    error MintNotOpen();

    /// @notice Thrown when metadata is queried for a nonexistent token
    error TokenDoesNotExist();

    constructor(address _root) ERC721("Azurian", "AZUR") {
        ROOT = _root;
    }

    function burnRootAndMint(uint256[] calldata rootIds) external {
        if (msg.sender != ROOT) revert AccessControl();
        if (!mintOpen) revert MintNotOpen();
        unchecked {
            for (uint256 i = 0; i < rootIds.length; ++i) {
                _mint(tx.origin, rootIds[i]);
            }
        }
        totalSupply += rootIds.length;
    }

    /////////////////////////
    // ADMIN FUNCTIONALITY //
    /////////////////////////

    /// @notice Set metadata
    function setBaseTokenURI(string memory _baseTokenURI) external {
        if (msg.sender != metadataOwner) {
            revert AccessControl();
        }
        baseTokenURI = _baseTokenURI;
    }

    /// @notice Set mint open
    function setMintOpen(bool _mintOpen) external {
        if (msg.sender != mintingOwner) {
            revert AccessControl();
        }
        mintOpen = _mintOpen;
    }

    // ROYALTY FUNCTIONALITY

    /// @dev See {IERC165-supportsInterface}.
    function supportsInterface(bytes4 interfaceId) public pure override(ERC721, ERC2981) returns (bool) {
        return interfaceId == 0x2a55205a // ERC165 Interface ID for ERC2981
            || interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165
            || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721
            || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /// @dev See {ERC2981-_setDefaultRoyalty}.
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    /// @dev See {ERC2981-_deleteDefaultRoyalty}.
    function deleteDefaultRoyalty() external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _deleteDefaultRoyalty();
    }

    /// @dev See {ERC2981-_setTokenRoyalty}.
    function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _setTokenRoyalty(tokenId, receiver, feeNumerator);
    }

    /// @dev See {ERC2981-_resetTokenRoyalty}.
    function resetTokenRoyalty(uint256 tokenId) external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _resetTokenRoyalty(tokenId);
    }

    // METADATA FUNCTIONALITY

    /// @notice Returns the metadata URI for a given token
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (_ownerOf[tokenId] == address(0)) revert TokenDoesNotExist();
        return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId)));
    }

    // OPERATOR FILTER

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

File 2 of 14 : MultiOwnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;

abstract contract MultiOwnable {
    /// @notice The address which can admin mint for free, set merkle roots, and set auction params
    address public mintingOwner;
    /// @notice The address which can update the metadata uri
    address public metadataOwner;
    /// @notice The address which will be returned for the ERC721 owner() standard for setting royalties
    address public royaltyOwner;

    /// @notice Raised when an unauthorized user calls a gated function
    error AccessControl();

    constructor() {
        mintingOwner = msg.sender;
        metadataOwner = msg.sender;
        royaltyOwner = msg.sender;
    }

    modifier onlyMintingOwner() {
        if (msg.sender != mintingOwner) {
            revert AccessControl();
        }
        _;
    }

    modifier onlyMetadataOwner() {
        if (msg.sender != metadataOwner) {
            revert AccessControl();
        }
        _;
    }

    modifier onlyRoyaltyOwner() {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _;
    }

    ////////////////////////////////////
    // ACCESS CONTROL ADDRESS UPDATES //
    ////////////////////////////////////

    /// @notice Update the mintingOwner
    /// @dev Can also be used to revoke this power by setting to 0x0
    function setMintingOwner(address _mintingOwner) external onlyMintingOwner {
        mintingOwner = _mintingOwner;
    }

    /// @notice Update the metadataOwner
    /// @dev Can also be used to revoke this power by setting to 0x0
    /// @dev Should only be revoked after setting an IPFS url so others can pin
    function setMetadataOwner(address _metadataOwner) external onlyMetadataOwner {
        metadataOwner = _metadataOwner;
    }

    /// @notice Update the royaltyOwner
    /// @dev Can also be used to revoke this power by setting to 0x0
    function setRoyaltyOwner(address _royaltyOwner) external onlyRoyaltyOwner {
        royaltyOwner = _royaltyOwner;
    }

    /// @notice The address which can set royalties
    function owner() external view returns (address) {
        return royaltyOwner;
    }
}

File 3 of 14 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

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

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 4 of 14 : ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;

import "../../interfaces/IERC2981.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 5 of 14 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

File 6 of 14 : DefaultOperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {OperatorFilterer} from "./OperatorFilterer.sol";
import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol";
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

File 7 of 14 : AzurRoot.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;

import {MultiOwnable} from "./MultiOwnable.sol";
import {IDelegationRegistry} from "./IDelegationRegistry.sol";

import {ERC721} from "solmate/tokens/ERC721.sol";
import {ERC2981} from "openzeppelin-contracts/contracts/token/common/ERC2981.sol";
import {Strings} from "openzeppelin-contracts/contracts/utils/Strings.sol";
import {DefaultOperatorFilterer} from "operator-filter-registry/DefaultOperatorFilterer.sol";

interface IERC721 {
    function ownerOf(uint256 tokenId) external view returns (address);
    function transferFrom(address from, address to, uint256 id) external;
}

interface IAzurian {
    function burnRootAndMint(uint256[] calldata rootIds) external;
}

contract AzurRoot is DefaultOperatorFilterer, ERC721, ERC2981, MultiOwnable {
    /// @notice The Bored and Dangerous contract
    address public immutable BOOK;

    /// @notice Total number of tokens which have minted
    uint256 public totalSupply = 0;

    /// @notice The prefix to attach to the tokenId to get the metadata uri
    string public baseTokenURI;

    /// @notice Whether the burning is open
    bool public burnOpen;

    /// @notice The delegation registry for burning root authentication
    IDelegationRegistry public constant delegationRegistry =
        IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B);

    /// @notice Emitted when a token is minted
    event Mint(address indexed owner, uint256 indexed tokenId);

    /// @notice Raised when the mint has not reached the required timestamp
    error MintNotOpen();
    /// @notice Raised when two calldata arrays do not have the same length
    error MismatchedArrays();
    /// @notice Raised when `sender` does not pass the proper ether amount to `recipient`
    error FailedToSendEther(address sender, address recipient);
    /// @notice Raised when `msg.sender` does not own the roots they're attempting to burn
    error BurnAuthentication();

    constructor(address _book) ERC721("Azur Root", "ROOT") {
        BOOK = _book;
    }

    /// @notice Admin mint a batch of tokens
    function ownerMint(address[] calldata recipients) external {
        if (msg.sender != mintingOwner) {
            revert AccessControl();
        }

        unchecked {
            uint256 _totalSupply = totalSupply;
            for (uint256 i = 0; i < recipients.length; ++i) {
                _mint(recipients[i], _totalSupply + i);
            }
            totalSupply += recipients.length;
        }
    }

    /// @notice Burn a token
    function burn(uint256 id) external {
        address from = _ownerOf[id];
        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id], "NOT_AUTHORIZED"
        );
        _burn(id);
    }

    //////////////////
    // BOOK BURNING //
    //////////////////

    /// @notice Burn a book to receive an azur root
    function burnBooks(uint256[] calldata tokenIds) external {
        if (!burnOpen) {
            revert MintNotOpen();
        }

        // Cache the totalSupply to minimize storage reads
        uint256 _totalSupply = totalSupply;
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            // Attempt to transfer token from the msg sender, revert if not owned or approved
            IERC721(BOOK).transferFrom(msg.sender, address(this), tokenIds[i]);
            _mint(msg.sender, _totalSupply + i);
        }
        totalSupply += tokenIds.length;
    }

    /// @notice Burn a root to receive an azurian
    function burnRoots(address azurians, uint256[] calldata rootIds) external {
        for (uint256 i = 0; i < rootIds.length; ++i) {
            address rootOwner = ownerOf(rootIds[i]);
            if (
                !(
                    msg.sender == rootOwner
                        || delegationRegistry.checkDelegateForToken(msg.sender, rootOwner, address(this), rootIds[i])
                )
            ) {
                revert BurnAuthentication();
            }
            _burn(rootIds[i]);
        }
        IAzurian(azurians).burnRootAndMint(rootIds);
    }

    /////////////////////////
    // ADMIN FUNCTIONALITY //
    /////////////////////////

    /// @notice Set metadata
    function setBaseTokenURI(string memory _baseTokenURI) external {
        if (msg.sender != metadataOwner) {
            revert AccessControl();
        }
        baseTokenURI = _baseTokenURI;
    }

    /// @notice Set burn open
    function setBurnOpen(bool _burnOpen) external {
        if (msg.sender != mintingOwner) {
            revert AccessControl();
        }
        burnOpen = _burnOpen;
    }

    /// @notice Claim funds
    function claimFunds(address payable recipient) external {
        if (!(msg.sender == mintingOwner || msg.sender == metadataOwner || msg.sender == royaltyOwner)) {
            revert AccessControl();
        }

        (bool sent,) = recipient.call{value: address(this).balance}("");
        if (!sent) {
            revert FailedToSendEther(address(this), recipient);
        }
    }

    // ROYALTY FUNCTIONALITY

    /// @dev See {IERC165-supportsInterface}.
    function supportsInterface(bytes4 interfaceId) public pure override(ERC721, ERC2981) returns (bool) {
        return interfaceId == 0x2a55205a // ERC165 Interface ID for ERC2981
            || interfaceId == 0x01ffc9a7 // ERC165 Interface ID for ERC165
            || interfaceId == 0x80ac58cd // ERC165 Interface ID for ERC721
            || interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /// @dev See {ERC2981-_setDefaultRoyalty}.
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _setDefaultRoyalty(receiver, feeNumerator);
    }

    /// @dev See {ERC2981-_deleteDefaultRoyalty}.
    function deleteDefaultRoyalty() external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _deleteDefaultRoyalty();
    }

    /// @dev See {ERC2981-_setTokenRoyalty}.
    function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _setTokenRoyalty(tokenId, receiver, feeNumerator);
    }

    /// @dev See {ERC2981-_resetTokenRoyalty}.
    function resetTokenRoyalty(uint256 tokenId) external {
        if (msg.sender != royaltyOwner) {
            revert AccessControl();
        }
        _resetTokenRoyalty(tokenId);
    }

    // METADATA FUNCTIONALITY

    /// @notice Returns the metadata URI for a given token
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId)));
    }

    // OPERATOR FILTER

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
    }

    function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

File 8 of 14 : IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import "../utils/introspection/IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 9 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 10 of 14 : OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol";
/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

File 11 of 14 : Constants.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

File 12 of 14 : IDelegationRegistry.sol
// SPDX-License-Identifier: CC0-1.0
pragma solidity ^0.8.17;

/**
 * @title An immutable registry contract to be deployed as a standalone primitive
 * @dev See EIP-5639, new project launches can read previous cold wallet -> hot wallet delegations
 * from here and integrate those permissions into their flow
 */
interface IDelegationRegistry {
    /// @notice Delegation type
    enum DelegationType {
        NONE,
        ALL,
        CONTRACT,
        TOKEN
    }

    /// @notice Info about a single delegation, used for onchain enumeration
    struct DelegationInfo {
        DelegationType type_;
        address vault;
        address delegate;
        address contract_;
        uint256 tokenId;
    }

    /// @notice Info about a single contract-level delegation
    struct ContractDelegation {
        address contract_;
        address delegate;
    }

    /// @notice Info about a single token-level delegation
    struct TokenDelegation {
        address contract_;
        uint256 tokenId;
        address delegate;
    }

    /// @notice Emitted when a user delegates their entire wallet
    event DelegateForAll(address vault, address delegate, bool value);

    /// @notice Emitted when a user delegates a specific contract
    event DelegateForContract(address vault, address delegate, address contract_, bool value);

    /// @notice Emitted when a user delegates a specific token
    event DelegateForToken(address vault, address delegate, address contract_, uint256 tokenId, bool value);

    /// @notice Emitted when a user revokes all delegations
    event RevokeAllDelegates(address vault);

    /// @notice Emitted when a user revoes all delegations for a given delegate
    event RevokeDelegate(address vault, address delegate);

    /**
     * -----------  WRITE -----------
     */

    /**
     * @notice Allow the delegate to act on your behalf for all contracts
     * @param delegate The hotwallet to act on your behalf
     * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
     */
    function delegateForAll(address delegate, bool value) external;

    /**
     * @notice Allow the delegate to act on your behalf for a specific contract
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
     */
    function delegateForContract(address delegate, address contract_, bool value) external;

    /**
     * @notice Allow the delegate to act on your behalf for a specific token
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param tokenId The token id for the token you're delegating
     * @param value Whether to enable or disable delegation for this address, true for setting and false for revoking
     */
    function delegateForToken(address delegate, address contract_, uint256 tokenId, bool value) external;

    /**
     * @notice Revoke all delegates
     */
    function revokeAllDelegates() external;

    /**
     * @notice Revoke a specific delegate for all their permissions
     * @param delegate The hotwallet to revoke
     */
    function revokeDelegate(address delegate) external;

    /**
     * @notice Remove yourself as a delegate for a specific vault
     * @param vault The vault which delegated to the msg.sender, and should be removed
     */
    function revokeSelf(address vault) external;

    /**
     * -----------  READ -----------
     */

    /**
     * @notice Returns all active delegations a given delegate is able to claim on behalf of
     * @param delegate The delegate that you would like to retrieve delegations for
     * @return info Array of DelegationInfo structs
     */
    function getDelegationsByDelegate(address delegate) external view returns (DelegationInfo[] memory);

    /**
     * @notice Returns an array of wallet-level delegates for a given vault
     * @param vault The cold wallet who issued the delegation
     * @return addresses Array of wallet-level delegates for a given vault
     */
    function getDelegatesForAll(address vault) external view returns (address[] memory);

    /**
     * @notice Returns an array of contract-level delegates for a given vault and contract
     * @param vault The cold wallet who issued the delegation
     * @param contract_ The address for the contract you're delegating
     * @return addresses Array of contract-level delegates for a given vault and contract
     */
    function getDelegatesForContract(address vault, address contract_) external view returns (address[] memory);

    /**
     * @notice Returns an array of contract-level delegates for a given vault's token
     * @param vault The cold wallet who issued the delegation
     * @param contract_ The address for the contract holding the token
     * @param tokenId The token id for the token you're delegating
     * @return addresses Array of contract-level delegates for a given vault's token
     */
    function getDelegatesForToken(address vault, address contract_, uint256 tokenId)
        external
        view
        returns (address[] memory);

    /**
     * @notice Returns all contract-level delegations for a given vault
     * @param vault The cold wallet who issued the delegations
     * @return delegations Array of ContractDelegation structs
     */
    function getContractLevelDelegations(address vault)
        external
        view
        returns (ContractDelegation[] memory delegations);

    /**
     * @notice Returns all token-level delegations for a given vault
     * @param vault The cold wallet who issued the delegations
     * @return delegations Array of TokenDelegation structs
     */
    function getTokenLevelDelegations(address vault) external view returns (TokenDelegation[] memory delegations);

    /**
     * @notice Returns true if the address is delegated to act on the entire vault
     * @param delegate The hotwallet to act on your behalf
     * @param vault The cold wallet who issued the delegation
     */
    function checkDelegateForAll(address delegate, address vault) external view returns (bool);

    /**
     * @notice Returns true if the address is delegated to act on your behalf for a token contract or an entire vault
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param vault The cold wallet who issued the delegation
     */
    function checkDelegateForContract(address delegate, address vault, address contract_)
        external
        view
        returns (bool);

    /**
     * @notice Returns true if the address is delegated to act on your behalf for a specific token, the token's contract or an entire vault
     * @param delegate The hotwallet to act on your behalf
     * @param contract_ The address for the contract you're delegating
     * @param tokenId The token id for the token you're delegating
     * @param vault The cold wallet who issued the delegation
     */
    function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId)
        external
        view
        returns (bool);
}

File 13 of 14 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

File 14 of 14 : IOperatorFilterRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

Settings
{
  "remappings": [
    "@rari-capital/solmate/=lib/solmate/",
    "contracts/=contracts/",
    "ds-test/=lib/ds-test/src/",
    "erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "murky/=lib/murky/src/",
    "openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "operator-filter-registry/=lib/operator-filter-registry/src/",
    "solmate/=lib/solmate/src/",
    "lib/murky:ds-test/=lib/murky/lib/forge-std/lib/ds-test/src/",
    "lib/murky:forge-std/=lib/murky/lib/forge-std/src/",
    "lib/murky:openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/",
    "lib/operator-filter-registry:ds-test/=lib/operator-filter-registry/lib/forge-std/lib/ds-test/src/",
    "lib/operator-filter-registry:erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "lib/operator-filter-registry:forge-std/=lib/operator-filter-registry/lib/forge-std/src/",
    "lib/operator-filter-registry:openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/contracts/",
    "lib/operator-filter-registry:openzeppelin-contracts/=lib/operator-filter-registry/lib/openzeppelin-contracts/contracts/",
    "lib/solmate:ds-test/=lib/solmate/lib/ds-test/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_root","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControl","type":"error"},{"inputs":[],"name":"MintNotOpen","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"TokenDoesNotExist","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROOT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"rootIds","type":"uint256[]"}],"name":"burnRootAndMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deleteDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_metadataOwner","type":"address"}],"name":"setMetadataOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mintOpen","type":"bool"}],"name":"setMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mintingOwner","type":"address"}],"name":"setMintingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyOwner","type":"address"}],"name":"setRoyaltyOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040525f600b5534801562000014575f80fd5b506040516200266d3803806200266d833981016040819052620000379162000223565b604080518082018252600781526620bd3ab934b0b760c91b6020808301919091528251808401909352600483526320ad2aa960e11b9083015290733cc6cdda760b79bafa08df41ecfa224f810dceb660016daaeb6d7670e522a718067333cd4e3b15620001c35780156200011657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b5f604051808303815f87803b158015620000f9575f80fd5b505af11580156200010c573d5f803e3d5ffd5b50505050620001c3565b6001600160a01b03821615620001675760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000e1565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e486906024015f604051808303815f87803b158015620001ab575f80fd5b505af1158015620001be573d5f803e3d5ffd5b505050505b505f9050620001d38382620002f2565b506001620001e28282620002f2565b505060088054336001600160a01b0319918216811790925560098054821683179055600a80549091169091179055506001600160a01b0316608052620003ba565b5f6020828403121562000234575f80fd5b81516001600160a01b03811681146200024b575f80fd5b9392505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200027b57607f821691505b6020821081036200029a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620002ed575f81815260208120601f850160051c81016020861015620002c85750805b601f850160051c820191505b81811015620002e957828155600101620002d4565b5050505b505050565b81516001600160401b038111156200030e576200030e62000252565b62000326816200031f845462000266565b84620002a0565b602080601f8311600181146200035c575f8415620003445750858301515b5f19600386901b1c1916600185901b178555620002e9565b5f85815260208120601f198616915b828110156200038c578886015182559484019460019091019084016200036b565b5085821015620003aa57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b608051612293620003da5f395f81816103790152610a4d01526122935ff3fe608060405234801561000f575f80fd5b5060043610610201575f3560e01c80635c49d2cb11610123578063aa1b103f116100b8578063d547cfb711610088578063e985e9c51161006e578063e985e9c514610495578063ecde3c89146104c2578063f8004d31146104d5575f80fd5b8063d547cfb71461047a578063db5eb70214610482575f80fd5b8063aa1b103f14610439578063b113c60814610441578063b88d4fde14610454578063c87b56dd14610467575f80fd5b80638a616bc0116100f35780638a616bc0146103fa5780638da5cb5b1461040d57806395d89b411461041e578063a22cb46514610426575f80fd5b80635c49d2cb146103ae5780636352211e146103c157806367c24000146103d457806370a08231146103e7575f80fd5b80632525b3d71161019957806341f434341161016957806341f434341461034c57806342842e0e146103615780635909c12f146103745780635944c7531461039b575f80fd5b80632525b3d7146102e15780632a55205a146102f457806330176e131461032657806335137cd014610339575f80fd5b8063095ea7b3116101d4578063095ea7b31461029757806318160ddd146102aa57806323b872dd146102c157806324bbd049146102d4575f80fd5b806301ffc9a71461020557806304634d8d1461022d57806306fdde0314610242578063081812fc14610257575b5f80fd5b610218610213366004611a13565b6104e8565b60405190151581526020015b60405180910390f35b61024061023b366004611a66565b610618565b005b61024a61066a565b6040516102249190611ab9565b61027f610265366004611b09565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610224565b6102406102a5366004611b20565b6106f5565b6102b3600b5481565b604051908152602001610224565b6102406102cf366004611b48565b61070e565b600d546102189060ff1681565b6102406102ef366004611b81565b610739565b610307610302366004611b9a565b6107b7565b604080516001600160a01b039093168352602083019190915201610224565b610240610334366004611be7565b610892565b610240610347366004611b81565b6108e2565b61027f6daaeb6d7670e522a718067333cd4e81565b61024061036f366004611b48565b610960565b61027f7f000000000000000000000000000000000000000000000000000000000000000081565b6102406103a9366004611cb0565b610985565b60085461027f906001600160a01b031681565b61027f6103cf366004611b09565b6109d4565b6102406103e2366004611ce9565b610a42565b6102b36103f5366004611b81565b610b32565b610240610408366004611b09565b610ba4565b600a546001600160a01b031661027f565b61024a610bfb565b610240610434366004611d65565b610c08565b610240610c1c565b60095461027f906001600160a01b031681565b610240610462366004611d9a565b610c6b565b61024a610475366004611b09565b610c9a565b61024a610d1c565b600a5461027f906001600160a01b031681565b6102186104a3366004611e2d565b600560209081525f928352604080842090915290825290205460ff1681565b6102406104d0366004611b81565b610d29565b6102406104e3366004611e55565b610da7565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061057a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105c657507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061061257507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600a546001600160a01b0316331461065c576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106668282610e1c565b5050565b5f805461067690611e70565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290611e70565b80156106ed5780601f106106c4576101008083540402835291602001916106ed565b820191905f5260205f20905b8154815290600101906020018083116106d057829003601f168201915b505050505081565b816106ff81610f47565b6107098383611030565b505050565b826001600160a01b03811633146107285761072833610f47565b610733848484611136565b50505050565b600a546001600160a01b0316331461077d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8281526007602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916108575750604080518082019091526006546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101515f906127109061087a906bffffffffffffffffffffffff1687611eee565b6108849190611f32565b915196919550909350505050565b6009546001600160a01b031633146108d6576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c6106668282611f8a565b6008546001600160a01b03163314610926576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b826001600160a01b038116331461097a5761097a33610f47565b61073384848461135d565b600a546001600160a01b031633146109c9576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61070983838361148a565b5f818152600260205260409020546001600160a01b031680610a3d5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e5445440000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aa4576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5460ff16610ae0576040517f951b974f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610b1457610b0c32848484818110610b0057610b006120a2565b905060200201356115c5565b600101610ae2565b5081819050600b5f828254610b2991906120cf565b90915550505050565b5f6001600160a01b038216610b895760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610a34565b506001600160a01b03165f9081526003602052604090205490565b600a546001600160a01b03163314610be8576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f90815260076020526040812055565b50565b6001805461067690611e70565b81610c1281610f47565b6107098383611701565b600a546001600160a01b03163314610c60576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c695f600655565b565b846001600160a01b0381163314610c8557610c8533610f47565b610c92868686868661178a565b505050505050565b5f818152600260205260409020546060906001600160a01b0316610cea576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c610cf5836118ad565b604051602001610d069291906120e2565b6040516020818303038152906040529050919050565b600c805461067690611e70565b6009546001600160a01b03163314610d6d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610deb576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6127106bffffffffffffffffffffffff82161115610ea25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b038216610ef85760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610a34565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600655565b6daaeb6d7670e522a718067333cd4e3b15610bf8576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612183565b610bf8576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a34565b5f818152600260205260409020546001600160a01b03163381148061107757506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b6110c35760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b5f8281526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152600260205260409020546001600160a01b0384811691161461119e5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382166111f45760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b336001600160a01b038416148061122d57506001600160a01b0383165f90815260056020908152604080832033845290915290205460ff165b8061124d57505f818152600460205260409020546001600160a01b031633145b6112995760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b038084165f81815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526002825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61136883838361070e565b6001600160a01b0382163b158061143e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af11580156113f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141a919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6107095760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b6127106bffffffffffffffffffffffff821611156115105760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b0382166115665760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610a34565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff92831660208083019182525f96875260079052919094209351905190911674010000000000000000000000000000000000000000029116179055565b6001600160a01b03821661161b5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b5f818152600260205260409020546001600160a01b03161561167f5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b335f8181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61179585858561070e565b6001600160a01b0384163b158061185a57506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a02906117f69033908a908990899089906004016121b9565b6020604051808303815f875af1158015611812573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611836919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6118a65760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b5050505050565b6060815f036118ef57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b815f5b8115611918578061190281612229565b91506119119050600a83611f32565b91506118f2565b5f8167ffffffffffffffff81111561193257611932611bba565b6040519080825280601f01601f19166020018201604052801561195c576020820181803683370190505b5090505b84156119de57611971600183612260565b915061197e600a86612273565b6119899060306120cf565b60f81b81838151811061199e5761199e6120a2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506119d7600a86611f32565b9450611960565b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bf8575f80fd5b5f60208284031215611a23575f80fd5b8135611a2e816119e6565b9392505050565b80356001600160a01b0381168114610a3d575f80fd5b80356bffffffffffffffffffffffff81168114610a3d575f80fd5b5f8060408385031215611a77575f80fd5b611a8083611a35565b9150611a8e60208401611a4b565b90509250929050565b5f5b83811015611ab1578181015183820152602001611a99565b50505f910152565b602081525f8251806020840152611ad7816040850160208701611a97565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f60208284031215611b19575f80fd5b5035919050565b5f8060408385031215611b31575f80fd5b611b3a83611a35565b946020939093013593505050565b5f805f60608486031215611b5a575f80fd5b611b6384611a35565b9250611b7160208501611a35565b9150604084013590509250925092565b5f60208284031215611b91575f80fd5b611a2e82611a35565b5f8060408385031215611bab575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611bf7575f80fd5b813567ffffffffffffffff80821115611c0e575f80fd5b818401915084601f830112611c21575f80fd5b813581811115611c3357611c33611bba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611c7957611c79611bba565b81604052828152876020848701011115611c91575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611cc2575f80fd5b83359250611cd260208501611a35565b9150611ce060408501611a4b565b90509250925092565b5f8060208385031215611cfa575f80fd5b823567ffffffffffffffff80821115611d11575f80fd5b818501915085601f830112611d24575f80fd5b813581811115611d32575f80fd5b8660208260051b8501011115611d46575f80fd5b60209290920196919550909350505050565b8015158114610bf8575f80fd5b5f8060408385031215611d76575f80fd5b611d7f83611a35565b91506020830135611d8f81611d58565b809150509250929050565b5f805f805f60808688031215611dae575f80fd5b611db786611a35565b9450611dc560208701611a35565b935060408601359250606086013567ffffffffffffffff80821115611de8575f80fd5b818801915088601f830112611dfb575f80fd5b813581811115611e09575f80fd5b896020828501011115611e1a575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611e3e575f80fd5b611e4783611a35565b9150611a8e60208401611a35565b5f60208284031215611e65575f80fd5b8135611a2e81611d58565b600181811c90821680611e8457607f821691505b602082108103611ebb577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761061257610612611ec1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611f4057611f40611f05565b500490565b601f821115610709575f81815260208120601f850160051c81016020861015611f6b5750805b601f850160051c820191505b81811015610c9257828155600101611f77565b815167ffffffffffffffff811115611fa457611fa4611bba565b611fb881611fb28454611e70565b84611f45565b602080601f83116001811461200a575f8415611fd45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610c92565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561205657888601518255948401946001909101908401612037565b508582101561209257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082018082111561061257610612611ec1565b5f8084546120ef81611e70565b60018281168015612107576001811461213a57612166565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612166565b885f526020805f205f5b8581101561215d5781548a820152908401908201612144565b50505082870194505b50505050835161217a818360208801611a97565b01949350505050565b5f60208284031215612193575f80fd5b8151611a2e81611d58565b5f602082840312156121ae575f80fd5b8151611a2e816119e6565b5f6001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a08401375f60a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361225957612259611ec1565b5060010190565b8181038181111561061257610612611ec1565b5f8261228157612281611f05565b50069056fea164736f6c6343000815000a0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610201575f3560e01c80635c49d2cb11610123578063aa1b103f116100b8578063d547cfb711610088578063e985e9c51161006e578063e985e9c514610495578063ecde3c89146104c2578063f8004d31146104d5575f80fd5b8063d547cfb71461047a578063db5eb70214610482575f80fd5b8063aa1b103f14610439578063b113c60814610441578063b88d4fde14610454578063c87b56dd14610467575f80fd5b80638a616bc0116100f35780638a616bc0146103fa5780638da5cb5b1461040d57806395d89b411461041e578063a22cb46514610426575f80fd5b80635c49d2cb146103ae5780636352211e146103c157806367c24000146103d457806370a08231146103e7575f80fd5b80632525b3d71161019957806341f434341161016957806341f434341461034c57806342842e0e146103615780635909c12f146103745780635944c7531461039b575f80fd5b80632525b3d7146102e15780632a55205a146102f457806330176e131461032657806335137cd014610339575f80fd5b8063095ea7b3116101d4578063095ea7b31461029757806318160ddd146102aa57806323b872dd146102c157806324bbd049146102d4575f80fd5b806301ffc9a71461020557806304634d8d1461022d57806306fdde0314610242578063081812fc14610257575b5f80fd5b610218610213366004611a13565b6104e8565b60405190151581526020015b60405180910390f35b61024061023b366004611a66565b610618565b005b61024a61066a565b6040516102249190611ab9565b61027f610265366004611b09565b60046020525f90815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610224565b6102406102a5366004611b20565b6106f5565b6102b3600b5481565b604051908152602001610224565b6102406102cf366004611b48565b61070e565b600d546102189060ff1681565b6102406102ef366004611b81565b610739565b610307610302366004611b9a565b6107b7565b604080516001600160a01b039093168352602083019190915201610224565b610240610334366004611be7565b610892565b610240610347366004611b81565b6108e2565b61027f6daaeb6d7670e522a718067333cd4e81565b61024061036f366004611b48565b610960565b61027f7f0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c81565b6102406103a9366004611cb0565b610985565b60085461027f906001600160a01b031681565b61027f6103cf366004611b09565b6109d4565b6102406103e2366004611ce9565b610a42565b6102b36103f5366004611b81565b610b32565b610240610408366004611b09565b610ba4565b600a546001600160a01b031661027f565b61024a610bfb565b610240610434366004611d65565b610c08565b610240610c1c565b60095461027f906001600160a01b031681565b610240610462366004611d9a565b610c6b565b61024a610475366004611b09565b610c9a565b61024a610d1c565b600a5461027f906001600160a01b031681565b6102186104a3366004611e2d565b600560209081525f928352604080842090915290825290205460ff1681565b6102406104d0366004611b81565b610d29565b6102406104e3366004611e55565b610da7565b5f7f2a55205a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061057a57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806105c657507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b8061061257507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b600a546001600160a01b0316331461065c576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106668282610e1c565b5050565b5f805461067690611e70565b80601f01602080910402602001604051908101604052809291908181526020018280546106a290611e70565b80156106ed5780601f106106c4576101008083540402835291602001916106ed565b820191905f5260205f20905b8154815290600101906020018083116106d057829003601f168201915b505050505081565b816106ff81610f47565b6107098383611030565b505050565b826001600160a01b03811633146107285761072833610f47565b610733848484611136565b50505050565b600a546001600160a01b0316331461077d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b5f8281526007602090815260408083208151808301909252546001600160a01b038116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916108575750604080518082019091526006546001600160a01b03811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101515f906127109061087a906bffffffffffffffffffffffff1687611eee565b6108849190611f32565b915196919550909350505050565b6009546001600160a01b031633146108d6576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c6106668282611f8a565b6008546001600160a01b03163314610926576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600880547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b826001600160a01b038116331461097a5761097a33610f47565b61073384848461135d565b600a546001600160a01b031633146109c9576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61070983838361148a565b5f818152600260205260409020546001600160a01b031680610a3d5760405162461bcd60e51b815260206004820152600a60248201527f4e4f545f4d494e5445440000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b919050565b336001600160a01b037f0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c1614610aa4576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d5460ff16610ae0576040517f951b974f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610b1457610b0c32848484818110610b0057610b006120a2565b905060200201356115c5565b600101610ae2565b5081819050600b5f828254610b2991906120cf565b90915550505050565b5f6001600160a01b038216610b895760405162461bcd60e51b815260206004820152600c60248201527f5a45524f5f4144445245535300000000000000000000000000000000000000006044820152606401610a34565b506001600160a01b03165f9081526003602052604090205490565b600a546001600160a01b03163314610be8576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f90815260076020526040812055565b50565b6001805461067690611e70565b81610c1281610f47565b6107098383611701565b600a546001600160a01b03163314610c60576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c695f600655565b565b846001600160a01b0381163314610c8557610c8533610f47565b610c92868686868661178a565b505050505050565b5f818152600260205260409020546060906001600160a01b0316610cea576040517fceea21b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c610cf5836118ad565b604051602001610d069291906120e2565b6040516020818303038152906040529050919050565b600c805461067690611e70565b6009546001600160a01b03163314610d6d576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6008546001600160a01b03163314610deb576040517f1f7c4bf300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b6127106bffffffffffffffffffffffff82161115610ea25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b038216610ef85760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610a34565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff90911660209092018290527401000000000000000000000000000000000000000090910217600655565b6daaeb6d7670e522a718067333cd4e3b15610bf8576040517fc61711340000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190612183565b610bf8576040517fede71dcc0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610a34565b5f818152600260205260409020546001600160a01b03163381148061107757506001600160a01b0381165f90815260056020908152604080832033845290915290205460ff165b6110c35760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b5f8281526004602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b5f818152600260205260409020546001600160a01b0384811691161461119e5760405162461bcd60e51b815260206004820152600a60248201527f57524f4e475f46524f4d000000000000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382166111f45760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b336001600160a01b038416148061122d57506001600160a01b0383165f90815260056020908152604080832033845290915290205460ff165b8061124d57505f818152600460205260409020546001600160a01b031633145b6112995760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b038084165f81815260036020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff019055938616808352848320805460010190558583526002825284832080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61136883838361070e565b6001600160a01b0382163b158061143e57506040517f150b7a02000000000000000000000000000000000000000000000000000000008082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af11580156113f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141a919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6107095760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b6127106bffffffffffffffffffffffff821611156115105760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610a34565b6001600160a01b0382166115665760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d657465727300000000006044820152606401610a34565b6040805180820182526001600160a01b0393841681526bffffffffffffffffffffffff92831660208083019182525f96875260079052919094209351905190911674010000000000000000000000000000000000000000029116179055565b6001600160a01b03821661161b5760405162461bcd60e51b815260206004820152601160248201527f494e56414c49445f524543495049454e540000000000000000000000000000006044820152606401610a34565b5f818152600260205260409020546001600160a01b03161561167f5760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4d494e5445440000000000000000000000000000000000006044820152606401610a34565b6001600160a01b0382165f81815260036020908152604080832080546001019055848352600290915280822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b335f8181526005602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61179585858561070e565b6001600160a01b0384163b158061185a57506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063150b7a02906117f69033908a908990899089906004016121b9565b6020604051808303815f875af1158015611812573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611836919061219e565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6118a65760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610a34565b5050505050565b6060815f036118ef57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b815f5b8115611918578061190281612229565b91506119119050600a83611f32565b91506118f2565b5f8167ffffffffffffffff81111561193257611932611bba565b6040519080825280601f01601f19166020018201604052801561195c576020820181803683370190505b5090505b84156119de57611971600183612260565b915061197e600a86612273565b6119899060306120cf565b60f81b81838151811061199e5761199e6120a2565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506119d7600a86611f32565b9450611960565b949350505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610bf8575f80fd5b5f60208284031215611a23575f80fd5b8135611a2e816119e6565b9392505050565b80356001600160a01b0381168114610a3d575f80fd5b80356bffffffffffffffffffffffff81168114610a3d575f80fd5b5f8060408385031215611a77575f80fd5b611a8083611a35565b9150611a8e60208401611a4b565b90509250929050565b5f5b83811015611ab1578181015183820152602001611a99565b50505f910152565b602081525f8251806020840152611ad7816040850160208701611a97565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b5f60208284031215611b19575f80fd5b5035919050565b5f8060408385031215611b31575f80fd5b611b3a83611a35565b946020939093013593505050565b5f805f60608486031215611b5a575f80fd5b611b6384611a35565b9250611b7160208501611a35565b9150604084013590509250925092565b5f60208284031215611b91575f80fd5b611a2e82611a35565b5f8060408385031215611bab575f80fd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215611bf7575f80fd5b813567ffffffffffffffff80821115611c0e575f80fd5b818401915084601f830112611c21575f80fd5b813581811115611c3357611c33611bba565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611c7957611c79611bba565b81604052828152876020848701011115611c91575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f805f60608486031215611cc2575f80fd5b83359250611cd260208501611a35565b9150611ce060408501611a4b565b90509250925092565b5f8060208385031215611cfa575f80fd5b823567ffffffffffffffff80821115611d11575f80fd5b818501915085601f830112611d24575f80fd5b813581811115611d32575f80fd5b8660208260051b8501011115611d46575f80fd5b60209290920196919550909350505050565b8015158114610bf8575f80fd5b5f8060408385031215611d76575f80fd5b611d7f83611a35565b91506020830135611d8f81611d58565b809150509250929050565b5f805f805f60808688031215611dae575f80fd5b611db786611a35565b9450611dc560208701611a35565b935060408601359250606086013567ffffffffffffffff80821115611de8575f80fd5b818801915088601f830112611dfb575f80fd5b813581811115611e09575f80fd5b896020828501011115611e1a575f80fd5b9699959850939650602001949392505050565b5f8060408385031215611e3e575f80fd5b611e4783611a35565b9150611a8e60208401611a35565b5f60208284031215611e65575f80fd5b8135611a2e81611d58565b600181811c90821680611e8457607f821691505b602082108103611ebb577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761061257610612611ec1565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82611f4057611f40611f05565b500490565b601f821115610709575f81815260208120601f850160051c81016020861015611f6b5750805b601f850160051c820191505b81811015610c9257828155600101611f77565b815167ffffffffffffffff811115611fa457611fa4611bba565b611fb881611fb28454611e70565b84611f45565b602080601f83116001811461200a575f8415611fd45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610c92565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561205657888601518255948401946001909101908401612037565b508582101561209257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082018082111561061257610612611ec1565b5f8084546120ef81611e70565b60018281168015612107576001811461213a57612166565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612166565b885f526020805f205f5b8581101561215d5781548a820152908401908201612144565b50505082870194505b50505050835161217a818360208801611a97565b01949350505050565b5f60208284031215612193575f80fd5b8151611a2e81611d58565b5f602082840312156121ae575f80fd5b8151611a2e816119e6565b5f6001600160a01b03808816835280871660208401525084604083015260806060830152826080830152828460a08401375f60a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361225957612259611ec1565b5060010190565b8181038181111561061257610612611ec1565b5f8261228157612281611f05565b50069056fea164736f6c6343000815000a

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

0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c

-----Decoded View---------------
Arg [0] : _root (address): 0x0025C3ABfa72E7c509ad458b50982835404A1d6c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000025c3abfa72e7c509ad458b50982835404a1d6c


Deployed Bytecode Sourcemap

455:4408:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2136:417;;;;;;:::i;:::-;;:::i;:::-;;;611:14:14;;604:22;586:41;;574:2;559:18;2136:417:11;;;;;;;;2606:222;;;;;;:::i;:::-;;:::i;:::-;;896:18:9;;;:::i;:::-;;;;;;;:::i;1841:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1841:46:9;;;;;;-1:-1:-1;;;;;2350:55:14;;;2332:74;;2320:2;2305:18;1841:46:9;2186:226:14;4134:155:11;;;;;;:::i;:::-;;:::i;678:30::-;;;;;;;;;2822:25:14;;;2810:2;2795:18;678:30:11;2676:177:14;4295:161:11;;;;;;:::i;:::-;;:::i;868:20::-;;;;;;;;;1906:119:13;;;;;;:::i;:::-;;:::i;1671:432:1:-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3827:55:14;;;3809:74;;3914:2;3899:18;;3892:34;;;;3782:18;1671:432:1;3635:297:14;1650:197:11;;;;;;:::i;:::-;;:::i;1352:119:13:-;;;;;;:::i;:::-;;:::i;1158:142:7:-;;120:42:8;1158:142:7;;4462:169:11;;;;;;:::i;:::-;;:::i;585:29::-;;;;;3104:244;;;;;;:::i;:::-;;:::i;196:27:13:-;;;;;-1:-1:-1;;;;;196:27:13;;;1324:149:9;;;;;;:::i;:::-;;:::i;1166:358:11:-;;;;;;:::i;:::-;;:::i;1479:168:9:-;;;;;;:::i;:::-;;:::i;3401:185:11:-;;;;;;:::i;:::-;;:::i;2083:85:13:-;2149:12;;-1:-1:-1;;;;;2149:12:13;2083:85;;921:20:9;;;:::i;3954:174:11:-;;;;;;:::i;:::-;;:::i;2884:169::-;;;:::i;291:28:13:-;;;;;-1:-1:-1;;;;;291:28:13;;;4637:224:11;;;;;;:::i;:::-;;:::i;3682:242::-;;;;;;:::i;:::-;;:::i;791:26::-;;;:::i;430:27:13:-;;;;;-1:-1:-1;;;;;430:27:13;;;1894:68:9;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1667:124:13;;;;;;:::i;:::-;;:::i;1883:171:11:-;;;;;;:::i;:::-;;:::i;2136:417::-;2230:4;2253:25;;;;;;:101;;-1:-1:-1;2329:25:11;;;;;2253:101;:176;;;-1:-1:-1;2404:25:11;;;;;2253:176;:251;;;-1:-1:-1;2479:25:11;;;;;2253:251;2246:258;2136:417;-1:-1:-1;;2136:417:11:o;2606:222::-;2709:12;;-1:-1:-1;;;;;2709:12:11;2695:10;:26;2691:79;;2744:15;;;;;;;;;;;;;;2691:79;2779:42;2798:8;2808:12;2779:18;:42::i;:::-;2606:222;;:::o;896:18:9:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4134:155:11:-;4230:8;2902:30:7;2923:8;2902:20;:30::i;:::-;4250:32:11::1;4264:8;4274:7;4250:13;:32::i;:::-;4134:155:::0;;;:::o;4295:161::-;4396:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;4412:37:11::1;4431:4;4437:2;4441:7;4412:18;:37::i;:::-;4295:161:::0;;;;:::o;1906:119:13:-;1035:12;;-1:-1:-1;;;;;1035:12:13;1021:10;:26;1017:79;;1070:15;;;;;;;;;;;;;;1017:79;1990:12:::1;:28:::0;;;::::1;-1:-1:-1::0;;;;;1990:28:13;;;::::1;::::0;;;::::1;::::0;;1906:119::o;1671:432:1:-;1768:7;1825:27;;;:17;:27;;;;;;;;1796:56;;;;;;;;;-1:-1:-1;;;;;1796:56:1;;;;;;;;;;;;;;;;;;1768:7;;1863:90;;-1:-1:-1;1913:29:1;;;;;;;;;1923:19;1913:29;-1:-1:-1;;;;;1913:29:1;;;;;;;;;;;;;1863:90;2001:23;;;;1963:21;;2461:5;;1988:36;;1987:58;1988:36;:10;:36;:::i;:::-;1987:58;;;;:::i;:::-;2064:16;;;;;-1:-1:-1;1671:432:1;;-1:-1:-1;;;;1671:432:1:o;1650:197:11:-;1741:13;;-1:-1:-1;;;;;1741:13:11;1727:10;:27;1723:80;;1777:15;;;;;;;;;;;;;;1723:80;1812:12;:28;1827:13;1812:12;:28;:::i;1352:119:13:-;753:12;;-1:-1:-1;;;;;753:12:13;739:10;:26;735:79;;788:15;;;;;;;;;;;;;;735:79;1436:12:::1;:28:::0;;;::::1;-1:-1:-1::0;;;;;1436:28:13;;;::::1;::::0;;;::::1;::::0;;1352:119::o;4462:169:11:-;4567:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;4583:41:11::1;4606:4;4612:2;4616:7;4583:22;:41::i;3104:244::-:0;3222:12;;-1:-1:-1;;;;;3222:12:11;3208:10;:26;3204:79;;3257:15;;;;;;;;;;;;;;3204:79;3292:49;3309:7;3318:8;3328:12;3292:16;:49::i;1324:149:9:-;1382:13;1424:12;;;:8;:12;;;;;;-1:-1:-1;;;;;1424:12:9;;1407:59;;;;-1:-1:-1;;;1407:59:9;;11795:2:14;1407:59:9;;;11777:21:14;11834:2;11814:18;;;11807:30;11873:12;11853:18;;;11846:40;11903:18;;1407:59:9;;;;;;;;;1324:149;;;:::o;1166:358:11:-;1242:10;-1:-1:-1;;;;;1256:4:11;1242:18;;1238:46;;1269:15;;;;;;;;;;;;;;1238:46;1299:8;;;;1294:35;;1316:13;;;;;;;;;;;;;;1294:35;1368:9;1363:106;1383:18;;;1363:106;;;1426:28;1432:9;1443:7;;1451:1;1443:10;;;;;;;:::i;:::-;;;;;;;1426:5;:28::i;:::-;1403:3;;1363:106;;;;1503:7;;:14;;1488:11;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;1166:358:11:o;1479:168:9:-;1542:7;-1:-1:-1;;;;;1569:19:9;;1561:44;;;;-1:-1:-1;;;1561:44:9;;12453:2:14;1561:44:9;;;12435:21:14;12492:2;12472:18;;;12465:30;12531:14;12511:18;;;12504:42;12563:18;;1561:44:9;12251:336:14;1561:44:9;-1:-1:-1;;;;;;1623:17:9;;;;;:10;:17;;;;;;;1479:168::o;3401:185:11:-;3482:12;;-1:-1:-1;;;;;3482:12:11;3468:10;:26;3464:79;;3517:15;;;;;;;;;;;;;;3464:79;4061:26:1;;;;:17;:26;;;;;4054:33;3401:185:11:o;3552:27::-;3401:185;:::o;921:20:9:-;;;;;;;:::i;3954:174:11:-;4058:8;2902:30:7;2923:8;2902:20;:30::i;:::-;4078:43:11::1;4102:8;4112;4078:23;:43::i;2884:169::-:0;2953:12;;-1:-1:-1;;;;;2953:12:11;2939:10;:26;2935:79;;2988:15;;;;;;;;;;;;;;2935:79;3023:23;3199:19:1;;3192:26;3132:93;3023:23:11;2884:169::o;4637:224::-;4787:4;-1:-1:-1;;;;;2638:18:7;;2646:10;2638:18;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;4807:47:11::1;4830:4;4836:2;4840:7;4849:4;;4807:22;:47::i;:::-;4637:224:::0;;;;;;:::o;3682:242::-;3805:1;3776:17;;;:8;:17;;;;;;3747:13;;-1:-1:-1;;;;;3776:17:11;3772:63;;3816:19;;;;;;;;;;;;;;3772:63;3876:12;3890:25;3907:7;3890:16;:25::i;:::-;3859:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3845:72;;3682:242;;;:::o;791:26::-;;;;;;;:::i;1667:124:13:-;894:13;;-1:-1:-1;;;;;894:13:13;880:10;:27;876:80;;930:15;;;;;;;;;;;;;;876:80;1754:13:::1;:30:::0;;;::::1;-1:-1:-1::0;;;;;1754:30:13;;;::::1;::::0;;;::::1;::::0;;1667:124::o;1883:171:11:-;1957:12;;-1:-1:-1;;;;;1957:12:11;1943:10;:26;1939:79;;1992:15;;;;;;;;;;;;;;1939:79;2027:8;:20;;;;;;;;;;;;;1883:171::o;2734:327:1:-;2461:5;2836:33;;;;;2828:88;;;;-1:-1:-1;;;2828:88:1;;13877:2:14;2828:88:1;;;13859:21:14;13916:2;13896:18;;;13889:30;13955:34;13935:18;;;13928:62;14026:12;14006:18;;;13999:40;14056:19;;2828:88:1;13675:406:14;2828:88:1;-1:-1:-1;;;;;2934:22:1;;2926:60;;;;-1:-1:-1;;;2926:60:1;;14288:2:14;2926:60:1;;;14270:21:14;14327:2;14307:18;;;14300:30;14366:27;14346:18;;;14339:55;14411:18;;2926:60:1;14086:349:14;2926:60:1;3019:35;;;;;;;;;-1:-1:-1;;;;;3019:35:1;;;;;;;;;;;;;;;;;2997:57;;;;;:19;:57;2734:327::o;3038:638:7:-;120:42:8;3227:45:7;:49;3223:447;;3523:67;;;;;3574:4;3523:67;;;14675:34:14;-1:-1:-1;;;;;14745:15:14;;14725:18;;;14718:43;120:42:8;;3523::7;;14587:18:14;;3523:67:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3518:142;;3617:28;;;;;-1:-1:-1;;;;;2350:55:14;;3617:28:7;;;2332:74:14;2305:18;;3617:28:7;2186:226:14;2450:282:9;2521:13;2537:12;;;:8;:12;;;;;;-1:-1:-1;;;;;2537:12:9;2568:10;:19;;;:58;;-1:-1:-1;;;;;;2591:23:9;;;;;;:16;:23;;;;;;;;2615:10;2591:35;;;;;;;;;;2568:58;2560:85;;;;-1:-1:-1;;;2560:85:9;;15224:2:14;2560:85:9;;;15206:21:14;15263:2;15243:18;;;15236:30;15302:16;15282:18;;;15275:44;15336:18;;2560:85:9;15022:338:14;2560:85:9;2656:15;;;;:11;:15;;;;;;:25;;;;-1:-1:-1;;;;;2656:25:9;;;;;;;;;2697:28;;2656:15;;2697:28;;;;;;;2511:221;2450:282;;:::o;2947:741::-;3078:12;;;;:8;:12;;;;;;-1:-1:-1;;;;;3070:20:9;;;3078:12;;3070:20;3062:43;;;;-1:-1:-1;;;3062:43:9;;15567:2:14;3062:43:9;;;15549:21:14;15606:2;15586:18;;;15579:30;15645:12;15625:18;;;15618:40;15675:18;;3062:43:9;15365:334:14;3062:43:9;-1:-1:-1;;;;;3124:16:9;;3116:46;;;;-1:-1:-1;;;3116:46:9;;15906:2:14;3116:46:9;;;15888:21:14;15945:2;15925:18;;;15918:30;15984:19;15964:18;;;15957:47;16021:18;;3116:46:9;15704:341:14;3116:46:9;3194:10;-1:-1:-1;;;;;3194:18:9;;;;:56;;-1:-1:-1;;;;;;3216:22:9;;;;;;:16;:22;;;;;;;;3239:10;3216:34;;;;;;;;;;3194:56;:89;;;-1:-1:-1;3268:15:9;;;;:11;:15;;;;;;-1:-1:-1;;;;;3268:15:9;3254:10;:29;3194:89;3173:150;;;;-1:-1:-1;;;3173:150:9;;15224:2:14;3173:150:9;;;15206:21:14;15263:2;15243:18;;;15236:30;15302:16;15282:18;;;15275:44;15336:18;;3173:150:9;15022:338:14;3173:150:9;-1:-1:-1;;;;;3523:16:9;;;;;;;:10;:16;;;;;;;;:18;;;;;;3556:14;;;;;;;;;:16;;3523:18;3556:16;;;3593:12;;;:8;:12;;;;;:17;;;;;;;;;;;3628:11;:15;;;;;;3621:22;;;;;;;;3659;;3602:2;;3556:14;3523:16;3659:22;;;2947:741;;;:::o;3694:396::-;3813:26;3826:4;3832:2;3836;3813:12;:26::i;:::-;-1:-1:-1;;;;;3871:14:9;;;:19;;:170;;-1:-1:-1;3910:66:9;;3996:45;3910:66;;;3951:10;3910:66;;;16378:34:14;-1:-1:-1;;;;;16448:15:14;;;16428:18;;;16421:43;16480:18;;;16473:34;;;16543:3;16523:18;;;16516:31;-1:-1:-1;16563:19:14;;;16556:30;3996:45:9;;3910:40;;;;3996:45;;16603:19:14;;3910:66:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:131;;;3871:170;3850:233;;;;-1:-1:-1;;;3850:233:9;;17089:2:14;3850:233:9;;;17071:21:14;17128:2;17108:18;;;17101:30;17167:18;17147;;;17140:46;17203:18;;3850:233:9;16887:340:14;3495:381:1;2461:5;3642:33;;;;;3634:88;;;;-1:-1:-1;;;3634:88:1;;13877:2:14;3634:88:1;;;13859:21:14;13916:2;13896:18;;;13889:30;13955:34;13935:18;;;13928:62;14026:12;14006:18;;;13999:40;14056:19;;3634:88:1;13675:406:14;3634:88:1;-1:-1:-1;;;;;3740:22:1;;3732:62;;;;-1:-1:-1;;;3732:62:1;;17434:2:14;3732:62:1;;;17416:21:14;17473:2;17453:18;;;17446:30;17512:29;17492:18;;;17485:57;17559:18;;3732:62:1;17232:351:14;3732:62:1;3834:35;;;;;;;;-1:-1:-1;;;;;3834:35:1;;;;;;;;;;;;;;;;-1:-1:-1;3805:26:1;;;:17;:26;;;;;;:64;;;;;;;;;;;;;;3495:381::o;5240:371:9:-;-1:-1:-1;;;;;5314:16:9;;5306:46;;;;-1:-1:-1;;;5306:46:9;;15906:2:14;5306:46:9;;;15888:21:14;15945:2;15925:18;;;15918:30;15984:19;15964:18;;;15957:47;16021:18;;5306:46:9;15704:341:14;5306:46:9;5395:1;5371:12;;;:8;:12;;;;;;-1:-1:-1;;;;;5371:12:9;:26;5363:53;;;;-1:-1:-1;;;5363:53:9;;17790:2:14;5363:53:9;;;17772:21:14;17829:2;17809:18;;;17802:30;17868:16;17848:18;;;17841:44;17902:18;;5363:53:9;17588:338:14;5363:53:9;-1:-1:-1;;;;;5506:14:9;;;;;;:10;:14;;;;;;;;:16;;;;;;5543:12;;;:8;:12;;;;;;:17;;;;;;;;5576:28;5552:2;;5506:14;;5576:28;;5506:14;;5576:28;5240:371;;:::o;2738:203::-;2840:10;2823:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;2823:38:9;;;;;;;;;;;;:49;;;;;;;;;;;;;2888:46;;586:41:14;;;2823:38:9;;2840:10;2888:46;;559:18:14;2888:46:9;;;;;;;2738:203;;:::o;4096:427::-;4244:26;4257:4;4263:2;4267;4244:12;:26::i;:::-;-1:-1:-1;;;;;4302:14:9;;;:19;;:172;;-1:-1:-1;4341:68:9;;4429:45;4341:68;;;4429:45;-1:-1:-1;;;;;4341:40:9;;;4429:45;;4341:68;;4382:10;;4394:4;;4400:2;;4404:4;;;;4341:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:133;;;4302:172;4281:235;;;;-1:-1:-1;;;4281:235:9;;17089:2:14;4281:235:9;;;17071:21:14;17128:2;17108:18;;;17101:30;17167:18;17147;;;17140:46;17203:18;;4281:235:9;16887:340:14;4281:235:9;4096:427;;;;;:::o;392:703:2:-;448:13;665:5;674:1;665:10;661:51;;-1:-1:-1;;691:10:2;;;;;;;;;;;;;;;;;;392:703::o;661:51::-;736:5;721:12;775:75;782:9;;775:75;;807:8;;;;:::i;:::-;;-1:-1:-1;829:10:2;;-1:-1:-1;837:2:2;829:10;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;881:17:2;;859:39;;908:150;915:10;;908:150;;941:11;951:1;941:11;;:::i;:::-;;-1:-1:-1;1009:10:2;1017:2;1009:5;:10;:::i;:::-;996:24;;:2;:24;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1036:11:2;1045:2;1036:11;;:::i;:::-;;;908:150;;;1081:6;392:703;-1:-1:-1;;;;392:703:2:o;14:177:14:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:14:o;638:196::-;706:20;;-1:-1:-1;;;;;755:54:14;;745:65;;735:93;;824:1;821;814:12;839:179;906:20;;966:26;955:38;;945:49;;935:77;;1008:1;1005;998:12;1023:258;1090:6;1098;1151:2;1139:9;1130:7;1126:23;1122:32;1119:52;;;1167:1;1164;1157:12;1119:52;1190:29;1209:9;1190:29;:::i;:::-;1180:39;;1238:37;1271:2;1260:9;1256:18;1238:37;:::i;:::-;1228:47;;1023:258;;;;;:::o;1286:250::-;1371:1;1381:113;1395:6;1392:1;1389:13;1381:113;;;1471:11;;;1465:18;1452:11;;;1445:39;1417:2;1410:10;1381:113;;;-1:-1:-1;;1528:1:14;1510:16;;1503:27;1286:250::o;1541:455::-;1690:2;1679:9;1672:21;1653:4;1722:6;1716:13;1765:6;1760:2;1749:9;1745:18;1738:34;1781:79;1853:6;1848:2;1837:9;1833:18;1828:2;1820:6;1816:15;1781:79;:::i;:::-;1912:2;1900:15;1917:66;1896:88;1881:104;;;;1987:2;1877:113;;1541:455;-1:-1:-1;;1541:455:14:o;2001:180::-;2060:6;2113:2;2101:9;2092:7;2088:23;2084:32;2081:52;;;2129:1;2126;2119:12;2081:52;-1:-1:-1;2152:23:14;;2001:180;-1:-1:-1;2001:180:14:o;2417:254::-;2485:6;2493;2546:2;2534:9;2525:7;2521:23;2517:32;2514:52;;;2562:1;2559;2552:12;2514:52;2585:29;2604:9;2585:29;:::i;:::-;2575:39;2661:2;2646:18;;;;2633:32;;-1:-1:-1;;;2417:254:14:o;2858:328::-;2935:6;2943;2951;3004:2;2992:9;2983:7;2979:23;2975:32;2972:52;;;3020:1;3017;3010:12;2972:52;3043:29;3062:9;3043:29;:::i;:::-;3033:39;;3091:38;3125:2;3114:9;3110:18;3091:38;:::i;:::-;3081:48;;3176:2;3165:9;3161:18;3148:32;3138:42;;2858:328;;;;;:::o;3191:186::-;3250:6;3303:2;3291:9;3282:7;3278:23;3274:32;3271:52;;;3319:1;3316;3309:12;3271:52;3342:29;3361:9;3342:29;:::i;3382:248::-;3450:6;3458;3511:2;3499:9;3490:7;3486:23;3482:32;3479:52;;;3527:1;3524;3517:12;3479:52;-1:-1:-1;;3550:23:14;;;3620:2;3605:18;;;3592:32;;-1:-1:-1;3382:248:14:o;3937:184::-;3989:77;3986:1;3979:88;4086:4;4083:1;4076:15;4110:4;4107:1;4100:15;4126:981;4195:6;4248:2;4236:9;4227:7;4223:23;4219:32;4216:52;;;4264:1;4261;4254:12;4216:52;4304:9;4291:23;4333:18;4374:2;4366:6;4363:14;4360:34;;;4390:1;4387;4380:12;4360:34;4428:6;4417:9;4413:22;4403:32;;4473:7;4466:4;4462:2;4458:13;4454:27;4444:55;;4495:1;4492;4485:12;4444:55;4531:2;4518:16;4553:2;4549;4546:10;4543:36;;;4559:18;;:::i;:::-;4693:2;4687:9;4755:4;4747:13;;4598:66;4743:22;;;4767:2;4739:31;4735:40;4723:53;;;4791:18;;;4811:22;;;4788:46;4785:72;;;4837:18;;:::i;:::-;4877:10;4873:2;4866:22;4912:2;4904:6;4897:18;4952:7;4947:2;4942;4938;4934:11;4930:20;4927:33;4924:53;;;4973:1;4970;4963:12;4924:53;5029:2;5024;5020;5016:11;5011:2;5003:6;4999:15;4986:46;5074:1;5052:15;;;5069:2;5048:24;5041:35;;;;-1:-1:-1;5056:6:14;4126:981;-1:-1:-1;;;;;4126:981:14:o;5374:326::-;5450:6;5458;5466;5519:2;5507:9;5498:7;5494:23;5490:32;5487:52;;;5535:1;5532;5525:12;5487:52;5571:9;5558:23;5548:33;;5600:38;5634:2;5623:9;5619:18;5600:38;:::i;:::-;5590:48;;5657:37;5690:2;5679:9;5675:18;5657:37;:::i;:::-;5647:47;;5374:326;;;;;:::o;5705:615::-;5791:6;5799;5852:2;5840:9;5831:7;5827:23;5823:32;5820:52;;;5868:1;5865;5858:12;5820:52;5908:9;5895:23;5937:18;5978:2;5970:6;5967:14;5964:34;;;5994:1;5991;5984:12;5964:34;6032:6;6021:9;6017:22;6007:32;;6077:7;6070:4;6066:2;6062:13;6058:27;6048:55;;6099:1;6096;6089:12;6048:55;6139:2;6126:16;6165:2;6157:6;6154:14;6151:34;;;6181:1;6178;6171:12;6151:34;6234:7;6229:2;6219:6;6216:1;6212:14;6208:2;6204:23;6200:32;6197:45;6194:65;;;6255:1;6252;6245:12;6194:65;6286:2;6278:11;;;;;6308:6;;-1:-1:-1;5705:615:14;;-1:-1:-1;;;;5705:615:14:o;6325:118::-;6411:5;6404:13;6397:21;6390:5;6387:32;6377:60;;6433:1;6430;6423:12;6448:315;6513:6;6521;6574:2;6562:9;6553:7;6549:23;6545:32;6542:52;;;6590:1;6587;6580:12;6542:52;6613:29;6632:9;6613:29;:::i;:::-;6603:39;;6692:2;6681:9;6677:18;6664:32;6705:28;6727:5;6705:28;:::i;:::-;6752:5;6742:15;;;6448:315;;;;;:::o;6768:808::-;6865:6;6873;6881;6889;6897;6950:3;6938:9;6929:7;6925:23;6921:33;6918:53;;;6967:1;6964;6957:12;6918:53;6990:29;7009:9;6990:29;:::i;:::-;6980:39;;7038:38;7072:2;7061:9;7057:18;7038:38;:::i;:::-;7028:48;;7123:2;7112:9;7108:18;7095:32;7085:42;;7178:2;7167:9;7163:18;7150:32;7201:18;7242:2;7234:6;7231:14;7228:34;;;7258:1;7255;7248:12;7228:34;7296:6;7285:9;7281:22;7271:32;;7341:7;7334:4;7330:2;7326:13;7322:27;7312:55;;7363:1;7360;7353:12;7312:55;7403:2;7390:16;7429:2;7421:6;7418:14;7415:34;;;7445:1;7442;7435:12;7415:34;7490:7;7485:2;7476:6;7472:2;7468:15;7464:24;7461:37;7458:57;;;7511:1;7508;7501:12;7458:57;6768:808;;;;-1:-1:-1;6768:808:14;;-1:-1:-1;7542:2:14;7534:11;;7564:6;6768:808;-1:-1:-1;;;6768:808:14:o;7581:260::-;7649:6;7657;7710:2;7698:9;7689:7;7685:23;7681:32;7678:52;;;7726:1;7723;7716:12;7678:52;7749:29;7768:9;7749:29;:::i;:::-;7739:39;;7797:38;7831:2;7820:9;7816:18;7797:38;:::i;7846:241::-;7902:6;7955:2;7943:9;7934:7;7930:23;7926:32;7923:52;;;7971:1;7968;7961:12;7923:52;8010:9;7997:23;8029:28;8051:5;8029:28;:::i;8092:437::-;8171:1;8167:12;;;;8214;;;8235:61;;8289:4;8281:6;8277:17;8267:27;;8235:61;8342:2;8334:6;8331:14;8311:18;8308:38;8305:218;;8379:77;8376:1;8369:88;8480:4;8477:1;8470:15;8508:4;8505:1;8498:15;8305:218;;8092:437;;;:::o;8534:184::-;8586:77;8583:1;8576:88;8683:4;8680:1;8673:15;8707:4;8704:1;8697:15;8723:168;8796:9;;;8827;;8844:15;;;8838:22;;8824:37;8814:71;;8865:18;;:::i;8896:184::-;8948:77;8945:1;8938:88;9045:4;9042:1;9035:15;9069:4;9066:1;9059:15;9085:120;9125:1;9151;9141:35;;9156:18;;:::i;:::-;-1:-1:-1;9190:9:14;;9085:120::o;9336:545::-;9438:2;9433:3;9430:11;9427:448;;;9474:1;9499:5;9495:2;9488:17;9544:4;9540:2;9530:19;9614:2;9602:10;9598:19;9595:1;9591:27;9585:4;9581:38;9650:4;9638:10;9635:20;9632:47;;;-1:-1:-1;9673:4:14;9632:47;9728:2;9723:3;9719:12;9716:1;9712:20;9706:4;9702:31;9692:41;;9783:82;9801:2;9794:5;9791:13;9783:82;;;9846:17;;;9827:1;9816:13;9783:82;;10117:1471;10243:3;10237:10;10270:18;10262:6;10259:30;10256:56;;;10292:18;;:::i;:::-;10321:97;10411:6;10371:38;10403:4;10397:11;10371:38;:::i;:::-;10365:4;10321:97;:::i;:::-;10473:4;;10537:2;10526:14;;10554:1;10549:782;;;;11375:1;11392:6;11389:89;;;-1:-1:-1;11444:19:14;;;11438:26;11389:89;10023:66;10014:1;10010:11;;;10006:84;10002:89;9992:100;10098:1;10094:11;;;9989:117;11491:81;;10519:1063;;10549:782;9283:1;9276:14;;;9320:4;9307:18;;10597:66;10585:79;;;10762:236;10776:7;10773:1;10770:14;10762:236;;;10865:19;;;10859:26;10844:42;;10957:27;;;;10925:1;10913:14;;;;10792:19;;10762:236;;;10766:3;11026:6;11017:7;11014:19;11011:261;;;11087:19;;;11081:26;11188:66;11170:1;11166:14;;;11182:3;11162:24;11158:97;11154:102;11139:118;11124:134;;11011:261;-1:-1:-1;;;;;11318:1:14;11302:14;;;11298:22;11285:36;;-1:-1:-1;10117:1471:14:o;11932:184::-;11984:77;11981:1;11974:88;12081:4;12078:1;12071:15;12105:4;12102:1;12095:15;12121:125;12186:9;;;12207:10;;;12204:36;;;12220:18;;:::i;12592:1078::-;12768:3;12797:1;12830:6;12824:13;12860:36;12886:9;12860:36;:::i;:::-;12915:1;12932:18;;;12959:191;;;;13164:1;13159:356;;;;12925:590;;12959:191;13007:66;12996:9;12992:82;12987:3;12980:95;13130:6;13123:14;13116:22;13108:6;13104:35;13099:3;13095:45;13088:52;;12959:191;;13159:356;13190:6;13187:1;13180:17;13220:4;13265:2;13262:1;13252:16;13290:1;13304:165;13318:6;13315:1;13312:13;13304:165;;;13396:14;;13383:11;;;13376:35;13439:16;;;;13333:10;;13304:165;;;13308:3;;;13498:6;13493:3;13489:16;13482:23;;12925:590;;;;;13546:6;13540:13;13562:68;13621:8;13616:3;13609:4;13601:6;13597:17;13562:68;:::i;:::-;13646:18;;12592:1078;-1:-1:-1;;;;12592:1078:14:o;14772:245::-;14839:6;14892:2;14880:9;14871:7;14867:23;14863:32;14860:52;;;14908:1;14905;14898:12;14860:52;14940:9;14934:16;14959:28;14981:5;14959:28;:::i;16633:249::-;16702:6;16755:2;16743:9;16734:7;16730:23;16726:32;16723:52;;;16771:1;16768;16761:12;16723:52;16803:9;16797:16;16822:30;16846:5;16822:30;:::i;17931:744::-;18135:4;-1:-1:-1;;;;;18245:2:14;18237:6;18233:15;18222:9;18215:34;18297:2;18289:6;18285:15;18280:2;18269:9;18265:18;18258:43;;18337:6;18332:2;18321:9;18317:18;18310:34;18380:3;18375:2;18364:9;18360:18;18353:31;18421:6;18415:3;18404:9;18400:19;18393:35;18479:6;18471;18465:3;18454:9;18450:19;18437:49;18536:1;18530:3;18521:6;18510:9;18506:22;18502:32;18495:43;18665:3;18595:66;18590:2;18582:6;18578:15;18574:88;18563:9;18559:104;18555:114;18547:122;;17931:744;;;;;;;;:::o;18680:195::-;18719:3;18750:66;18743:5;18740:77;18737:103;;18820:18;;:::i;:::-;-1:-1:-1;18867:1:14;18856:13;;18680:195::o;18880:128::-;18947:9;;;18968:11;;;18965:37;;;18982:18;;:::i;19013:112::-;19045:1;19071;19061:35;;19076:18;;:::i;:::-;-1:-1:-1;19110:9:14;;19013:112::o

Swarm Source

none
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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