ETH Price: $2,605.51 (-0.61%)

Token

Dream Hollywood (DREAM)
 

Overview

Max Total Supply

63 DREAM

Holders

33

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
drpawn.eth
Balance
1 DREAM
0xa33a70fabfeb361fe891c208b1c27ec0b64babeb
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:
DreamNFT

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 10: Dream.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.16;

import "./ReentrancyGuard.sol";
import "./MerkleProof.sol";
import "./Strings.sol";
import "./Delegated.sol";
import "./ERC721A.sol";



contract DreamNFT is Delegated, ReentrancyGuard, ERC721A {

  using Strings for uint256;
  uint256 public immutable maxSupply = 400;
  uint256 public personalCap = 10;
  string public baseURI;
  string public uriSuffix = ".json";
  bytes32 public merkleRoot;
  uint256 public mintPrice = 20000000000000000;
  uint256 public exclusivePrice = 10000000000000000;
  uint256 public whitelistSold;
  bool public isPresaleActive;
  bool public isPublicSaleActive;
  address public registry = 0x04C626E451f8977303c340721b764c27d21E65DE;
  

  mapping(address => uint256) public whitelistAccountAmounts;
  event BaseURI(string baseUri);


  constructor()
    Delegated()
    ERC721A("Dream Hollywood", "DREAM") {
  }


  function setBaseURI(string calldata _baseUri) external onlyOwner onlyDelegates {
    baseURI = _baseUri;
    emit BaseURI(_baseUri);
  }


  function _baseURI() internal view override returns (string memory) {
    return baseURI;
  }
  

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId), "Token doesn't exist");
        return string(abi.encodePacked(baseURI, _tokenId.toString(), uriSuffix));
  }


  function setMerkleRoot(bytes32 root) external onlyOwner {
    merkleRoot = root;
  } 


  function setPersonalCap(uint256 _personalCap) public onlyOwner onlyDelegates {
    personalCap = _personalCap;
  }


  function setMintPrice(uint256 _mintPrice) external onlyOwner onlyDelegates {
    mintPrice = _mintPrice;
  }

  
  function setExclusivePrice(uint256 _exclusivePrice) external onlyOwner onlyDelegates {
    exclusivePrice = _exclusivePrice;
  }

  function setSaleConfig( bool presaleState, bool publicState ) external onlyOwner onlyDelegates{
    isPresaleActive = presaleState;
    isPublicSaleActive = publicState;
  }


  function isWhitelisted(
    address account,
    bytes32[] memory proof
  ) public view returns (bool) {
    return
      MerkleProof.verify(
        proof,
        merkleRoot,
        keccak256(abi.encodePacked(keccak256(abi.encodePacked(account))))
      );
  }


 function mint(uint256 qty) external payable {
    require(isPublicSaleActive, "public auction not started yet");
    require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints");
    require(totalSupply() + qty <= maxSupply, "max supply");
    require(msg.value == qty * mintPrice, "wrong amount");
  

    _safeMint(_msgSender(), qty);
  }


  function exclusiveMint (bytes32[] memory proof, uint256 qty) external payable {
    require(isWhitelisted(_msgSender(), proof), "not whitelisted");
    require(isPresaleActive, "Exclusive Mint not started yet");
    require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints");
    require(totalSupply() + qty <= maxSupply, "max supply");
    require(msg.value == qty * exclusivePrice, "wrong amount");


    whitelistSold += qty;
    whitelistAccountAmounts[_msgSender()] += qty;
    _safeMint(_msgSender(), qty);

  }


  function crossmint(address _to, uint256 qty) public payable nonReentrant {
    require(isPublicSaleActive, "public auction not started yet");
    require(msg.value == qty * mintPrice, "wrong amount");
    require(_numberMinted(_msgSender()) + qty <= personalCap, "too many mints");
    require(totalSupply() + qty <= maxSupply, "max supply");
    require(msg.sender == 0xdAb1a1854214684acE522439684a145E62505233,
      "This function is for Crossmint only."
    );
    _safeMint(_to, qty);
  }


  function setFailSafeRegistry(address _registry) external onlyOwner onlyDelegates {
    registry = _registry;
  }


  function withdraw() external onlyOwner onlyDelegates {
    (bool hs, ) = payable(0x5BbF11F39fBA82783cb1455e93C41Eee01fBdaeC).call{value: address(this).balance *20 / 100}("");
    require(hs, "Transfer failed");

    (bool success, ) = payable(registry).call{value: address(this).balance}("");
    require(success, "transfer failed");
  }


  function airdrop(uint256[] calldata qty, address[] calldata recipients) external payable onlyDelegates{
    require(qty.length == recipients.length, "arguments must have equal counts"); 
    uint256 total = 0;
    for( uint256 i = 0; i < qty.length; ++i ){
      total += qty[i];
    }
    require(totalSupply() + total <= maxSupply, "max supply");
    for( uint256 i = 0; i < qty.length; ++i ){
      _safeMint(recipients[i], qty[i]);

    }
  }



  function rescue( uint256 tokenId, address recipient ) external onlyOwner{
    _tokenApprovals[tokenId] = TokenApprovalRef(owner());
    address from = ownerOf( tokenId );
    transferFrom( from, recipient, tokenId );

  }

}



File 1 of 10: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 2 of 10: Delegated.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.16;

import "./Ownable.sol";

contract Delegated is Ownable{
  mapping(address => bool) internal _delegates;

  modifier onlyDelegates {
    require(_delegates[msg.sender], "Invalid delegate" );
    _;
  }

  constructor()
    Ownable(){
    setDelegate( owner(), true );
  }

  //onlyOwner
  function isDelegate( address addr ) external view onlyOwner returns( bool ){
    return _delegates[addr];
  }

  function setDelegate( address addr, bool isDelegate_ ) public onlyOwner{
    _delegates[addr] = isDelegate_;
  }

  function transferOwnership(address newOwner) public virtual override onlyOwner {
    _delegates[newOwner] = true;
    super.transferOwnership( newOwner );
  }
}

File 4 of 10: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

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

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

    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

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

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

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

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

File 5 of 10: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // ==============================
    //            IERC165
    // ==============================

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

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 10: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

File 7 of 10: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 8 of 10: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

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

File 9 of 10: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

pragma solidity ^0.8.0;

