ETH Price: $3,684.15 (+3.22%)

Token

SCHIZO.PHRENIA (SCHIZO)
 

Overview

Max Total Supply

798 SCHIZO

Holders

231

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
gvall.eth
Balance
1 SCHIZO
0x2fe3553bd3cc5bcc4b0242a34257db1f0bde37f9
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:
SCHIZOphreniaNFT

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 7 of 7: schizophrenia.sol
//.dP"Y8  dP""b8 88  88 88 8888P  dP"Yb      88""Yb 88  88 88""Yb 888888 88b 88 88    db    
//`Ybo." dP   `" 88  88 88   dP  dP   Yb     88__dP 88  88 88__dP 88__   88Yb88 88   dPYb   
//o.`Y8b Yb      888888 88  dP   Yb   dP .o. 88"""  888888 88"Yb  88""   88 Y88 88  dP__Yb  
//8bodP'  YboodP 88  88 88 d8888  YbodP  `"' 88     88  88 88  Yb 888888 88  Y8 88 dP""""Yb



//I'm hearing voices.
// SPDX-License-Identifier: None

pragma solidity ^0.8.4;

import "./ERC721A.sol";
import "./Ownable.sol";
import "./ERC721AQueryable.sol";
import "./Context.sol";

contract SCHIZOphreniaNFT is ERC721A, ERC721AQueryable, Ownable {
  uint256 public EXTRA_MINT_PRICE = 0.005 ether;
  uint256 public MAX_SUPPLY_PLUS_ONE  = 5001;
  uint256 public MAX_FREE_SUPPLY = 1;
  uint256 public constant MAX_PER_TRANSACTION_PLUS_ONE = 11;


  string tokenBaseUri = "";

  bool public paused = true;

  address public immutable proxyRegistryAddress;

  mapping(address => uint256) private _freeMintedCount;

  constructor(address _proxyRegistryAddress) ERC721A("SCHIZO.PHRENIA", "SCHIZO") {
    proxyRegistryAddress = _proxyRegistryAddress;
  }

  function mint(uint256 _quantity) external payable {
    require(!paused, "Minting is Paused");

    uint256 _totalSupply = totalSupply();

    require(_totalSupply + _quantity < MAX_SUPPLY_PLUS_ONE, "Exceeds Supply");
    require(_quantity < MAX_PER_TRANSACTION_PLUS_ONE, "Exceed Max Supply");

    // Free Mints
    uint256 payForCount = _quantity;
    uint256 freeMintCount = _freeMintedCount[msg.sender];

    if (freeMintCount < MAX_FREE_SUPPLY) {
      if (_quantity > MAX_FREE_SUPPLY) {
        payForCount = _quantity - MAX_FREE_SUPPLY;
      } else {
        payForCount = 0;
      }

      _freeMintedCount[msg.sender] = MAX_FREE_SUPPLY;
    }



    require(msg.value >= payForCount * EXTRA_MINT_PRICE, "Ether amount sent wrong");

    _mint(msg.sender, _quantity);
  }

  function freeMintedCount(address owner) external view returns (uint256) {
    return _freeMintedCount[owner];
  }

  function _startTokenId() internal pure override returns (uint256) {
    return 1;
  }

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

  function configMaxFreePrice(uint256 newPrice) public onlyOwner {
        MAX_FREE_SUPPLY = newPrice;
    }


 function configActualPrice(uint256 newnewPrice) public onlyOwner {
        EXTRA_MINT_PRICE = newnewPrice;
    }

    function configtotalsupply(uint256 newsupply) public onlyOwner {
        MAX_SUPPLY_PLUS_ONE = newsupply;
    }
    
  function isApprovedForAll(address owner, address operator)
    public
    view
   override(ERC721A, IERC721A)
    returns (bool)
  {
    OpenSeaProxyRegistry proxyRegistry = OpenSeaProxyRegistry(
      proxyRegistryAddress
    );

    if (address(proxyRegistry.proxies(owner)) == operator) {
      return true;
    }

    return super.isApprovedForAll(owner, operator);
  }

  function setBaseURI(string calldata _newBaseUri) external onlyOwner {
    tokenBaseUri = _newBaseUri;
  }

  function flipSale() external onlyOwner {
    paused = !paused;
  }

function collectReserves(address[] calldata addresses, uint256 quantity)
    external
    onlyOwner
  {
    uint256 _totalSupply = totalSupply();

    require(
      _totalSupply + quantity * addresses.length <= MAX_SUPPLY_PLUS_ONE,
      "Exceeds max supply"
    );

    for (uint256 i = 0; i < addresses.length; i++) {
      _mint(addresses[i], quantity);
    }
  }

  function withdraw() external onlyOwner {
    require(
      payable(owner()).send(address(this).balance),
      "Withdraw Unsuccessful"
    );
  }
}


contract OwnableDelegateProxy {}

contract OpenSeaProxyRegistry {
  mapping(address => OwnableDelegateProxy) public proxies;
}

File 1 of 7: 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 7: ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.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 {
    // 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 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`
    mapping(uint256 => uint256) private _packedOwnerships;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            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;
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @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.
     */
    function _mint(address to, uint256 quantity) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @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 _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

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

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

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

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

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

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

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

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

File 3 of 7: ERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721AQueryable.sol';
import './ERC721A.sol';

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
        unchecked {
            uint256 tokenIdsLength = tokenIds.length;
            TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
            for (uint256 i; i != tokenIdsLength; ++i) {
                ownerships[i] = explicitOwnershipOf(tokenIds[i]);
            }
            return ownerships;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
        unchecked {
            if (start >= stop) revert InvalidQueryRange();
            uint256 tokenIdsIdx;
            uint256 stopLimit = _nextTokenId();
            // Set `start = max(start, _startTokenId())`.
            if (start < _startTokenId()) {
                start = _startTokenId();
            }
            // Set `stop = min(stop, stopLimit)`.
            if (stop > stopLimit) {
                stop = stopLimit;
            }
            uint256 tokenIdsMaxLength = balanceOf(owner);
            // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
            // to cater for cases where `balanceOf(owner)` is too big.
            if (start < stop) {
                uint256 rangeLength = stop - start;
                if (rangeLength < tokenIdsMaxLength) {
                    tokenIdsMaxLength = rangeLength;
                }
            } else {
                tokenIdsMaxLength = 0;
            }
            uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
            if (tokenIdsMaxLength == 0) {
                return tokenIds;
            }
            // We need to call `explicitOwnershipOf(start)`,
            // because the slot at `start` may not be initialized.
            TokenOwnership memory ownership = explicitOwnershipOf(start);
            address currOwnershipAddr;
            // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
            // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
            if (!ownership.burned) {
                currOwnershipAddr = ownership.addr;
            }
            for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            // Downsize the array to fit.
            assembly {
                mstore(tokenIds, tokenIdsIdx)
            }
            return tokenIds;
        }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
        unchecked {
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            uint256 tokenIdsLength = balanceOf(owner);
            uint256[] memory tokenIds = new uint256[](tokenIdsLength);
            TokenOwnership memory ownership;
            for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
                ownership = _ownershipAt(i);
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    tokenIds[tokenIdsIdx++] = i;
                }
            }
            return tokenIds;
        }
    }
}

File 4 of 7: IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.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();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

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

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

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

File 5 of 7: IERC721AQueryable.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

