ETH Price: $2,683.40 (-2.51%)

Token

PoootAtoohhzzZzz (POTATOES)
 

Overview

Max Total Supply

1,023 POTATOES

Holders

207

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 POTATOES
0x0d357eb9a87e35df6a3a8d05a6bdc105b4a8facd
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:
PotatoesWTF

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 5 of 5: Potatoes.sol
// SPDX-License-Identifier: MIT

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


pragma solidity ^0.8.7;

contract PotatoesWTF is Ownable, ERC721A {
    uint256 public maxSupply                    = 5000;
    uint256 public maxFreeSupply                = 1000;

    uint256 public maxPerAddressDuringMint      = 10;
    uint256 public maxPerAddressDuringFreeMint  = 5;
    
    uint256 public price                        = 0.005 ether;
    bool    public saleIsActive                 = false;

    string private _baseTokenURI;

    mapping(address => uint256) public freeMintedAmount;
    mapping(address => uint256) public mintedAmount;

    constructor() ERC721A("PoootAtoohhzzZzz", "POTATOES") {
        
    }

    modifier mintCompliance() {
        require(saleIsActive, "Sale is not active yet.");
        require(tx.origin == msg.sender, "Caller cannot be a contract.");
        _;
    }

    function mint(uint256 _quantity) external payable mintCompliance() {
        require(
            msg.value >= price * _quantity,
            "Insufficient Fund."
        );
        require(
            maxSupply >= totalSupply() + _quantity,
            "Exceeds max supply."
        );
        uint256 _mintedAmount = mintedAmount[msg.sender];
        require(
            _mintedAmount + _quantity <= maxPerAddressDuringMint,
            "Exceeds max mints per address!"
        );

        mintedAmount[msg.sender] = _mintedAmount + _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function freeMint(uint256 _quantity) external mintCompliance() {
        require(
            maxFreeSupply >= totalSupply() + _quantity,
            "Exceeds max free supply."
        );
        uint256 _freeMintedAmount = freeMintedAmount[msg.sender];
        require(
            _freeMintedAmount + _quantity <= maxPerAddressDuringFreeMint,
            "Exceeds max free mints per address!"
        );
        freeMintedAmount[msg.sender] = _freeMintedAmount + _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function flipSale() public onlyOwner {
        saleIsActive = !saleIsActive;
    }

    function burnSupply(uint256 _amount) public onlyOwner {
        require(
            maxSupply - _amount >= totalSupply(), 
            "Supply cannot fall below minted tokens."
        );
        maxSupply -= _amount;
    }

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

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

      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),".json")) : '';

    }

    function withdraw() external payable onlyOwner {
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
  }
 
}

File 1 of 5: 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 5: ERC721A.sol
// SPDX-License-Identifier: MIT

import './IERC721A.sol';

pragma solidity ^0.8.4;