import "./Math.sol";

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _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) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseUri","type":"string"}],"name":"BaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"qty","type":"uint256[]"},{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"crossmint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"exclusiveMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"exclusivePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isDelegate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"personalCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"registry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"isDelegate_","type":"bool"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_exclusivePrice","type":"uint256"}],"name":"setExclusivePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registry","type":"address"}],"name":"setFailSafeRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"root","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_personalCap","type":"uint256"}],"name":"setPersonalCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleState","type":"bool"},{"internalType":"bool","name":"publicState","type":"bool"}],"name":"setSaleConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAccountAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a0604052610190608090815250600a600b556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90816200005891906200063e565b5066470de4df820000600f55662386f26fc100006010557304c626e451f8977303c340721b764c27d21e65de601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000d157600080fd5b506040518060400160405280600f81526020017f447265616d20486f6c6c79776f6f6400000000000000000000000000000000008152506040518060400160405280600581526020017f445245414d0000000000000000000000000000000000000000000000000000008152506200015e62000152620001ca60201b60201c565b620001d260201b60201c565b62000180620001726200029660201b60201c565b6001620002bf60201b60201c565b600160028190555081600590816200019991906200063e565b508060069081620001ab91906200063e565b50620001bc6200032a60201b60201c565b6003819055505050620007a8565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620002cf6200033360201b60201c565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006001905090565b62000343620001ca60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003696200029660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003c2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003b99062000786565b60405180910390fd5b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044657607f821691505b6020821081036200045c576200045b620003fe565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004c67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000487565b620004d2868362000487565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200051f620005196200051384620004ea565b620004f4565b620004ea565b9050919050565b6000819050919050565b6200053b83620004fe565b620005536200054a8262000526565b84845462000494565b825550505050565b600090565b6200056a6200055b565b6200057781848462000530565b505050565b5b818110156200059f576200059360008262000560565b6001810190506200057d565b5050565b601f821115620005ee57620005b88162000462565b620005c38462000477565b81016020851015620005d3578190505b620005eb620005e28562000477565b8301826200057c565b50505b505050565b600082821c905092915050565b60006200061360001984600802620005f3565b1980831691505092915050565b60006200062e838362000600565b9150826002028217905092915050565b6200064982620003c4565b67ffffffffffffffff811115620006655762000664620003cf565b5b6200067182546200042d565b6200067e828285620005a3565b600060209050601f831160018114620006b65760008415620006a1578287015190505b620006ad858262000620565b8655506200071d565b601f198416620006c68662000462565b60005b82811015620006f057848901518255600182019150602085019450602081019050620006c9565b868310156200071057848901516200070c601f89168262000600565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200076e60208362000725565b91506200077b8262000736565b602082019050919050565b60006020820190508181036000830152620007a1816200075f565b9050919050565b608051614b52620007e0600039600081816116940152818161194501528181611e220152818161235c01526125300152614b526000f3fe6080604052600436106102725760003560e01c806370a082311161014f578063a923625c116100c1578063d5abeb011161007a578063d5abeb0114610918578063e78b9d0b14610943578063e985e9c51461096e578063f2fde38b146109ab578063f4a0a528146109d4578063f760f228146109fd57610272565b8063a923625c14610819578063b88d4fde14610842578063bfb396971461086b578063c24144d814610894578063c7c2aee3146108b0578063c87b56dd146108db57610272565b80638da5cb5b116101135780638da5cb5b1461072a57806391d6fc2814610755578063936762701461077e57806395d89b41146107a9578063a0712d68146107d4578063a22cb465146107f057610272565b806370a0823114610645578063715018a6146106825780637b103999146106995780637cb64759146106c457806385a8c937146106ed57610272565b806342842e0e116101e85780635a23dd99116101ac5780635a23dd991461052e57806360d938dc1461056b5780636352211e146105965780636673c4c2146105d35780636817c76c146105ef5780636c0360eb1461061a57610272565b806342842e0e1461046c5780634a994eef146104955780635503a0e8146104be57806355f804b3146104e957806358891a371461051257610272565b8063095ea7b31161023a578063095ea7b31461038257806318160ddd146103ab5780631e84c413146103d657806323b872dd146104015780632eb4a7ab1461042a5780633ccfd60b1461045557610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c57806308ea29ad14610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613348565b610a26565b6040516102ab9190613390565b60405180910390f35b3480156102c057600080fd5b506102c9610ab8565b6040516102d6919061343b565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906134bb565b610b4a565b6040516103139190613390565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061351e565b610ba8565b604051610350919061355a565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b919061351e565b610c27565b005b34801561038e57600080fd5b506103a960048036038101906103a49190613575565b610cc5565b005b3480156103b757600080fd5b506103c0610e09565b6040516103cd91906135c4565b60405180910390f35b3480156103e257600080fd5b506103eb610e20565b6040516103f89190613390565b60405180910390f35b34801561040d57600080fd5b50610428600480360381019061042391906135df565b610e33565b005b34801561043657600080fd5b5061043f611155565b60405161044c919061364b565b60405180910390f35b34801561046157600080fd5b5061046a61115b565b005b34801561047857600080fd5b50610493600480360381019061048e91906135df565b611399565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613692565b6113b9565b005b3480156104ca57600080fd5b506104d361141c565b6040516104e0919061343b565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613737565b6114aa565b005b61052c60048036038101906105279190613575565b61158d565b005b34801561053a57600080fd5b50610555600480360381019061055091906138ee565b61179f565b6040516105629190613390565b60405180910390f35b34801561057757600080fd5b50610580611802565b60405161058d9190613390565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b8919061351e565b611815565b6040516105ca919061355a565b60405180910390f35b6105ed60048036038101906105e891906139f6565b611827565b005b3480156105fb57600080fd5b50610604611a29565b60405161061191906135c4565b60405180910390f35b34801561062657600080fd5b5061062f611a2f565b60405161063c919061343b565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906134bb565b611abd565b60405161067991906135c4565b60405180910390f35b34801561068e57600080fd5b50610697611b75565b005b3480156106a557600080fd5b506106ae611b89565b6040516106bb919061355a565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190613a77565b611baf565b005b3480156106f957600080fd5b50610714600480360381019061070f91906134bb565b611bc1565b60405161072191906135c4565b60405180910390f35b34801561073657600080fd5b5061073f611bd9565b60405161074c919061355a565b60405180910390f35b34801561076157600080fd5b5061077c600480360381019061077791906134bb565b611c02565b005b34801561078a57600080fd5b50610793611cda565b6040516107a091906135c4565b60405180910390f35b3480156107b557600080fd5b506107be611ce0565b6040516107cb919061343b565b60405180910390f35b6107ee60048036038101906107e9919061351e565b611d72565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613692565b611ef8565b005b34801561082557600080fd5b50610840600480360381019061083b9190613aa4565b61206f565b005b34801561084e57600080fd5b5061086960048036038101906108649190613b99565b61211d565b005b34801561087757600080fd5b50610892600480360381019061088d9190613c1c565b612190565b005b6108ae60048036038101906108a99190613c5c565b61225c565b005b3480156108bc57600080fd5b506108c56124a9565b6040516108d291906135c4565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd919061351e565b6124af565b60405161090f919061343b565b60405180910390f35b34801561092457600080fd5b5061092d61252e565b60405161093a91906135c4565b60405180910390f35b34801561094f57600080fd5b50610958612552565b60405161096591906135c4565b60405180910390f35b34801561097a57600080fd5b5061099560048036038101906109909190613cb8565b612558565b6040516109a29190613390565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134bb565b6125ec565b005b3480156109e057600080fd5b506109fb60048036038101906109f6919061351e565b612657565b005b348015610a0957600080fd5b50610a246004803603810190610a1f919061351e565b6126f5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac790613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390613d27565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b6000610b54612793565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb382612811565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c2f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613da4565b60405180910390fd5b8060108190555050565b6000610cd082611815565b90508073ffffffffffffffffffffffffffffffffffffffff16610cf1612870565b73ffffffffffffffffffffffffffffffffffffffff1614610d5457610d1d81610d18612870565b612558565b610d53576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e13612878565b6004546003540303905090565b601260019054906101000a900460ff1681565b6000610e3e82612881565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eb18461294d565b91509150610ec78187610ec2612870565b612974565b610f1357610edc86610ed7612870565b612558565b610f12576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f79576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8686868660016129b8565b8015610f9157600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061105f8561103b8888876129be565b7c0200000000000000000000000000000000000000000000000000000000176129e6565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110e557600060018501905060006007600083815260200190815260200160002054036110e35760035481146110e2578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461114d8686866001612a11565b505050505050565b600e5481565b611163612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613da4565b60405180910390fd5b6000735bbf11f39fba82783cb1455e93c41eee01fbdaec73ffffffffffffffffffffffffffffffffffffffff16606460144761122b9190613df3565b6112359190613e7c565b60405161124190613ede565b60006040518083038185875af1925050503d806000811461127e576040519150601f19603f3d011682016040523d82523d6000602084013e611283565b606091505b50509050806112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90613f3f565b60405180910390fd5b6000601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161130f90613ede565b60006040518083038185875af1925050503d806000811461134c576040519150601f19603f3d011682016040523d82523d6000602084013e611351565b606091505b5050905080611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613fab565b60405180910390fd5b5050565b6113b48383836040518060200160405280600081525061211d565b505050565b6113c1612793565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d805461142990613d27565b80601f016020809104026020016040519081016040528092919081815260200182805461145590613d27565b80156114a25780601f10611477576101008083540402835291602001916114a2565b820191906000526020600020905b81548152906001019060200180831161148557829003601f168201915b505050505081565b6114b2612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613da4565b60405180910390fd5b8181600c918261154f929190614182565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161158192919061427f565b60405180910390a15050565b611595612a17565b601260019054906101000a900460ff166115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906142ef565b60405180910390fd5b600f54816115f29190613df3565b3414611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a9061435b565b60405180910390fd5b600b5481611647611642612a64565b612a6c565b611651919061437b565b1115611692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611689906143fb565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816116bc610e09565b6116c6919061437b565b1115611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614467565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906144f9565b60405180910390fd5b6117938282612ac3565b61179b612ae1565b5050565b60006117fa82600e54856040516020016117b99190614561565b604051602081830303815290604052805190602001206040516020016117df919061459d565b60405160208183030381529060405280519060200120612aeb565b905092915050565b601260009054906101000a900460ff1681565b600061182082612881565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90613da4565b60405180910390fd5b8181905084849050146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290614604565b60405180910390fd5b6000805b858590508110156119425785858281811061191d5761191c614624565b5b905060200201358261192f919061437b565b91508061193b90614653565b90506118ff565b507f00000000000000000000000000000000000000000000000000000000000000008161196d610e09565b611977919061437b565b11156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614467565b60405180910390fd5b60005b85859050811015611a2157611a108484838181106119dc576119db614624565b5b90506020020160208101906119f191906134bb565b878784818110611a0457611a03614624565b5b90506020020135612ac3565b80611a1a90614653565b90506119bb565b505050505050565b600f5481565b600c8054611a3c90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6890613d27565b8015611ab55780601f10611a8a57610100808354040283529160200191611ab5565b820191906000526020600020905b815481529060010190602001808311611a9857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b24576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b7d612793565b611b876000612b02565b565b601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bb7612793565b80600e8190555050565b60136020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c0a612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90613da4565b60405180910390fd5b80601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b606060068054611cef90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1b90613d27565b8015611d685780601f10611d3d57610100808354040283529160200191611d68565b820191906000526020600020905b815481529060010190602001808311611d4b57829003601f168201915b5050505050905090565b601260019054906101000a900460ff16611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db8906142ef565b60405180910390fd5b600b5481611dd5611dd0612a64565b612a6c565b611ddf919061437b565b1115611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e17906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081611e4a610e09565b611e54919061437b565b1115611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614467565b60405180910390fd5b600f5481611ea39190613df3565b3414611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061435b565b60405180910390fd5b611ef5611eef612a64565b82612ac3565b50565b611f00612870565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f71612870565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201e612870565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120639190613390565b60405180910390a35050565b612077612793565b604051806020016040528061208a611bd9565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600061210b83611815565b9050612118818385610e33565b505050565b612128848484610e33565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461218a5761215384848484612bc6565b612189576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612198612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90613da4565b60405180910390fd5b81601260006101000a81548160ff02191690831515021790555080601260016101000a81548160ff0219169083151502179055505050565b61226d612267612a64565b8361179f565b6122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a3906146e7565b60405180910390fd5b601260009054906101000a900460ff166122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614753565b60405180910390fd5b600b548161230f61230a612a64565b612a6c565b612319919061437b565b111561235a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612351906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081612384610e09565b61238e919061437b565b11156123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690614467565b60405180910390fd5b601054816123dd9190613df3565b341461241e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124159061435b565b60405180910390fd5b8060116000828254612430919061437b565b925050819055508060136000612444612a64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248d919061437b565b925050819055506124a561249f612a64565b82612ac3565b5050565b600b5481565b60606124ba82612811565b6124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906147bf565b60405180910390fd5b600c61250483612d16565b600d6040516020016125189392919061489e565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60115481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f4612793565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061265481612de4565b50565b61265f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290613da4565b60405180910390fd5b80600f8190555050565b6126fd612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278090613da4565b60405180910390fd5b80600b8190555050565b61279b612a64565b73ffffffffffffffffffffffffffffffffffffffff166127b9611bd9565b73ffffffffffffffffffffffffffffffffffffffff161461280f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128069061491b565b60405180910390fd5b565b60008161281c612878565b1115801561282b575060035482105b8015612869575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612890612878565b11612916576003548110156129155760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612913575b600081036129095760076000836001900393508381526020019081526020016000205490506128df565b8092505050612948565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d5868684612e67565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002805403612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5290614987565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612add828260405180602001604052806000815250612e70565b5050565b6001600281905550565b600082612af88584612f0e565b1490509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bec612870565b8786866040518563ffffffff1660e01b8152600401612c0e94939291906149fc565b6020604051808303816000875af1925050508015612c4a57506040513d601f19601f82011682018060405250810190612c479190614a5d565b60015b612cc3573d8060008114612c7a576040519150601f19603f3d011682016040523d82523d6000602084013e612c7f565b606091505b506000815103612cbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612d2584612f64565b01905060008167ffffffffffffffff811115612d4457612d43613784565b5b6040519080825280601f01601f191660200182016040528015612d765781602001600182028036833780820191505090505b509050600082602001820190505b600115612dd9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dcd57612dcc613e4d565b5b04945060008503612d84575b819350505050919050565b612dec612793565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614afc565b60405180910390fd5b612e6481612b02565b50565b60009392505050565b612e7a83836130b7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f095760006003549050600083820390505b612ebb6000868380600101945086612bc6565b612ef1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ea8578160035414612f0657600080fd5b50505b505050565b60008082905060005b8451811015612f5957612f4482868381518110612f3757612f36614624565b5b602002602001015161328a565b91508080612f5190614653565b915050612f17565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fc2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fb857612fb7613e4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fff576d04ee2d6d415b85acef81000000008381612ff557612ff4613e4d565b5b0492506020810190505b662386f26fc10000831061302e57662386f26fc10000838161302457613023613e4d565b5b0492506010810190505b6305f5e1008310613057576305f5e100838161304d5761304c613e4d565b5b0492506008810190505b612710831061307c57612710838161307257613071613e4d565b5b0492506004810190505b6064831061309f576064838161309557613094613e4d565b5b0492506002810190505b600a83106130ae576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613124576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361315e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61316b60008483856129b8565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131e2836131d360008660006129be565b6131dc856132b5565b176129e6565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613206578060038190555050506132856000848385612a11565b505050565b60008183106132a25761329d82846132c5565b6132ad565b6132ac83836132c5565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613325816132f0565b811461333057600080fd5b50565b6000813590506133428161331c565b92915050565b60006020828403121561335e5761335d6132e6565b5b600061336c84828501613333565b91505092915050565b60008115159050919050565b61338a81613375565b82525050565b60006020820190506133a56000830184613381565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133e55780820151818401526020810190506133ca565b60008484015250505050565b6000601f19601f8301169050919050565b600061340d826133ab565b61341781856133b6565b93506134278185602086016133c7565b613430816133f1565b840191505092915050565b600060208201905081810360008301526134558184613402565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134888261345d565b9050919050565b6134988161347d565b81146134a357600080fd5b50565b6000813590506134b58161348f565b92915050565b6000602082840312156134d1576134d06132e6565b5b60006134df848285016134a6565b91505092915050565b6000819050919050565b6134fb816134e8565b811461350657600080fd5b50565b600081359050613518816134f2565b92915050565b600060208284031215613534576135336132e6565b5b600061354284828501613509565b91505092915050565b6135548161347d565b82525050565b600060208201905061356f600083018461354b565b92915050565b6000806040838503121561358c5761358b6132e6565b5b600061359a858286016134a6565b92505060206135ab85828601613509565b9150509250929050565b6135be816134e8565b82525050565b60006020820190506135d960008301846135b5565b92915050565b6000806000606084860312156135f8576135f76132e6565b5b6000613606868287016134a6565b9350506020613617868287016134a6565b925050604061362886828701613509565b9150509250925092565b6000819050919050565b61364581613632565b82525050565b6000602082019050613660600083018461363c565b92915050565b61366f81613375565b811461367a57600080fd5b50565b60008135905061368c81613666565b92915050565b600080604083850312156136a9576136a86132e6565b5b60006136b7858286016134a6565b92505060206136c88582860161367d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136f7576136f66136d2565b5b8235905067ffffffffffffffff811115613714576137136136d7565b5b6020830191508360018202830111156137305761372f6136dc565b5b9250929050565b6000806020838503121561374e5761374d6132e6565b5b600083013567ffffffffffffffff81111561376c5761376b6132eb565b5b613778858286016136e1565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137bc826133f1565b810181811067ffffffffffffffff821117156137db576137da613784565b5b80604052505050565b60006137ee6132dc565b90506137fa82826137b3565b919050565b600067ffffffffffffffff82111561381a57613819613784565b5b602082029050602081019050919050565b61383481613632565b811461383f57600080fd5b50565b6000813590506138518161382b565b92915050565b600061386a613865846137ff565b6137e4565b9050808382526020820190506020840283018581111561388d5761388c6136dc565b5b835b818110156138b657806138a28882613842565b84526020840193505060208101905061388f565b5050509392505050565b600082601f8301126138d5576138d46136d2565b5b81356138e5848260208601613857565b91505092915050565b60008060408385031215613905576139046132e6565b5b6000613913858286016134a6565b925050602083013567ffffffffffffffff811115613934576139336132eb565b5b613940858286016138c0565b9150509250929050565b60008083601f8401126139605761395f6136d2565b5b8235905067ffffffffffffffff81111561397d5761397c6136d7565b5b602083019150836020820283011115613999576139986136dc565b5b9250929050565b60008083601f8401126139b6576139b56136d2565b5b8235905067ffffffffffffffff8111156139d3576139d26136d7565b5b6020830191508360208202830111156139ef576139ee6136dc565b5b9250929050565b60008060008060408587031215613a1057613a0f6132e6565b5b600085013567ffffffffffffffff811115613a2e57613a2d6132eb565b5b613a3a8782880161394a565b9450945050602085013567ffffffffffffffff811115613a5d57613a5c6132eb565b5b613a69878288016139a0565b925092505092959194509250565b600060208284031215613a8d57613a8c6132e6565b5b6000613a9b84828501613842565b91505092915050565b60008060408385031215613abb57613aba6132e6565b5b6000613ac985828601613509565b9250506020613ada858286016134a6565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613b0457613b03613784565b5b613b0d826133f1565b9050602081019050919050565b82818337600083830152505050565b6000613b3c613b3784613ae9565b6137e4565b905082815260208101848484011115613b5857613b57613ae4565b5b613b63848285613b1a565b509392505050565b600082601f830112613b8057613b7f6136d2565b5b8135613b90848260208601613b29565b91505092915050565b60008060008060808587031215613bb357613bb26132e6565b5b6000613bc1878288016134a6565b9450506020613bd2878288016134a6565b9350506040613be387828801613509565b925050606085013567ffffffffffffffff811115613c0457613c036132eb565b5b613c1087828801613b6b565b91505092959194509250565b60008060408385031215613c3357613c326132e6565b5b6000613c418582860161367d565b9250506020613c528582860161367d565b9150509250929050565b60008060408385031215613c7357613c726132e6565b5b600083013567ffffffffffffffff811115613c9157613c906132eb565b5b613c9d858286016138c0565b9250506020613cae85828601613509565b9150509250929050565b60008060408385031215613ccf57613cce6132e6565b5b6000613cdd858286016134a6565b9250506020613cee858286016134a6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d3f57607f821691505b602082108103613d5257613d51613cf8565b5b50919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b6000613d8e6010836133b6565b9150613d9982613d58565b602082019050919050565b60006020820190508181036000830152613dbd81613d81565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dfe826134e8565b9150613e09836134e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4257613e41613dc4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e87826134e8565b9150613e92836134e8565b925082613ea257613ea1613e4d565b5b828204905092915050565b600081905092915050565b50565b6000613ec8600083613ead565b9150613ed382613eb8565b600082019050919050565b6000613ee982613ebb565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f29600f836133b6565b9150613f3482613ef3565b602082019050919050565b60006020820190508181036000830152613f5881613f1c565b9050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f95600f836133b6565b9150613fa082613f5f565b602082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ffb565b6140428683613ffb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061407f61407a614075846134e8565b61405a565b6134e8565b9050919050565b6000819050919050565b61409983614064565b6140ad6140a582614086565b848454614008565b825550505050565b600090565b6140c26140b5565b6140cd818484614090565b505050565b5b818110156140f1576140e66000826140ba565b6001810190506140d3565b5050565b601f8211156141365761410781613fd6565b61411084613feb565b8101602085101561411f578190505b61413361412b85613feb565b8301826140d2565b50505b505050565b600082821c905092915050565b60006141596000198460080261413b565b1980831691505092915050565b60006141728383614148565b9150826002028217905092915050565b61418c8383613fcb565b67ffffffffffffffff8111156141a5576141a4613784565b5b6141af8254613d27565b6141ba8282856140f5565b6000601f8311600181146141e957600084156141d7578287013590505b6141e18582614166565b865550614249565b601f1984166141f786613fd6565b60005b8281101561421f578489013582556001820191506020850194506020810190506141fa565b8683101561423c5784890135614238601f891682614148565b8355505b6001600288020188555050505b50505050505050565b600061425e83856133b6565b935061426b838584613b1a565b614274836133f1565b840190509392505050565b6000602082019050818103600083015261429a818486614252565b90509392505050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b60006142d9601e836133b6565b91506142e4826142a3565b602082019050919050565b60006020820190508181036000830152614308816142cc565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000614345600c836133b6565b91506143508261430f565b602082019050919050565b6000602082019050818103600083015261437481614338565b9050919050565b6000614386826134e8565b9150614391836134e8565b92508282019050808211156143a9576143a8613dc4565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b60006143e5600e836133b6565b91506143f0826143af565b602082019050919050565b60006020820190508181036000830152614414816143d8565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000614451600a836133b6565b915061445c8261441b565b602082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e36024836133b6565b91506144ee82614487565b604082019050919050565b60006020820190508181036000830152614512816144d6565b9050919050565b60008160601b9050919050565b600061453182614519565b9050919050565b600061454382614526565b9050919050565b61455b6145568261347d565b614538565b82525050565b600061456d828461454a565b60148201915081905092915050565b6000819050919050565b61459761459282613632565b61457c565b82525050565b60006145a98284614586565b60208201915081905092915050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b60006145ee6020836133b6565b91506145f9826145b8565b602082019050919050565b6000602082019050818103600083015261461d816145e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061465e826134e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146905761468f613dc4565b5b600182019050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006146d1600f836133b6565b91506146dc8261469b565b602082019050919050565b60006020820190508181036000830152614700816146c4565b9050919050565b7f4578636c7573697665204d696e74206e6f742073746172746564207965740000600082015250565b600061473d601e836133b6565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147a96013836133b6565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b600081905092915050565b600081546147f781613d27565b61480181866147df565b9450600182166000811461481c576001811461483157614864565b60ff1983168652811515820286019350614864565b61483a85613fd6565b60005b8381101561485c5781548189015260018201915060208101905061483d565b838801955050505b50505092915050565b6000614878826133ab565b61488281856147df565b93506148928185602086016133c7565b80840191505092915050565b60006148aa82866147ea565b91506148b6828561486d565b91506148c282846147ea565b9150819050949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149056020836133b6565b9150614910826148cf565b602082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614971601f836133b6565b915061497c8261493b565b602082019050919050565b600060208201905081810360008301526149a081614964565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149ce826149a7565b6149d881856149b2565b93506149e88185602086016133c7565b6149f1816133f1565b840191505092915050565b6000608082019050614a11600083018761354b565b614a1e602083018661354b565b614a2b60408301856135b5565b8181036060830152614a3d81846149c3565b905095945050505050565b600081519050614a578161331c565b92915050565b600060208284031215614a7357614a726132e6565b5b6000614a8184828501614a48565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ae66026836133b6565b9150614af182614a8a565b604082019050919050565b60006020820190508181036000830152614b1581614ad9565b905091905056fea264697066735822122060ff2734b3bbf6e9d9416d2a6458609955f8333132c46746db4944dc6a9528cd64736f6c63430008100033