File 6 of 7: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":[],"name":"EXTRA_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_TRANSACTION_PLUS_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_PLUS_ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"collectReserves","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newnewPrice","type":"uint256"}],"name":"configActualPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"configMaxFreePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newsupply","type":"uint256"}],"name":"configtotalsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"freeMintedCount","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":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526611c37937e08000600955611389600a556001600b5560405180602001604052806000815250600c90816200003a9190620004dd565b506001600d60006101000a81548160ff0219169083151502179055503480156200006357600080fd5b50604051620045ca380380620045ca83398181016040528101906200008991906200062e565b6040518060400160405280600e81526020017f534348495a4f2e504852454e49410000000000000000000000000000000000008152506040518060400160405280600681526020017f534348495a4f00000000000000000000000000000000000000000000000000008152508160029081620001069190620004dd565b508060039081620001189190620004dd565b50620001296200018c60201b60201c565b600081905550505062000151620001456200019560201b60201c565b6200019d60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000660565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002e557607f821691505b602082108103620002fb57620002fa6200029d565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003657fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000326565b62000371868362000326565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003be620003b8620003b28462000389565b62000393565b62000389565b9050919050565b6000819050919050565b620003da836200039d565b620003f2620003e982620003c5565b84845462000333565b825550505050565b600090565b62000409620003fa565b62000416818484620003cf565b505050565b5b818110156200043e5762000432600082620003ff565b6001810190506200041c565b5050565b601f8211156200048d57620004578162000301565b620004628462000316565b8101602085101562000472578190505b6200048a620004818562000316565b8301826200041b565b50505b505050565b600082821c905092915050565b6000620004b26000198460080262000492565b1980831691505092915050565b6000620004cd83836200049f565b9150826002028217905092915050565b620004e88262000263565b67ffffffffffffffff8111156200050457620005036200026e565b5b620005108254620002cc565b6200051d82828562000442565b600060209050601f83116001811462000555576000841562000540578287015190505b6200054c8582620004bf565b865550620005bc565b601f198416620005658662000301565b60005b828110156200058f5784890151825560018201915060208501945060208101905062000568565b86831015620005af5784890151620005ab601f8916826200049f565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005f682620005c9565b9050919050565b6200060881620005e9565b81146200061457600080fd5b50565b6000815190506200062881620005fd565b92915050565b600060208284031215620006475762000646620005c4565b5b6000620006578482850162000617565b91505092915050565b608051613f476200068360003960008181611c210152611c480152613f476000f3fe60806040526004361061020f5760003560e01c80638090839311610118578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd1461078e578063cd7c0326146107cb578063e985e9c5146107f6578063f2b7813214610833578063f2fde38b1461085c5761020f565b8063a0712d68146106e3578063a22cb465146106ff578063b88d4fde14610728578063c23dc68f146107515761020f565b8063909c0c20116100e7578063909c0c20146105ea57806395d89b411461061357806396b04c751461063e578063981332351461066957806399a2557a146106a65761020f565b8063809083931461052e57806382d5b249146105575780638462151c146105825780638da5cb5b146105bf5761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e1461045b5780636b1ec2e41461049857806370a08231146104c3578063715018a6146105005780637ba5e621146105175761020f565b806342842e0e146103a157806355f804b3146103ca5780635bbb2177146103f35780635c975abb146104305761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806318160ddd1461030d57806323b872dd1461033857806333f15a1f146103615780633ccfd60b1461038a5761020f565b806301ffc9a71461021457806302ddb65b1461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612ac2565b610885565b6040516102489190612b0a565b60405180910390f35b34801561025d57600080fd5b50610266610917565b6040516102739190612b3e565b60405180910390f35b34801561028857600080fd5b5061029161091d565b60405161029e9190612bf2565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190612c40565b6109af565b6040516102db9190612cae565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190612cf5565b610a2b565b005b34801561031957600080fd5b50610322610bd1565b60405161032f9190612b3e565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190612d35565b610be8565b005b34801561036d57600080fd5b5061038860048036038101906103839190612ded565b610bf8565b005b34801561039657600080fd5b5061039f610d37565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612d35565b610e30565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612ea3565b610e50565b005b3480156103ff57600080fd5b5061041a6004803603810190610415919061302e565b610ee2565b60405161042791906131a9565b60405180910390f35b34801561043c57600080fd5b50610445610fa3565b6040516104529190612b0a565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190612c40565b610fb6565b60405161048f9190612cae565b60405180910390f35b3480156104a457600080fd5b506104ad610fc8565b6040516104ba9190612b3e565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906131cb565b610fcd565b6040516104f79190612b3e565b60405180910390f35b34801561050c57600080fd5b50610515611085565b005b34801561052357600080fd5b5061052c61110d565b005b34801561053a57600080fd5b5061055560048036038101906105509190612c40565b6111b5565b005b34801561056357600080fd5b5061056c61123b565b6040516105799190612b3e565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a491906131cb565b611241565b6040516105b691906132b6565b60405180910390f35b3480156105cb57600080fd5b506105d4611384565b6040516105e19190612cae565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190612c40565b6113ae565b005b34801561061f57600080fd5b50610628611434565b6040516106359190612bf2565b60405180910390f35b34801561064a57600080fd5b506106536114c6565b6040516106609190612b3e565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b91906131cb565b6114cc565b60405161069d9190612b3e565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906132d8565b611515565b6040516106da91906132b6565b60405180910390f35b6106fd60048036038101906106f89190612c40565b611721565b005b34801561070b57600080fd5b5061072660048036038101906107219190613357565b61192d565b005b34801561073457600080fd5b5061074f600480360381019061074a919061344c565b611aa4565b005b34801561075d57600080fd5b5061077860048036038101906107739190612c40565b611b17565b6040516107859190613511565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612c40565b611b81565b6040516107c29190612bf2565b60405180910390f35b3480156107d757600080fd5b506107e0611c1f565b6040516107ed9190612cae565b60405180910390f35b34801561080257600080fd5b5061081d6004803603810190610818919061352c565b611c43565b60405161082a9190612b0a565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190612c40565b611d33565b005b34801561086857600080fd5b50610883600480360381019061087e91906131cb565b611db9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109105750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461092c9061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546109589061359b565b80156109a55780601f1061097a576101008083540402835291602001916109a5565b820191906000526020600020905b81548152906001019060200180831161098857829003601f168201915b5050505050905090565b60006109ba82611eb0565b6109f0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3682611f0f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610abc611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614610b1f57610ae881610ae3611fdb565b611c43565b610b1e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bdb611fe3565b6001546000540303905090565b610bf3838383611fec565b505050565b610c00612393565b73ffffffffffffffffffffffffffffffffffffffff16610c1e611384565b73ffffffffffffffffffffffffffffffffffffffff1614610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b90613618565b60405180910390fd5b6000610c7e610bd1565b9050600a548484905083610c929190613667565b82610c9d91906136c1565b1115610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590613763565b60405180910390fd5b60005b84849050811015610d3057610d1d858583818110610d0257610d01613783565b5b9050602002016020810190610d1791906131cb565b8461239b565b8080610d28906137b2565b915050610ce1565b5050505050565b610d3f612393565b73ffffffffffffffffffffffffffffffffffffffff16610d5d611384565b73ffffffffffffffffffffffffffffffffffffffff1614610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613618565b60405180910390fd5b610dbb611384565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613846565b60405180910390fd5b565b610e4b83838360405180602001604052806000815250611aa4565b505050565b610e58612393565b73ffffffffffffffffffffffffffffffffffffffff16610e76611384565b73ffffffffffffffffffffffffffffffffffffffff1614610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390613618565b60405180910390fd5b8181600c9182610edd929190613a1d565b505050565b606060008251905060008167ffffffffffffffff811115610f0657610f05612ef0565b5b604051908082528060200260200182016040528015610f3f57816020015b610f2c612a13565b815260200190600190039081610f245790505b50905060005b828114610f9857610f6f858281518110610f6257610f61613783565b5b6020026020010151611b17565b828281518110610f8257610f81613783565b5b6020026020010181905250806001019050610f45565b508092505050919050565b600d60009054906101000a900460ff1681565b6000610fc182611f0f565b9050919050565b600b81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611034576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61108d612393565b73ffffffffffffffffffffffffffffffffffffffff166110ab611384565b73ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890613618565b60405180910390fd5b61110b600061256d565b565b611115612393565b73ffffffffffffffffffffffffffffffffffffffff16611133611384565b73ffffffffffffffffffffffffffffffffffffffff1614611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613618565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111bd612393565b73ffffffffffffffffffffffffffffffffffffffff166111db611384565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890613618565b60405180910390fd5b80600a8190555050565b600a5481565b6060600080600061125185610fcd565b905060008167ffffffffffffffff81111561126f5761126e612ef0565b5b60405190808252806020026020018201604052801561129d5781602001602082028036833780820191505090505b5090506112a8612a13565b60006112b2611fe3565b90505b838614611376576112c581612633565b9150816040015161136b57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461131057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361136a578083878060010198508151811061135d5761135c613783565b5b6020026020010181815250505b5b8060010190506112b5565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113b6612393565b73ffffffffffffffffffffffffffffffffffffffff166113d4611384565b73ffffffffffffffffffffffffffffffffffffffff161461142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190613618565b60405180910390fd5b80600b8190555050565b6060600380546114439061359b565b80601f016020809104026020016040519081016040528092919081815260200182805461146f9061359b565b80156114bc5780601f10611491576101008083540402835291602001916114bc565b820191906000526020600020905b81548152906001019060200180831161149f57829003601f168201915b5050505050905090565b60095481565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060818310611550576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061155b61265e565b9050611565611fe3565b85101561157757611574611fe3565b94505b80841115611583578093505b600061158e87610fcd565b9050848610156115b15760008686039050818110156115ab578091505b506115b6565b600090505b60008167ffffffffffffffff8111156115d2576115d1612ef0565b5b6040519080825280602002602001820160405280156116005781602001602082028036833780820191505090505b50905060008203611617578094505050505061171a565b600061162288611b17565b90506000816040015161163757816000015190505b60008990505b88811415801561164d5750848714155b1561170c5761165b81612633565b9250826040015161170157600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146116a657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361170057808488806001019950815181106116f3576116f2613783565b5b6020026020010181815250505b5b80600101905061163d565b508583528296505050505050505b9392505050565b600d60009054906101000a900460ff1615611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613b39565b60405180910390fd5b600061177b610bd1565b9050600a54828261178c91906136c1565b106117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c390613ba5565b60405180910390fd5b600b821061180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613c11565b60405180910390fd5b60008290506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b548110156118cd57600b5484111561188157600b548461187a9190613c31565b9150611886565b600091505b600b54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600954826118db9190613667565b34101561191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490613cb1565b60405180910390fd5b611927338561239b565b50505050565b611935611fdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611999576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119a6611fdb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a53611fdb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a989190612b0a565b60405180910390a35050565b611aaf848484611fec565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b1157611ada84848484612667565b611b10576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b1f612a13565b611b27612a13565b611b2f611fe3565b831080611b435750611b3f61265e565b8310155b15611b515780915050611b7c565b611b5a83612633565b9050806040015115611b6f5780915050611b7c565b611b78836127b7565b9150505b919050565b6060611b8c82611eb0565b611bc2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bcc6127d7565b90506000815103611bec5760405180602001604052806000815250611c17565b80611bf684612869565b604051602001611c07929190613d0d565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000807f000000000000000000000000000000000000000000000000000000000000000090508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611cb99190612cae565b602060405180830381865afa158015611cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfa9190613d6f565b73ffffffffffffffffffffffffffffffffffffffff1603611d1f576001915050611d2d565b611d2984846128c3565b9150505b92915050565b611d3b612393565b73ffffffffffffffffffffffffffffffffffffffff16611d59611384565b73ffffffffffffffffffffffffffffffffffffffff1614611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613618565b60405180910390fd5b8060098190555050565b611dc1612393565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611384565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90613e0e565b60405180910390fd5b611ead8161256d565b50565b600081611ebb611fe3565b11158015611eca575060005482105b8015611f08575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611f1e611fe3565b11611fa457600054811015611fa35760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611fa1575b60008103611f97576004600083600190039350838152602001908152602001600020549050611f6d565b8092505050611fd6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6000611ff782611f0f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461205e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661207f611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614806120ae57506120ad856120a8611fdb565b611c43565b5b806120f357506120bc611fdb565b73ffffffffffffffffffffffffffffffffffffffff166120db846109af565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061212c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612192576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61219f8585856001612957565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61229c8661295d565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036123245760006001840190506000600460008381526020019081526020016000205403612322576000548114612321578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461238c8585856001612967565b5050505050565b600033905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612407576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612441576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61244e6000848385612957565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124b36001841461296d565b901b60a042901b6124c38561295d565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106124e9578160008190555050506125686000848385612967565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61263b612a13565b6126576004600084815260200190815260200160002054612977565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261268d611fdb565b8786866040518563ffffffff1660e01b81526004016126af9493929190613e83565b6020604051808303816000875af19250505080156126eb57506040513d601f19601f820116820180604052508101906126e89190613ee4565b60015b612764573d806000811461271b576040519150601f19603f3d011682016040523d82523d6000602084013e612720565b606091505b50600081510361275c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6127bf612a13565b6127d06127cb83611f0f565b612977565b9050919050565b6060600c80546127e69061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546128129061359b565b801561285f5780601f106128345761010080835404028352916020019161285f565b820191906000526020600020905b81548152906001019060200180831161284257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128af57600183039250600a81066030018353600a8104905061288f565b508181036020830392508083525050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b50505050565b6000819050919050565b50505050565b6000819050919050565b61297f612a13565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a9f81612a6a565b8114612aaa57600080fd5b50565b600081359050612abc81612a96565b92915050565b600060208284031215612ad857612ad7612a60565b5b6000612ae684828501612aad565b91505092915050565b60008115159050919050565b612b0481612aef565b82525050565b6000602082019050612b1f6000830184612afb565b92915050565b6000819050919050565b612b3881612b25565b82525050565b6000602082019050612b536000830184612b2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b93578082015181840152602081019050612b78565b83811115612ba2576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bde818560208601612b75565b612be781612ba8565b840191505092915050565b60006020820190508181036000830152612c0c8184612bb9565b905092915050565b612c1d81612b25565b8114612c2857600080fd5b50565b600081359050612c3a81612c14565b92915050565b600060208284031215612c5657612c55612a60565b5b6000612c6484828501612c2b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9882612c6d565b9050919050565b612ca881612c8d565b82525050565b6000602082019050612cc36000830184612c9f565b92915050565b612cd281612c8d565b8114612cdd57600080fd5b50565b600081359050612cef81612cc9565b92915050565b60008060408385031215612d0c57612d0b612a60565b5b6000612d1a85828601612ce0565b9250506020612d2b85828601612c2b565b9150509250929050565b600080600060608486031215612d4e57612d4d612a60565b5b6000612d5c86828701612ce0565b9350506020612d6d86828701612ce0565b9250506040612d7e86828701612c2b565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612dad57612dac612d88565b5b8235905067ffffffffffffffff811115612dca57612dc9612d8d565b5b602083019150836020820283011115612de657612de5612d92565b5b9250929050565b600080600060408486031215612e0657612e05612a60565b5b600084013567ffffffffffffffff811115612e2457612e23612a65565b5b612e3086828701612d97565b93509350506020612e4386828701612c2b565b9150509250925092565b60008083601f840112612e6357612e62612d88565b5b8235905067ffffffffffffffff811115612e8057612e7f612d8d565b5b602083019150836001820283011115612e9c57612e9b612d92565b5b9250929050565b60008060208385031215612eba57612eb9612a60565b5b600083013567ffffffffffffffff811115612ed857612ed7612a65565b5b612ee485828601612e4d565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f2882612ba8565b810181811067ffffffffffffffff82111715612f4757612f46612ef0565b5b80604052505050565b6000612f5a612a56565b9050612f668282612f1f565b919050565b600067ffffffffffffffff821115612f8657612f85612ef0565b5b602082029050602081019050919050565b6000612faa612fa584612f6b565b612f50565b90508083825260208201905060208402830185811115612fcd57612fcc612d92565b5b835b81811015612ff65780612fe28882612c2b565b845260208401935050602081019050612fcf565b5050509392505050565b600082601f83011261301557613014612d88565b5b8135613025848260208601612f97565b91505092915050565b60006020828403121561304457613043612a60565b5b600082013567ffffffffffffffff81111561306257613061612a65565b5b61306e84828501613000565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6130ac81612c8d565b82525050565b600067ffffffffffffffff82169050919050565b6130cf816130b2565b82525050565b6130de81612aef565b82525050565b6060820160008201516130fa60008501826130a3565b50602082015161310d60208501826130c6565b50604082015161312060408501826130d5565b50505050565b600061313283836130e4565b60608301905092915050565b6000602082019050919050565b600061315682613077565b6131608185613082565b935061316b83613093565b8060005b8381101561319c5781516131838882613126565b975061318e8361313e565b92505060018101905061316f565b5085935050505092915050565b600060208201905081810360008301526131c3818461314b565b905092915050565b6000602082840312156131e1576131e0612a60565b5b60006131ef84828501612ce0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61322d81612b25565b82525050565b600061323f8383613224565b60208301905092915050565b6000602082019050919050565b6000613263826131f8565b61326d8185613203565b935061327883613214565b8060005b838110156132a95781516132908882613233565b975061329b8361324b565b92505060018101905061327c565b5085935050505092915050565b600060208201905081810360008301526132d08184613258565b905092915050565b6000806000606084860312156132f1576132f0612a60565b5b60006132ff86828701612ce0565b935050602061331086828701612c2b565b925050604061332186828701612c2b565b9150509250925092565b61333481612aef565b811461333f57600080fd5b50565b6000813590506133518161332b565b92915050565b6000806040838503121561336e5761336d612a60565b5b600061337c85828601612ce0565b925050602061338d85828601613342565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156133b7576133b6612ef0565b5b6133c082612ba8565b9050602081019050919050565b82818337600083830152505050565b60006133ef6133ea8461339c565b612f50565b90508281526020810184848401111561340b5761340a613397565b5b6134168482856133cd565b509392505050565b600082601f83011261343357613432612d88565b5b81356134438482602086016133dc565b91505092915050565b6000806000806080858703121561346657613465612a60565b5b600061347487828801612ce0565b945050602061348587828801612ce0565b935050604061349687828801612c2b565b925050606085013567ffffffffffffffff8111156134b7576134b6612a65565b5b6134c38782880161341e565b91505092959194509250565b6060820160008201516134e560008501826130a3565b5060208201516134f860208501826130c6565b50604082015161350b60408501826130d5565b50505050565b600060608201905061352660008301846134cf565b92915050565b6000806040838503121561354357613542612a60565b5b600061355185828601612ce0565b925050602061356285828601612ce0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135b357607f821691505b6020821081036135c6576135c561356c565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613602602083612b64565b915061360d826135cc565b602082019050919050565b60006020820190508181036000830152613631816135f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061367282612b25565b915061367d83612b25565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136b6576136b5613638565b5b828202905092915050565b60006136cc82612b25565b91506136d783612b25565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561370c5761370b613638565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061374d601283612b64565b915061375882613717565b602082019050919050565b6000602082019050818103600083015261377c81613740565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006137bd82612b25565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137ef576137ee613638565b5b600182019050919050565b7f576974686472617720556e7375636365737366756c0000000000000000000000600082015250565b6000613830601583612b64565b915061383b826137fa565b602082019050919050565b6000602082019050818103600083015261385f81613823565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613896565b6138dd8683613896565b95508019841693508086168417925050509392505050565b6000819050919050565b600061391a61391561391084612b25565b6138f5565b612b25565b9050919050565b6000819050919050565b613934836138ff565b61394861394082613921565b8484546138a3565b825550505050565b600090565b61395d613950565b61396881848461392b565b505050565b5b8181101561398c57613981600082613955565b60018101905061396e565b5050565b601f8211156139d1576139a281613871565b6139ab84613886565b810160208510156139ba578190505b6139ce6139c685613886565b83018261396d565b50505b505050565b600082821c905092915050565b60006139f4600019846008026139d6565b1980831691505092915050565b6000613a0d83836139e3565b9150826002028217905092915050565b613a278383613866565b67ffffffffffffffff811115613a4057613a3f612ef0565b5b613a4a825461359b565b613a55828285613990565b6000601f831160018114613a845760008415613a72578287013590505b613a7c8582613a01565b865550613ae4565b601f198416613a9286613871565b60005b82811015613aba57848901358255600182019150602085019450602081019050613a95565b86831015613ad75784890135613ad3601f8916826139e3565b8355505b6001600288020188555050505b50505050505050565b7f4d696e74696e6720697320506175736564000000000000000000000000000000600082015250565b6000613b23601183612b64565b9150613b2e82613aed565b602082019050919050565b60006020820190508181036000830152613b5281613b16565b9050919050565b7f4578636565647320537570706c79000000000000000000000000000000000000600082015250565b6000613b8f600e83612b64565b9150613b9a82613b59565b602082019050919050565b60006020820190508181036000830152613bbe81613b82565b9050919050565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b6000613bfb601183612b64565b9150613c0682613bc5565b602082019050919050565b60006020820190508181036000830152613c2a81613bee565b9050919050565b6000613c3c82612b25565b9150613c4783612b25565b925082821015613c5a57613c59613638565b5b828203905092915050565b7f457468657220616d6f756e742073656e742077726f6e67000000000000000000600082015250565b6000613c9b601783612b64565b9150613ca682613c65565b602082019050919050565b60006020820190508181036000830152613cca81613c8e565b9050919050565b600081905092915050565b6000613ce782612b59565b613cf18185613cd1565b9350613d01818560208601612b75565b80840191505092915050565b6000613d198285613cdc565b9150613d258284613cdc565b91508190509392505050565b6000613d3c82612c8d565b9050919050565b613d4c81613d31565b8114613d5757600080fd5b50565b600081519050613d6981613d43565b92915050565b600060208284031215613d8557613d84612a60565b5b6000613d9384828501613d5a565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613df8602683612b64565b9150613e0382613d9c565b604082019050919050565b60006020820190508181036000830152613e2781613deb565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613e5582613e2e565b613e5f8185613e39565b9350613e6f818560208601612b75565b613e7881612ba8565b840191505092915050565b6000608082019050613e986000830187612c9f565b613ea56020830186612c9f565b613eb26040830185612b2f565b8181036060830152613ec48184613e4a565b905095945050505050565b600081519050613ede81612a96565b92915050565b600060208284031215613efa57613ef9612a60565b5b6000613f0884828501613ecf565b9150509291505056fea2646970667358221220a268ab7514f980acd4dc2f6f6a013bfce900a9e67dc540beacd0e8875d9e510264736f6c634300080f0033000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80638090839311610118578063a0712d68116100a0578063c87b56dd1161006f578063c87b56dd1461078e578063cd7c0326146107cb578063e985e9c5146107f6578063f2b7813214610833578063f2fde38b1461085c5761020f565b8063a0712d68146106e3578063a22cb465146106ff578063b88d4fde14610728578063c23dc68f146107515761020f565b8063909c0c20116100e7578063909c0c20146105ea57806395d89b411461061357806396b04c751461063e578063981332351461066957806399a2557a146106a65761020f565b8063809083931461052e57806382d5b249146105575780638462151c146105825780638da5cb5b146105bf5761020f565b806342842e0e1161019b5780636352211e1161016a5780636352211e1461045b5780636b1ec2e41461049857806370a08231146104c3578063715018a6146105005780637ba5e621146105175761020f565b806342842e0e146103a157806355f804b3146103ca5780635bbb2177146103f35780635c975abb146104305761020f565b8063095ea7b3116101e2578063095ea7b3146102e457806318160ddd1461030d57806323b872dd1461033857806333f15a1f146103615780633ccfd60b1461038a5761020f565b806301ffc9a71461021457806302ddb65b1461025157806306fdde031461027c578063081812fc146102a7575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612ac2565b610885565b6040516102489190612b0a565b60405180910390f35b34801561025d57600080fd5b50610266610917565b6040516102739190612b3e565b60405180910390f35b34801561028857600080fd5b5061029161091d565b60405161029e9190612bf2565b60405180910390f35b3480156102b357600080fd5b506102ce60048036038101906102c99190612c40565b6109af565b6040516102db9190612cae565b60405180910390f35b3480156102f057600080fd5b5061030b60048036038101906103069190612cf5565b610a2b565b005b34801561031957600080fd5b50610322610bd1565b60405161032f9190612b3e565b60405180910390f35b34801561034457600080fd5b5061035f600480360381019061035a9190612d35565b610be8565b005b34801561036d57600080fd5b5061038860048036038101906103839190612ded565b610bf8565b005b34801561039657600080fd5b5061039f610d37565b005b3480156103ad57600080fd5b506103c860048036038101906103c39190612d35565b610e30565b005b3480156103d657600080fd5b506103f160048036038101906103ec9190612ea3565b610e50565b005b3480156103ff57600080fd5b5061041a6004803603810190610415919061302e565b610ee2565b60405161042791906131a9565b60405180910390f35b34801561043c57600080fd5b50610445610fa3565b6040516104529190612b0a565b60405180910390f35b34801561046757600080fd5b50610482600480360381019061047d9190612c40565b610fb6565b60405161048f9190612cae565b60405180910390f35b3480156104a457600080fd5b506104ad610fc8565b6040516104ba9190612b3e565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e591906131cb565b610fcd565b6040516104f79190612b3e565b60405180910390f35b34801561050c57600080fd5b50610515611085565b005b34801561052357600080fd5b5061052c61110d565b005b34801561053a57600080fd5b5061055560048036038101906105509190612c40565b6111b5565b005b34801561056357600080fd5b5061056c61123b565b6040516105799190612b3e565b60405180910390f35b34801561058e57600080fd5b506105a960048036038101906105a491906131cb565b611241565b6040516105b691906132b6565b60405180910390f35b3480156105cb57600080fd5b506105d4611384565b6040516105e19190612cae565b60405180910390f35b3480156105f657600080fd5b50610611600480360381019061060c9190612c40565b6113ae565b005b34801561061f57600080fd5b50610628611434565b6040516106359190612bf2565b60405180910390f35b34801561064a57600080fd5b506106536114c6565b6040516106609190612b3e565b60405180910390f35b34801561067557600080fd5b50610690600480360381019061068b91906131cb565b6114cc565b60405161069d9190612b3e565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c891906132d8565b611515565b6040516106da91906132b6565b60405180910390f35b6106fd60048036038101906106f89190612c40565b611721565b005b34801561070b57600080fd5b5061072660048036038101906107219190613357565b61192d565b005b34801561073457600080fd5b5061074f600480360381019061074a919061344c565b611aa4565b005b34801561075d57600080fd5b5061077860048036038101906107739190612c40565b611b17565b6040516107859190613511565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190612c40565b611b81565b6040516107c29190612bf2565b60405180910390f35b3480156107d757600080fd5b506107e0611c1f565b6040516107ed9190612cae565b60405180910390f35b34801561080257600080fd5b5061081d6004803603810190610818919061352c565b611c43565b60405161082a9190612b0a565b60405180910390f35b34801561083f57600080fd5b5061085a60048036038101906108559190612c40565b611d33565b005b34801561086857600080fd5b50610883600480360381019061087e91906131cb565b611db9565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109105750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600b5481565b60606002805461092c9061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546109589061359b565b80156109a55780601f1061097a576101008083540402835291602001916109a5565b820191906000526020600020905b81548152906001019060200180831161098857829003601f168201915b5050505050905090565b60006109ba82611eb0565b6109f0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a3682611f0f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a9d576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610abc611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614610b1f57610ae881610ae3611fdb565b611c43565b610b1e576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610bdb611fe3565b6001546000540303905090565b610bf3838383611fec565b505050565b610c00612393565b73ffffffffffffffffffffffffffffffffffffffff16610c1e611384565b73ffffffffffffffffffffffffffffffffffffffff1614610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b90613618565b60405180910390fd5b6000610c7e610bd1565b9050600a548484905083610c929190613667565b82610c9d91906136c1565b1115610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd590613763565b60405180910390fd5b60005b84849050811015610d3057610d1d858583818110610d0257610d01613783565b5b9050602002016020810190610d1791906131cb565b8461239b565b8080610d28906137b2565b915050610ce1565b5050505050565b610d3f612393565b73ffffffffffffffffffffffffffffffffffffffff16610d5d611384565b73ffffffffffffffffffffffffffffffffffffffff1614610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613618565b60405180910390fd5b610dbb611384565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590613846565b60405180910390fd5b565b610e4b83838360405180602001604052806000815250611aa4565b505050565b610e58612393565b73ffffffffffffffffffffffffffffffffffffffff16610e76611384565b73ffffffffffffffffffffffffffffffffffffffff1614610ecc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec390613618565b60405180910390fd5b8181600c9182610edd929190613a1d565b505050565b606060008251905060008167ffffffffffffffff811115610f0657610f05612ef0565b5b604051908082528060200260200182016040528015610f3f57816020015b610f2c612a13565b815260200190600190039081610f245790505b50905060005b828114610f9857610f6f858281518110610f6257610f61613783565b5b6020026020010151611b17565b828281518110610f8257610f81613783565b5b6020026020010181905250806001019050610f45565b508092505050919050565b600d60009054906101000a900460ff1681565b6000610fc182611f0f565b9050919050565b600b81565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611034576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61108d612393565b73ffffffffffffffffffffffffffffffffffffffff166110ab611384565b73ffffffffffffffffffffffffffffffffffffffff1614611101576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f890613618565b60405180910390fd5b61110b600061256d565b565b611115612393565b73ffffffffffffffffffffffffffffffffffffffff16611133611384565b73ffffffffffffffffffffffffffffffffffffffff1614611189576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118090613618565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b6111bd612393565b73ffffffffffffffffffffffffffffffffffffffff166111db611384565b73ffffffffffffffffffffffffffffffffffffffff1614611231576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122890613618565b60405180910390fd5b80600a8190555050565b600a5481565b6060600080600061125185610fcd565b905060008167ffffffffffffffff81111561126f5761126e612ef0565b5b60405190808252806020026020018201604052801561129d5781602001602082028036833780820191505090505b5090506112a8612a13565b60006112b2611fe3565b90505b838614611376576112c581612633565b9150816040015161136b57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161461131057816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361136a578083878060010198508151811061135d5761135c613783565b5b6020026020010181815250505b5b8060010190506112b5565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6113b6612393565b73ffffffffffffffffffffffffffffffffffffffff166113d4611384565b73ffffffffffffffffffffffffffffffffffffffff161461142a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142190613618565b60405180910390fd5b80600b8190555050565b6060600380546114439061359b565b80601f016020809104026020016040519081016040528092919081815260200182805461146f9061359b565b80156114bc5780601f10611491576101008083540402835291602001916114bc565b820191906000526020600020905b81548152906001019060200180831161149f57829003601f168201915b5050505050905090565b60095481565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060818310611550576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061155b61265e565b9050611565611fe3565b85101561157757611574611fe3565b94505b80841115611583578093505b600061158e87610fcd565b9050848610156115b15760008686039050818110156115ab578091505b506115b6565b600090505b60008167ffffffffffffffff8111156115d2576115d1612ef0565b5b6040519080825280602002602001820160405280156116005781602001602082028036833780820191505090505b50905060008203611617578094505050505061171a565b600061162288611b17565b90506000816040015161163757816000015190505b60008990505b88811415801561164d5750848714155b1561170c5761165b81612633565b9250826040015161170157600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146116a657826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361170057808488806001019950815181106116f3576116f2613783565b5b6020026020010181815250505b5b80600101905061163d565b508583528296505050505050505b9392505050565b600d60009054906101000a900460ff1615611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613b39565b60405180910390fd5b600061177b610bd1565b9050600a54828261178c91906136c1565b106117cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c390613ba5565b60405180910390fd5b600b821061180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613c11565b60405180910390fd5b60008290506000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b548110156118cd57600b5484111561188157600b548461187a9190613c31565b9150611886565b600091505b600b54600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600954826118db9190613667565b34101561191d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191490613cb1565b60405180910390fd5b611927338561239b565b50505050565b611935611fdb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611999576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119a6611fdb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a53611fdb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a989190612b0a565b60405180910390a35050565b611aaf848484611fec565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b1157611ada84848484612667565b611b10576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b1f612a13565b611b27612a13565b611b2f611fe3565b831080611b435750611b3f61265e565b8310155b15611b515780915050611b7c565b611b5a83612633565b9050806040015115611b6f5780915050611b7c565b611b78836127b7565b9150505b919050565b6060611b8c82611eb0565b611bc2576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611bcc6127d7565b90506000815103611bec5760405180602001604052806000815250611c17565b80611bf684612869565b604051602001611c07929190613d0d565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c181565b6000807f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611cb99190612cae565b602060405180830381865afa158015611cd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfa9190613d6f565b73ffffffffffffffffffffffffffffffffffffffff1603611d1f576001915050611d2d565b611d2984846128c3565b9150505b92915050565b611d3b612393565b73ffffffffffffffffffffffffffffffffffffffff16611d59611384565b73ffffffffffffffffffffffffffffffffffffffff1614611daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da690613618565b60405180910390fd5b8060098190555050565b611dc1612393565b73ffffffffffffffffffffffffffffffffffffffff16611ddf611384565b73ffffffffffffffffffffffffffffffffffffffff1614611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c90613618565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ea4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9b90613e0e565b60405180910390fd5b611ead8161256d565b50565b600081611ebb611fe3565b11158015611eca575060005482105b8015611f08575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611f1e611fe3565b11611fa457600054811015611fa35760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611fa1575b60008103611f97576004600083600190039350838152602001908152602001600020549050611f6d565b8092505050611fd6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b6000611ff782611f0f565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461205e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661207f611fdb565b73ffffffffffffffffffffffffffffffffffffffff1614806120ae57506120ad856120a8611fdb565b611c43565b5b806120f357506120bc611fdb565b73ffffffffffffffffffffffffffffffffffffffff166120db846109af565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061212c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612192576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61219f8585856001612957565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61229c8661295d565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036123245760006001840190506000600460008381526020019081526020016000205403612322576000548114612321578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461238c8585856001612967565b5050505050565b600033905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612407576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008203612441576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61244e6000848385612957565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16124b36001841461296d565b901b60a042901b6124c38561295d565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106124e9578160008190555050506125686000848385612967565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61263b612a13565b6126576004600084815260200190815260200160002054612977565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261268d611fdb565b8786866040518563ffffffff1660e01b81526004016126af9493929190613e83565b6020604051808303816000875af19250505080156126eb57506040513d601f19601f820116820180604052508101906126e89190613ee4565b60015b612764573d806000811461271b576040519150601f19603f3d011682016040523d82523d6000602084013e612720565b606091505b50600081510361275c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6127bf612a13565b6127d06127cb83611f0f565b612977565b9050919050565b6060600c80546127e69061359b565b80601f01602080910402602001604051908101604052809291908181526020018280546128129061359b565b801561285f5780601f106128345761010080835404028352916020019161285f565b820191906000526020600020905b81548152906001019060200180831161284257829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156128af57600183039250600a81066030018353600a8104905061288f565b508181036020830392508083525050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b50505050565b6000819050919050565b50505050565b6000819050919050565b61297f612a13565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a9f81612a6a565b8114612aaa57600080fd5b50565b600081359050612abc81612a96565b92915050565b600060208284031215612ad857612ad7612a60565b5b6000612ae684828501612aad565b91505092915050565b60008115159050919050565b612b0481612aef565b82525050565b6000602082019050612b1f6000830184612afb565b92915050565b6000819050919050565b612b3881612b25565b82525050565b6000602082019050612b536000830184612b2f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612b93578082015181840152602081019050612b78565b83811115612ba2576000848401525b50505050565b6000601f19601f8301169050919050565b6000612bc482612b59565b612bce8185612b64565b9350612bde818560208601612b75565b612be781612ba8565b840191505092915050565b60006020820190508181036000830152612c0c8184612bb9565b905092915050565b612c1d81612b25565b8114612c2857600080fd5b50565b600081359050612c3a81612c14565b92915050565b600060208284031215612c5657612c55612a60565b5b6000612c6484828501612c2b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612c9882612c6d565b9050919050565b612ca881612c8d565b82525050565b6000602082019050612cc36000830184612c9f565b92915050565b612cd281612c8d565b8114612cdd57600080fd5b50565b600081359050612cef81612cc9565b92915050565b60008060408385031215612d0c57612d0b612a60565b5b6000612d1a85828601612ce0565b9250506020612d2b85828601612c2b565b9150509250929050565b600080600060608486031215612d4e57612d4d612a60565b5b6000612d5c86828701612ce0565b9350506020612d6d86828701612ce0565b9250506040612d7e86828701612c2b565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612dad57612dac612d88565b5b8235905067ffffffffffffffff811115612dca57612dc9612d8d565b5b602083019150836020820283011115612de657612de5612d92565b5b9250929050565b600080600060408486031215612e0657612e05612a60565b5b600084013567ffffffffffffffff811115612e2457612e23612a65565b5b612e3086828701612d97565b93509350506020612e4386828701612c2b565b9150509250925092565b60008083601f840112612e6357612e62612d88565b5b8235905067ffffffffffffffff811115612e8057612e7f612d8d565b5b602083019150836001820283011115612e9c57612e9b612d92565b5b9250929050565b60008060208385031215612eba57612eb9612a60565b5b600083013567ffffffffffffffff811115612ed857612ed7612a65565b5b612ee485828601612e4d565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612f2882612ba8565b810181811067ffffffffffffffff82111715612f4757612f46612ef0565b5b80604052505050565b6000612f5a612a56565b9050612f668282612f1f565b919050565b600067ffffffffffffffff821115612f8657612f85612ef0565b5b602082029050602081019050919050565b6000612faa612fa584612f6b565b612f50565b90508083825260208201905060208402830185811115612fcd57612fcc612d92565b5b835b81811015612ff65780612fe28882612c2b565b845260208401935050602081019050612fcf565b5050509392505050565b600082601f83011261301557613014612d88565b5b8135613025848260208601612f97565b91505092915050565b60006020828403121561304457613043612a60565b5b600082013567ffffffffffffffff81111561306257613061612a65565b5b61306e84828501613000565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6130ac81612c8d565b82525050565b600067ffffffffffffffff82169050919050565b6130cf816130b2565b82525050565b6130de81612aef565b82525050565b6060820160008201516130fa60008501826130a3565b50602082015161310d60208501826130c6565b50604082015161312060408501826130d5565b50505050565b600061313283836130e4565b60608301905092915050565b6000602082019050919050565b600061315682613077565b6131608185613082565b935061316b83613093565b8060005b8381101561319c5781516131838882613126565b975061318e8361313e565b92505060018101905061316f565b5085935050505092915050565b600060208201905081810360008301526131c3818461314b565b905092915050565b6000602082840312156131e1576131e0612a60565b5b60006131ef84828501612ce0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61322d81612b25565b82525050565b600061323f8383613224565b60208301905092915050565b6000602082019050919050565b6000613263826131f8565b61326d8185613203565b935061327883613214565b8060005b838110156132a95781516132908882613233565b975061329b8361324b565b92505060018101905061327c565b5085935050505092915050565b600060208201905081810360008301526132d08184613258565b905092915050565b6000806000606084860312156132f1576132f0612a60565b5b60006132ff86828701612ce0565b935050602061331086828701612c2b565b925050604061332186828701612c2b565b9150509250925092565b61333481612aef565b811461333f57600080fd5b50565b6000813590506133518161332b565b92915050565b6000806040838503121561336e5761336d612a60565b5b600061337c85828601612ce0565b925050602061338d85828601613342565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156133b7576133b6612ef0565b5b6133c082612ba8565b9050602081019050919050565b82818337600083830152505050565b60006133ef6133ea8461339c565b612f50565b90508281526020810184848401111561340b5761340a613397565b5b6134168482856133cd565b509392505050565b600082601f83011261343357613432612d88565b5b81356134438482602086016133dc565b91505092915050565b6000806000806080858703121561346657613465612a60565b5b600061347487828801612ce0565b945050602061348587828801612ce0565b935050604061349687828801612c2b565b925050606085013567ffffffffffffffff8111156134b7576134b6612a65565b5b6134c38782880161341e565b91505092959194509250565b6060820160008201516134e560008501826130a3565b5060208201516134f860208501826130c6565b50604082015161350b60408501826130d5565b50505050565b600060608201905061352660008301846134cf565b92915050565b6000806040838503121561354357613542612a60565b5b600061355185828601612ce0565b925050602061356285828601612ce0565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135b357607f821691505b6020821081036135c6576135c561356c565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613602602083612b64565b915061360d826135cc565b602082019050919050565b60006020820190508181036000830152613631816135f5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061367282612b25565b915061367d83612b25565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136b6576136b5613638565b5b828202905092915050565b60006136cc82612b25565b91506136d783612b25565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561370c5761370b613638565b5b828201905092915050565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b600061374d601283612b64565b915061375882613717565b602082019050919050565b6000602082019050818103600083015261377c81613740565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006137bd82612b25565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036137ef576137ee613638565b5b600182019050919050565b7f576974686472617720556e7375636365737366756c0000000000000000000000600082015250565b6000613830601583612b64565b915061383b826137fa565b602082019050919050565b6000602082019050818103600083015261385f81613823565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026138d37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613896565b6138dd8683613896565b95508019841693508086168417925050509392505050565b6000819050919050565b600061391a61391561391084612b25565b6138f5565b612b25565b9050919050565b6000819050919050565b613934836138ff565b61394861394082613921565b8484546138a3565b825550505050565b600090565b61395d613950565b61396881848461392b565b505050565b5b8181101561398c57613981600082613955565b60018101905061396e565b5050565b601f8211156139d1576139a281613871565b6139ab84613886565b810160208510156139ba578190505b6139ce6139c685613886565b83018261396d565b50505b505050565b600082821c905092915050565b60006139f4600019846008026139d6565b1980831691505092915050565b6000613a0d83836139e3565b9150826002028217905092915050565b613a278383613866565b67ffffffffffffffff811115613a4057613a3f612ef0565b5b613a4a825461359b565b613a55828285613990565b6000601f831160018114613a845760008415613a72578287013590505b613a7c8582613a01565b865550613ae4565b601f198416613a9286613871565b60005b82811015613aba57848901358255600182019150602085019450602081019050613a95565b86831015613ad75784890135613ad3601f8916826139e3565b8355505b6001600288020188555050505b50505050505050565b7f4d696e74696e6720697320506175736564000000000000000000000000000000600082015250565b6000613b23601183612b64565b9150613b2e82613aed565b602082019050919050565b60006020820190508181036000830152613b5281613b16565b9050919050565b7f4578636565647320537570706c79000000000000000000000000000000000000600082015250565b6000613b8f600e83612b64565b9150613b9a82613b59565b602082019050919050565b60006020820190508181036000830152613bbe81613b82565b9050919050565b7f457863656564204d617820537570706c79000000000000000000000000000000600082015250565b6000613bfb601183612b64565b9150613c0682613bc5565b602082019050919050565b60006020820190508181036000830152613c2a81613bee565b9050919050565b6000613c3c82612b25565b9150613c4783612b25565b925082821015613c5a57613c59613638565b5b828203905092915050565b7f457468657220616d6f756e742073656e742077726f6e67000000000000000000600082015250565b6000613c9b601783612b64565b9150613ca682613c65565b602082019050919050565b60006020820190508181036000830152613cca81613c8e565b9050919050565b600081905092915050565b6000613ce782612b59565b613cf18185613cd1565b9350613d01818560208601612b75565b80840191505092915050565b6000613d198285613cdc565b9150613d258284613cdc565b91508190509392505050565b6000613d3c82612c8d565b9050919050565b613d4c81613d31565b8114613d5757600080fd5b50565b600081519050613d6981613d43565b92915050565b600060208284031215613d8557613d84612a60565b5b6000613d9384828501613d5a565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613df8602683612b64565b9150613e0382613d9c565b604082019050919050565b60006020820190508181036000830152613e2781613deb565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613e5582613e2e565b613e5f8185613e39565b9350613e6f818560208601612b75565b613e7881612ba8565b840191505092915050565b6000608082019050613e986000830187612c9f565b613ea56020830186612c9f565b613eb26040830185612b2f565b8181036060830152613ec48184613e4a565b905095945050505050565b600081519050613ede81612a96565b92915050565b600060208284031215613efa57613ef9612a60565b5b6000613f0884828501613ecf565b9150509291505056fea2646970667358221220a268ab7514f980acd4dc2f6f6a013bfce900a9e67dc540beacd0e8875d9e510264736f6c634300080f0033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