/**
 * @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 5: IERC721A.sol
// SPDX-License-Identifier: MIT

// File: erc721a/contracts/IERC721A.sol

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 4 of 5: 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":[],"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":"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":[{"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":"uint256","name":"_amount","type":"uint256"}],"name":"burnSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"freeMintedAmount","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":[],"name":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringFreeMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerAddressDuringMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526113886009556103e8600a55600a600b556005600c556611c37937e08000600d556000600e60006101000a81548160ff0219169083151502179055503480156200004d57600080fd5b506040518060400160405280601081526020017f506f6f6f7441746f6f68687a7a5a7a7a000000000000000000000000000000008152506040518060400160405280600881526020017f504f5441544f4553000000000000000000000000000000000000000000000000815250620000da620000ce6200012a60201b60201c565b6200013260201b60201c565b8160039080519060200190620000f2929190620001fb565b5080600490805190602001906200010b929190620001fb565b506200011c620001f660201b60201c565b600181905550505062000310565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b8280546200020990620002ab565b90600052602060002090601f0160209004810192826200022d576000855562000279565b82601f106200024857805160ff191683800117855562000279565b8280016001018555821562000279579182015b82811115620002785782518255916020019190600101906200025b565b5b5090506200028891906200028c565b5090565b5b80821115620002a75760008160009055506001016200028d565b5090565b60006002820490506001821680620002c457607f821691505b60208210811415620002db57620002da620002e1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61330180620003206000396000f3fe6080604052600436106101d85760003560e01c80637c928fe911610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461066a578063eb8d2444146106a7578063f2fde38b146106d2578063fbbf8cc3146106fb576101d8565b8063b88d4fde146105b0578063c87b56dd146105d9578063d595c33114610616578063d5abeb011461063f576101d8565b806396b10201116100d157806396b1020114610503578063a035b1fe14610540578063a0712d681461056b578063a22cb46514610587576101d8565b80637c928fe9146104595780638bc35c2f146104825780638da5cb5b146104ad57806395d89b41146104d8576101d8565b80633ccfd60b1161017a5780636352211e116101495780636352211e146103b157806370a08231146103ee578063715018a61461042b5780637ba5e62114610442576101d8565b80633ccfd60b1461032a57806342842e0e14610334578063475133341461035d57806355f804b314610388576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632e0fd6eb146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff919061274f565b610738565b6040516102119190612b42565b60405180910390f35b34801561022657600080fd5b5061022f6107ca565b60405161023c9190612b5d565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906127f6565b61085c565b6040516102799190612adb565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061270f565b6108d8565b005b3480156102b757600080fd5b506102c0610a7f565b6040516102cd9190612cbf565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f891906125f9565b610a96565b005b34801561030b57600080fd5b50610314610aa6565b6040516103219190612cbf565b60405180910390f35b610332610aac565b005b34801561034057600080fd5b5061035b600480360381019061035691906125f9565b610ba8565b005b34801561036957600080fd5b50610372610bc8565b60405161037f9190612cbf565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906127a9565b610bce565b005b3480156103bd57600080fd5b506103d860048036038101906103d391906127f6565b610c60565b6040516103e59190612adb565b60405180910390f35b3480156103fa57600080fd5b506104156004803603810190610410919061258c565b610c72565b6040516104229190612cbf565b60405180910390f35b34801561043757600080fd5b50610440610d2b565b005b34801561044e57600080fd5b50610457610db3565b005b34801561046557600080fd5b50610480600480360381019061047b91906127f6565b610e5b565b005b34801561048e57600080fd5b50610497611060565b6040516104a49190612cbf565b60405180910390f35b3480156104b957600080fd5b506104c2611066565b6040516104cf9190612adb565b60405180910390f35b3480156104e457600080fd5b506104ed61108f565b6040516104fa9190612b5d565b60405180910390f35b34801561050f57600080fd5b5061052a6004803603810190610525919061258c565b611121565b6040516105379190612cbf565b60405180910390f35b34801561054c57600080fd5b50610555611139565b6040516105629190612cbf565b60405180910390f35b610585600480360381019061058091906127f6565b61113f565b005b34801561059357600080fd5b506105ae60048036038101906105a991906126cf565b611394565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061264c565b61150c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906127f6565b61157f565b60405161060d9190612b5d565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906127f6565b61161e565b005b34801561064b57600080fd5b5061065461170d565b6040516106619190612cbf565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906125b9565b611713565b60405161069e9190612b42565b60405180910390f35b3480156106b357600080fd5b506106bc6117a7565b6040516106c99190612b42565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061258c565b6117ba565b005b34801561070757600080fd5b50610722600480360381019061071d919061258c565b6118b2565b60405161072f9190612cbf565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546107d990612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461080590612f18565b80156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b5050505050905090565b6000610867826118ca565b61089d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382611929565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096a6119f7565b73ffffffffffffffffffffffffffffffffffffffff16146109cd57610996816109916119f7565b611713565b6109cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a896119ff565b6002546001540303905090565b610aa1838383611a04565b505050565b600c5481565b610ab4611dae565b73ffffffffffffffffffffffffffffffffffffffff16610ad2611066565b73ffffffffffffffffffffffffffffffffffffffff1614610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90612bff565b60405180910390fd5b6000610b32611066565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b5590612ac6565b60006040518083038185875af1925050503d8060008114610b92576040519150601f19603f3d011682016040523d82523d6000602084013e610b97565b606091505b5050905080610ba557600080fd5b50565b610bc38383836040518060200160405280600081525061150c565b505050565b600a5481565b610bd6611dae565b73ffffffffffffffffffffffffffffffffffffffff16610bf4611066565b73ffffffffffffffffffffffffffffffffffffffff1614610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190612bff565b60405180910390fd5b8181600f9190610c5b9291906123ba565b505050565b6000610c6b82611929565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cda576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d33611dae565b73ffffffffffffffffffffffffffffffffffffffff16610d51611066565b73ffffffffffffffffffffffffffffffffffffffff1614610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90612bff565b60405180910390fd5b610db16000611db6565b565b610dbb611dae565b73ffffffffffffffffffffffffffffffffffffffff16610dd9611066565b73ffffffffffffffffffffffffffffffffffffffff1614610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690612bff565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff16610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90612b9f565b60405180910390fd5b80610f21610a7f565b610f2b9190612d7e565b600a541015610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690612c9f565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600c548282610fc29190612d7e565b1115611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612c5f565b60405180910390fd5b818161100f9190612d7e565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061105c3383611e7a565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461109e90612f18565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca90612f18565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b60106020528060005260406000206000915090505481565b600d5481565b600e60009054906101000a900460ff1661118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390612b9f565b60405180910390fd5b80600d5461120a9190612dd4565b34101561124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390612c3f565b60405180910390fd5b80611255610a7f565b61125f9190612d7e565b60095410156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90612c1f565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b5482826112f69190612d7e565b1115611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90612c7f565b60405180910390fd5b81816113439190612d7e565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113903383611e7a565b5050565b61139c6119f7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611401576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061140e6119f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bb6119f7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115009190612b42565b60405180910390a35050565b611517848484611a04565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115795761154284848484611e98565b611578576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061158a826118ca565b6115c0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115ca611ff8565b90506000815114156115eb5760405180602001604052806000815250611616565b806115f58461208a565b604051602001611606929190612a97565b6040516020818303038152906040525b915050919050565b611626611dae565b73ffffffffffffffffffffffffffffffffffffffff16611644611066565b73ffffffffffffffffffffffffffffffffffffffff161461169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190612bff565b60405180910390fd5b6116a2610a7f565b816009546116b09190612e2e565b10156116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e890612bdf565b60405180910390fd5b80600960008282546117039190612e2e565b9250508190555050565b60095481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6117c2611dae565b73ffffffffffffffffffffffffffffffffffffffff166117e0611066565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d90612bff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90612b7f565b60405180910390fd5b6118af81611db6565b50565b60116020528060005260406000206000915090505481565b6000816118d56119ff565b111580156118e4575060015482105b8015611922575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806119386119ff565b116119c0576001548110156119bf5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156119bd575b60008114156119b3576005600083600190039350838152602001908152602001600020549050611988565b80925050506119f2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611a0f82611929565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a976119f7565b73ffffffffffffffffffffffffffffffffffffffff161480611ac65750611ac585611ac06119f7565b611713565b5b80611b0b5750611ad46119f7565b73ffffffffffffffffffffffffffffffffffffffff16611af38461085c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b44576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885858560016120e4565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611cb5866120ea565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611d3f576000600184019050600060056000838152602001908152602001600020541415611d3d576001548114611d3c578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611da785858560016120f4565b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e948282604051806020016040528060008152506120fa565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ebe6119f7565b8786866040518563ffffffff1660e01b8152600401611ee09493929190612af6565b602060405180830381600087803b158015611efa57600080fd5b505af1925050508015611f2b57506040513d601f19601f82011682018060405250810190611f28919061277c565b60015b611fa5573d8060008114611f5b576040519150601f19603f3d011682016040523d82523d6000602084013e611f60565b606091505b50600081511415611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461200790612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461203390612f18565b80156120805780601f1061205557610100808354040283529160200191612080565b820191906000526020600020905b81548152906001019060200180831161206357829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156120d057600183039250600a81066030018353600a810490506120b0565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612168576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121a3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121b060008583866120e4565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612215600185146123b0565b901b60a042901b612225866120ea565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612329575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d96000878480600101955087611e98565b61230f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061226a57826001541461232457600080fd5b612394565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061232a575b8160018190555050506123aa60008583866120f4565b50505050565b6000819050919050565b8280546123c690612f18565b90600052602060002090601f0160209004810192826123e8576000855561242f565b82601f1061240157803560ff191683800117855561242f565b8280016001018555821561242f579182015b8281111561242e578235825591602001919060010190612413565b5b50905061243c9190612440565b5090565b5b80821115612459576000816000905550600101612441565b5090565b600061247061246b84612cff565b612cda565b90508281526020810184848401111561248c5761248b613017565b5b612497848285612ed6565b509392505050565b6000813590506124ae8161326f565b92915050565b6000813590506124c381613286565b92915050565b6000813590506124d88161329d565b92915050565b6000815190506124ed8161329d565b92915050565b600082601f8301126125085761250761300d565b5b813561251884826020860161245d565b91505092915050565b60008083601f8401126125375761253661300d565b5b8235905067ffffffffffffffff81111561255457612553613008565b5b6020830191508360018202830111156125705761256f613012565b5b9250929050565b600081359050612586816132b4565b92915050565b6000602082840312156125a2576125a1613021565b5b60006125b08482850161249f565b91505092915050565b600080604083850312156125d0576125cf613021565b5b60006125de8582860161249f565b92505060206125ef8582860161249f565b9150509250929050565b60008060006060848603121561261257612611613021565b5b60006126208682870161249f565b93505060206126318682870161249f565b925050604061264286828701612577565b9150509250925092565b6000806000806080858703121561266657612665613021565b5b60006126748782880161249f565b94505060206126858782880161249f565b935050604061269687828801612577565b925050606085013567ffffffffffffffff8111156126b7576126b661301c565b5b6126c3878288016124f3565b91505092959194509250565b600080604083850312156126e6576126e5613021565b5b60006126f48582860161249f565b9250506020612705858286016124b4565b9150509250929050565b6000806040838503121561272657612725613021565b5b60006127348582860161249f565b925050602061274585828601612577565b9150509250929050565b60006020828403121561276557612764613021565b5b6000612773848285016124c9565b91505092915050565b60006020828403121561279257612791613021565b5b60006127a0848285016124de565b91505092915050565b600080602083850312156127c0576127bf613021565b5b600083013567ffffffffffffffff8111156127de576127dd61301c565b5b6127ea85828601612521565b92509250509250929050565b60006020828403121561280c5761280b613021565b5b600061281a84828501612577565b91505092915050565b61282c81612e62565b82525050565b61283b81612e74565b82525050565b600061284c82612d30565b6128568185612d46565b9350612866818560208601612ee5565b61286f81613026565b840191505092915050565b600061288582612d3b565b61288f8185612d62565b935061289f818560208601612ee5565b6128a881613026565b840191505092915050565b60006128be82612d3b565b6128c88185612d73565b93506128d8818560208601612ee5565b80840191505092915050565b60006128f1602683612d62565b91506128fc82613037565b604082019050919050565b6000612914601c83612d62565b915061291f82613086565b602082019050919050565b6000612937601783612d62565b9150612942826130af565b602082019050919050565b600061295a602783612d62565b9150612965826130d8565b604082019050919050565b600061297d600583612d73565b915061298882613127565b600582019050919050565b60006129a0602083612d62565b91506129ab82613150565b602082019050919050565b60006129c3601383612d62565b91506129ce82613179565b602082019050919050565b60006129e6601283612d62565b91506129f1826131a2565b602082019050919050565b6000612a09600083612d57565b9150612a14826131cb565b600082019050919050565b6000612a2c602383612d62565b9150612a37826131ce565b604082019050919050565b6000612a4f601e83612d62565b9150612a5a8261321d565b602082019050919050565b6000612a72601883612d62565b9150612a7d82613246565b602082019050919050565b612a9181612ecc565b82525050565b6000612aa382856128b3565b9150612aaf82846128b3565b9150612aba82612970565b91508190509392505050565b6000612ad1826129fc565b9150819050919050565b6000602082019050612af06000830184612823565b92915050565b6000608082019050612b0b6000830187612823565b612b186020830186612823565b612b256040830185612a88565b8181036060830152612b378184612841565b905095945050505050565b6000602082019050612b576000830184612832565b92915050565b60006020820190508181036000830152612b77818461287a565b905092915050565b60006020820190508181036000830152612b98816128e4565b9050919050565b60006020820190508181036000830152612bb881612907565b9050919050565b60006020820190508181036000830152612bd88161292a565b9050919050565b60006020820190508181036000830152612bf88161294d565b9050919050565b60006020820190508181036000830152612c1881612993565b9050919050565b60006020820190508181036000830152612c38816129b6565b9050919050565b60006020820190508181036000830152612c58816129d9565b9050919050565b60006020820190508181036000830152612c7881612a1f565b9050919050565b60006020820190508181036000830152612c9881612a42565b9050919050565b60006020820190508181036000830152612cb881612a65565b9050919050565b6000602082019050612cd46000830184612a88565b92915050565b6000612ce4612cf5565b9050612cf08282612f4a565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d19612fd9565b5b612d2382613026565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d8982612ecc565b9150612d9483612ecc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dc957612dc8612f7b565b5b828201905092915050565b6000612ddf82612ecc565b9150612dea83612ecc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2357612e22612f7b565b5b828202905092915050565b6000612e3982612ecc565b9150612e4483612ecc565b925082821015612e5757612e56612f7b565b5b828203905092915050565b6000612e6d82612eac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f03578082015181840152602081019050612ee8565b83811115612f12576000848401525b50505050565b60006002820490506001821680612f3057607f821691505b60208210811415612f4457612f43612faa565b5b50919050565b612f5382613026565b810181811067ffffffffffffffff82111715612f7257612f71612fd9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c65722063616e6e6f74206265206120636f6e74726163742e00000000600082015250565b7f53616c65206973206e6f7420616374697665207965742e000000000000000000600082015250565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f496e73756666696369656e742046756e642e0000000000000000000000000000600082015250565b50565b7f45786365656473206d61782066726565206d696e74732070657220616464726560008201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178206d696e7473207065722061646472657373210000600082015250565b7f45786365656473206d6178206672656520737570706c792e0000000000000000600082015250565b61327881612e62565b811461328357600080fd5b50565b61328f81612e74565b811461329a57600080fd5b50565b6132a681612e80565b81146132b157600080fd5b50565b6132bd81612ecc565b81146132c857600080fd5b5056fea2646970667358221220a51253f0708f30be73eb872a1843d60d3c62b6da2dcf1d5c9cb1addc2f0f2f5b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101d85760003560e01c80637c928fe911610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461066a578063eb8d2444146106a7578063f2fde38b146106d2578063fbbf8cc3146106fb576101d8565b8063b88d4fde146105b0578063c87b56dd146105d9578063d595c33114610616578063d5abeb011461063f576101d8565b806396b10201116100d157806396b1020114610503578063a035b1fe14610540578063a0712d681461056b578063a22cb46514610587576101d8565b80637c928fe9146104595780638bc35c2f146104825780638da5cb5b146104ad57806395d89b41146104d8576101d8565b80633ccfd60b1161017a5780636352211e116101495780636352211e146103b157806370a08231146103ee578063715018a61461042b5780637ba5e62114610442576101d8565b80633ccfd60b1461032a57806342842e0e14610334578063475133341461035d57806355f804b314610388576101d8565b8063095ea7b3116101b6578063095ea7b31461028257806318160ddd146102ab57806323b872dd146102d65780632e0fd6eb146102ff576101d8565b806301ffc9a7146101dd57806306fdde031461021a578063081812fc14610245575b600080fd5b3480156101e957600080fd5b5061020460048036038101906101ff919061274f565b610738565b6040516102119190612b42565b60405180910390f35b34801561022657600080fd5b5061022f6107ca565b60405161023c9190612b5d565b60405180910390f35b34801561025157600080fd5b5061026c600480360381019061026791906127f6565b61085c565b6040516102799190612adb565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a4919061270f565b6108d8565b005b3480156102b757600080fd5b506102c0610a7f565b6040516102cd9190612cbf565b60405180910390f35b3480156102e257600080fd5b506102fd60048036038101906102f891906125f9565b610a96565b005b34801561030b57600080fd5b50610314610aa6565b6040516103219190612cbf565b60405180910390f35b610332610aac565b005b34801561034057600080fd5b5061035b600480360381019061035691906125f9565b610ba8565b005b34801561036957600080fd5b50610372610bc8565b60405161037f9190612cbf565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa91906127a9565b610bce565b005b3480156103bd57600080fd5b506103d860048036038101906103d391906127f6565b610c60565b6040516103e59190612adb565b60405180910390f35b3480156103fa57600080fd5b506104156004803603810190610410919061258c565b610c72565b6040516104229190612cbf565b60405180910390f35b34801561043757600080fd5b50610440610d2b565b005b34801561044e57600080fd5b50610457610db3565b005b34801561046557600080fd5b50610480600480360381019061047b91906127f6565b610e5b565b005b34801561048e57600080fd5b50610497611060565b6040516104a49190612cbf565b60405180910390f35b3480156104b957600080fd5b506104c2611066565b6040516104cf9190612adb565b60405180910390f35b3480156104e457600080fd5b506104ed61108f565b6040516104fa9190612b5d565b60405180910390f35b34801561050f57600080fd5b5061052a6004803603810190610525919061258c565b611121565b6040516105379190612cbf565b60405180910390f35b34801561054c57600080fd5b50610555611139565b6040516105629190612cbf565b60405180910390f35b610585600480360381019061058091906127f6565b61113f565b005b34801561059357600080fd5b506105ae60048036038101906105a991906126cf565b611394565b005b3480156105bc57600080fd5b506105d760048036038101906105d2919061264c565b61150c565b005b3480156105e557600080fd5b5061060060048036038101906105fb91906127f6565b61157f565b60405161060d9190612b5d565b60405180910390f35b34801561062257600080fd5b5061063d600480360381019061063891906127f6565b61161e565b005b34801561064b57600080fd5b5061065461170d565b6040516106619190612cbf565b60405180910390f35b34801561067657600080fd5b50610691600480360381019061068c91906125b9565b611713565b60405161069e9190612b42565b60405180910390f35b3480156106b357600080fd5b506106bc6117a7565b6040516106c99190612b42565b60405180910390f35b3480156106de57600080fd5b506106f960048036038101906106f4919061258c565b6117ba565b005b34801561070757600080fd5b50610722600480360381019061071d919061258c565b6118b2565b60405161072f9190612cbf565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061079357506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107c35750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546107d990612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461080590612f18565b80156108525780601f1061082757610100808354040283529160200191610852565b820191906000526020600020905b81548152906001019060200180831161083557829003601f168201915b5050505050905090565b6000610867826118ca565b61089d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e382611929565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096a6119f7565b73ffffffffffffffffffffffffffffffffffffffff16146109cd57610996816109916119f7565b611713565b6109cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a896119ff565b6002546001540303905090565b610aa1838383611a04565b505050565b600c5481565b610ab4611dae565b73ffffffffffffffffffffffffffffffffffffffff16610ad2611066565b73ffffffffffffffffffffffffffffffffffffffff1614610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90612bff565b60405180910390fd5b6000610b32611066565b73ffffffffffffffffffffffffffffffffffffffff1647604051610b5590612ac6565b60006040518083038185875af1925050503d8060008114610b92576040519150601f19603f3d011682016040523d82523d6000602084013e610b97565b606091505b5050905080610ba557600080fd5b50565b610bc38383836040518060200160405280600081525061150c565b505050565b600a5481565b610bd6611dae565b73ffffffffffffffffffffffffffffffffffffffff16610bf4611066565b73ffffffffffffffffffffffffffffffffffffffff1614610c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4190612bff565b60405180910390fd5b8181600f9190610c5b9291906123ba565b505050565b6000610c6b82611929565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610cda576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d33611dae565b73ffffffffffffffffffffffffffffffffffffffff16610d51611066565b73ffffffffffffffffffffffffffffffffffffffff1614610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90612bff565b60405180910390fd5b610db16000611db6565b565b610dbb611dae565b73ffffffffffffffffffffffffffffffffffffffff16610dd9611066565b73ffffffffffffffffffffffffffffffffffffffff1614610e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2690612bff565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b600e60009054906101000a900460ff16610eaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea190612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610f18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0f90612b9f565b60405180910390fd5b80610f21610a7f565b610f2b9190612d7e565b600a541015610f6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6690612c9f565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600c548282610fc29190612d7e565b1115611003576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ffa90612c5f565b60405180910390fd5b818161100f9190612d7e565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061105c3383611e7a565b5050565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461109e90612f18565b80601f01602080910402602001604051908101604052809291908181526020018280546110ca90612f18565b80156111175780601f106110ec57610100808354040283529160200191611117565b820191906000526020600020905b8154815290600101906020018083116110fa57829003601f168201915b5050505050905090565b60106020528060005260406000206000915090505481565b600d5481565b600e60009054906101000a900460ff1661118e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118590612bbf565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f390612b9f565b60405180910390fd5b80600d5461120a9190612dd4565b34101561124c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124390612c3f565b60405180910390fd5b80611255610a7f565b61125f9190612d7e565b60095410156112a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129a90612c1f565b60405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600b5482826112f69190612d7e565b1115611337576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132e90612c7f565b60405180910390fd5b81816113439190612d7e565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506113903383611e7a565b5050565b61139c6119f7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611401576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806008600061140e6119f7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114bb6119f7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115009190612b42565b60405180910390a35050565b611517848484611a04565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115795761154284848484611e98565b611578576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061158a826118ca565b6115c0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115ca611ff8565b90506000815114156115eb5760405180602001604052806000815250611616565b806115f58461208a565b604051602001611606929190612a97565b6040516020818303038152906040525b915050919050565b611626611dae565b73ffffffffffffffffffffffffffffffffffffffff16611644611066565b73ffffffffffffffffffffffffffffffffffffffff161461169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190612bff565b60405180910390fd5b6116a2610a7f565b816009546116b09190612e2e565b10156116f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e890612bdf565b60405180910390fd5b80600960008282546117039190612e2e565b9250508190555050565b60095481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6117c2611dae565b73ffffffffffffffffffffffffffffffffffffffff166117e0611066565b73ffffffffffffffffffffffffffffffffffffffff1614611836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182d90612bff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90612b7f565b60405180910390fd5b6118af81611db6565b50565b60116020528060005260406000206000915090505481565b6000816118d56119ff565b111580156118e4575060015482105b8015611922575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600080829050806119386119ff565b116119c0576001548110156119bf5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156119bd575b60008114156119b3576005600083600190039350838152602001908152602001600020549050611988565b80925050506119f2565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611a0f82611929565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611a76576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611a976119f7565b73ffffffffffffffffffffffffffffffffffffffff161480611ac65750611ac585611ac06119f7565b611713565b5b80611b0b5750611ad46119f7565b73ffffffffffffffffffffffffffffffffffffffff16611af38461085c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b44576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611bab576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bb885858560016120e4565b6007600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611cb5866120ea565b1717600560008581526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415611d3f576000600184019050600060056000838152602001908152602001600020541415611d3d576001548114611d3c578260056000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611da785858560016120f4565b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e948282604051806020016040528060008152506120fa565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ebe6119f7565b8786866040518563ffffffff1660e01b8152600401611ee09493929190612af6565b602060405180830381600087803b158015611efa57600080fd5b505af1925050508015611f2b57506040513d601f19601f82011682018060405250810190611f28919061277c565b60015b611fa5573d8060008114611f5b576040519150601f19603f3d011682016040523d82523d6000602084013e611f60565b606091505b50600081511415611f9d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600f805461200790612f18565b80601f016020809104026020016040519081016040528092919081815260200182805461203390612f18565b80156120805780601f1061205557610100808354040283529160200191612080565b820191906000526020600020905b81548152906001019060200180831161206357829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156120d057600183039250600a81066030018353600a810490506120b0565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612168576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156121a3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121b060008583866120e4565b600160406001901b178302600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1612215600185146123b0565b901b60a042901b612225866120ea565b1717600560008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612329575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122d96000878480600101955087611e98565b61230f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061226a57826001541461232457600080fd5b612394565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061232a575b8160018190555050506123aa60008583866120f4565b50505050565b6000819050919050565b8280546123c690612f18565b90600052602060002090601f0160209004810192826123e8576000855561242f565b82601f1061240157803560ff191683800117855561242f565b8280016001018555821561242f579182015b8281111561242e578235825591602001919060010190612413565b5b50905061243c9190612440565b5090565b5b80821115612459576000816000905550600101612441565b5090565b600061247061246b84612cff565b612cda565b90508281526020810184848401111561248c5761248b613017565b5b612497848285612ed6565b509392505050565b6000813590506124ae8161326f565b92915050565b6000813590506124c381613286565b92915050565b6000813590506124d88161329d565b92915050565b6000815190506124ed8161329d565b92915050565b600082601f8301126125085761250761300d565b5b813561251884826020860161245d565b91505092915050565b60008083601f8401126125375761253661300d565b5b8235905067ffffffffffffffff81111561255457612553613008565b5b6020830191508360018202830111156125705761256f613012565b5b9250929050565b600081359050612586816132b4565b92915050565b6000602082840312156125a2576125a1613021565b5b60006125b08482850161249f565b91505092915050565b600080604083850312156125d0576125cf613021565b5b60006125de8582860161249f565b92505060206125ef8582860161249f565b9150509250929050565b60008060006060848603121561261257612611613021565b5b60006126208682870161249f565b93505060206126318682870161249f565b925050604061264286828701612577565b9150509250925092565b6000806000806080858703121561266657612665613021565b5b60006126748782880161249f565b94505060206126858782880161249f565b935050604061269687828801612577565b925050606085013567ffffffffffffffff8111156126b7576126b661301c565b5b6126c3878288016124f3565b91505092959194509250565b600080604083850312156126e6576126e5613021565b5b60006126f48582860161249f565b9250506020612705858286016124b4565b9150509250929050565b6000806040838503121561272657612725613021565b5b60006127348582860161249f565b925050602061274585828601612577565b9150509250929050565b60006020828403121561276557612764613021565b5b6000612773848285016124c9565b91505092915050565b60006020828403121561279257612791613021565b5b60006127a0848285016124de565b91505092915050565b600080602083850312156127c0576127bf613021565b5b600083013567ffffffffffffffff8111156127de576127dd61301c565b5b6127ea85828601612521565b92509250509250929050565b60006020828403121561280c5761280b613021565b5b600061281a84828501612577565b91505092915050565b61282c81612e62565b82525050565b61283b81612e74565b82525050565b600061284c82612d30565b6128568185612d46565b9350612866818560208601612ee5565b61286f81613026565b840191505092915050565b600061288582612d3b565b61288f8185612d62565b935061289f818560208601612ee5565b6128a881613026565b840191505092915050565b60006128be82612d3b565b6128c88185612d73565b93506128d8818560208601612ee5565b80840191505092915050565b60006128f1602683612d62565b91506128fc82613037565b604082019050919050565b6000612914601c83612d62565b915061291f82613086565b602082019050919050565b6000612937601783612d62565b9150612942826130af565b602082019050919050565b600061295a602783612d62565b9150612965826130d8565b604082019050919050565b600061297d600583612d73565b915061298882613127565b600582019050919050565b60006129a0602083612d62565b91506129ab82613150565b602082019050919050565b60006129c3601383612d62565b91506129ce82613179565b602082019050919050565b60006129e6601283612d62565b91506129f1826131a2565b602082019050919050565b6000612a09600083612d57565b9150612a14826131cb565b600082019050919050565b6000612a2c602383612d62565b9150612a37826131ce565b604082019050919050565b6000612a4f601e83612d62565b9150612a5a8261321d565b602082019050919050565b6000612a72601883612d62565b9150612a7d82613246565b602082019050919050565b612a9181612ecc565b82525050565b6000612aa382856128b3565b9150612aaf82846128b3565b9150612aba82612970565b91508190509392505050565b6000612ad1826129fc565b9150819050919050565b6000602082019050612af06000830184612823565b92915050565b6000608082019050612b0b6000830187612823565b612b186020830186612823565b612b256040830185612a88565b8181036060830152612b378184612841565b905095945050505050565b6000602082019050612b576000830184612832565b92915050565b60006020820190508181036000830152612b77818461287a565b905092915050565b60006020820190508181036000830152612b98816128e4565b9050919050565b60006020820190508181036000830152612bb881612907565b9050919050565b60006020820190508181036000830152612bd88161292a565b9050919050565b60006020820190508181036000830152612bf88161294d565b9050919050565b60006020820190508181036000830152612c1881612993565b9050919050565b60006020820190508181036000830152612c38816129b6565b9050919050565b60006020820190508181036000830152612c58816129d9565b9050919050565b60006020820190508181036000830152612c7881612a1f565b9050919050565b60006020820190508181036000830152612c9881612a42565b9050919050565b60006020820190508181036000830152612cb881612a65565b9050919050565b6000602082019050612cd46000830184612a88565b92915050565b6000612ce4612cf5565b9050612cf08282612f4a565b919050565b6000604051905090565b600067ffffffffffffffff821115612d1a57612d19612fd9565b5b612d2382613026565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612d8982612ecc565b9150612d9483612ecc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612dc957612dc8612f7b565b5b828201905092915050565b6000612ddf82612ecc565b9150612dea83612ecc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e2357612e22612f7b565b5b828202905092915050565b6000612e3982612ecc565b9150612e4483612ecc565b925082821015612e5757612e56612f7b565b5b828203905092915050565b6000612e6d82612eac565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612f03578082015181840152602081019050612ee8565b83811115612f12576000848401525b50505050565b60006002820490506001821680612f3057607f821691505b60208210811415612f4457612f43612faa565b5b50919050565b612f5382613026565b810181811067ffffffffffffffff82111715612f7257612f71612fd9565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f43616c6c65722063616e6e6f74206265206120636f6e74726163742e00000000600082015250565b7f53616c65206973206e6f7420616374697665207965742e000000000000000000600082015250565b7f537570706c792063616e6e6f742066616c6c2062656c6f77206d696e7465642060008201527f746f6b656e732e00000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b7f496e73756666696369656e742046756e642e0000000000000000000000000000600082015250565b50565b7f45786365656473206d61782066726565206d696e74732070657220616464726560008201527f7373210000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178206d696e7473207065722061646472657373210000600082015250565b7f45786365656473206d6178206672656520737570706c792e0000000000000000600082015250565b61327881612e62565b811461328357600080fd5b50565b61328f81612e74565b811461329a57600080fd5b50565b6132a681612e80565b81146132b157600080fd5b50565b6132bd81612ecc565b81146132c857600080fd5b5056fea2646970667358221220a51253f0708f30be73eb872a1843d60d3c62b6da2dcf1d5c9cb1addc2f0f2f5b64736f6c63430008070033

Deployed Bytecode Sourcemap

132:2970:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4830:607:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9718:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11719:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11195:463;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3913:309;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12579:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;346:47:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2946:152;;;:::i;:::-;;12809:179:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;235:50:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2377:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9514:142:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5496:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:3;;;;;;;;;;;;;:::i;:::-;;2059:82:4;;;;;;;;;;;;;:::i;:::-;;1530:523;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;292:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1029:85:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9880:102:1;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;560:51:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;404:57;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;929:595;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11986:303:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13054:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2607:333:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2147:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;179:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12355:162:1;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;467:51:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;617:47:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4830:607:1;4915:4;5225:10;5210:25;;:11;:25;;;;:101;;;;5301:10;5286:25;;:11;:25;;;;5210:101;:177;;;;5377:10;5362:25;;:11;:25;;;;5210:177;5191:196;;4830:607;;;:::o;9718:98::-;9772:13;9804:5;9797:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9718:98;:::o;11719:200::-;11787:7;11811:16;11819:7;11811;:16::i;:::-;11806:64;;11836:34;;;;;;;;;;;;;;11806:64;11888:15;:24;11904:7;11888:24;;;;;;;;;;;;;;;;;;;;;11881:31;;11719:200;;;:::o;11195:463::-;11267:13;11299:27;11318:7;11299:18;:27::i;:::-;11267:61;;11348:5;11342:11;;:2;:11;;;11338:48;;;11362:24;;;;;;;;;;;;;;11338:48;11424:5;11401:28;;:19;:17;:19::i;:::-;:28;;;11397:172;;11448:44;11465:5;11472:19;:17;:19::i;:::-;11448:16;:44::i;:::-;11443:126;;11519:35;;;;;;;;;;;;;;11443:126;11397:172;11606:2;11579:15;:24;11595:7;11579:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11643:7;11639:2;11623:28;;11632:5;11623:28;;;;;;;;;;;;11257:401;11195:463;;:::o;3913:309::-;3966:7;4190:15;:13;:15::i;:::-;4175:12;;4159:13;;:28;:46;4152:53;;3913:309;:::o;12579:164::-;12708:28;12718:4;12724:2;12728:7;12708:9;:28::i;:::-;12579:164;;;:::o;346:47:4:-;;;;:::o;2946:152::-;1252:12:3;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3004:7:4::1;3025;:5;:7::i;:::-;3017:21;;3046;3017:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3003:69;;;3090:2;3082:11;;;::::0;::::1;;2993:105;2946:152::o:0;12809:179:1:-;12942:39;12959:4;12965:2;12969:7;12942:39;;;;;;;;;;;;:16;:39::i;:::-;12809:179;;;:::o;235:50:4:-;;;;:::o;2377:104::-;1252:12:3;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2467:7:4::1;;2451:13;:23;;;;;;;:::i;:::-;;2377:104:::0;;:::o;9514:142:1:-;9578:7;9620:27;9639:7;9620:18;:27::i;:::-;9597:52;;9514:142;;;:::o;5496:221::-;5560:7;5600:1;5583:19;;:5;:19;;;5579:60;;;5611:28;;;;;;;;;;;;;;5579:60;967:13;5656:18;:25;5675:5;5656:25;;;;;;;;;;;;;;;;:54;5649:61;;5496:221;;;:::o;1661:101:3:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;2059:82:4:-;1252:12:3;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2122:12:4::1;;;;;;;;;;;2121:13;2106:12;;:28;;;;;;;;;;;;;;;;;;2059:82::o:0;1530:523::-;791:12;;;;;;;;;;;783:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;862:10;849:23;;:9;:23;;;841:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1657:9:::1;1641:13;:11;:13::i;:::-;:25;;;;:::i;:::-;1624:13;;:42;;1603:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;1726:25;1754:16;:28;1771:10;1754:28;;;;;;;;;;;;;;;;1726:56;;1846:27;;1833:9;1813:17;:29;;;;:::i;:::-;:60;;1792:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;1995:9;1975:17;:29;;;;:::i;:::-;1944:16;:28;1961:10;1944:28;;;;;;;;;;;;;;;:60;;;;2014:32;2024:10;2036:9;2014;:32::i;:::-;1593:460;1530:523:::0;:::o;292:48::-;;;;:::o;1029:85:3:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;9880:102:1:-;9936:13;9968:7;9961:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9880:102;:::o;560:51:4:-;;;;;;;;;;;;;;;;;:::o;404:57::-;;;;:::o;929:595::-;791:12;;;;;;;;;;;783:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;862:10;849:23;;:9;:23;;;841:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1048:9:::1;1040:5;;:17;;;;:::i;:::-;1027:9;:30;;1006:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1161:9;1145:13;:11;:13::i;:::-;:25;;;;:::i;:::-;1132:9;;:38;;1111:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;1225:21;1249:12;:24;1262:10;1249:24;;;;;;;;;;;;;;;;1225:48;;1333:23;;1320:9;1304:13;:25;;;;:::i;:::-;:52;;1283:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;1466:9;1450:13;:25;;;;:::i;:::-;1423:12;:24;1436:10;1423:24;;;;;;;;;;;;;;;:52;;;;1485:32;1495:10;1507:9;1485;:32::i;:::-;996:528;929:595:::0;:::o;11986:303:1:-;12096:19;:17;:19::i;:::-;12084:31;;:8;:31;;;12080:61;;;12124:17;;;;;;;;;;;;;;12080:61;12204:8;12152:18;:39;12171:19;:17;:19::i;:::-;12152:39;;;;;;;;;;;;;;;:49;12192:8;12152:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12263:8;12227:55;;12242:19;:17;:19::i;:::-;12227:55;;;12273:8;12227:55;;;;;;:::i;:::-;;;;;;;;11986:303;;:::o;13054:385::-;13215:28;13225:4;13231:2;13235:7;13215:9;:28::i;:::-;13275:1;13257:2;:14;;;:19;13253:180;;13295:56;13326:4;13332:2;13336:7;13345:5;13295:30;:56::i;:::-;13290:143;;13378:40;;;;;;;;;;;;;;13290:143;13253:180;13054:385;;;;:::o;2607:333:4:-;2680:13;2710:16;2718:7;2710;:16::i;:::-;2705:59;;2735:29;;;;;;;;;;;;;;2705:59;2780:21;2804:10;:8;:10::i;:::-;2780:34;;2862:1;2843:7;2837:21;:26;;:95;;;;;;;;;;;;;;;;;2890:7;2899:18;2909:7;2899:9;:18::i;:::-;2873:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2837:95;2830:102;;;2607:333;;;:::o;2147:224::-;1252:12:3;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2255:13:4::1;:11;:13::i;:::-;2244:7;2232:9;;:19;;;;:::i;:::-;:36;;2211:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;2357:7;2344:9;;:20;;;;;;;:::i;:::-;;;;;;;;2147:224:::0;:::o;179:50::-;;;;:::o;12355:162:1:-;12452:4;12475:18;:25;12494:5;12475:25;;;;;;;;;;;;;;;:35;12501:8;12475:35;;;;;;;;;;;;;;;;;;;;;;;;;12468:42;;12355:162;;;;:::o;467:51:4:-;;;;;;;;;;;;;:::o;1911:198:3:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;617:47:4:-;;;;;;;;;;;;;;;;;:::o;13685:268:1:-;13742:4;13796:7;13777:15;:13;:15::i;:::-;:26;;:65;;;;;13829:13;;13819:7;:23;13777:65;:150;;;;;13926:1;1719:8;13879:17;:26;13897:7;13879:26;;;;;;;;;;;;:43;:48;13777:150;13758:169;;13685:268;;;:::o;7091:1105::-;7158:7;7177:12;7192:7;7177:22;;7257:4;7238:15;:13;:15::i;:::-;:23;7234:898;;7290:13;;7283:4;:20;7279:853;;;7327:14;7344:17;:23;7362:4;7344:23;;;;;;;;;;;;7327:40;;7458:1;1719:8;7431:6;:23;:28;7427:687;;;7942:111;7959:1;7949:6;:11;7942:111;;;8001:17;:25;8019:6;;;;;;;8001:25;;;;;;;;;;;;7992:34;;7942:111;;;8085:6;8078:13;;;;;;7427:687;7305:827;7279:853;7234:898;8158:31;;;;;;;;;;;;;;7091:1105;;;;:::o;27310:103::-;27370:7;27396:10;27389:17;;27310:103;:::o;3452:90::-;3508:7;3452:90;:::o;18785:2460::-;18895:27;18925;18944:7;18925:18;:27::i;:::-;18895:57;;19008:4;18967:45;;18983:19;18967:45;;;18963:86;;19021:28;;;;;;;;;;;;;;18963:86;19060:22;19109:4;19086:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;19129:43;19146:4;19152:19;:17;:19::i;:::-;19129:16;:43::i;:::-;19086:86;:145;;;;19212:19;:17;:19::i;:::-;19188:43;;:20;19200:7;19188:11;:20::i;:::-;:43;;;19086:145;19060:172;;19248:17;19243:66;;19274:35;;;;;;;;;;;;;;19243:66;19337:1;19323:16;;:2;:16;;;19319:52;;;19348:23;;;;;;;;;;;;;;19319:52;19382:43;19404:4;19410:2;19414:7;19423:1;19382:21;:43::i;:::-;19495:15;:24;19511:7;19495:24;;;;;;;;;;;;19488:31;;;;;;;;;;;19880:18;:24;19899:4;19880:24;;;;;;;;;;;;;;;;19878:26;;;;;;;;;;;;19948:18;:22;19967:2;19948:22;;;;;;;;;;;;;;;;19946:24;;;;;;;;;;;1995:8;1606:3;20320:15;:41;;20279:21;20297:2;20279:17;:21::i;:::-;:83;:126;20234:17;:26;20252:7;20234:26;;;;;;;;;;;:171;;;;20572:1;1995:8;20522:19;:46;:51;20518:616;;;20593:19;20625:1;20615:7;:11;20593:33;;20780:1;20746:17;:30;20764:11;20746:30;;;;;;;;;;;;:35;20742:378;;;20882:13;;20867:11;:28;20863:239;;21060:19;21027:17;:30;21045:11;21027:30;;;;;;;;;;;:52;;;;20863:239;20742:378;20575:559;20518:616;21178:7;21174:2;21159:27;;21168:4;21159:27;;;;;;;;;;;;21196:42;21217:4;21223:2;21227:7;21236:1;21196:20;:42::i;:::-;18885:2360;;18785:2460;;;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;2263:187:3:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;14032:102:1:-;14100:27;14110:2;14114:8;14100:27;;;;;;;;;;;;:9;:27::i;:::-;14032:102;;:::o;24850:697::-;25008:4;25053:2;25028:45;;;25074:19;:17;:19::i;:::-;25095:4;25101:7;25110:5;25028:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25024:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25323:1;25306:6;:13;:18;25302:229;;;25351:40;;;;;;;;;;;;;;25302:229;25491:6;25485:13;25476:6;25472:2;25468:15;25461:38;25024:517;25194:54;;;25184:64;;;:6;:64;;;;25177:71;;;24850:697;;;;;;:::o;2487:112:4:-;2547:13;2579;2572:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2487:112;:::o;27514:1920:1:-;27571:17;27986:3;27979:4;27973:11;27969:21;27962:28;;28075:3;28069:4;28062:17;28178:3;28627:5;28755:1;28750:3;28746:11;28739:18;;28890:2;28884:4;28880:13;28876:2;28872:22;28867:3;28859:36;28930:2;28924:4;28920:13;28912:21;;28520:668;28948:4;28520:668;;;29119:1;29114:3;29110:11;29103:18;;29169:2;29163:4;29159:13;29155:2;29151:22;29146:3;29138:36;29042:2;29036:4;29032:13;29024:21;;28520:668;;;28524:423;29237:3;29232;29228:13;29350:2;29345:3;29341:12;29334:19;;29411:6;29406:3;29399:19;27609:1819;;27514:1920;;;:::o;26178:154::-;;;;;:::o;10774:144::-;10838:14;10897:5;10887:15;;10774:144;;;:::o;26973:153::-;;;;;:::o;14494:2184::-;14612:20;14635:13;;14612:36;;14676:1;14662:16;;:2;:16;;;14658:48;;;14687:19;;;;;;;;;;;;;;14658:48;14732:1;14720:8;:13;14716:44;;;14742:18;;;;;;;;;;;;;;14716:44;14771:61;14801:1;14805:2;14809:12;14823:8;14771:21;:61::i;:::-;15364:1;1101:2;15335:1;:25;;15334:31;15322:8;:44;15296:18;:22;15315:2;15296:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1863:3;15755:29;15782:1;15770:8;:13;15755:14;:29::i;:::-;:56;;1606:3;15693:15;:41;;15652:21;15670:2;15652:17;:21::i;:::-;:83;:160;15602:17;:31;15620:12;15602:31;;;;;;;;;;;:210;;;;15827:20;15850:12;15827:35;;15876:11;15905:8;15890:12;:23;15876:37;;15950:1;15932:2;:14;;;:19;15928:622;;15971:308;16026:12;16022:2;16001:38;;16018:1;16001:38;;;;;;;;;;;;16066:69;16105:1;16109:2;16113:14;;;;;;16129:5;16066:30;:69::i;:::-;16061:172;;16170:40;;;;;;;;;;;;;;16061:172;16274:3;16259:12;:18;15971:308;;16358:12;16341:13;;:29;16337:43;;16372:8;;;16337:43;15928:622;;;16419:117;16474:14;;;;;;16470:2;16449:40;;16466:1;16449:40;;;;;;;;;;;;16531:3;16516:12;:18;16419:117;;15928:622;16579:12;16563:13;:28;;;;15079:1523;;16611:60;16640:1;16644:2;16648:12;16662:8;16611:20;:60::i;:::-;14602:2076;14494:2184;;;:::o;11000:138::-;11058:14;11117:5;11107:15;;11000:138;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:5:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8331:366::-;8473:3;8494:67;8558:2;8553:3;8494:67;:::i;:::-;8487:74;;8570:93;8659:3;8570:93;:::i;:::-;8688:2;8683:3;8679:12;8672:19;;8331:366;;;:::o;8703:::-;8845:3;8866:67;8930:2;8925:3;8866:67;:::i;:::-;8859:74;;8942:93;9031:3;8942:93;:::i;:::-;9060:2;9055:3;9051:12;9044:19;;8703:366;;;:::o;9075:::-;9217:3;9238:67;9302:2;9297:3;9238:67;:::i;:::-;9231:74;;9314:93;9403:3;9314:93;:::i;:::-;9432:2;9427:3;9423:12;9416:19;;9075:366;;;:::o;9447:::-;9589:3;9610:67;9674:2;9669:3;9610:67;:::i;:::-;9603:74;;9686:93;9775:3;9686:93;:::i;:::-;9804:2;9799:3;9795:12;9788:19;;9447:366;;;:::o;9819:400::-;9979:3;10000:84;10082:1;10077:3;10000:84;:::i;:::-;9993:91;;10093:93;10182:3;10093:93;:::i;:::-;10211:1;10206:3;10202:11;10195:18;;9819:400;;;:::o;10225:366::-;10367:3;10388:67;10452:2;10447:3;10388:67;:::i;:::-;10381:74;;10464:93;10553:3;10464:93;:::i;:::-;10582:2;10577:3;10573:12;10566:19;;10225:366;;;:::o;10597:::-;10739:3;10760:67;10824:2;10819:3;10760:67;:::i;:::-;10753:74;;10836:93;10925:3;10836:93;:::i;:::-;10954:2;10949:3;10945:12;10938:19;;10597:366;;;:::o;10969:::-;11111:3;11132:67;11196:2;11191:3;11132:67;:::i;:::-;11125:74;;11208:93;11297:3;11208:93;:::i;:::-;11326:2;11321:3;11317:12;11310:19;;10969:366;;;:::o;11341:398::-;11500:3;11521:83;11602:1;11597:3;11521:83;:::i;:::-;11514:90;;11613:93;11702:3;11613:93;:::i;:::-;11731:1;11726:3;11722:11;11715:18;;11341:398;;;:::o;11745:366::-;11887:3;11908:67;11972:2;11967:3;11908:67;:::i;:::-;11901:74;;11984:93;12073:3;11984:93;:::i;:::-;12102:2;12097:3;12093:12;12086:19;;11745:366;;;:::o;12117:::-;12259:3;12280:67;12344:2;12339:3;12280:67;:::i;:::-;12273:74;;12356:93;12445:3;12356:93;:::i;:::-;12474:2;12469:3;12465:12;12458:19;;12117:366;;;:::o;12489:::-;12631:3;12652:67;12716:2;12711:3;12652:67;:::i;:::-;12645:74;;12728:93;12817:3;12728:93;:::i;:::-;12846:2;12841:3;12837:12;12830:19;;12489:366;;;:::o;12861:118::-;12948:24;12966:5;12948:24;:::i;:::-;12943:3;12936:37;12861:118;;:::o;12985:701::-;13266:3;13288:95;13379:3;13370:6;13288:95;:::i;:::-;13281:102;;13400:95;13491:3;13482:6;13400:95;:::i;:::-;13393:102;;13512:148;13656:3;13512:148;:::i;:::-;13505:155;;13677:3;13670:10;;12985:701;;;;;:::o;13692:379::-;13876:3;13898:147;14041:3;13898:147;:::i;:::-;13891:154;;14062:3;14055:10;;13692:379;;;:::o;14077:222::-;14170:4;14208:2;14197:9;14193:18;14185:26;;14221:71;14289:1;14278:9;14274:17;14265:6;14221:71;:::i;:::-;14077:222;;;;:::o;14305:640::-;14500:4;14538:3;14527:9;14523:19;14515:27;;14552:71;14620:1;14609:9;14605:17;14596:6;14552:71;:::i;:::-;14633:72;14701:2;14690:9;14686:18;14677:6;14633:72;:::i;:::-;14715;14783:2;14772:9;14768:18;14759:6;14715:72;:::i;:::-;14834:9;14828:4;14824:20;14819:2;14808:9;14804:18;14797:48;14862:76;14933:4;14924:6;14862:76;:::i;:::-;14854:84;;14305:640;;;;;;;:::o;14951:210::-;15038:4;15076:2;15065:9;15061:18;15053:26;;15089:65;15151:1;15140:9;15136:17;15127:6;15089:65;:::i;:::-;14951:210;;;;:::o;15167:313::-;15280:4;15318:2;15307:9;15303:18;15295:26;;15367:9;15361:4;15357:20;15353:1;15342:9;15338:17;15331:47;15395:78;15468:4;15459:6;15395:78;:::i;:::-;15387:86;;15167:313;;;;:::o;15486:419::-;15652:4;15690:2;15679:9;15675:18;15667:26;;15739:9;15733:4;15729:20;15725:1;15714:9;15710:17;15703:47;15767:131;15893:4;15767:131;:::i;:::-;15759:139;;15486:419;;;:::o;15911:::-;16077:4;16115:2;16104:9;16100:18;16092:26;;16164:9;16158:4;16154:20;16150:1;16139:9;16135:17;16128:47;16192:131;16318:4;16192:131;:::i;:::-;16184:139;;15911:419;;;:::o;16336:::-;16502:4;16540:2;16529:9;16525:18;16517:26;;16589:9;16583:4;16579:20;16575:1;16564:9;16560:17;16553:47;16617:131;16743:4;16617:131;:::i;:::-;16609:139;;16336:419;;;:::o;16761:::-;16927:4;16965:2;16954:9;16950:18;16942:26;;17014:9;17008:4;17004:20;17000:1;16989:9;16985:17;16978:47;17042:131;17168:4;17042:131;:::i;:::-;17034:139;;16761:419;;;:::o;17186:::-;17352:4;17390:2;17379:9;17375:18;17367:26;;17439:9;17433:4;17429:20;17425:1;17414:9;17410:17;17403:47;17467:131;17593:4;17467:131;:::i;:::-;17459:139;;17186:419;;;:::o;17611:::-;17777:4;17815:2;17804:9;17800:18;17792:26;;17864:9;17858:4;17854:20;17850:1;17839:9;17835:17;17828:47;17892:131;18018:4;17892:131;:::i;:::-;17884:139;;17611:419;;;:::o;18036:::-;18202:4;18240:2;18229:9;18225:18;18217:26;;18289:9;18283:4;18279:20;18275:1;18264:9;18260:17;18253:47;18317:131;18443:4;18317:131;:::i;:::-;18309:139;;18036:419;;;:::o;18461:::-;18627:4;18665:2;18654:9;18650:18;18642:26;;18714:9;18708:4;18704:20;18700:1;18689:9;18685:17;18678:47;18742:131;18868:4;18742:131;:::i;:::-;18734:139;;18461:419;;;:::o;18886:::-;19052:4;19090:2;19079:9;19075:18;19067:26;;19139:9;19133:4;19129:20;19125:1;19114:9;19110:17;19103:47;19167:131;19293:4;19167:131;:::i;:::-;19159:139;;18886:419;;;:::o;19311:::-;19477:4;19515:2;19504:9;19500:18;19492:26;;19564:9;19558:4;19554:20;19550:1;19539:9;19535:17;19528:47;19592:131;19718:4;19592:131;:::i;:::-;19584:139;;19311:419;;;:::o;19736:222::-;19829:4;19867:2;19856:9;19852:18;19844:26;;19880:71;19948:1;19937:9;19933:17;19924:6;19880:71;:::i;:::-;19736:222;;;;:::o;19964:129::-;19998:6;20025:20;;:::i;:::-;20015:30;;20054:33;20082:4;20074:6;20054:33;:::i;:::-;19964:129;;;:::o;20099:75::-;20132:6;20165:2;20159:9;20149:19;;20099:75;:::o;20180:307::-;20241:4;20331:18;20323:6;20320:30;20317:56;;;20353:18;;:::i;:::-;20317:56;20391:29;20413:6;20391:29;:::i;:::-;20383:37;;20475:4;20469;20465:15;20457:23;;20180:307;;;:::o;20493:98::-;20544:6;20578:5;20572:12;20562:22;;20493:98;;;:::o;20597:99::-;20649:6;20683:5;20677:12;20667:22;;20597:99;;;:::o;20702:168::-;20785:11;20819:6;20814:3;20807:19;20859:4;20854:3;20850:14;20835:29;;20702:168;;;;:::o;20876:147::-;20977:11;21014:3;20999:18;;20876:147;;;;:::o;21029:169::-;21113:11;21147:6;21142:3;21135:19;21187:4;21182:3;21178:14;21163:29;;21029:169;;;;:::o;21204:148::-;21306:11;21343:3;21328:18;;21204:148;;;;:::o;21358:305::-;21398:3;21417:20;21435:1;21417:20;:::i;:::-;21412:25;;21451:20;21469:1;21451:20;:::i;:::-;21446:25;;21605:1;21537:66;21533:74;21530:1;21527:81;21524:107;;;21611:18;;:::i;:::-;21524:107;21655:1;21652;21648:9;21641:16;;21358:305;;;;:::o;21669:348::-;21709:7;21732:20;21750:1;21732:20;:::i;:::-;21727:25;;21766:20;21784:1;21766:20;:::i;:::-;21761:25;;21954:1;21886:66;21882:74;21879:1;21876:81;21871:1;21864:9;21857:17;21853:105;21850:131;;;21961:18;;:::i;:::-;21850:131;22009:1;22006;22002:9;21991:20;;21669:348;;;;:::o;22023:191::-;22063:4;22083:20;22101:1;22083:20;:::i;:::-;22078:25;;22117:20;22135:1;22117:20;:::i;:::-;22112:25;;22156:1;22153;22150:8;22147:34;;;22161:18;;:::i;:::-;22147:34;22206:1;22203;22199:9;22191:17;;22023:191;;;;:::o;22220:96::-;22257:7;22286:24;22304:5;22286:24;:::i;:::-;22275:35;;22220:96;;;:::o;22322:90::-;22356:7;22399:5;22392:13;22385:21;22374:32;;22322:90;;;:::o;22418:149::-;22454:7;22494:66;22487:5;22483:78;22472:89;;22418:149;;;:::o;22573:126::-;22610:7;22650:42;22643:5;22639:54;22628:65;;22573:126;;;:::o;22705:77::-;22742:7;22771:5;22760:16;;22705:77;;;:::o;22788:154::-;22872:6;22867:3;22862;22849:30;22934:1;22925:6;22920:3;22916:16;22909:27;22788:154;;;:::o;22948:307::-;23016:1;23026:113;23040:6;23037:1;23034:13;23026:113;;;23125:1;23120:3;23116:11;23110:18;23106:1;23101:3;23097:11;23090:39;23062:2;23059:1;23055:10;23050:15;;23026:113;;;23157:6;23154:1;23151:13;23148:101;;;23237:1;23228:6;23223:3;23219:16;23212:27;23148:101;22997:258;22948:307;;;:::o;23261:320::-;23305:6;23342:1;23336:4;23332:12;23322:22;;23389:1;23383:4;23379:12;23410:18;23400:81;;23466:4;23458:6;23454:17;23444:27;;23400:81;23528:2;23520:6;23517:14;23497:18;23494:38;23491:84;;;23547:18;;:::i;:::-;23491:84;23312:269;23261:320;;;:::o;23587:281::-;23670:27;23692:4;23670:27;:::i;:::-;23662:6;23658:40;23800:6;23788:10;23785:22;23764:18;23752:10;23749:34;23746:62;23743:88;;;23811:18;;:::i;:::-;23743:88;23851:10;23847:2;23840:22;23630:238;23587:281;;:::o;23874:180::-;23922:77;23919:1;23912:88;24019:4;24016:1;24009:15;24043:4;24040:1;24033:15;24060:180;24108:77;24105:1;24098:88;24205:4;24202:1;24195:15;24229:4;24226:1;24219:15;24246:180;24294:77;24291:1;24284:88;24391:4;24388:1;24381:15;24415:4;24412:1;24405:15;24432:117;24541:1;24538;24531:12;24555:117;24664:1;24661;24654:12;24678:117;24787:1;24784;24777:12;24801:117;24910:1;24907;24900:12;24924:117;25033:1;25030;25023:12;25047:117;25156:1;25153;25146:12;25170:102;25211:6;25262:2;25258:7;25253:2;25246:5;25242:14;25238:28;25228:38;;25170:102;;;:::o;25278:225::-;25418:34;25414:1;25406:6;25402:14;25395:58;25487:8;25482:2;25474:6;25470:15;25463:33;25278:225;:::o;25509:178::-;25649:30;25645:1;25637:6;25633:14;25626:54;25509:178;:::o;25693:173::-;25833:25;25829:1;25821:6;25817:14;25810:49;25693:173;:::o;25872:226::-;26012:34;26008:1;26000:6;25996:14;25989:58;26081:9;26076:2;26068:6;26064:15;26057:34;25872:226;:::o;26104:155::-;26244:7;26240:1;26232:6;26228:14;26221:31;26104:155;:::o;26265:182::-;26405:34;26401:1;26393:6;26389:14;26382:58;26265:182;:::o;26453:169::-;26593:21;26589:1;26581:6;26577:14;26570:45;26453:169;:::o;26628:168::-;26768:20;26764:1;26756:6;26752:14;26745:44;26628:168;:::o;26802:114::-;;:::o;26922:222::-;27062:34;27058:1;27050:6;27046:14;27039:58;27131:5;27126:2;27118:6;27114:15;27107:30;26922:222;:::o;27150:180::-;27290:32;27286:1;27278:6;27274:14;27267:56;27150:180;:::o;27336:174::-;27476:26;27472:1;27464:6;27460:14;27453:50;27336:174;:::o;27516:122::-;27589:24;27607:5;27589:24;:::i;:::-;27582:5;27579:35;27569:63;;27628:1;27625;27618:12;27569:63;27516:122;:::o;27644:116::-;27714:21;27729:5;27714:21;:::i;:::-;27707:5;27704:32;27694:60;;27750:1;27747;27740:12;27694:60;27644:116;:::o;27766:120::-;27838:23;27855:5;27838:23;:::i;:::-;27831:5;27828:34;27818:62;;27876:1;27873;27866:12;27818:62;27766:120;:::o;27892:122::-;27965:24;27983:5;27965:24;:::i;:::-;27958:5;27955:35;27945:63;;28004:1;28001;27994:12;27945:63;27892:122;:::o

Swarm Source

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