Deployed Bytecode

0x6080604052600436106102725760003560e01c806370a082311161014f578063a923625c116100c1578063d5abeb011161007a578063d5abeb0114610918578063e78b9d0b14610943578063e985e9c51461096e578063f2fde38b146109ab578063f4a0a528146109d4578063f760f228146109fd57610272565b8063a923625c14610819578063b88d4fde14610842578063bfb396971461086b578063c24144d814610894578063c7c2aee3146108b0578063c87b56dd146108db57610272565b80638da5cb5b116101135780638da5cb5b1461072a57806391d6fc2814610755578063936762701461077e57806395d89b41146107a9578063a0712d68146107d4578063a22cb465146107f057610272565b806370a0823114610645578063715018a6146106825780637b103999146106995780637cb64759146106c457806385a8c937146106ed57610272565b806342842e0e116101e85780635a23dd99116101ac5780635a23dd991461052e57806360d938dc1461056b5780636352211e146105965780636673c4c2146105d35780636817c76c146105ef5780636c0360eb1461061a57610272565b806342842e0e1461046c5780634a994eef146104955780635503a0e8146104be57806355f804b3146104e957806358891a371461051257610272565b8063095ea7b31161023a578063095ea7b31461038257806318160ddd146103ab5780631e84c413146103d657806323b872dd146104015780632eb4a7ab1461042a5780633ccfd60b1461045557610272565b806301ffc9a71461027757806306fdde03146102b457806307779627146102df578063081812fc1461031c57806308ea29ad14610359575b600080fd5b34801561028357600080fd5b5061029e60048036038101906102999190613348565b610a26565b6040516102ab9190613390565b60405180910390f35b3480156102c057600080fd5b506102c9610ab8565b6040516102d6919061343b565b60405180910390f35b3480156102eb57600080fd5b50610306600480360381019061030191906134bb565b610b4a565b6040516103139190613390565b60405180910390f35b34801561032857600080fd5b50610343600480360381019061033e919061351e565b610ba8565b604051610350919061355a565b60405180910390f35b34801561036557600080fd5b50610380600480360381019061037b919061351e565b610c27565b005b34801561038e57600080fd5b506103a960048036038101906103a49190613575565b610cc5565b005b3480156103b757600080fd5b506103c0610e09565b6040516103cd91906135c4565b60405180910390f35b3480156103e257600080fd5b506103eb610e20565b6040516103f89190613390565b60405180910390f35b34801561040d57600080fd5b50610428600480360381019061042391906135df565b610e33565b005b34801561043657600080fd5b5061043f611155565b60405161044c919061364b565b60405180910390f35b34801561046157600080fd5b5061046a61115b565b005b34801561047857600080fd5b50610493600480360381019061048e91906135df565b611399565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190613692565b6113b9565b005b3480156104ca57600080fd5b506104d361141c565b6040516104e0919061343b565b60405180910390f35b3480156104f557600080fd5b50610510600480360381019061050b9190613737565b6114aa565b005b61052c60048036038101906105279190613575565b61158d565b005b34801561053a57600080fd5b50610555600480360381019061055091906138ee565b61179f565b6040516105629190613390565b60405180910390f35b34801561057757600080fd5b50610580611802565b60405161058d9190613390565b60405180910390f35b3480156105a257600080fd5b506105bd60048036038101906105b8919061351e565b611815565b6040516105ca919061355a565b60405180910390f35b6105ed60048036038101906105e891906139f6565b611827565b005b3480156105fb57600080fd5b50610604611a29565b60405161061191906135c4565b60405180910390f35b34801561062657600080fd5b5061062f611a2f565b60405161063c919061343b565b60405180910390f35b34801561065157600080fd5b5061066c600480360381019061066791906134bb565b611abd565b60405161067991906135c4565b60405180910390f35b34801561068e57600080fd5b50610697611b75565b005b3480156106a557600080fd5b506106ae611b89565b6040516106bb919061355a565b60405180910390f35b3480156106d057600080fd5b506106eb60048036038101906106e69190613a77565b611baf565b005b3480156106f957600080fd5b50610714600480360381019061070f91906134bb565b611bc1565b60405161072191906135c4565b60405180910390f35b34801561073657600080fd5b5061073f611bd9565b60405161074c919061355a565b60405180910390f35b34801561076157600080fd5b5061077c600480360381019061077791906134bb565b611c02565b005b34801561078a57600080fd5b50610793611cda565b6040516107a091906135c4565b60405180910390f35b3480156107b557600080fd5b506107be611ce0565b6040516107cb919061343b565b60405180910390f35b6107ee60048036038101906107e9919061351e565b611d72565b005b3480156107fc57600080fd5b5061081760048036038101906108129190613692565b611ef8565b005b34801561082557600080fd5b50610840600480360381019061083b9190613aa4565b61206f565b005b34801561084e57600080fd5b5061086960048036038101906108649190613b99565b61211d565b005b34801561087757600080fd5b50610892600480360381019061088d9190613c1c565b612190565b005b6108ae60048036038101906108a99190613c5c565b61225c565b005b3480156108bc57600080fd5b506108c56124a9565b6040516108d291906135c4565b60405180910390f35b3480156108e757600080fd5b5061090260048036038101906108fd919061351e565b6124af565b60405161090f919061343b565b60405180910390f35b34801561092457600080fd5b5061092d61252e565b60405161093a91906135c4565b60405180910390f35b34801561094f57600080fd5b50610958612552565b60405161096591906135c4565b60405180910390f35b34801561097a57600080fd5b5061099560048036038101906109909190613cb8565b612558565b6040516109a29190613390565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd91906134bb565b6125ec565b005b3480156109e057600080fd5b506109fb60048036038101906109f6919061351e565b612657565b005b348015610a0957600080fd5b50610a246004803603810190610a1f919061351e565b6126f5565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a8157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab15750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060058054610ac790613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054610af390613d27565b8015610b405780601f10610b1557610100808354040283529160200191610b40565b820191906000526020600020905b815481529060010190602001808311610b2357829003601f168201915b5050505050905090565b6000610b54612793565b600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000610bb382612811565b610be9576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c2f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb290613da4565b60405180910390fd5b8060108190555050565b6000610cd082611815565b90508073ffffffffffffffffffffffffffffffffffffffff16610cf1612870565b73ffffffffffffffffffffffffffffffffffffffff1614610d5457610d1d81610d18612870565b612558565b610d53576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826009600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610e13612878565b6004546003540303905090565b601260019054906101000a900460ff1681565b6000610e3e82612881565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610eb18461294d565b91509150610ec78187610ec2612870565b612974565b610f1357610edc86610ed7612870565b612558565b610f12576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610f79576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f8686868660016129b8565b8015610f9157600082555b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061105f8561103b8888876129be565b7c0200000000000000000000000000000000000000000000000000000000176129e6565b600760008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036110e557600060018501905060006007600083815260200190815260200160002054036110e35760035481146110e2578360076000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461114d8686866001612a11565b505050505050565b600e5481565b611163612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613da4565b60405180910390fd5b6000735bbf11f39fba82783cb1455e93c41eee01fbdaec73ffffffffffffffffffffffffffffffffffffffff16606460144761122b9190613df3565b6112359190613e7c565b60405161124190613ede565b60006040518083038185875af1925050503d806000811461127e576040519150601f19603f3d011682016040523d82523d6000602084013e611283565b606091505b50509050806112c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112be90613f3f565b60405180910390fd5b6000601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161130f90613ede565b60006040518083038185875af1925050503d806000811461134c576040519150601f19603f3d011682016040523d82523d6000602084013e611351565b606091505b5050905080611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613fab565b60405180910390fd5b5050565b6113b48383836040518060200160405280600081525061211d565b505050565b6113c1612793565b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600d805461142990613d27565b80601f016020809104026020016040519081016040528092919081815260200182805461145590613d27565b80156114a25780601f10611477576101008083540402835291602001916114a2565b820191906000526020600020905b81548152906001019060200180831161148557829003601f168201915b505050505081565b6114b2612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661153e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153590613da4565b60405180910390fd5b8181600c918261154f929190614182565b507f01e56a02aca7f26a28165a040851ba78f30282b55ca81c63a804cdc1e2dcea72828260405161158192919061427f565b60405180910390a15050565b611595612a17565b601260019054906101000a900460ff166115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db906142ef565b60405180910390fd5b600f54816115f29190613df3565b3414611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a9061435b565b60405180910390fd5b600b5481611647611642612a64565b612a6c565b611651919061437b565b1115611692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611689906143fb565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000190816116bc610e09565b6116c6919061437b565b1115611707576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fe90614467565b60405180910390fd5b73dab1a1854214684ace522439684a145e6250523373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906144f9565b60405180910390fd5b6117938282612ac3565b61179b612ae1565b5050565b60006117fa82600e54856040516020016117b99190614561565b604051602081830303815290604052805190602001206040516020016117df919061459d565b60405160208183030381529060405280519060200120612aeb565b905092915050565b601260009054906101000a900460ff1681565b600061182082612881565b9050919050565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa90613da4565b60405180910390fd5b8181905084849050146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290614604565b60405180910390fd5b6000805b858590508110156119425785858281811061191d5761191c614624565b5b905060200201358261192f919061437b565b91508061193b90614653565b90506118ff565b507f00000000000000000000000000000000000000000000000000000000000001908161196d610e09565b611977919061437b565b11156119b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119af90614467565b60405180910390fd5b60005b85859050811015611a2157611a108484838181106119dc576119db614624565b5b90506020020160208101906119f191906134bb565b878784818110611a0457611a03614624565b5b90506020020135612ac3565b80611a1a90614653565b90506119bb565b505050505050565b600f5481565b600c8054611a3c90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6890613d27565b8015611ab55780601f10611a8a57610100808354040283529160200191611ab5565b820191906000526020600020905b815481529060010190602001808311611a9857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b24576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611b7d612793565b611b876000612b02565b565b601260029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611bb7612793565b80600e8190555050565b60136020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611c0a612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8d90613da4565b60405180910390fd5b80601260026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60105481565b606060068054611cef90613d27565b80601f0160208091040260200160405190810160405280929190818152602001828054611d1b90613d27565b8015611d685780601f10611d3d57610100808354040283529160200191611d68565b820191906000526020600020905b815481529060010190602001808311611d4b57829003601f168201915b5050505050905090565b601260019054906101000a900460ff16611dc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db8906142ef565b60405180910390fd5b600b5481611dd5611dd0612a64565b612a6c565b611ddf919061437b565b1115611e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e17906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000019081611e4a610e09565b611e54919061437b565b1115611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614467565b60405180910390fd5b600f5481611ea39190613df3565b3414611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb9061435b565b60405180910390fd5b611ef5611eef612a64565b82612ac3565b50565b611f00612870565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f64576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600a6000611f71612870565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661201e612870565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120639190613390565b60405180910390a35050565b612077612793565b604051806020016040528061208a611bd9565b73ffffffffffffffffffffffffffffffffffffffff168152506009600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550905050600061210b83611815565b9050612118818385610e33565b505050565b612128848484610e33565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461218a5761215384848484612bc6565b612189576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b612198612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221b90613da4565b60405180910390fd5b81601260006101000a81548160ff02191690831515021790555080601260016101000a81548160ff0219169083151502179055505050565b61226d612267612a64565b8361179f565b6122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a3906146e7565b60405180910390fd5b601260009054906101000a900460ff166122fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f290614753565b60405180910390fd5b600b548161230f61230a612a64565b612a6c565b612319919061437b565b111561235a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612351906143fb565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000019081612384610e09565b61238e919061437b565b11156123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690614467565b60405180910390fd5b601054816123dd9190613df3565b341461241e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124159061435b565b60405180910390fd5b8060116000828254612430919061437b565b925050819055508060136000612444612a64565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248d919061437b565b925050819055506124a561249f612a64565b82612ac3565b5050565b600b5481565b60606124ba82612811565b6124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f0906147bf565b60405180910390fd5b600c61250483612d16565b600d6040516020016125189392919061489e565b6040516020818303038152906040529050919050565b7f000000000000000000000000000000000000000000000000000000000000019081565b60115481565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125f4612793565b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061265481612de4565b50565b61265f612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166126eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e290613da4565b60405180910390fd5b80600f8190555050565b6126fd612793565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278090613da4565b60405180910390fd5b80600b8190555050565b61279b612a64565b73ffffffffffffffffffffffffffffffffffffffff166127b9611bd9565b73ffffffffffffffffffffffffffffffffffffffff161461280f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128069061491b565b60405180910390fd5b565b60008161281c612878565b1115801561282b575060035482105b8015612869575060007c0100000000000000000000000000000000000000000000000000000000600760008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080612890612878565b11612916576003548110156129155760006007600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612913575b600081036129095760076000836001900393508381526020019081526020016000205490506128df565b8092505050612948565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006009600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d5868684612e67565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6002805403612a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5290614987565b60405180910390fd5b60028081905550565b600033905090565b600067ffffffffffffffff6040600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b612add828260405180602001604052806000815250612e70565b5050565b6001600281905550565b600082612af88584612f0e565b1490509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612bec612870565b8786866040518563ffffffff1660e01b8152600401612c0e94939291906149fc565b6020604051808303816000875af1925050508015612c4a57506040513d601f19601f82011682018060405250810190612c479190614a5d565b60015b612cc3573d8060008114612c7a576040519150601f19603f3d011682016040523d82523d6000602084013e612c7f565b606091505b506000815103612cbb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060006001612d2584612f64565b01905060008167ffffffffffffffff811115612d4457612d43613784565b5b6040519080825280601f01601f191660200182016040528015612d765781602001600182028036833780820191505090505b509050600082602001820190505b600115612dd9578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612dcd57612dcc613e4d565b5b04945060008503612d84575b819350505050919050565b612dec612793565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5290614afc565b60405180910390fd5b612e6481612b02565b50565b60009392505050565b612e7a83836130b7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f095760006003549050600083820390505b612ebb6000868380600101945086612bc6565b612ef1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ea8578160035414612f0657600080fd5b50505b505050565b60008082905060005b8451811015612f5957612f4482868381518110612f3757612f36614624565b5b602002602001015161328a565b91508080612f5190614653565b915050612f17565b508091505092915050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612fc2577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612fb857612fb7613e4d565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612fff576d04ee2d6d415b85acef81000000008381612ff557612ff4613e4d565b5b0492506020810190505b662386f26fc10000831061302e57662386f26fc10000838161302457613023613e4d565b5b0492506010810190505b6305f5e1008310613057576305f5e100838161304d5761304c613e4d565b5b0492506008810190505b612710831061307c57612710838161307257613071613e4d565b5b0492506004810190505b6064831061309f576064838161309557613094613e4d565b5b0492506002810190505b600a83106130ae576001810190505b80915050919050565b60006003549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613124576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361315e576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61316b60008483856129b8565b600160406001901b178202600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506131e2836131d360008660006129be565b6131dc856132b5565b176129e6565b60076000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613206578060038190555050506132856000848385612a11565b505050565b60008183106132a25761329d82846132c5565b6132ad565b6132ac83836132c5565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613325816132f0565b811461333057600080fd5b50565b6000813590506133428161331c565b92915050565b60006020828403121561335e5761335d6132e6565b5b600061336c84828501613333565b91505092915050565b60008115159050919050565b61338a81613375565b82525050565b60006020820190506133a56000830184613381565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133e55780820151818401526020810190506133ca565b60008484015250505050565b6000601f19601f8301169050919050565b600061340d826133ab565b61341781856133b6565b93506134278185602086016133c7565b613430816133f1565b840191505092915050565b600060208201905081810360008301526134558184613402565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006134888261345d565b9050919050565b6134988161347d565b81146134a357600080fd5b50565b6000813590506134b58161348f565b92915050565b6000602082840312156134d1576134d06132e6565b5b60006134df848285016134a6565b91505092915050565b6000819050919050565b6134fb816134e8565b811461350657600080fd5b50565b600081359050613518816134f2565b92915050565b600060208284031215613534576135336132e6565b5b600061354284828501613509565b91505092915050565b6135548161347d565b82525050565b600060208201905061356f600083018461354b565b92915050565b6000806040838503121561358c5761358b6132e6565b5b600061359a858286016134a6565b92505060206135ab85828601613509565b9150509250929050565b6135be816134e8565b82525050565b60006020820190506135d960008301846135b5565b92915050565b6000806000606084860312156135f8576135f76132e6565b5b6000613606868287016134a6565b9350506020613617868287016134a6565b925050604061362886828701613509565b9150509250925092565b6000819050919050565b61364581613632565b82525050565b6000602082019050613660600083018461363c565b92915050565b61366f81613375565b811461367a57600080fd5b50565b60008135905061368c81613666565b92915050565b600080604083850312156136a9576136a86132e6565b5b60006136b7858286016134a6565b92505060206136c88582860161367d565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f8401126136f7576136f66136d2565b5b8235905067ffffffffffffffff811115613714576137136136d7565b5b6020830191508360018202830111156137305761372f6136dc565b5b9250929050565b6000806020838503121561374e5761374d6132e6565b5b600083013567ffffffffffffffff81111561376c5761376b6132eb565b5b613778858286016136e1565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6137bc826133f1565b810181811067ffffffffffffffff821117156137db576137da613784565b5b80604052505050565b60006137ee6132dc565b90506137fa82826137b3565b919050565b600067ffffffffffffffff82111561381a57613819613784565b5b602082029050602081019050919050565b61383481613632565b811461383f57600080fd5b50565b6000813590506138518161382b565b92915050565b600061386a613865846137ff565b6137e4565b9050808382526020820190506020840283018581111561388d5761388c6136dc565b5b835b818110156138b657806138a28882613842565b84526020840193505060208101905061388f565b5050509392505050565b600082601f8301126138d5576138d46136d2565b5b81356138e5848260208601613857565b91505092915050565b60008060408385031215613905576139046132e6565b5b6000613913858286016134a6565b925050602083013567ffffffffffffffff811115613934576139336132eb565b5b613940858286016138c0565b9150509250929050565b60008083601f8401126139605761395f6136d2565b5b8235905067ffffffffffffffff81111561397d5761397c6136d7565b5b602083019150836020820283011115613999576139986136dc565b5b9250929050565b60008083601f8401126139b6576139b56136d2565b5b8235905067ffffffffffffffff8111156139d3576139d26136d7565b5b6020830191508360208202830111156139ef576139ee6136dc565b5b9250929050565b60008060008060408587031215613a1057613a0f6132e6565b5b600085013567ffffffffffffffff811115613a2e57613a2d6132eb565b5b613a3a8782880161394a565b9450945050602085013567ffffffffffffffff811115613a5d57613a5c6132eb565b5b613a69878288016139a0565b925092505092959194509250565b600060208284031215613a8d57613a8c6132e6565b5b6000613a9b84828501613842565b91505092915050565b60008060408385031215613abb57613aba6132e6565b5b6000613ac985828601613509565b9250506020613ada858286016134a6565b9150509250929050565b600080fd5b600067ffffffffffffffff821115613b0457613b03613784565b5b613b0d826133f1565b9050602081019050919050565b82818337600083830152505050565b6000613b3c613b3784613ae9565b6137e4565b905082815260208101848484011115613b5857613b57613ae4565b5b613b63848285613b1a565b509392505050565b600082601f830112613b8057613b7f6136d2565b5b8135613b90848260208601613b29565b91505092915050565b60008060008060808587031215613bb357613bb26132e6565b5b6000613bc1878288016134a6565b9450506020613bd2878288016134a6565b9350506040613be387828801613509565b925050606085013567ffffffffffffffff811115613c0457613c036132eb565b5b613c1087828801613b6b565b91505092959194509250565b60008060408385031215613c3357613c326132e6565b5b6000613c418582860161367d565b9250506020613c528582860161367d565b9150509250929050565b60008060408385031215613c7357613c726132e6565b5b600083013567ffffffffffffffff811115613c9157613c906132eb565b5b613c9d858286016138c0565b9250506020613cae85828601613509565b9150509250929050565b60008060408385031215613ccf57613cce6132e6565b5b6000613cdd858286016134a6565b9250506020613cee858286016134a6565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d3f57607f821691505b602082108103613d5257613d51613cf8565b5b50919050565b7f496e76616c69642064656c656761746500000000000000000000000000000000600082015250565b6000613d8e6010836133b6565b9150613d9982613d58565b602082019050919050565b60006020820190508181036000830152613dbd81613d81565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613dfe826134e8565b9150613e09836134e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613e4257613e41613dc4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e87826134e8565b9150613e92836134e8565b925082613ea257613ea1613e4d565b5b828204905092915050565b600081905092915050565b50565b6000613ec8600083613ead565b9150613ed382613eb8565b600082019050919050565b6000613ee982613ebb565b9150819050919050565b7f5472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f29600f836133b6565b9150613f3482613ef3565b602082019050919050565b60006020820190508181036000830152613f5881613f1c565b9050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000613f95600f836133b6565b9150613fa082613f5f565b602082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613ffb565b6140428683613ffb565b95508019841693508086168417925050509392505050565b6000819050919050565b600061407f61407a614075846134e8565b61405a565b6134e8565b9050919050565b6000819050919050565b61409983614064565b6140ad6140a582614086565b848454614008565b825550505050565b600090565b6140c26140b5565b6140cd818484614090565b505050565b5b818110156140f1576140e66000826140ba565b6001810190506140d3565b5050565b601f8211156141365761410781613fd6565b61411084613feb565b8101602085101561411f578190505b61413361412b85613feb565b8301826140d2565b50505b505050565b600082821c905092915050565b60006141596000198460080261413b565b1980831691505092915050565b60006141728383614148565b9150826002028217905092915050565b61418c8383613fcb565b67ffffffffffffffff8111156141a5576141a4613784565b5b6141af8254613d27565b6141ba8282856140f5565b6000601f8311600181146141e957600084156141d7578287013590505b6141e18582614166565b865550614249565b601f1984166141f786613fd6565b60005b8281101561421f578489013582556001820191506020850194506020810190506141fa565b8683101561423c5784890135614238601f891682614148565b8355505b6001600288020188555050505b50505050505050565b600061425e83856133b6565b935061426b838584613b1a565b614274836133f1565b840190509392505050565b6000602082019050818103600083015261429a818486614252565b90509392505050565b7f7075626c69632061756374696f6e206e6f742073746172746564207965740000600082015250565b60006142d9601e836133b6565b91506142e4826142a3565b602082019050919050565b60006020820190508181036000830152614308816142cc565b9050919050565b7f77726f6e6720616d6f756e740000000000000000000000000000000000000000600082015250565b6000614345600c836133b6565b91506143508261430f565b602082019050919050565b6000602082019050818103600083015261437481614338565b9050919050565b6000614386826134e8565b9150614391836134e8565b92508282019050808211156143a9576143a8613dc4565b5b92915050565b7f746f6f206d616e79206d696e7473000000000000000000000000000000000000600082015250565b60006143e5600e836133b6565b91506143f0826143af565b602082019050919050565b60006020820190508181036000830152614414816143d8565b9050919050565b7f6d617820737570706c7900000000000000000000000000000000000000000000600082015250565b6000614451600a836133b6565b915061445c8261441b565b602082019050919050565b6000602082019050818103600083015261448081614444565b9050919050565b7f546869732066756e6374696f6e20697320666f722043726f73736d696e74206f60008201527f6e6c792e00000000000000000000000000000000000000000000000000000000602082015250565b60006144e36024836133b6565b91506144ee82614487565b604082019050919050565b60006020820190508181036000830152614512816144d6565b9050919050565b60008160601b9050919050565b600061453182614519565b9050919050565b600061454382614526565b9050919050565b61455b6145568261347d565b614538565b82525050565b600061456d828461454a565b60148201915081905092915050565b6000819050919050565b61459761459282613632565b61457c565b82525050565b60006145a98284614586565b60208201915081905092915050565b7f617267756d656e7473206d757374206861766520657175616c20636f756e7473600082015250565b60006145ee6020836133b6565b91506145f9826145b8565b602082019050919050565b6000602082019050818103600083015261461d816145e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061465e826134e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036146905761468f613dc4565b5b600182019050919050565b7f6e6f742077686974656c69737465640000000000000000000000000000000000600082015250565b60006146d1600f836133b6565b91506146dc8261469b565b602082019050919050565b60006020820190508181036000830152614700816146c4565b9050919050565b7f4578636c7573697665204d696e74206e6f742073746172746564207965740000600082015250565b600061473d601e836133b6565b915061474882614707565b602082019050919050565b6000602082019050818103600083015261476c81614730565b9050919050565b7f546f6b656e20646f65736e277420657869737400000000000000000000000000600082015250565b60006147a96013836133b6565b91506147b482614773565b602082019050919050565b600060208201905081810360008301526147d88161479c565b9050919050565b600081905092915050565b600081546147f781613d27565b61480181866147df565b9450600182166000811461481c576001811461483157614864565b60ff1983168652811515820286019350614864565b61483a85613fd6565b60005b8381101561485c5781548189015260018201915060208101905061483d565b838801955050505b50505092915050565b6000614878826133ab565b61488281856147df565b93506148928185602086016133c7565b80840191505092915050565b60006148aa82866147ea565b91506148b6828561486d565b91506148c282846147ea565b9150819050949350505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006149056020836133b6565b9150614910826148cf565b602082019050919050565b60006020820190508181036000830152614934816148f8565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614971601f836133b6565b915061497c8261493b565b602082019050919050565b600060208201905081810360008301526149a081614964565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006149ce826149a7565b6149d881856149b2565b93506149e88185602086016133c7565b6149f1816133f1565b840191505092915050565b6000608082019050614a11600083018761354b565b614a1e602083018661354b565b614a2b60408301856135b5565b8181036060830152614a3d81846149c3565b905095945050505050565b600081519050614a578161331c565b92915050565b600060208284031215614a7357614a726132e6565b5b6000614a8184828501614a48565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ae66026836133b6565b9150614af182614a8a565b604082019050919050565b60006020820190508181036000830152614b1581614ad9565b905091905056fea264697066735822122060ff2734b3bbf6e9d9416d2a6458609955f8333132c46746db4944dc6a9528cd64736f6c63430008100033