578:3198:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5031:615:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;744:34:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10044:100:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12112:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11572:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4085:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12998:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3235:381:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3622:151;;;;;;;;;;;;;:::i;:::-;;13239:185:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3050:107:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1549:468:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;880:25:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9833:144:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;783:57:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5710:224:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1714:103:5;;;;;;;;;;;;;:::i;:::-;;3163:68:6;;;;;;;;;;;;;:::i;:::-;;2533:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;697:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5361:892:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1063:87:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2296:108:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10213:104:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;647:45:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1977:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2407:2505:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1165:806:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12388:308:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13495:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;970:420:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10388:318:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;912:45:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2656:388;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2411:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1972:201:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5031:615:1;5116:4;5431:10;5416:25;;:11;:25;;;;:102;;;;5508:10;5493:25;;:11;:25;;;;5416:102;:179;;;;5585:10;5570:25;;:11;:25;;;;5416:179;5396:199;;5031:615;;;:::o;744:34:6:-;;;;:::o;10044:100:1:-;10098:13;10131:5;10124:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10044:100;:::o;12112:204::-;12180:7;12205:16;12213:7;12205;:16::i;:::-;12200:64;;12230:34;;;;;;;;;;;;;;12200:64;12284:15;:24;12300:7;12284:24;;;;;;;;;;;;;;;;;;;;;12277:31;;12112:204;;;:::o;11572:474::-;11645:13;11677:27;11696:7;11677:18;:27::i;:::-;11645:61;;11727:5;11721:11;;:2;:11;;;11717:48;;11741:24;;;;;;;;;;;;;;11717:48;11805:5;11782:28;;:19;:17;:19::i;:::-;:28;;;11778:175;;11830:44;11847:5;11854:19;:17;:19::i;:::-;11830:16;:44::i;:::-;11825:128;;11902:35;;;;;;;;;;;;;;11825:128;11778:175;11992:2;11965:15;:24;11981:7;11965:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12030:7;12026:2;12010:28;;12019:5;12010:28;;;;;;;;;;;;11634:412;11572:474;;:::o;4085:315::-;4138:7;4366:15;:13;:15::i;:::-;4351:12;;4335:13;;:28;:46;4328:53;;4085:315;:::o;12998:170::-;13132:28;13142:4;13148:2;13152:7;13132:9;:28::i;:::-;12998:170;;;:::o;3235:381:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3347:20:6::1;3370:13;:11;:13::i;:::-;3347:36;;3454:19;;3434:9;;:16;;3423:8;:27;;;;:::i;:::-;3408:12;:42;;;;:::i;:::-;:65;;3392:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3523:9;3518:93;3542:9;;:16;;3538:1;:20;3518:93;;;3574:29;3580:9;;3590:1;3580:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;3594:8;3574:5;:29::i;:::-;3560:3;;;;;:::i;:::-;;;;3518:93;;;;3340:276;3235:381:::0;;;:::o;3622:151::-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3692:7:6::1;:5;:7::i;:::-;3684:21;;:44;3706:21;3684:44;;;;;;;;;;;;;;;;;;;;;;;3668:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;3622:151::o:0;13239:185:1:-;13377:39;13394:4;13400:2;13404:7;13377:39;;;;;;;;;;;;:16;:39::i;:::-;13239:185;;;:::o;3050:107:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3140:11:6::1;;3125:12;:26;;;;;;;:::i;:::-;;3050:107:::0;;:::o;1549:468:2:-;1638:23;1699:22;1724:8;:15;1699:40;;1754:34;1812:14;1791:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1754:73;;1847:9;1842:125;1863:14;1858:1;:19;1842:125;;1919:32;1939:8;1948:1;1939:11;;;;;;;;:::i;:::-;;;;;;;;1919:19;:32::i;:::-;1903:10;1914:1;1903:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1879:3;;;;;1842:125;;;;1988:10;1981:17;;;;1549:468;;;:::o;880:25:6:-;;;;;;;;;;;;;:::o;9833:144:1:-;9897:7;9940:27;9959:7;9940:18;:27::i;:::-;9917:52;;9833:144;;;:::o;783:57:6:-;838:2;783:57;:::o;5710:224:1:-;5774:7;5815:1;5798:19;;:5;:19;;;5794:60;;5826:28;;;;;;;;;;;;;;5794:60;1049:13;5872:18;:25;5891:5;5872:25;;;;;;;;;;;;;;;;:54;5865:61;;5710:224;;;:::o;1714:103:5:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;3163:68:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3219:6:6::1;;;;;;;;;;;3218:7;3209:6;;:16;;;;;;;;;;;;;;;;;;3163:68::o:0;2533:113::-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2629:9:6::1;2607:19;:31;;;;2533:113:::0;:::o;697:42::-;;;;:::o;5361:892:2:-;5431:16;5485:19;5519:25;5559:22;5584:16;5594:5;5584:9;:16::i;:::-;5559:41;;5615:25;5657:14;5643:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5615:57;;5687:31;;:::i;:::-;5738:9;5750:15;:13;:15::i;:::-;5738:27;;5733:472;5782:14;5767:11;:29;5733:472;;5834:15;5847:1;5834:12;:15::i;:::-;5822:27;;5872:9;:16;;;5913:8;5868:73;5989:1;5963:28;;:9;:14;;;:28;;;5959:111;;6036:9;:14;;;6016:34;;5959:111;6113:5;6092:26;;:17;:26;;;6088:102;;6169:1;6143:8;6152:13;;;;;;6143:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6088:102;5733:472;5798:3;;;;;5733:472;;;;6226:8;6219:15;;;;;;;5361:892;;;:::o;1063:87:5:-;1109:7;1136:6;;;;;;;;;;;1129:13;;1063:87;:::o;2296:108:6:-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2388:8:6::1;2370:15;:26;;;;2296:108:::0;:::o;10213:104:1:-;10269:13;10302:7;10295:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10213:104;:::o;647:45:6:-;;;;:::o;1977:115::-;2040:7;2063:16;:23;2080:5;2063:23;;;;;;;;;;;;;;;;2056:30;;1977:115;;;:::o;2407:2505:2:-;2542:16;2609:4;2600:5;:13;2596:45;;2622:19;;;;;;;;;;;;;;2596:45;2656:19;2690:17;2710:14;:12;:14::i;:::-;2690:34;;2810:15;:13;:15::i;:::-;2802:5;:23;2798:87;;;2854:15;:13;:15::i;:::-;2846:23;;2798:87;2961:9;2954:4;:16;2950:73;;;2998:9;2991:16;;2950:73;3037:25;3065:16;3075:5;3065:9;:16::i;:::-;3037:44;;3259:4;3251:5;:12;3247:278;;;3284:19;3313:5;3306:4;:12;3284:34;;3355:17;3341:11;:31;3337:111;;;3417:11;3397:31;;3337:111;3265:198;3247:278;;;3508:1;3488:21;;3247:278;3539:25;3581:17;3567:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3539:60;;3639:1;3618:17;:22;3614:78;;3668:8;3661:15;;;;;;;;3614:78;3836:31;3870:26;3890:5;3870:19;:26::i;:::-;3836:60;;3911:25;4156:9;:16;;;4151:92;;4213:9;:14;;;4193:34;;4151:92;4262:9;4274:5;4262:17;;4257:478;4286:4;4281:1;:9;;:45;;;;;4309:17;4294:11;:32;;4281:45;4257:478;;;4364:15;4377:1;4364:12;:15::i;:::-;4352:27;;4402:9;:16;;;4443:8;4398:73;4519:1;4493:28;;:9;:14;;;:28;;;4489:111;;4566:9;:14;;;4546:34;;4489:111;4643:5;4622:26;;:17;:26;;;4618:102;;4699:1;4673:8;4682:13;;;;;;4673:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4618:102;4257:478;4328:3;;;;;4257:478;;;;4837:11;4827:8;4820:29;4885:8;4878:15;;;;;;;;2407:2505;;;;;;:::o;1165:806:6:-;1231:6;;;;;;;;;;;1230:7;1222:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;1268:20;1291:13;:11;:13::i;:::-;1268:36;;1348:19;;1336:9;1321:12;:24;;;;:::i;:::-;:46;1313:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;838:2;1401:9;:40;1393:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;1491:19;1513:9;1491:31;;1529:21;1553:16;:28;1570:10;1553:28;;;;;;;;;;;;;;;;1529:52;;1610:15;;1594:13;:31;1590:247;;;1652:15;;1640:9;:27;1636:137;;;1706:15;;1694:9;:27;;;;:::i;:::-;1680:41;;1636:137;;;1762:1;1748:15;;1636:137;1814:15;;1783:16;:28;1800:10;1783:28;;;;;;;;;;;;;;;:46;;;;1590:247;1884:16;;1870:11;:30;;;;:::i;:::-;1857:9;:43;;1849:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;1937:28;1943:10;1955:9;1937:5;:28::i;:::-;1215:756;;;1165:806;:::o;12388:308:1:-;12499:19;:17;:19::i;:::-;12487:31;;:8;:31;;;12483:61;;12527:17;;;;;;;;;;;;;;12483:61;12609:8;12557:18;:39;12576:19;:17;:19::i;:::-;12557:39;;;;;;;;;;;;;;;:49;12597:8;12557:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12669:8;12633:55;;12648:19;:17;:19::i;:::-;12633:55;;;12679:8;12633:55;;;;;;:::i;:::-;;;;;;;;12388:308;;:::o;13495:396::-;13662:28;13672:4;13678:2;13682:7;13662:9;:28::i;:::-;13723:1;13705:2;:14;;;:19;13701:183;;13744:56;13775:4;13781:2;13785:7;13794:5;13744:30;:56::i;:::-;13739:145;;13828:40;;;;;;;;;;;;;;13739:145;13701:183;13495:396;;;;:::o;970:420:2:-;1046:21;;:::i;:::-;1080:31;;:::i;:::-;1136:15;:13;:15::i;:::-;1126:7;:25;:54;;;;1166:14;:12;:14::i;:::-;1155:7;:25;;1126:54;1122:103;;;1204:9;1197:16;;;;;1122:103;1247:21;1260:7;1247:12;:21::i;:::-;1235:33;;1283:9;:16;;;1279:65;;;1323:9;1316:16;;;;;1279:65;1361:21;1374:7;1361:12;:21::i;:::-;1354:28;;;970:420;;;;:::o;10388:318:1:-;10461:13;10492:16;10500:7;10492;:16::i;:::-;10487:59;;10517:29;;;;;;;;;;;;;;10487:59;10559:21;10583:10;:8;:10::i;:::-;10559:34;;10636:1;10617:7;10611:21;:26;:87;;;;;;;;;;;;;;;;;10664:7;10673:18;10683:7;10673:9;:18::i;:::-;10647:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10611:87;10604:94;;;10388:318;;;:::o;912:45:6:-;;;:::o;2656:388::-;2783:4;2799:34;2865:20;2799:93;;2946:8;2905:49;;2913:13;:21;;;2935:5;2913:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2905:49;;;2901:83;;2972:4;2965:11;;;;;2901:83;2999:39;3022:5;3029:8;2999:22;:39::i;:::-;2992:46;;;2656:388;;;;;:::o;2411:114::-;1294:12:5;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2506:11:6::1;2487:16;:30;;;;2411:114:::0;:::o;1972:201:5:-;1294:12;:10;:12::i;:::-;1283:23;;:7;:5;:7::i;:::-;:23;;;1275:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:1:::1;2061:22;;:8;:22;;::::0;2053:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2137:28;2156:8;2137:18;:28::i;:::-;1972:201:::0;:::o;14146:273:1:-;14203:4;14259:7;14240:15;:13;:15::i;:::-;:26;;:66;;;;;14293:13;;14283:7;:23;14240:66;:152;;;;;14391:1;1819:8;14344:17;:26;14362:7;14344:26;;;;;;;;;;;;:43;:48;14240:152;14220:172;;14146:273;;;:::o;7348:1129::-;7415:7;7435:12;7450:7;7435:22;;7518:4;7499:15;:13;:15::i;:::-;:23;7495:915;;7552:13;;7545:4;:20;7541:869;;;7590:14;7607:17;:23;7625:4;7607:23;;;;;;;;;;;;7590:40;;7723:1;1819:8;7696:6;:23;:28;7692:699;;8215:113;8232:1;8222:6;:11;8215:113;;8275:17;:25;8293:6;;;;;;;8275:25;;;;;;;;;;;;8266:34;;8215:113;;;8361:6;8354:13;;;;;;7692:699;7567:843;7541:869;7495:915;8438:31;;;;;;;;;;;;;;7348:1129;;;;:::o;28128:105::-;28188:7;28215:10;28208:17;;28128:105;:::o;2098:87:6:-;2155:7;2178:1;2171:8;;2098:87;:::o;19385:2515:1:-;19500:27;19530;19549:7;19530:18;:27::i;:::-;19500:57;;19615:4;19574:45;;19590:19;19574:45;;;19570:86;;19628:28;;;;;;;;;;;;;;19570:86;19669:22;19718:4;19695:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;19739:43;19756:4;19762:19;:17;:19::i;:::-;19739:16;:43::i;:::-;19695:87;:147;;;;19823:19;:17;:19::i;:::-;19799:43;;:20;19811:7;19799:11;:20::i;:::-;:43;;;19695:147;19669:174;;19861:17;19856:66;;19887:35;;;;;;;;;;;;;;19856:66;19951:1;19937:16;;:2;:16;;;19933:52;;19962:23;;;;;;;;;;;;;;19933:52;19998:43;20020:4;20026:2;20030:7;20039:1;19998:21;:43::i;:::-;20114:15;:24;20130:7;20114:24;;;;;;;;;;;;20107:31;;;;;;;;;;;20506:18;:24;20525:4;20506:24;;;;;;;;;;;;;;;;20504:26;;;;;;;;;;;;20575:18;:22;20594:2;20575:22;;;;;;;;;;;;;;;;20573:24;;;;;;;;;;;2101:8;1703:3;20956:15;:41;;20914:21;20932:2;20914:17;:21::i;:::-;:84;:128;20868:17;:26;20886:7;20868:26;;;;;;;;;;;:174;;;;21212:1;2101:8;21162:19;:46;:51;21158:626;;21234:19;21266:1;21256:7;:11;21234:33;;21423:1;21389:17;:30;21407:11;21389:30;;;;;;;;;;;;:35;21385:384;;21527:13;;21512:11;:28;21508:242;;21707:19;21674:17;:30;21692:11;21674:30;;;;;;;;;;;:52;;;;21508:242;21385:384;21215:569;21158:626;21831:7;21827:2;21812:27;;21821:4;21812:27;;;;;;;;;;;;21850:42;21871:4;21877:2;21881:7;21890:1;21850:20;:42::i;:::-;19489:2411;;19385:2515;;;:::o;656:98:0:-;709:7;736:10;729:17;;656:98;:::o;17475:1656:1:-;17540:20;17563:13;;17540:36;;17605:1;17591:16;;:2;:16;;;17587:48;;17616:19;;;;;;;;;;;;;;17587:48;17662:1;17650:8;:13;17646:44;;17672:18;;;;;;;;;;;;;;17646:44;17703:61;17733:1;17737:2;17741:12;17755:8;17703:21;:61::i;:::-;18307:1;1186:2;18278:1;:25;;18277:31;18265:8;:44;18239:18;:22;18258:2;18239:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1966:3;18708:29;18735:1;18723:8;:13;18708:14;:29::i;:::-;:56;;1703:3;18645:15;:41;;18603:21;18621:2;18603:17;:21::i;:::-;:84;:162;18552:17;:31;18570:12;18552:31;;;;;;;;;;;:213;;;;18782:20;18805:12;18782:35;;18832:11;18861:8;18846:12;:23;18832:37;;18886:111;18938:14;;;;;;18934:2;18913:40;;18930:1;18913:40;;;;;;;;;;;;18992:3;18977:12;:18;18886:111;;19029:12;19013:13;:28;;;;18016:1037;;19063:60;19092:1;19096:2;19100:12;19114:8;19063:20;:60::i;:::-;17529:1602;17475:1656;;:::o;2333:191:5:-;2407:16;2426:6;;;;;;;;;;;2407:25;;2452:8;2443:6;;:17;;;;;;;;;;;;;;;;;;2507:8;2476:40;;2497:8;2476:40;;;;;;;;;;;;2396:128;2333:191;:::o;8957:153:1:-;9017:21;;:::i;:::-;9058:44;9077:17;:24;9095:5;9077:24;;;;;;;;;;;;9058:18;:44::i;:::-;9051:51;;8957:153;;;:::o;3779:95::-;3826:7;3853:13;;3846:20;;3779:95;:::o;25597:716::-;25760:4;25806:2;25781:45;;;25827:19;:17;:19::i;:::-;25848:4;25854:7;25863:5;25781:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25777:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26081:1;26064:6;:13;:18;26060:235;;26110:40;;;;;;;;;;;;;;26060:235;26253:6;26247:13;26238:6;26234:2;26230:15;26223:38;25777:529;25950:54;;;25940:64;;;:6;:64;;;;25933:71;;;25597:716;;;;;;:::o;9613:158::-;9675:21;;:::i;:::-;9716:47;9735:27;9754:7;9735:18;:27::i;:::-;9716:18;:47::i;:::-;9709:54;;9613:158;;;:::o;2191:99:6:-;2243:13;2272:12;2265:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2191:99;:::o;28339:1959:1:-;28396:17;28817:3;28810:4;28804:11;28800:21;28793:28;;28908:3;28902:4;28895:17;29014:3;29471:5;29601:1;29596:3;29592:11;29585:18;;29738:2;29732:4;29728:13;29724:2;29720:22;29715:3;29707:36;29779:2;29773:4;29769:13;29761:21;;29362:682;29798:4;29362:682;;;29973:1;29968:3;29964:11;29957:18;;30024:2;30018:4;30014:13;30010:2;30006:22;30001:3;29993:36;29894:2;29888:4;29884:13;29876:21;;29362:682;;;29366:431;30095:3;30090;30086:13;30210:2;30205:3;30201:12;30194:19;;30273:6;30268:3;30261:19;28435:1856;;28339:1959;;;:::o;12767:164::-;12864:4;12888:18;:25;12907:5;12888:25;;;;;;;;;;;;;;;:35;12914:8;12888:35;;;;;;;;;;;;;;;;;;;;;;;;;12881:42;;12767:164;;;;:::o;26961:159::-;;;;;:::o;11133:148::-;11197:14;11258:5;11248:15;;11133:148;;;:::o;27779:158::-;;;;;:::o;11368:142::-;11426:14;11487:5;11477:15;;11368:142;;;:::o;8571:295::-;8637:31;;:::i;:::-;8714:6;8681:9;:14;;:41;;;;;;;;;;;1703:3;8767:6;:32;;8733:9;:24;;:67;;;;;;;;;;;8857:1;1819:8;8830:6;:23;:28;;8811:9;:16;;:47;;;;;;;;;;;8571:295;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:7:-;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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6301:568;6374:8;6384:6;6434:3;6427:4;6419:6;6415:17;6411:27;6401:122;;6442:79;;:::i;:::-;6401:122;6555:6;6542:20;6532:30;;6585:18;6577:6;6574:30;6571:117;;;6607:79;;:::i;:::-;6571:117;6721:4;6713:6;6709:17;6697:29;;6775:3;6767:4;6759:6;6755:17;6745:8;6741:32;6738:41;6735:128;;;6782:79;;:::i;:::-;6735:128;6301:568;;;;;:::o;6875:704::-;6970:6;6978;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7189:1;7178:9;7174:17;7161:31;7219:18;7211:6;7208:30;7205:117;;;7241:79;;:::i;:::-;7205:117;7354:80;7426:7;7417:6;7406:9;7402:22;7354:80;:::i;:::-;7336:98;;;;7132:312;7483:2;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7454:118;6875:704;;;;;:::o;7599:553::-;7657:8;7667:6;7717:3;7710:4;7702:6;7698:17;7694:27;7684:122;;7725:79;;:::i;:::-;7684:122;7838:6;7825:20;7815:30;;7868:18;7860:6;7857:30;7854:117;;;7890:79;;:::i;:::-;7854:117;8004:4;7996:6;7992:17;7980:29;;8058:3;8050:4;8042:6;8038:17;8028:8;8024:32;8021:41;8018:128;;;8065:79;;:::i;:::-;8018:128;7599:553;;;;;:::o;8158:529::-;8229:6;8237;8286:2;8274:9;8265:7;8261:23;8257:32;8254:119;;;8292:79;;:::i;:::-;8254:119;8440:1;8429:9;8425:17;8412:31;8470:18;8462:6;8459:30;8456:117;;;8492:79;;:::i;:::-;8456:117;8605:65;8662:7;8653:6;8642:9;8638:22;8605:65;:::i;:::-;8587:83;;;;8383:297;8158:529;;;;;:::o;8693:180::-;8741:77;8738:1;8731:88;8838:4;8835:1;8828:15;8862:4;8859:1;8852:15;8879:281;8962:27;8984:4;8962:27;:::i;:::-;8954:6;8950:40;9092:6;9080:10;9077:22;9056:18;9044:10;9041:34;9038:62;9035:88;;;9103:18;;:::i;:::-;9035:88;9143:10;9139:2;9132:22;8922:238;8879:281;;:::o;9166:129::-;9200:6;9227:20;;:::i;:::-;9217:30;;9256:33;9284:4;9276:6;9256:33;:::i;:::-;9166:129;;;:::o;9301:311::-;9378:4;9468:18;9460:6;9457:30;9454:56;;;9490:18;;:::i;:::-;9454:56;9540:4;9532:6;9528:17;9520:25;;9600:4;9594;9590:15;9582:23;;9301:311;;;:::o;9635:710::-;9731:5;9756:81;9772:64;9829:6;9772:64;:::i;:::-;9756:81;:::i;:::-;9747:90;;9857:5;9886:6;9879:5;9872:21;9920:4;9913:5;9909:16;9902:23;;9973:4;9965:6;9961:17;9953:6;9949:30;10002:3;9994:6;9991:15;9988:122;;;10021:79;;:::i;:::-;9988:122;10136:6;10119:220;10153:6;10148:3;10145:15;10119:220;;;10228:3;10257:37;10290:3;10278:10;10257:37;:::i;:::-;10252:3;10245:50;10324:4;10319:3;10315:14;10308:21;;10195:144;10179:4;10174:3;10170:14;10163:21;;10119:220;;;10123:21;9737:608;;9635:710;;;;;:::o;10368:370::-;10439:5;10488:3;10481:4;10473:6;10469:17;10465:27;10455:122;;10496:79;;:::i;:::-;10455:122;10613:6;10600:20;10638:94;10728:3;10720:6;10713:4;10705:6;10701:17;10638:94;:::i;:::-;10629:103;;10445:293;10368:370;;;;:::o;10744:539::-;10828:6;10877:2;10865:9;10856:7;10852:23;10848:32;10845:119;;;10883:79;;:::i;:::-;10845:119;11031:1;11020:9;11016:17;11003:31;11061:18;11053:6;11050:30;11047:117;;;11083:79;;:::i;:::-;11047:117;11188:78;11258:7;11249:6;11238:9;11234:22;11188:78;:::i;:::-;11178:88;;10974:302;10744:539;;;;:::o;11289:146::-;11388:6;11422:5;11416:12;11406:22;;11289:146;;;:::o;11441:216::-;11572:11;11606:6;11601:3;11594:19;11646:4;11641:3;11637:14;11622:29;;11441:216;;;;:::o;11663:164::-;11762:4;11785:3;11777:11;;11815:4;11810:3;11806:14;11798:22;;11663:164;;;:::o;11833:108::-;11910:24;11928:5;11910:24;:::i;:::-;11905:3;11898:37;11833:108;;:::o;11947:101::-;11983:7;12023:18;12016:5;12012:30;12001:41;;11947:101;;;:::o;12054:105::-;12129:23;12146:5;12129:23;:::i;:::-;12124:3;12117:36;12054:105;;:::o;12165:99::-;12236:21;12251:5;12236:21;:::i;:::-;12231:3;12224:34;12165:99;;:::o;12342:689::-;12493:4;12488:3;12484:14;12580:4;12573:5;12569:16;12563:23;12599:63;12656:4;12651:3;12647:14;12633:12;12599:63;:::i;:::-;12508:164;12764:4;12757:5;12753:16;12747:23;12783:61;12838:4;12833:3;12829:14;12815:12;12783:61;:::i;:::-;12682:172;12938:4;12931:5;12927:16;12921:23;12957:57;13008:4;13003:3;12999:14;12985:12;12957:57;:::i;:::-;12864:160;12462:569;12342:689;;:::o;13037:307::-;13170:10;13191:110;13297:3;13289:6;13191:110;:::i;:::-;13333:4;13328:3;13324:14;13310:28;;13037:307;;;;:::o;13350:145::-;13452:4;13484;13479:3;13475:14;13467:22;;13350:145;;;:::o;13577:988::-;13760:3;13789:86;13869:5;13789:86;:::i;:::-;13891:118;14002:6;13997:3;13891:118;:::i;:::-;13884:125;;14033:88;14115:5;14033:88;:::i;:::-;14144:7;14175:1;14160:380;14185:6;14182:1;14179:13;14160:380;;;14261:6;14255:13;14288:127;14411:3;14396:13;14288:127;:::i;:::-;14281:134;;14438:92;14523:6;14438:92;:::i;:::-;14428:102;;14220:320;14207:1;14204;14200:9;14195:14;;14160:380;;;14164:14;14556:3;14549:10;;13765:800;;;13577:988;;;;:::o;14571:501::-;14778:4;14816:2;14805:9;14801:18;14793:26;;14865:9;14859:4;14855:20;14851:1;14840:9;14836:17;14829:47;14893:172;15060:4;15051:6;14893:172;:::i;:::-;14885:180;;14571:501;;;;:::o;15078:329::-;15137:6;15186:2;15174:9;15165:7;15161:23;15157:32;15154:119;;;15192:79;;:::i;:::-;15154:119;15312:1;15337:53;15382:7;15373:6;15362:9;15358:22;15337:53;:::i;:::-;15327:63;;15283:117;15078:329;;;;:::o;15413:114::-;15480:6;15514:5;15508:12;15498:22;;15413:114;;;:::o;15533:184::-;15632:11;15666:6;15661:3;15654:19;15706:4;15701:3;15697:14;15682:29;;15533:184;;;;:::o;15723:132::-;15790:4;15813:3;15805:11;;15843:4;15838:3;15834:14;15826:22;;15723:132;;;:::o;15861:108::-;15938:24;15956:5;15938:24;:::i;:::-;15933:3;15926:37;15861:108;;:::o;15975:179::-;16044:10;16065:46;16107:3;16099:6;16065:46;:::i;:::-;16143:4;16138:3;16134:14;16120:28;;15975:179;;;;:::o;16160:113::-;16230:4;16262;16257:3;16253:14;16245:22;;16160:113;;;:::o;16309:732::-;16428:3;16457:54;16505:5;16457:54;:::i;:::-;16527:86;16606:6;16601:3;16527:86;:::i;:::-;16520:93;;16637:56;16687:5;16637:56;:::i;:::-;16716:7;16747:1;16732:284;16757:6;16754:1;16751:13;16732:284;;;16833:6;16827:13;16860:63;16919:3;16904:13;16860:63;:::i;:::-;16853:70;;16946:60;16999:6;16946:60;:::i;:::-;16936:70;;16792:224;16779:1;16776;16772:9;16767:14;;16732:284;;;16736:14;17032:3;17025:10;;16433:608;;;16309:732;;;;:::o;17047:373::-;17190:4;17228:2;17217:9;17213:18;17205:26;;17277:9;17271:4;17267:20;17263:1;17252:9;17248:17;17241:47;17305:108;17408:4;17399:6;17305:108;:::i;:::-;17297:116;;17047:373;;;;:::o;17426:619::-;17503:6;17511;17519;17568:2;17556:9;17547:7;17543:23;17539:32;17536:119;;;17574:79;;:::i;:::-;17536:119;17694:1;17719:53;17764:7;17755:6;17744:9;17740:22;17719:53;:::i;:::-;17709:63;;17665:117;17821:2;17847:53;17892:7;17883:6;17872:9;17868:22;17847:53;:::i;:::-;17837:63;;17792:118;17949:2;17975:53;18020:7;18011:6;18000:9;17996:22;17975:53;:::i;:::-;17965:63;;17920:118;17426:619;;;;;:::o;18051:116::-;18121:21;18136:5;18121:21;:::i;:::-;18114:5;18111:32;18101:60;;18157:1;18154;18147:12;18101:60;18051:116;:::o;18173:133::-;18216:5;18254:6;18241:20;18232:29;;18270:30;18294:5;18270:30;:::i;:::-;18173:133;;;;:::o;18312:468::-;18377:6;18385;18434:2;18422:9;18413:7;18409:23;18405:32;18402:119;;;18440:79;;:::i;:::-;18402:119;18560:1;18585:53;18630:7;18621:6;18610:9;18606:22;18585:53;:::i;:::-;18575:63;;18531:117;18687:2;18713:50;18755:7;18746:6;18735:9;18731:22;18713:50;:::i;:::-;18703:60;;18658:115;18312:468;;;;;:::o;18786:117::-;18895:1;18892;18885:12;18909:307;18970:4;19060:18;19052:6;19049:30;19046:56;;;19082:18;;:::i;:::-;19046:56;19120:29;19142:6;19120:29;:::i;:::-;19112:37;;19204:4;19198;19194:15;19186:23;;18909:307;;;:::o;19222:154::-;19306:6;19301:3;19296;19283:30;19368:1;19359:6;19354:3;19350:16;19343:27;19222:154;;;:::o;19382:410::-;19459:5;19484:65;19500:48;19541:6;19500:48;:::i;:::-;19484:65;:::i;:::-;19475:74;;19572:6;19565:5;19558:21;19610:4;19603:5;19599:16;19648:3;19639:6;19634:3;19630:16;19627:25;19624:112;;;19655:79;;:::i;:::-;19624:112;19745:41;19779:6;19774:3;19769;19745:41;:::i;:::-;19465:327;19382:410;;;;;:::o;19811:338::-;19866:5;19915:3;19908:4;19900:6;19896:17;19892:27;19882:122;;19923:79;;:::i;:::-;19882:122;20040:6;20027:20;20065:78;20139:3;20131:6;20124:4;20116:6;20112:17;20065:78;:::i;:::-;20056:87;;19872:277;19811:338;;;;:::o;20155:943::-;20250:6;20258;20266;20274;20323:3;20311:9;20302:7;20298:23;20294:33;20291:120;;;20330:79;;:::i;:::-;20291:120;20450:1;20475:53;20520:7;20511:6;20500:9;20496:22;20475:53;:::i;:::-;20465:63;;20421:117;20577:2;20603:53;20648:7;20639:6;20628:9;20624:22;20603:53;:::i;:::-;20593:63;;20548:118;20705:2;20731:53;20776:7;20767:6;20756:9;20752:22;20731:53;:::i;:::-;20721:63;;20676:118;20861:2;20850:9;20846:18;20833:32;20892:18;20884:6;20881:30;20878:117;;;20914:79;;:::i;:::-;20878:117;21019:62;21073:7;21064:6;21053:9;21049:22;21019:62;:::i;:::-;21009:72;;20804:287;20155:943;;;;;;;:::o;21176:699::-;21337:4;21332:3;21328:14;21424:4;21417:5;21413:16;21407:23;21443:63;21500:4;21495:3;21491:14;21477:12;21443:63;:::i;:::-;21352:164;21608:4;21601:5;21597:16;21591:23;21627:61;21682:4;21677:3;21673:14;21659:12;21627:61;:::i;:::-;21526:172;21782:4;21775:5;21771:16;21765:23;21801:57;21852:4;21847:3;21843:14;21829:12;21801:57;:::i;:::-;21708:160;21306:569;21176:699;;:::o;21881:350::-;22038:4;22076:2;22065:9;22061:18;22053:26;;22089:135;22221:1;22210:9;22206:17;22197:6;22089:135;:::i;:::-;21881:350;;;;:::o;22237:474::-;22305:6;22313;22362:2;22350:9;22341:7;22337:23;22333:32;22330:119;;;22368:79;;:::i;:::-;22330:119;22488:1;22513:53;22558:7;22549:6;22538:9;22534:22;22513:53;:::i;:::-;22503:63;;22459:117;22615:2;22641:53;22686:7;22677:6;22666:9;22662:22;22641:53;:::i;:::-;22631:63;;22586:118;22237:474;;;;;:::o;22717:180::-;22765:77;22762:1;22755:88;22862:4;22859:1;22852:15;22886:4;22883:1;22876:15;22903:320;22947:6;22984:1;22978:4;22974:12;22964:22;;23031:1;23025:4;23021:12;23052:18;23042:81;;23108:4;23100:6;23096:17;23086:27;;23042:81;23170:2;23162:6;23159:14;23139:18;23136:38;23133:84;;23189:18;;:::i;:::-;23133:84;22954:269;22903:320;;;:::o;23229:182::-;23369:34;23365:1;23357:6;23353:14;23346:58;23229:182;:::o;23417:366::-;23559:3;23580:67;23644:2;23639:3;23580:67;:::i;:::-;23573:74;;23656:93;23745:3;23656:93;:::i;:::-;23774:2;23769:3;23765:12;23758:19;;23417:366;;;:::o;23789:419::-;23955:4;23993:2;23982:9;23978:18;23970:26;;24042:9;24036:4;24032:20;24028:1;24017:9;24013:17;24006:47;24070:131;24196:4;24070:131;:::i;:::-;24062:139;;23789:419;;;:::o;24214:180::-;24262:77;24259:1;24252:88;24359:4;24356:1;24349:15;24383:4;24380:1;24373:15;24400:348;24440:7;24463:20;24481:1;24463:20;:::i;:::-;24458:25;;24497:20;24515:1;24497:20;:::i;:::-;24492:25;;24685:1;24617:66;24613:74;24610:1;24607:81;24602:1;24595:9;24588:17;24584:105;24581:131;;;24692:18;;:::i;:::-;24581:131;24740:1;24737;24733:9;24722:20;;24400:348;;;;:::o;24754:305::-;24794:3;24813:20;24831:1;24813:20;:::i;:::-;24808:25;;24847:20;24865:1;24847:20;:::i;:::-;24842:25;;25001:1;24933:66;24929:74;24926:1;24923:81;24920:107;;;25007:18;;:::i;:::-;24920:107;25051:1;25048;25044:9;25037:16;;24754:305;;;;:::o;25065:168::-;25205:20;25201:1;25193:6;25189:14;25182:44;25065:168;:::o;25239:366::-;25381:3;25402:67;25466:2;25461:3;25402:67;:::i;:::-;25395:74;;25478:93;25567:3;25478:93;:::i;:::-;25596:2;25591:3;25587:12;25580:19;;25239:366;;;:::o;25611:419::-;25777:4;25815:2;25804:9;25800:18;25792:26;;25864:9;25858:4;25854:20;25850:1;25839:9;25835:17;25828:47;25892:131;26018:4;25892:131;:::i;:::-;25884:139;;25611:419;;;:::o;26036:180::-;26084:77;26081:1;26074:88;26181:4;26178:1;26171:15;26205:4;26202:1;26195:15;26222:233;26261:3;26284:24;26302:5;26284:24;:::i;:::-;26275:33;;26330:66;26323:5;26320:77;26317:103;;26400:18;;:::i;:::-;26317:103;26447:1;26440:5;26436:13;26429:20;;26222:233;;;:::o;26461:171::-;26601:23;26597:1;26589:6;26585:14;26578:47;26461:171;:::o;26638:366::-;26780:3;26801:67;26865:2;26860:3;26801:67;:::i;:::-;26794:74;;26877:93;26966:3;26877:93;:::i;:::-;26995:2;26990:3;26986:12;26979:19;;26638:366;;;:::o;27010:419::-;27176:4;27214:2;27203:9;27199:18;27191:26;;27263:9;27257:4;27253:20;27249:1;27238:9;27234:17;27227:47;27291:131;27417:4;27291:131;:::i;:::-;27283:139;;27010:419;;;:::o;27435:97::-;27494:6;27522:3;27512:13;;27435:97;;;;:::o;27538:141::-;27587:4;27610:3;27602:11;;27633:3;27630:1;27623:14;27667:4;27664:1;27654:18;27646:26;;27538:141;;;:::o;27685:93::-;27722:6;27769:2;27764;27757:5;27753:14;27749:23;27739:33;;27685:93;;;:::o;27784:107::-;27828:8;27878:5;27872:4;27868:16;27847:37;;27784:107;;;;:::o;27897:393::-;27966:6;28016:1;28004:10;28000:18;28039:97;28069:66;28058:9;28039:97;:::i;:::-;28157:39;28187:8;28176:9;28157:39;:::i;:::-;28145:51;;28229:4;28225:9;28218:5;28214:21;28205:30;;28278:4;28268:8;28264:19;28257:5;28254:30;28244:40;;27973:317;;27897:393;;;;;:::o;28296:60::-;28324:3;28345:5;28338:12;;28296:60;;;:::o;28362:142::-;28412:9;28445:53;28463:34;28472:24;28490:5;28472:24;:::i;:::-;28463:34;:::i;:::-;28445:53;:::i;:::-;28432:66;;28362:142;;;:::o;28510:75::-;28553:3;28574:5;28567:12;;28510:75;;;:::o;28591:269::-;28701:39;28732:7;28701:39;:::i;:::-;28762:91;28811:41;28835:16;28811:41;:::i;:::-;28803:6;28796:4;28790:11;28762:91;:::i;:::-;28756:4;28749:105;28667:193;28591:269;;;:::o;28866:73::-;28911:3;28866:73;:::o;28945:189::-;29022:32;;:::i;:::-;29063:65;29121:6;29113;29107:4;29063:65;:::i;:::-;28998:136;28945:189;;:::o;29140:186::-;29200:120;29217:3;29210:5;29207:14;29200:120;;;29271:39;29308:1;29301:5;29271:39;:::i;:::-;29244:1;29237:5;29233:13;29224:22;;29200:120;;;29140:186;;:::o;29332:543::-;29433:2;29428:3;29425:11;29422:446;;;29467:38;29499:5;29467:38;:::i;:::-;29551:29;29569:10;29551:29;:::i;:::-;29541:8;29537:44;29734:2;29722:10;29719:18;29716:49;;;29755:8;29740:23;;29716:49;29778:80;29834:22;29852:3;29834:22;:::i;:::-;29824:8;29820:37;29807:11;29778:80;:::i;:::-;29437:431;;29422:446;29332:543;;;:::o;29881:117::-;29935:8;29985:5;29979:4;29975:16;29954:37;;29881:117;;;;:::o;30004:169::-;30048:6;30081:51;30129:1;30125:6;30117:5;30114:1;30110:13;30081:51;:::i;:::-;30077:56;30162:4;30156;30152:15;30142:25;;30055:118;30004:169;;;;:::o;30178:295::-;30254:4;30400:29;30425:3;30419:4;30400:29;:::i;:::-;30392:37;;30462:3;30459:1;30455:11;30449:4;30446:21;30438:29;;30178:295;;;;:::o;30478:1403::-;30602:44;30642:3;30637;30602:44;:::i;:::-;30711:18;30703:6;30700:30;30697:56;;;30733:18;;:::i;:::-;30697:56;30777:38;30809:4;30803:11;30777:38;:::i;:::-;30862:67;30922:6;30914;30908:4;30862:67;:::i;:::-;30956:1;30985:2;30977:6;30974:14;31002:1;30997:632;;;;31673:1;31690:6;31687:84;;;31746:9;31741:3;31737:19;31724:33;31715:42;;31687:84;31797:67;31857:6;31850:5;31797:67;:::i;:::-;31791:4;31784:81;31646:229;30967:908;;30997:632;31049:4;31045:9;31037:6;31033:22;31083:37;31115:4;31083:37;:::i;:::-;31142:1;31156:215;31170:7;31167:1;31164:14;31156:215;;;31256:9;31251:3;31247:19;31234:33;31226:6;31219:49;31307:1;31299:6;31295:14;31285:24;;31354:2;31343:9;31339:18;31326:31;;31193:4;31190:1;31186:12;31181:17;;31156:215;;;31399:6;31390:7;31387:19;31384:186;;;31464:9;31459:3;31455:19;31442:33;31507:48;31549:4;31541:6;31537:17;31526:9;31507:48;:::i;:::-;31499:6;31492:64;31407:163;31384:186;31616:1;31612;31604:6;31600:14;31596:22;31590:4;31583:36;31004:625;;;30967:908;;30577:1304;;;30478:1403;;;:::o;31887:167::-;32027:19;32023:1;32015:6;32011:14;32004:43;31887:167;:::o;32060:366::-;32202:3;32223:67;32287:2;32282:3;32223:67;:::i;:::-;32216:74;;32299:93;32388:3;32299:93;:::i;:::-;32417:2;32412:3;32408:12;32401:19;;32060:366;;;:::o;32432:419::-;32598:4;32636:2;32625:9;32621:18;32613:26;;32685:9;32679:4;32675:20;32671:1;32660:9;32656:17;32649:47;32713:131;32839:4;32713:131;:::i;:::-;32705:139;;32432:419;;;:::o;32857:164::-;32997:16;32993:1;32985:6;32981:14;32974:40;32857:164;:::o;33027:366::-;33169:3;33190:67;33254:2;33249:3;33190:67;:::i;:::-;33183:74;;33266:93;33355:3;33266:93;:::i;:::-;33384:2;33379:3;33375:12;33368:19;;33027:366;;;:::o;33399:419::-;33565:4;33603:2;33592:9;33588:18;33580:26;;33652:9;33646:4;33642:20;33638:1;33627:9;33623:17;33616:47;33680:131;33806:4;33680:131;:::i;:::-;33672:139;;33399:419;;;:::o;33824:167::-;33964:19;33960:1;33952:6;33948:14;33941:43;33824:167;:::o;33997:366::-;34139:3;34160:67;34224:2;34219:3;34160:67;:::i;:::-;34153:74;;34236:93;34325:3;34236:93;:::i;:::-;34354:2;34349:3;34345:12;34338:19;;33997:366;;;:::o;34369:419::-;34535:4;34573:2;34562:9;34558:18;34550:26;;34622:9;34616:4;34612:20;34608:1;34597:9;34593:17;34586:47;34650:131;34776:4;34650:131;:::i;:::-;34642:139;;34369:419;;;:::o;34794:191::-;34834:4;34854:20;34872:1;34854:20;:::i;:::-;34849:25;;34888:20;34906:1;34888:20;:::i;:::-;34883:25;;34927:1;34924;34921:8;34918:34;;;34932:18;;:::i;:::-;34918:34;34977:1;34974;34970:9;34962:17;;34794:191;;;;:::o;34991:173::-;35131:25;35127:1;35119:6;35115:14;35108:49;34991:173;:::o;35170:366::-;35312:3;35333:67;35397:2;35392:3;35333:67;:::i;:::-;35326:74;;35409:93;35498:3;35409:93;:::i;:::-;35527:2;35522:3;35518:12;35511:19;;35170:366;;;:::o;35542:419::-;35708:4;35746:2;35735:9;35731:18;35723:26;;35795:9;35789:4;35785:20;35781:1;35770:9;35766:17;35759:47;35823:131;35949:4;35823:131;:::i;:::-;35815:139;;35542:419;;;:::o;35967:148::-;36069:11;36106:3;36091:18;;35967:148;;;;:::o;36121:377::-;36227:3;36255:39;36288:5;36255:39;:::i;:::-;36310:89;36392:6;36387:3;36310:89;:::i;:::-;36303:96;;36408:52;36453:6;36448:3;36441:4;36434:5;36430:16;36408:52;:::i;:::-;36485:6;36480:3;36476:16;36469:23;;36231:267;36121:377;;;;:::o;36504:435::-;36684:3;36706:95;36797:3;36788:6;36706:95;:::i;:::-;36699:102;;36818:95;36909:3;36900:6;36818:95;:::i;:::-;36811:102;;36930:3;36923:10;;36504:435;;;;;:::o;36945:125::-;37011:7;37040:24;37058:5;37040:24;:::i;:::-;37029:35;;36945:125;;;:::o;37076:180::-;37178:53;37225:5;37178:53;:::i;:::-;37171:5;37168:64;37158:92;;37246:1;37243;37236:12;37158:92;37076:180;:::o;37262:201::-;37348:5;37379:6;37373:13;37364:22;;37395:62;37451:5;37395:62;:::i;:::-;37262:201;;;;:::o;37469:409::-;37568:6;37617:2;37605:9;37596:7;37592:23;37588:32;37585:119;;;37623:79;;:::i;:::-;37585:119;37743:1;37768:93;37853:7;37844:6;37833:9;37829:22;37768:93;:::i;:::-;37758:103;;37714:157;37469:409;;;;:::o;37884:225::-;38024:34;38020:1;38012:6;38008:14;38001:58;38093:8;38088:2;38080:6;38076:15;38069:33;37884:225;:::o;38115:366::-;38257:3;38278:67;38342:2;38337:3;38278:67;:::i;:::-;38271:74;;38354:93;38443:3;38354:93;:::i;:::-;38472:2;38467:3;38463:12;38456:19;;38115:366;;;:::o;38487:419::-;38653:4;38691:2;38680:9;38676:18;38668:26;;38740:9;38734:4;38730:20;38726:1;38715:9;38711:17;38704:47;38768:131;38894:4;38768:131;:::i;:::-;38760:139;;38487:419;;;:::o;38912:98::-;38963:6;38997:5;38991:12;38981:22;;38912:98;;;:::o;39016:168::-;39099:11;39133:6;39128:3;39121:19;39173:4;39168:3;39164:14;39149:29;;39016:168;;;;:::o;39190:360::-;39276:3;39304:38;39336:5;39304:38;:::i;:::-;39358:70;39421:6;39416:3;39358:70;:::i;:::-;39351:77;;39437:52;39482:6;39477:3;39470:4;39463:5;39459:16;39437:52;:::i;:::-;39514:29;39536:6;39514:29;:::i;:::-;39509:3;39505:39;39498:46;;39280:270;39190:360;;;;:::o;39556:640::-;39751:4;39789:3;39778:9;39774:19;39766:27;;39803:71;39871:1;39860:9;39856:17;39847:6;39803:71;:::i;:::-;39884:72;39952:2;39941:9;39937:18;39928:6;39884:72;:::i;:::-;39966;40034:2;40023:9;40019:18;40010:6;39966:72;:::i;:::-;40085:9;40079:4;40075:20;40070:2;40059:9;40055:18;40048:48;40113:76;40184:4;40175:6;40113:76;:::i;:::-;40105:84;;39556:640;;;;;;;:::o;40202:141::-;40258:5;40289:6;40283:13;40274:22;;40305:32;40331:5;40305:32;:::i;:::-;40202:141;;;;:::o;40349:349::-;40418:6;40467:2;40455:9;40446:7;40442:23;40438:32;40435:119;;;40473:79;;:::i;:::-;40435:119;40593:1;40618:63;40673:7;40664:6;40653:9;40649:22;40618:63;:::i;:::-;40608:73;;40564:127;40349:349;;;;:::o

Swarm Source

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