Deployed Bytecode Sourcemap

207:4780:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5970:615:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11689:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;366:111:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13649:218:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1781:130:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13183:400:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5000:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;644:30:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22788:2800:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;446:25:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3938:343;;;;;;;;;;;;;:::i;:::-;;14553:185:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;483:114:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;408:33:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;945:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3306:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2101:273;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;612:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11470:152:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4289:457:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;476:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;382:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6649:232:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:7;;;;;;;;;;;;;:::i;:::-;;679:68:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1442:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;758:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1236:87:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3816:114:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;525:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11858:104:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2381:363:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13939:308:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4756:226:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14809:399:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1917:176:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2752:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;346:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1196:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;301:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;579:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14318:164:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;603:161:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1661:110:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1537:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5970:615:3;6055:4;6370:10;6355:25;;:11;:25;;;;:102;;;;6447:10;6432:25;;:11;:25;;;;6355:102;:179;;;;6524:10;6509:25;;:11;:25;;;;6355:179;6335:199;;5970:615;;;:::o;11689:100::-;11743:13;11776:5;11769:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11689:100;:::o;366:111:1:-;435:4;1122:13:7;:11;:13::i;:::-;455:10:1::1;:16;466:4;455:16;;;;;;;;;;;;;;;;;;;;;;;;;448:23;;366:111:::0;;;:::o;13649:218:3:-;13725:7;13750:16;13758:7;13750;:16::i;:::-;13745:64;;13775:34;;;;;;;;;;;;;;13745:64;13829:15;:24;13845:7;13829:24;;;;;;;;;;;:30;;;;;;;;;;;;13822:37;;13649:218;;;:::o;1781:130:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1890:15:2::2;1873:14;:32;;;;1781:130:::0;:::o;13183:400:3:-;13264:13;13280:16;13288:7;13280;:16::i;:::-;13264:32;;13336:5;13313:28;;:19;:17;:19::i;:::-;:28;;;13309:175;;13361:44;13378:5;13385:19;:17;:19::i;:::-;13361:16;:44::i;:::-;13356:128;;13433:35;;;;;;;;;;;;;;13356:128;13309:175;13529:2;13496:15;:24;13512:7;13496:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13567:7;13563:2;13547:28;;13556:5;13547:28;;;;;;;;;;;;13253:330;13183:400;;:::o;5000:323::-;5061:7;5289:15;:13;:15::i;:::-;5274:12;;5258:13;;:28;:46;5251:53;;5000:323;:::o;644:30:2:-;;;;;;;;;;;;;:::o;22788:2800:3:-;22922:27;22952;22971:7;22952:18;:27::i;:::-;22922:57;;23037:4;22996:45;;23012:19;22996:45;;;22992:86;;23050:28;;;;;;;;;;;;;;22992:86;23092:27;23121:23;23148:28;23168:7;23148:19;:28::i;:::-;23091:85;;;;23276:62;23295:15;23312:4;23318:19;:17;:19::i;:::-;23276:18;:62::i;:::-;23271:174;;23358:43;23375:4;23381:19;:17;:19::i;:::-;23358:16;:43::i;:::-;23353:92;;23410:35;;;;;;;;;;;;;;23353:92;23271:174;23476:1;23462:16;;:2;:16;;;23458:52;;23487:23;;;;;;;;;;;;;;23458:52;23523:43;23545:4;23551:2;23555:7;23564:1;23523:21;:43::i;:::-;23659:15;23656:160;;;23799:1;23778:19;23771:30;23656:160;24194:18;:24;24213:4;24194:24;;;;;;;;;;;;;;;;24192:26;;;;;;;;;;;;24263:18;:22;24282:2;24263:22;;;;;;;;;;;;;;;;24261:24;;;;;;;;;;;24585:145;24622:2;24670:45;24685:4;24691:2;24695:19;24670:14;:45::i;:::-;2210:8;24643:72;24585:18;:145::i;:::-;24556:17;:26;24574:7;24556:26;;;;;;;;;;;:174;;;;24900:1;2210:8;24850:19;:46;:51;24846:626;;24922:19;24954:1;24944:7;:11;24922:33;;25111:1;25077:17;:30;25095:11;25077:30;;;;;;;;;;;;:35;25073:384;;25215:13;;25200:11;:28;25196:242;;25395:19;25362:17;:30;25380:11;25362:30;;;;;;;;;;;:52;;;;25196:242;25073:384;24903:569;24846:626;25519:7;25515:2;25500:27;;25509:4;25500:27;;;;;;;;;;;;25538:42;25559:4;25565:2;25569:7;25578:1;25538:20;:42::i;:::-;22911:2677;;;22788:2800;;;:::o;446:25:2:-;;;;:::o;3938:343::-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3999:7:2::2;4020:42;4012:56;;4104:3;4099:2;4076:21;:25;;;;:::i;:::-;:31;;;;:::i;:::-;4012:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3998:114;;;4127:2;4119:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;4159:12;4185:8;;;;;;;;;;;4177:22;;4207:21;4177:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4158:75;;;4248:7;4240:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;3991:290;;3938:343::o:0;14553:185:3:-;14691:39;14708:4;14714:2;14718:7;14691:39;;;;;;;;;;;;:16;:39::i;:::-;14553:185;;;:::o;483:114:1:-;1122:13:7;:11;:13::i;:::-;580:11:1::1;561:10;:16;572:4;561:16;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;483:114:::0;;:::o;408:33:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;945:139::-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1041:8:2::2;;1031:7;:18;;;;;;;:::i;:::-;;1061:17;1069:8;;1061:17;;;;;;;:::i;:::-;;;;;;;;945:139:::0;;:::o;3306:502::-;2296:21:8;:19;:21::i;:::-;3394:18:2::1;;;;;;;;;;;3386:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;3481:9;;3475:3;:15;;;;:::i;:::-;3462:9;:28;3454:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3559:11;;3552:3;3522:27;3536:12;:10;:12::i;:::-;3522:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;3514:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3627:9;3620:3;3604:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;3596:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3680:42;3666:56;;:10;:56;;;3658:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;3783:19;3793:3;3798;3783:9;:19::i;:::-;2340:20:8::0;:18;:20::i;:::-;3306:502:2;;:::o;2101:273::-;2201:4;2228:140;2257:5;2273:10;;2348:7;2331:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;2321:36;;;;;;2304:54;;;;;;;;:::i;:::-;;;;;;;;;;;;;2294:65;;;;;;2228:18;:140::i;:::-;2214:154;;2101:273;;;;:::o;612:27::-;;;;;;;;;;;;;:::o;11470:152:3:-;11542:7;11585:27;11604:7;11585:18;:27::i;:::-;11562:52;;11470:152;;;:::o;4289:457:2:-;212:10:1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;4420:10:2::1;;:17;;4406:3;;:10;;:31;4398:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4482:13;4511:9:::0;4506:73:::1;4530:3;;:10;;4526:1;:14;4506:73;;;4565:3;;4569:1;4565:6;;;;;;;:::i;:::-;;;;;;;;4556:15;;;;;:::i;:::-;;;4542:3;;;;:::i;:::-;;;4506:73;;;;4618:9;4609:5;4593:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:34;;4585:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;4654:9;4649:92;4673:3;;:10;;4669:1;:14;4649:92;;;4699:32;4709:10;;4720:1;4709:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;4724:3;;4728:1;4724:6;;;;;;;:::i;:::-;;;;;;;;4699:9;:32::i;:::-;4685:3;;;;:::i;:::-;;;4649:92;;;;4391:355;4289:457:::0;;;;:::o;476:44::-;;;;:::o;382:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6649:232:3:-;6721:7;6762:1;6745:19;;:5;:19;;;6741:60;;6773:28;;;;;;;;;;;;;;6741:60;1162:13;6819:18;:25;6838:5;6819:25;;;;;;;;;;;;;;;;:54;6812:61;;6649:232;;;:::o;1884:103:7:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;679:68:2:-;;;;;;;;;;;;;:::o;1442:86::-;1122:13:7;:11;:13::i;:::-;1518:4:2::1;1505:10;:17;;;;1442:86:::0;:::o;758:58::-;;;;;;;;;;;;;;;;;:::o;1236:87:7:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;3816:114:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;3915:9:2::2;3904:8;;:20;;;;;;;;;;;;;;;;;;3816:114:::0;:::o;525:49::-;;;;:::o;11858:104:3:-;11914:13;11947:7;11940:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11858:104;:::o;2381:363:2:-;2440:18;;;;;;;;;;;2432:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;2545:11;;2538:3;2508:27;2522:12;:10;:12::i;:::-;2508:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;2500:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2613:9;2606:3;2590:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;2582:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2671:9;;2665:3;:15;;;;:::i;:::-;2652:9;:28;2644:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;2710:28;2720:12;:10;:12::i;:::-;2734:3;2710:9;:28::i;:::-;2381:363;:::o;13939:308:3:-;14050:19;:17;:19::i;:::-;14038:31;;:8;:31;;;14034:61;;14078:17;;;;;;;;;;;;;;14034:61;14160:8;14108:18;:39;14127:19;:17;:19::i;:::-;14108:39;;;;;;;;;;;;;;;:49;14148:8;14108:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;14220:8;14184:55;;14199:19;:17;:19::i;:::-;14184:55;;;14230:8;14184:55;;;;;;:::i;:::-;;;;;;;;13939:308;;:::o;4756:226:2:-;1122:13:7;:11;:13::i;:::-;4862:25:2::1;;;;;;;;4879:7;:5;:7::i;:::-;4862:25;;;;::::0;4835:15:::1;:24;4851:7;4835:24;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4894:12;4909:18;4918:7;4909;:18::i;:::-;4894:33;;4934:40;4948:4;4954:9;4965:7;4934:12;:40::i;:::-;4828:154;4756:226:::0;;:::o;14809:399:3:-;14976:31;14989:4;14995:2;14999:7;14976:12;:31::i;:::-;15040:1;15022:2;:14;;;:19;15018:183;;15061:56;15092:4;15098:2;15102:7;15111:5;15061:30;:56::i;:::-;15056:145;;15145:40;;;;;;;;;;;;;;15056:145;15018:183;14809:399;;;;:::o;1917:176:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;2036:12:2::2;2018:15;;:30;;;;;;;;;;;;;;;;;;2076:11;2055:18;;:32;;;;;;;;;;;;;;;;;;1917:176:::0;;:::o;2752:546::-;2845:34;2859:12;:10;:12::i;:::-;2873:5;2845:13;:34::i;:::-;2837:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;2914:15;;;;;;;;;;;2906:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3016:11;;3009:3;2979:27;2993:12;:10;:12::i;:::-;2979:13;:27::i;:::-;:33;;;;:::i;:::-;:48;;2971:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3084:9;3077:3;3061:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:32;;3053:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;3142:14;;3136:3;:20;;;;:::i;:::-;3123:9;:33;3115:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3201:3;3184:13;;:20;;;;;;;:::i;:::-;;;;;;;;3252:3;3211:23;:37;3235:12;:10;:12::i;:::-;3211:37;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;3262:28;3272:12;:10;:12::i;:::-;3286:3;3262:9;:28::i;:::-;2752:546;;:::o;346:31::-;;;;:::o;1196:238::-;1270:13;1304:17;1312:8;1304:7;:17::i;:::-;1296:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1387:7;1396:19;:8;:17;:19::i;:::-;1417:9;1370:57;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1356:72;;1196:238;;;:::o;301:40::-;;;:::o;579:28::-;;;;:::o;14318:164:3:-;14415:4;14439:18;:25;14458:5;14439:25;;;;;;;;;;;;;;;:35;14465:8;14439:35;;;;;;;;;;;;;;;;;;;;;;;;;14432:42;;14318:164;;;;:::o;603:161:1:-;1122:13:7;:11;:13::i;:::-;712:4:1::1;689:10:::0;:20:::1;700:8;689:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;723:35;748:8;723:23;:35::i;:::-;603:161:::0;:::o;1661:110:2:-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1755:10:2::2;1743:9;:22;;;;1661:110:::0;:::o;1537:116::-;1122:13:7;:11;:13::i;:::-;212:10:1::1;:22;223:10;212:22;;;;;;;;;;;;;;;;;;;;;;;;;204:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;1635:12:2::2;1621:11;:26;;;;1537:116:::0;:::o;1401:132:7:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;15463:281:3:-;15528:4;15584:7;15565:15;:13;:15::i;:::-;:26;;:66;;;;;15618:13;;15608:7;:23;15565:66;:152;;;;;15716:1;1932:8;15669:17;:26;15687:7;15669:26;;;;;;;;;;;;:43;:48;15565:152;15545:172;;15463:281;;;:::o;33892:105::-;33952:7;33979:10;33972:17;;33892:105;:::o;4516:92::-;4572:7;4599:1;4592:8;;4516:92;:::o;8363:1129::-;8430:7;8450:12;8465:7;8450:22;;8533:4;8514:15;:13;:15::i;:::-;:23;8510:915;;8567:13;;8560:4;:20;8556:869;;;8605:14;8622:17;:23;8640:4;8622:23;;;;;;;;;;;;8605:40;;8738:1;1932:8;8711:6;:23;:28;8707:699;;9230:113;9247:1;9237:6;:11;9230:113;;9290:17;:25;9308:6;;;;;;;9290:25;;;;;;;;;;;;9281:34;;9230:113;;;9376:6;9369:13;;;;;;8707:699;8582:843;8556:869;8510:915;9453:31;;;;;;;;;;;;;;8363:1129;;;;:::o;21304:472::-;21399:27;21428:23;21469:38;21510:15;:24;21526:7;21510:24;;;;;;;;;;;21469:65;;21681:18;21658:41;;21738:19;21732:26;21713:45;;21643:126;21304:472;;;:::o;21889:645::-;22031:11;22193:15;22187:4;22183:26;22175:34;;22352:15;22341:9;22337:31;22324:44;;22499:15;22488:9;22485:30;22478:4;22467:9;22464:19;22461:55;22451:65;;21889:645;;;;;:::o;32725:159::-;;;;;:::o;31037:309::-;31172:7;31192:16;2333:3;31218:19;:40;;31192:67;;2333:3;31285:31;31296:4;31302:2;31306:9;31285:10;:31::i;:::-;31277:40;;:61;;31270:68;;;31037:309;;;;;:::o;10961:447::-;11041:14;11209:15;11202:5;11198:27;11189:36;;11383:5;11369:11;11345:22;11341:40;11338:51;11331:5;11328:62;11318:72;;10961:447;;;;:::o;33543:158::-;;;;;:::o;2376:289:8:-;1778:1;2506:7;;:19;2498:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1778:1;2639:7;:18;;;;2376:289::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;6963:184:3:-;7032:7;1162:13;1299:2;7060:18;:25;7079:5;7060:25;;;;;;;;;;;;;;;;:49;;7059:80;7052:87;;6963:184;;;:::o;15828:112::-;15905:27;15915:2;15919:8;15905:27;;;;;;;;;;;;:9;:27::i;:::-;15828:112;;:::o;2673:213:8:-;1734:1;2856:7;:22;;;;2673:213::o;1179:190:6:-;1304:4;1357;1328:25;1341:5;1348:4;1328:12;:25::i;:::-;:33;1321:40;;1179:190;;;;;:::o;2503:191:7:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;29539:716:3:-;29702:4;29748:2;29723:45;;;29769:19;:17;:19::i;:::-;29790:4;29796:7;29805:5;29723:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29719:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30023:1;30006:6;:13;:18;30002:235;;30052:40;;;;;;;;;;;;;;30002:235;30195:6;30189:13;30180:6;30176:2;30172:15;30165:38;29719:529;29892:54;;;29882:64;;;:6;:64;;;;29875:71;;;29539:716;;;;;;:::o;427::9:-;483:13;534:14;571:1;551:17;562:5;551:10;:17::i;:::-;:21;534:38;;587:20;621:6;610:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;587:41;;643:11;772:6;768:2;764:15;756:6;752:28;745:35;;809:288;816:4;809:288;;;841:5;;;;;;;;983:8;978:2;971:5;967:14;962:30;957:3;949:44;1039:2;1030:11;;;;;;:::i;:::-;;;;;1073:1;1064:5;:10;809:288;1060:21;809:288;1118:6;1111:13;;;;;427:716;;;:::o;2142:201:7:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;31922:147:3:-;32059:6;31922:147;;;;;:::o;16356:689::-;16487:19;16493:2;16497:8;16487:5;:19::i;:::-;16566:1;16548:2;:14;;;:19;16544:483;;16588:11;16602:13;;16588:27;;16634:13;16656:8;16650:3;:14;16634:30;;16683:233;16714:62;16753:1;16757:2;16761:7;;;;;;16770:5;16714:30;:62::i;:::-;16709:167;;16812:40;;;;;;;;;;;;;;16709:167;16911:3;16903:5;:11;16683:233;;16998:3;16981:13;;:20;16977:34;;17003:8;;;16977:34;16569:458;;16544:483;16356:689;;;:::o;2046:296:6:-;2129:7;2149:20;2172:4;2149:27;;2192:9;2187:118;2211:5;:12;2207:1;:16;2187:118;;;2260:33;2270:12;2284:5;2290:1;2284:8;;;;;;;;:::i;:::-;;;;;;;;2260:9;:33::i;:::-;2245:48;;2225:3;;;;;:::i;:::-;;;;2187:118;;;;2322:12;2315:19;;;2046:296;;;;:::o;10146:922:5:-;10199:7;10219:14;10236:1;10219:18;;10286:6;10277:5;:15;10273:102;;10322:6;10313:15;;;;;;:::i;:::-;;;;;10357:2;10347:12;;;;10273:102;10402:6;10393:5;:15;10389:102;;10438:6;10429:15;;;;;;:::i;:::-;;;;;10473:2;10463:12;;;;10389:102;10518:6;10509:5;:15;10505:102;;10554:6;10545:15;;;;;;:::i;:::-;;;;;10589:2;10579:12;;;;10505:102;10634:5;10625;:14;10621:99;;10669:5;10660:14;;;;;;:::i;:::-;;;;;10703:1;10693:11;;;;10621:99;10747:5;10738;:14;10734:99;;10782:5;10773:14;;;;;;:::i;:::-;;;;;10816:1;10806:11;;;;10734:99;10860:5;10851;:14;10847:99;;10895:5;10886:14;;;;;;:::i;:::-;;;;;10929:1;10919:11;;;;10847:99;10973:5;10964;:14;10960:66;;11009:1;10999:11;;;;10960:66;11054:6;11047:13;;;10146:922;;;:::o;17318:1537:3:-;17391:20;17414:13;;17391:36;;17456:1;17442:16;;:2;:16;;;17438:48;;17467:19;;;;;;;;;;;;;;17438:48;17513:1;17501:8;:13;17497:44;;17523:18;;;;;;;;;;;;;;17497:44;17554:61;17584:1;17588:2;17592:12;17606:8;17554:21;:61::i;:::-;18097:1;1299:2;18068:1;:25;;18067:31;18055:8;:44;18029:18;:22;18048:2;18029:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;18376:139;18413:2;18467:33;18490:1;18494:2;18498:1;18467:14;:33::i;:::-;18434:30;18455:8;18434:20;:30::i;:::-;:66;18376:18;:139::i;:::-;18342:17;:31;18360:12;18342:31;;;;;;;;;;;:173;;;;18532:15;18550:12;18532:30;;18577:11;18606:8;18591:12;:23;18577:37;;18629:101;18681:9;;;;;;18677:2;18656:35;;18673:1;18656:35;;;;;;;;;;;;18725:3;18715:7;:13;18629:101;;18762:3;18746:13;:19;;;;17803:974;;18787:60;18816:1;18820:2;18824:12;18838:8;18787:20;:60::i;:::-;17380:1475;17318:1537;;:::o;8253:149:6:-;8316:7;8347:1;8343;:5;:51;;8374:20;8389:1;8392;8374:14;:20::i;:::-;8343:51;;;8351:20;8366:1;8369;8351:14;:20::i;:::-;8343:51;8336:58;;8253:149;;;;:::o;12799:322:3:-;12869:14;13100:1;13090:8;13087:15;13062:23;13058:45;13048:55;;12799:322;;;:::o;8410:268:6:-;8478:13;8585:1;8579:4;8572:15;8614:1;8608:4;8601:15;8655:4;8649;8639:21;8630:30;;8410:268;;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:126::-;2897:7;2937:42;2930:5;2926:54;2915:65;;2860:126;;;:::o;2992:96::-;3029:7;3058:24;3076:5;3058:24;:::i;:::-;3047:35;;2992:96;;;:::o;3094:122::-;3167:24;3185:5;3167:24;:::i;:::-;3160:5;3157:35;3147:63;;3206:1;3203;3196:12;3147:63;3094:122;:::o;3222:139::-;3268:5;3306:6;3293:20;3284:29;;3322:33;3349:5;3322:33;:::i;:::-;3222:139;;;;:::o;3367:329::-;3426:6;3475:2;3463:9;3454:7;3450:23;3446:32;3443:119;;;3481:79;;:::i;:::-;3443:119;3601:1;3626:53;3671:7;3662:6;3651:9;3647:22;3626:53;:::i;:::-;3616:63;;3572:117;3367:329;;;;:::o;3702:77::-;3739:7;3768:5;3757:16;;3702:77;;;:::o;3785:122::-;3858:24;3876:5;3858:24;:::i;:::-;3851:5;3848:35;3838:63;;3897:1;3894;3887:12;3838:63;3785:122;:::o;3913:139::-;3959:5;3997:6;3984:20;3975:29;;4013:33;4040:5;4013:33;:::i;:::-;3913:139;;;;:::o;4058:329::-;4117:6;4166:2;4154:9;4145:7;4141:23;4137:32;4134:119;;;4172:79;;:::i;:::-;4134:119;4292:1;4317:53;4362:7;4353:6;4342:9;4338:22;4317:53;:::i;:::-;4307:63;;4263:117;4058:329;;;;:::o;4393:118::-;4480:24;4498:5;4480:24;:::i;:::-;4475:3;4468:37;4393:118;;:::o;4517:222::-;4610:4;4648:2;4637:9;4633:18;4625:26;;4661:71;4729:1;4718:9;4714:17;4705:6;4661:71;:::i;:::-;4517:222;;;;:::o;4745:474::-;4813:6;4821;4870:2;4858:9;4849:7;4845:23;4841:32;4838:119;;;4876:79;;:::i;:::-;4838:119;4996:1;5021:53;5066:7;5057:6;5046:9;5042:22;5021:53;:::i;:::-;5011:63;;4967:117;5123:2;5149:53;5194:7;5185:6;5174:9;5170:22;5149:53;:::i;:::-;5139:63;;5094:118;4745:474;;;;;:::o;5225:118::-;5312:24;5330:5;5312:24;:::i;:::-;5307:3;5300:37;5225:118;;:::o;5349:222::-;5442:4;5480:2;5469:9;5465:18;5457:26;;5493:71;5561:1;5550:9;5546:17;5537:6;5493:71;:::i;:::-;5349:222;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:77::-;6239:7;6268:5;6257:16;;6202:77;;;:::o;6285:118::-;6372:24;6390:5;6372:24;:::i;:::-;6367:3;6360:37;6285:118;;:::o;6409:222::-;6502:4;6540:2;6529:9;6525:18;6517:26;;6553:71;6621:1;6610:9;6606:17;6597:6;6553:71;:::i;:::-;6409:222;;;;:::o;6637:116::-;6707:21;6722:5;6707:21;:::i;:::-;6700:5;6697:32;6687:60;;6743:1;6740;6733:12;6687:60;6637:116;:::o;6759:133::-;6802:5;6840:6;6827:20;6818:29;;6856:30;6880:5;6856:30;:::i;:::-;6759:133;;;;:::o;6898:468::-;6963:6;6971;7020:2;7008:9;6999:7;6995:23;6991:32;6988:119;;;7026:79;;:::i;:::-;6988:119;7146:1;7171:53;7216:7;7207:6;7196:9;7192:22;7171:53;:::i;:::-;7161:63;;7117:117;7273:2;7299:50;7341:7;7332:6;7321:9;7317:22;7299:50;:::i;:::-;7289:60;;7244:115;6898:468;;;;;:::o;7372:117::-;7481:1;7478;7471:12;7495:117;7604:1;7601;7594:12;7618:117;7727:1;7724;7717:12;7755:553;7813:8;7823:6;7873:3;7866:4;7858:6;7854:17;7850:27;7840:122;;7881:79;;:::i;:::-;7840:122;7994:6;7981:20;7971:30;;8024:18;8016:6;8013:30;8010:117;;;8046:79;;:::i;:::-;8010:117;8160:4;8152:6;8148:17;8136:29;;8214:3;8206:4;8198:6;8194:17;8184:8;8180:32;8177:41;8174:128;;;8221:79;;:::i;:::-;8174:128;7755:553;;;;;:::o;8314:529::-;8385:6;8393;8442:2;8430:9;8421:7;8417:23;8413:32;8410:119;;;8448:79;;:::i;:::-;8410:119;8596:1;8585:9;8581:17;8568:31;8626:18;8618:6;8615:30;8612:117;;;8648:79;;:::i;:::-;8612:117;8761:65;8818:7;8809:6;8798:9;8794:22;8761:65;:::i;:::-;8743:83;;;;8539:297;8314:529;;;;;:::o;8849:180::-;8897:77;8894:1;8887:88;8994:4;8991:1;8984:15;9018:4;9015:1;9008:15;9035:281;9118:27;9140:4;9118:27;:::i;:::-;9110:6;9106:40;9248:6;9236:10;9233:22;9212:18;9200:10;9197:34;9194:62;9191:88;;;9259:18;;:::i;:::-;9191:88;9299:10;9295:2;9288:22;9078:238;9035:281;;:::o;9322:129::-;9356:6;9383:20;;:::i;:::-;9373:30;;9412:33;9440:4;9432:6;9412:33;:::i;:::-;9322:129;;;:::o;9457:311::-;9534:4;9624:18;9616:6;9613:30;9610:56;;;9646:18;;:::i;:::-;9610:56;9696:4;9688:6;9684:17;9676:25;;9756:4;9750;9746:15;9738:23;;9457:311;;;:::o;9774:122::-;9847:24;9865:5;9847:24;:::i;:::-;9840:5;9837:35;9827:63;;9886:1;9883;9876:12;9827:63;9774:122;:::o;9902:139::-;9948:5;9986:6;9973:20;9964:29;;10002:33;10029:5;10002:33;:::i;:::-;9902:139;;;;:::o;10064:710::-;10160:5;10185:81;10201:64;10258:6;10201:64;:::i;:::-;10185:81;:::i;:::-;10176:90;;10286:5;10315:6;10308:5;10301:21;10349:4;10342:5;10338:16;10331:23;;10402:4;10394:6;10390:17;10382:6;10378:30;10431:3;10423:6;10420:15;10417:122;;;10450:79;;:::i;:::-;10417:122;10565:6;10548:220;10582:6;10577:3;10574:15;10548:220;;;10657:3;10686:37;10719:3;10707:10;10686:37;:::i;:::-;10681:3;10674:50;10753:4;10748:3;10744:14;10737:21;;10624:144;10608:4;10603:3;10599:14;10592:21;;10548:220;;;10552:21;10166:608;;10064:710;;;;;:::o;10797:370::-;10868:5;10917:3;10910:4;10902:6;10898:17;10894:27;10884:122;;10925:79;;:::i;:::-;10884:122;11042:6;11029:20;11067:94;11157:3;11149:6;11142:4;11134:6;11130:17;11067:94;:::i;:::-;11058:103;;10874:293;10797:370;;;;:::o;11173:684::-;11266:6;11274;11323:2;11311:9;11302:7;11298:23;11294:32;11291:119;;;11329:79;;:::i;:::-;11291:119;11449:1;11474:53;11519:7;11510:6;11499:9;11495:22;11474:53;:::i;:::-;11464:63;;11420:117;11604:2;11593:9;11589:18;11576:32;11635:18;11627:6;11624:30;11621:117;;;11657:79;;:::i;:::-;11621:117;11762:78;11832:7;11823:6;11812:9;11808:22;11762:78;:::i;:::-;11752:88;;11547:303;11173:684;;;;;:::o;11880:568::-;11953:8;11963:6;12013:3;12006:4;11998:6;11994:17;11990:27;11980:122;;12021:79;;:::i;:::-;11980:122;12134:6;12121:20;12111:30;;12164:18;12156:6;12153:30;12150:117;;;12186:79;;:::i;:::-;12150:117;12300:4;12292:6;12288:17;12276:29;;12354:3;12346:4;12338:6;12334:17;12324:8;12320:32;12317:41;12314:128;;;12361:79;;:::i;:::-;12314:128;11880:568;;;;;:::o;12471:::-;12544:8;12554:6;12604:3;12597:4;12589:6;12585:17;12581:27;12571:122;;12612:79;;:::i;:::-;12571:122;12725:6;12712:20;12702:30;;12755:18;12747:6;12744:30;12741:117;;;12777:79;;:::i;:::-;12741:117;12891:4;12883:6;12879:17;12867:29;;12945:3;12937:4;12929:6;12925:17;12915:8;12911:32;12908:41;12905:128;;;12952:79;;:::i;:::-;12905:128;12471:568;;;;;:::o;13045:934::-;13167:6;13175;13183;13191;13240:2;13228:9;13219:7;13215:23;13211:32;13208:119;;;13246:79;;:::i;:::-;13208:119;13394:1;13383:9;13379:17;13366:31;13424:18;13416:6;13413:30;13410:117;;;13446:79;;:::i;:::-;13410:117;13559:80;13631:7;13622:6;13611:9;13607:22;13559:80;:::i;:::-;13541:98;;;;13337:312;13716:2;13705:9;13701:18;13688:32;13747:18;13739:6;13736:30;13733:117;;;13769:79;;:::i;:::-;13733:117;13882:80;13954:7;13945:6;13934:9;13930:22;13882:80;:::i;:::-;13864:98;;;;13659:313;13045:934;;;;;;;:::o;13985:329::-;14044:6;14093:2;14081:9;14072:7;14068:23;14064:32;14061:119;;;14099:79;;:::i;:::-;14061:119;14219:1;14244:53;14289:7;14280:6;14269:9;14265:22;14244:53;:::i;:::-;14234:63;;14190:117;13985:329;;;;:::o;14320:474::-;14388:6;14396;14445:2;14433:9;14424:7;14420:23;14416:32;14413:119;;;14451:79;;:::i;:::-;14413:119;14571:1;14596:53;14641:7;14632:6;14621:9;14617:22;14596:53;:::i;:::-;14586:63;;14542:117;14698:2;14724:53;14769:7;14760:6;14749:9;14745:22;14724:53;:::i;:::-;14714:63;;14669:118;14320:474;;;;;:::o;14800:117::-;14909:1;14906;14899:12;14923:307;14984:4;15074:18;15066:6;15063:30;15060:56;;;15096:18;;:::i;:::-;15060:56;15134:29;15156:6;15134:29;:::i;:::-;15126:37;;15218:4;15212;15208:15;15200:23;;14923:307;;;:::o;15236:146::-;15333:6;15328:3;15323;15310:30;15374:1;15365:6;15360:3;15356:16;15349:27;15236:146;;;:::o;15388:423::-;15465:5;15490:65;15506:48;15547:6;15506:48;:::i;:::-;15490:65;:::i;:::-;15481:74;;15578:6;15571:5;15564:21;15616:4;15609:5;15605:16;15654:3;15645:6;15640:3;15636:16;15633:25;15630:112;;;15661:79;;:::i;:::-;15630:112;15751:54;15798:6;15793:3;15788;15751:54;:::i;:::-;15471:340;15388:423;;;;;:::o;15830:338::-;15885:5;15934:3;15927:4;15919:6;15915:17;15911:27;15901:122;;15942:79;;:::i;:::-;15901:122;16059:6;16046:20;16084:78;16158:3;16150:6;16143:4;16135:6;16131:17;16084:78;:::i;:::-;16075:87;;15891:277;15830:338;;;;:::o;16174:943::-;16269:6;16277;16285;16293;16342:3;16330:9;16321:7;16317:23;16313:33;16310:120;;;16349:79;;:::i;:::-;16310:120;16469:1;16494:53;16539:7;16530:6;16519:9;16515:22;16494:53;:::i;:::-;16484:63;;16440:117;16596:2;16622:53;16667:7;16658:6;16647:9;16643:22;16622:53;:::i;:::-;16612:63;;16567:118;16724:2;16750:53;16795:7;16786:6;16775:9;16771:22;16750:53;:::i;:::-;16740:63;;16695:118;16880:2;16869:9;16865:18;16852:32;16911:18;16903:6;16900:30;16897:117;;;16933:79;;:::i;:::-;16897:117;17038:62;17092:7;17083:6;17072:9;17068:22;17038:62;:::i;:::-;17028:72;;16823:287;16174:943;;;;;;;:::o;17123:462::-;17185:6;17193;17242:2;17230:9;17221:7;17217:23;17213:32;17210:119;;;17248:79;;:::i;:::-;17210:119;17368:1;17393:50;17435:7;17426:6;17415:9;17411:22;17393:50;:::i;:::-;17383:60;;17339:114;17492:2;17518:50;17560:7;17551:6;17540:9;17536:22;17518:50;:::i;:::-;17508:60;;17463:115;17123:462;;;;;:::o;17591:684::-;17684:6;17692;17741:2;17729:9;17720:7;17716:23;17712:32;17709:119;;;17747:79;;:::i;:::-;17709:119;17895:1;17884:9;17880:17;17867:31;17925:18;17917:6;17914:30;17911:117;;;17947:79;;:::i;:::-;17911:117;18052:78;18122:7;18113:6;18102:9;18098:22;18052:78;:::i;:::-;18042:88;;17838:302;18179:2;18205:53;18250:7;18241:6;18230:9;18226:22;18205:53;:::i;:::-;18195:63;;18150:118;17591:684;;;;;:::o;18281:474::-;18349:6;18357;18406:2;18394:9;18385:7;18381:23;18377:32;18374:119;;;18412:79;;:::i;:::-;18374:119;18532:1;18557:53;18602:7;18593:6;18582:9;18578:22;18557:53;:::i;:::-;18547:63;;18503:117;18659:2;18685:53;18730:7;18721:6;18710:9;18706:22;18685:53;:::i;:::-;18675:63;;18630:118;18281:474;;;;;:::o;18761:180::-;18809:77;18806:1;18799:88;18906:4;18903:1;18896:15;18930:4;18927:1;18920:15;18947:320;18991:6;19028:1;19022:4;19018:12;19008:22;;19075:1;19069:4;19065:12;19096:18;19086:81;;19152:4;19144:6;19140:17;19130:27;;19086:81;19214:2;19206:6;19203:14;19183:18;19180:38;19177:84;;19233:18;;:::i;:::-;19177:84;18998:269;18947:320;;;:::o;19273:166::-;19413:18;19409:1;19401:6;19397:14;19390:42;19273:166;:::o;19445:366::-;19587:3;19608:67;19672:2;19667:3;19608:67;:::i;:::-;19601:74;;19684:93;19773:3;19684:93;:::i;:::-;19802:2;19797:3;19793:12;19786:19;;19445:366;;;:::o;19817:419::-;19983:4;20021:2;20010:9;20006:18;19998:26;;20070:9;20064:4;20060:20;20056:1;20045:9;20041:17;20034:47;20098:131;20224:4;20098:131;:::i;:::-;20090:139;;19817:419;;;:::o;20242:180::-;20290:77;20287:1;20280:88;20387:4;20384:1;20377:15;20411:4;20408:1;20401:15;20428:348;20468:7;20491:20;20509:1;20491:20;:::i;:::-;20486:25;;20525:20;20543:1;20525:20;:::i;:::-;20520:25;;20713:1;20645:66;20641:74;20638:1;20635:81;20630:1;20623:9;20616:17;20612:105;20609:131;;;20720:18;;:::i;:::-;20609:131;20768:1;20765;20761:9;20750:20;;20428:348;;;;:::o;20782:180::-;20830:77;20827:1;20820:88;20927:4;20924:1;20917:15;20951:4;20948:1;20941:15;20968:185;21008:1;21025:20;21043:1;21025:20;:::i;:::-;21020:25;;21059:20;21077:1;21059:20;:::i;:::-;21054:25;;21098:1;21088:35;;21103:18;;:::i;:::-;21088:35;21145:1;21142;21138:9;21133:14;;20968:185;;;;:::o;21159:147::-;21260:11;21297:3;21282:18;;21159:147;;;;:::o;21312:114::-;;:::o;21432:398::-;21591:3;21612:83;21693:1;21688:3;21612:83;:::i;:::-;21605:90;;21704:93;21793:3;21704:93;:::i;:::-;21822:1;21817:3;21813:11;21806:18;;21432:398;;;:::o;21836:379::-;22020:3;22042:147;22185:3;22042:147;:::i;:::-;22035:154;;22206:3;22199:10;;21836:379;;;:::o;22221:165::-;22361:17;22357:1;22349:6;22345:14;22338:41;22221:165;:::o;22392:366::-;22534:3;22555:67;22619:2;22614:3;22555:67;:::i;:::-;22548:74;;22631:93;22720:3;22631:93;:::i;:::-;22749:2;22744:3;22740:12;22733:19;;22392:366;;;:::o;22764:419::-;22930:4;22968:2;22957:9;22953:18;22945:26;;23017:9;23011:4;23007:20;23003:1;22992:9;22988:17;22981:47;23045:131;23171:4;23045:131;:::i;:::-;23037:139;;22764:419;;;:::o;23189:165::-;23329:17;23325:1;23317:6;23313:14;23306:41;23189:165;:::o;23360:366::-;23502:3;23523:67;23587:2;23582:3;23523:67;:::i;:::-;23516:74;;23599:93;23688:3;23599:93;:::i;:::-;23717:2;23712:3;23708:12;23701:19;;23360:366;;;:::o;23732:419::-;23898:4;23936:2;23925:9;23921:18;23913:26;;23985:9;23979:4;23975:20;23971:1;23960:9;23956:17;23949:47;24013:131;24139:4;24013:131;:::i;:::-;24005:139;;23732:419;;;:::o;24157:97::-;24216:6;24244:3;24234:13;;24157:97;;;;:::o;24260:141::-;24309:4;24332:3;24324:11;;24355:3;24352:1;24345:14;24389:4;24386:1;24376:18;24368:26;;24260:141;;;:::o;24407:93::-;24444:6;24491:2;24486;24479:5;24475:14;24471:23;24461:33;;24407:93;;;:::o;24506:107::-;24550:8;24600:5;24594:4;24590:16;24569:37;;24506:107;;;;:::o;24619:393::-;24688:6;24738:1;24726:10;24722:18;24761:97;24791:66;24780:9;24761:97;:::i;:::-;24879:39;24909:8;24898:9;24879:39;:::i;:::-;24867:51;;24951:4;24947:9;24940:5;24936:21;24927:30;;25000:4;24990:8;24986:19;24979:5;24976:30;24966:40;;24695:317;;24619:393;;;;;:::o;25018:60::-;25046:3;25067:5;25060:12;;25018:60;;;:::o;25084:142::-;25134:9;25167:53;25185:34;25194:24;25212:5;25194:24;:::i;:::-;25185:34;:::i;:::-;25167:53;:::i;:::-;25154:66;;25084:142;;;:::o;25232:75::-;25275:3;25296:5;25289:12;;25232:75;;;:::o;25313:269::-;25423:39;25454:7;25423:39;:::i;:::-;25484:91;25533:41;25557:16;25533:41;:::i;:::-;25525:6;25518:4;25512:11;25484:91;:::i;:::-;25478:4;25471:105;25389:193;25313:269;;;:::o;25588:73::-;25633:3;25588:73;:::o;25667:189::-;25744:32;;:::i;:::-;25785:65;25843:6;25835;25829:4;25785:65;:::i;:::-;25720:136;25667:189;;:::o;25862:186::-;25922:120;25939:3;25932:5;25929:14;25922:120;;;25993:39;26030:1;26023:5;25993:39;:::i;:::-;25966:1;25959:5;25955:13;25946:22;;25922:120;;;25862:186;;:::o;26054:543::-;26155:2;26150:3;26147:11;26144:446;;;26189:38;26221:5;26189:38;:::i;:::-;26273:29;26291:10;26273:29;:::i;:::-;26263:8;26259:44;26456:2;26444:10;26441:18;26438:49;;;26477:8;26462:23;;26438:49;26500:80;26556:22;26574:3;26556:22;:::i;:::-;26546:8;26542:37;26529:11;26500:80;:::i;:::-;26159:431;;26144:446;26054:543;;;:::o;26603:117::-;26657:8;26707:5;26701:4;26697:16;26676:37;;26603:117;;;;:::o;26726:169::-;26770:6;26803:51;26851:1;26847:6;26839:5;26836:1;26832:13;26803:51;:::i;:::-;26799:56;26884:4;26878;26874:15;26864:25;;26777:118;26726:169;;;;:::o;26900:295::-;26976:4;27122:29;27147:3;27141:4;27122:29;:::i;:::-;27114:37;;27184:3;27181:1;27177:11;27171:4;27168:21;27160:29;;26900:295;;;;:::o;27200:1403::-;27324:44;27364:3;27359;27324:44;:::i;:::-;27433:18;27425:6;27422:30;27419:56;;;27455:18;;:::i;:::-;27419:56;27499:38;27531:4;27525:11;27499:38;:::i;:::-;27584:67;27644:6;27636;27630:4;27584:67;:::i;:::-;27678:1;27707:2;27699:6;27696:14;27724:1;27719:632;;;;28395:1;28412:6;28409:84;;;28468:9;28463:3;28459:19;28446:33;28437:42;;28409:84;28519:67;28579:6;28572:5;28519:67;:::i;:::-;28513:4;28506:81;28368:229;27689:908;;27719:632;27771:4;27767:9;27759:6;27755:22;27805:37;27837:4;27805:37;:::i;:::-;27864:1;27878:215;27892:7;27889:1;27886:14;27878:215;;;27978:9;27973:3;27969:19;27956:33;27948:6;27941:49;28029:1;28021:6;28017:14;28007:24;;28076:2;28065:9;28061:18;28048:31;;27915:4;27912:1;27908:12;27903:17;;27878:215;;;28121:6;28112:7;28109:19;28106:186;;;28186:9;28181:3;28177:19;28164:33;28229:48;28271:4;28263:6;28259:17;28248:9;28229:48;:::i;:::-;28221:6;28214:64;28129:163;28106:186;28338:1;28334;28326:6;28322:14;28318:22;28312:4;28305:36;27726:625;;;27689:908;;27299:1304;;;27200:1403;;;:::o;28633:317::-;28731:3;28752:71;28816:6;28811:3;28752:71;:::i;:::-;28745:78;;28833:56;28882:6;28877:3;28870:5;28833:56;:::i;:::-;28914:29;28936:6;28914:29;:::i;:::-;28909:3;28905:39;28898:46;;28633:317;;;;;:::o;28956:333::-;29079:4;29117:2;29106:9;29102:18;29094:26;;29166:9;29160:4;29156:20;29152:1;29141:9;29137:17;29130:47;29194:88;29277:4;29268:6;29260;29194:88;:::i;:::-;29186:96;;28956:333;;;;;:::o;29295:180::-;29435:32;29431:1;29423:6;29419:14;29412:56;29295:180;:::o;29481:366::-;29623:3;29644:67;29708:2;29703:3;29644:67;:::i;:::-;29637:74;;29720:93;29809:3;29720:93;:::i;:::-;29838:2;29833:3;29829:12;29822:19;;29481:366;;;:::o;29853:419::-;30019:4;30057:2;30046:9;30042:18;30034:26;;30106:9;30100:4;30096:20;30092:1;30081:9;30077:17;30070:47;30134:131;30260:4;30134:131;:::i;:::-;30126:139;;29853:419;;;:::o;30278:162::-;30418:14;30414:1;30406:6;30402:14;30395:38;30278:162;:::o;30446:366::-;30588:3;30609:67;30673:2;30668:3;30609:67;:::i;:::-;30602:74;;30685:93;30774:3;30685:93;:::i;:::-;30803:2;30798:3;30794:12;30787:19;;30446:366;;;:::o;30818:419::-;30984:4;31022:2;31011:9;31007:18;30999:26;;31071:9;31065:4;31061:20;31057:1;31046:9;31042:17;31035:47;31099:131;31225:4;31099:131;:::i;:::-;31091:139;;30818:419;;;:::o;31243:191::-;31283:3;31302:20;31320:1;31302:20;:::i;:::-;31297:25;;31336:20;31354:1;31336:20;:::i;:::-;31331:25;;31379:1;31376;31372:9;31365:16;;31400:3;31397:1;31394:10;31391:36;;;31407:18;;:::i;:::-;31391:36;31243:191;;;;:::o;31440:164::-;31580:16;31576:1;31568:6;31564:14;31557:40;31440:164;:::o;31610:366::-;31752:3;31773:67;31837:2;31832:3;31773:67;:::i;:::-;31766:74;;31849:93;31938:3;31849:93;:::i;:::-;31967:2;31962:3;31958:12;31951:19;;31610:366;;;:::o;31982:419::-;32148:4;32186:2;32175:9;32171:18;32163:26;;32235:9;32229:4;32225:20;32221:1;32210:9;32206:17;32199:47;32263:131;32389:4;32263:131;:::i;:::-;32255:139;;31982:419;;;:::o;32407:160::-;32547:12;32543:1;32535:6;32531:14;32524:36;32407:160;:::o;32573:366::-;32715:3;32736:67;32800:2;32795:3;32736:67;:::i;:::-;32729:74;;32812:93;32901:3;32812:93;:::i;:::-;32930:2;32925:3;32921:12;32914:19;;32573:366;;;:::o;32945:419::-;33111:4;33149:2;33138:9;33134:18;33126:26;;33198:9;33192:4;33188:20;33184:1;33173:9;33169:17;33162:47;33226:131;33352:4;33226:131;:::i;:::-;33218:139;;32945:419;;;:::o;33370:223::-;33510:34;33506:1;33498:6;33494:14;33487:58;33579:6;33574:2;33566:6;33562:15;33555:31;33370:223;:::o;33599:366::-;33741:3;33762:67;33826:2;33821:3;33762:67;:::i;:::-;33755:74;;33838:93;33927:3;33838:93;:::i;:::-;33956:2;33951:3;33947:12;33940:19;;33599:366;;;:::o;33971:419::-;34137:4;34175:2;34164:9;34160:18;34152:26;;34224:9;34218:4;34214:20;34210:1;34199:9;34195:17;34188:47;34252:131;34378:4;34252:131;:::i;:::-;34244:139;;33971:419;;;:::o;34396:94::-;34429:8;34477:5;34473:2;34469:14;34448:35;;34396:94;;;:::o;34496:::-;34535:7;34564:20;34578:5;34564:20;:::i;:::-;34553:31;;34496:94;;;:::o;34596:100::-;34635:7;34664:26;34684:5;34664:26;:::i;:::-;34653:37;;34596:100;;;:::o;34702:157::-;34807:45;34827:24;34845:5;34827:24;:::i;:::-;34807:45;:::i;:::-;34802:3;34795:58;34702:157;;:::o;34865:256::-;34977:3;34992:75;35063:3;35054:6;34992:75;:::i;:::-;35092:2;35087:3;35083:12;35076:19;;35112:3;35105:10;;34865:256;;;;:::o;35127:79::-;35166:7;35195:5;35184:16;;35127:79;;;:::o;35212:157::-;35317:45;35337:24;35355:5;35337:24;:::i;:::-;35317:45;:::i;:::-;35312:3;35305:58;35212:157;;:::o;35375:256::-;35487:3;35502:75;35573:3;35564:6;35502:75;:::i;:::-;35602:2;35597:3;35593:12;35586:19;;35622:3;35615:10;;35375:256;;;;:::o;35637:182::-;35777:34;35773:1;35765:6;35761:14;35754:58;35637:182;:::o;35825:366::-;35967:3;35988:67;36052:2;36047:3;35988:67;:::i;:::-;35981:74;;36064:93;36153:3;36064:93;:::i;:::-;36182:2;36177:3;36173:12;36166:19;;35825:366;;;:::o;36197:419::-;36363:4;36401:2;36390:9;36386:18;36378:26;;36450:9;36444:4;36440:20;36436:1;36425:9;36421:17;36414:47;36478:131;36604:4;36478:131;:::i;:::-;36470:139;;36197:419;;;:::o;36622:180::-;36670:77;36667:1;36660:88;36767:4;36764:1;36757:15;36791:4;36788:1;36781:15;36808:233;36847:3;36870:24;36888:5;36870:24;:::i;:::-;36861:33;;36916:66;36909:5;36906:77;36903:103;;36986:18;;:::i;:::-;36903:103;37033:1;37026:5;37022:13;37015:20;;36808:233;;;:::o;37047:165::-;37187:17;37183:1;37175:6;37171:14;37164:41;37047:165;:::o;37218:366::-;37360:3;37381:67;37445:2;37440:3;37381:67;:::i;:::-;37374:74;;37457:93;37546:3;37457:93;:::i;:::-;37575:2;37570:3;37566:12;37559:19;;37218:366;;;:::o;37590:419::-;37756:4;37794:2;37783:9;37779:18;37771:26;;37843:9;37837:4;37833:20;37829:1;37818:9;37814:17;37807:47;37871:131;37997:4;37871:131;:::i;:::-;37863:139;;37590:419;;;:::o;38015:180::-;38155:32;38151:1;38143:6;38139:14;38132:56;38015:180;:::o;38201:366::-;38343:3;38364:67;38428:2;38423:3;38364:67;:::i;:::-;38357:74;;38440:93;38529:3;38440:93;:::i;:::-;38558:2;38553:3;38549:12;38542:19;;38201:366;;;:::o;38573:419::-;38739:4;38777:2;38766:9;38762:18;38754:26;;38826:9;38820:4;38816:20;38812:1;38801:9;38797:17;38790:47;38854:131;38980:4;38854:131;:::i;:::-;38846:139;;38573:419;;;:::o;38998:169::-;39138:21;39134:1;39126:6;39122:14;39115:45;38998:169;:::o;39173:366::-;39315:3;39336:67;39400:2;39395:3;39336:67;:::i;:::-;39329:74;;39412:93;39501:3;39412:93;:::i;:::-;39530:2;39525:3;39521:12;39514:19;;39173:366;;;:::o;39545:419::-;39711:4;39749:2;39738:9;39734:18;39726:26;;39798:9;39792:4;39788:20;39784:1;39773:9;39769:17;39762:47;39826:131;39952:4;39826:131;:::i;:::-;39818:139;;39545:419;;;:::o;39970:148::-;40072:11;40109:3;40094:18;;39970:148;;;;:::o;40148:874::-;40251:3;40288:5;40282:12;40317:36;40343:9;40317:36;:::i;:::-;40369:89;40451:6;40446:3;40369:89;:::i;:::-;40362:96;;40489:1;40478:9;40474:17;40505:1;40500:166;;;;40680:1;40675:341;;;;40467:549;;40500:166;40584:4;40580:9;40569;40565:25;40560:3;40553:38;40646:6;40639:14;40632:22;40624:6;40620:35;40615:3;40611:45;40604:52;;40500:166;;40675:341;40742:38;40774:5;40742:38;:::i;:::-;40802:1;40816:154;40830:6;40827:1;40824:13;40816:154;;;40904:7;40898:14;40894:1;40889:3;40885:11;40878:35;40954:1;40945:7;40941:15;40930:26;;40852:4;40849:1;40845:12;40840:17;;40816:154;;;40999:6;40994:3;40990:16;40983:23;;40682:334;;40467:549;;40255:767;;40148:874;;;;:::o;41028:390::-;41134:3;41162:39;41195:5;41162:39;:::i;:::-;41217:89;41299:6;41294:3;41217:89;:::i;:::-;41210:96;;41315:65;41373:6;41368:3;41361:4;41354:5;41350:16;41315:65;:::i;:::-;41405:6;41400:3;41396:16;41389:23;;41138:280;41028:390;;;;:::o;41424:583::-;41646:3;41668:92;41756:3;41747:6;41668:92;:::i;:::-;41661:99;;41777:95;41868:3;41859:6;41777:95;:::i;:::-;41770:102;;41889:92;41977:3;41968:6;41889:92;:::i;:::-;41882:99;;41998:3;41991:10;;41424:583;;;;;;:::o;42013:182::-;42153:34;42149:1;42141:6;42137:14;42130:58;42013:182;:::o;42201:366::-;42343:3;42364:67;42428:2;42423:3;42364:67;:::i;:::-;42357:74;;42440:93;42529:3;42440:93;:::i;:::-;42558:2;42553:3;42549:12;42542:19;;42201:366;;;:::o;42573:419::-;42739:4;42777:2;42766:9;42762:18;42754:26;;42826:9;42820:4;42816:20;42812:1;42801:9;42797:17;42790:47;42854:131;42980:4;42854:131;:::i;:::-;42846:139;;42573:419;;;:::o;42998:181::-;43138:33;43134:1;43126:6;43122:14;43115:57;42998:181;:::o;43185:366::-;43327:3;43348:67;43412:2;43407:3;43348:67;:::i;:::-;43341:74;;43424:93;43513:3;43424:93;:::i;:::-;43542:2;43537:3;43533:12;43526:19;;43185:366;;;:::o;43557:419::-;43723:4;43761:2;43750:9;43746:18;43738:26;;43810:9;43804:4;43800:20;43796:1;43785:9;43781:17;43774:47;43838:131;43964:4;43838:131;:::i;:::-;43830:139;;43557:419;;;:::o;43982:98::-;44033:6;44067:5;44061:12;44051:22;;43982:98;;;:::o;44086:168::-;44169:11;44203:6;44198:3;44191:19;44243:4;44238:3;44234:14;44219:29;;44086:168;;;;:::o;44260:373::-;44346:3;44374:38;44406:5;44374:38;:::i;:::-;44428:70;44491:6;44486:3;44428:70;:::i;:::-;44421:77;;44507:65;44565:6;44560:3;44553:4;44546:5;44542:16;44507:65;:::i;:::-;44597:29;44619:6;44597:29;:::i;:::-;44592:3;44588:39;44581:46;;44350:283;44260:373;;;;:::o;44639:640::-;44834:4;44872:3;44861:9;44857:19;44849:27;;44886:71;44954:1;44943:9;44939:17;44930:6;44886:71;:::i;:::-;44967:72;45035:2;45024:9;45020:18;45011:6;44967:72;:::i;:::-;45049;45117:2;45106:9;45102:18;45093:6;45049:72;:::i;:::-;45168:9;45162:4;45158:20;45153:2;45142:9;45138:18;45131:48;45196:76;45267:4;45258:6;45196:76;:::i;:::-;45188:84;;44639:640;;;;;;;:::o;45285:141::-;45341:5;45372:6;45366:13;45357:22;;45388:32;45414:5;45388:32;:::i;:::-;45285:141;;;;:::o;45432:349::-;45501:6;45550:2;45538:9;45529:7;45525:23;45521:32;45518:119;;;45556:79;;:::i;:::-;45518:119;45676:1;45701:63;45756:7;45747:6;45736:9;45732:22;45701:63;:::i;:::-;45691:73;;45647:127;45432:349;;;;:::o;45787:225::-;45927:34;45923:1;45915:6;45911:14;45904:58;45996:8;45991:2;45983:6;45979:15;45972:33;45787:225;:::o;46018:366::-;46160:3;46181:67;46245:2;46240:3;46181:67;:::i;:::-;46174:74;;46257:93;46346:3;46257:93;:::i;:::-;46375:2;46370:3;46366:12;46359:19;;46018:366;;;:::o;46390:419::-;46556:4;46594:2;46583:9;46579:18;46571:26;;46643:9;46637:4;46633:20;46629:1;46618:9;46614:17;46607:47;46671:131;46797:4;46671:131;:::i;:::-;46663:139;;46390:419;;;:::o

Swarm Source

ipfs://60ff2734b3bbf6e9d9416d2a6458609955f8333132c46746db4944dc6a9528cd
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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