Token Breadstick

 

Overview ERC-20

Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
1,000,000,000 BSTICK

Holders:
540 addresses
Contract:
0x8e915a77e301ad12ad1f62012734cf7557eee81a0x8e915a77e301aD12Ad1f62012734cF7557Eee81a

Decimals:
18

Social Profiles:
Not Available, Update ?

 
Balance
153,636 BSTICK

Value
$0.00
0xfd374359d9f0ec603410a89e526894c871c3197d
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BSTICK

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at PolygonScan.com on 2021-12-27
*/

// SPDX-License-Identifier: GPL-3.0

/*  
    When you're here you're family #WYHYF
        __ ____ _______________________ __
      _/ // __ ) ___/_  __/  _/ ____/ //_/
     / __/ __  \__ \ / /  / // /   / ,<   
    (_  ) /_/ /__/ // / _/ // /___/ /| |  
   /  _/_____/____//_/ /___/\____/_/ |_|  
   /_/                           

    For franchisooooors of Non-Fungible Olive Gardens, 
    From passionate franchisoooors of Non-Fungible Olive Gardens
*/

pragma solidity ^0.8.7;

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

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

/**
 * @dev 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() {
        _setOwner(_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 {
        _setOwner(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"
        );
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount)
        public
        virtual
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "ERC20: transfer amount exceeds allowance"
        );
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "ERC20: decreased allowance below zero"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "ERC20: transfer amount exceeds balance"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

/// @title Fungible Breadsticks for NFOG
/// @custom:unaudited This contract has not been audited. Use at your own risk.
contract BSTICK is Context, Ownable, ERC20 {
    // Give out 56,818 Breadsticks for every Franchise that a user holds
    // This amount will change after initial airdrop, see tokenomics
    uint256 public bsticksPerNFOG = 56818 * (10**decimals());

    // Give out 1,000 Breadsticks for every review star (team decides 0-5 rating of review quality)
    uint256 public bsticksPerReviewStar = 1000 * (10**decimals());

    // Give out 1 Breadstick for every Breadstick NFT that a user holds
    uint256 public bsticksPerBreadstick = 1 * (10**decimals());

    // Give out 2,500 Breadstick for every Burnt Breadstick NFT that a user holds
    uint256 public bsticksPerBurntBreadstick = 2500 * (10**decimals());

    // Give out 10,000 Breadstick for every Proof of Pasta
    uint256 public bsticksPerProofOfPasta = 10000 * (10**decimals());

    // nfogIdStart of 1
    uint256 public nfogIdStart = 0;

    // nfogIdEnd of 879
    uint256 public nfogIdEnd = 879;

    // Courses are used to allow users to claim tokens regularly. Courses are
    // decided by the DAO, currently weekly.
    uint256 public course = 0;

    address private ownerWallet = 0x86C0aAa32B03A9ad61347372d7Aafc96FE13dE11;
    address private lpWallet = 0xDD51520dd5100936faFCbe7c2f1D8f318FFeDEd3;
    address private nfogAirdropWallet = 0x5e7FC6b11E68CBB731a3B5eC9b6dA8b22692E8c6;
    address private airdropBuffetWallet = 0x58f5d505919975f34e2Fb646837b2D5Dc8F578AA;
    address private charityWallet = 0xE0d4dF57ddb7555907312F4337087eB665462Cd0;
    address private marketingWallet = 0xE0d4dF57ddb7555907312F4337087eB665462Cd0;
    address private teamWallet = 0x5f870c2cD46ddDB6B109b855C49296A91c4e540c;

    // Track claimed tokens within a course for NFOG holders
    // IMPORTANT: The format of the mapping is:
    // courseClaimedByNFOGId[course][NFOGId][claimed]
    mapping(uint256 => mapping(uint256 => bool)) public courseClaimedByNFOGId;
    mapping(uint256 => mapping(uint256 => bool)) public courseClaimedByBreadstickId;

    constructor() Ownable() ERC20("Breadstick", "BSTICK") {
        // Distribute 10% to owner (for initial liquidity)
        _mint(ownerWallet, 100000000 * (10**decimals()));
        // Distribute 5% to NFOG airdrop wallet
        _mint(nfogAirdropWallet, 50000000 * (10**decimals()));
        // Distribute 25% to LP incentives wallet
        _mint(lpWallet, 250000000 * (10**decimals()));
        // Distribute 40% to Airdrop Buffet Wallet
        _mint(airdropBuffetWallet, 400000000 * (10**decimals()));
        // Distribute 10% to Charity Wallet
        _mint(charityWallet, 100000000 * (10**decimals()));
        // Distribute 5% to Happy Hour Specials Marketing Wallet
        _mint(marketingWallet, 50000000 * (10**decimals()));
        // Distribute 5% to Team Wallet
        _mint(teamWallet, 50000000 * (10**decimals()));
    }

    /// @notice Claim Breadsticks for a given NFOG ID
    /// @param receivers Addresses of wallets that hold NFOG NFT
    /// @param nfogIds The tokenId of the NFOG NFT
    function airdropNFOGFranchisors(address[] memory receivers, uint256[] memory nfogIds) external {
        require(_msgSender() == nfogAirdropWallet, "Can only be initiated by Airdrop Buffet Wallet");
        require(bsticksPerNFOG * receivers.length <= balanceOf(nfogAirdropWallet), "Airdrop Buffet Wallet doesn't have enough $BSTICK for this claim");
        require(receivers.length == nfogIds.length, "Make sure number of receivers equals number of nfogIDs");

        for(uint256 i = 0; i < receivers.length; i++) {
            address receiver = receivers[i];
            _claim(true, bsticksPerNFOG, nfogIds[i], receiver);
        }
    }

    /// @notice Claim Breadsticks for given Breadstick IDs (address array and breadstickId array order MUST match)
    /// @param receivers Address of receivers
    /// @param breadstickIds The tokenId of the Breadstick NFTs 
    function airdropBreadsticks(address[] memory receivers, uint256[] memory breadstickIds) external {
        require(_msgSender() == airdropBuffetWallet, "Can only be initiated by Airdrop Buffet Wallet");
        require(bsticksPerBreadstick * receivers.length <= balanceOf(airdropBuffetWallet), "Airdrop Buffet Wallet doesn't have enough $BSTICK for this claim");
        require(receivers.length == breadstickIds.length, "Make sure number of receivers equals number of breadstickIds");

        for(uint256 i = 0; i < receivers.length; i++) {
            address receiver = receivers[i];
            _claim(false, bsticksPerBreadstick, breadstickIds[i], receiver);
        }
    }

    /// @notice Claim Breadsticks for a given Burnt Breadstick ID
    /// @param receiver Address of receiver
    /// @param breadstickId The tokenId of the Breadstick NFT
    function airdropBurntBreadstick(address receiver, uint256 breadstickId) external {
        require(_msgSender() == airdropBuffetWallet, "Can only be initiated by Airdrop Buffet Wallet");
        require(bsticksPerBurntBreadstick <= balanceOf(airdropBuffetWallet), "Airdrop Buffet Wallet doesn't have enough $BSTICK for this claim");
        require(breadstickId % 1000 == 0, "Not a burnt breadstick!");
    
        _claim(false, bsticksPerBurntBreadstick, breadstickId, receiver);
    }
    
    /// @notice Claim Breadsticks for writing reviews on Yelp/Google Reviews
    /// @param receivers Address of receivers
    /// @param ratings The rating of how good the review is (0-5)
    function airdropReviewers(address[] memory receivers, uint8[] memory ratings) external {
        // 0-5k $BSTICK for Proof of Pasta (pic of yourself at Olive Garden w/ identity proof)
        require(_msgSender() == airdropBuffetWallet, "Can only be initiated by Airdrop Buffet Wallet");
        require(receivers.length == ratings.length, "Make sure number of receivers equals number of ratings");
       
        for(uint256 i = 0; i < receivers.length; i++) {
            require(ratings[i] <= 5 && ratings[i] >= 0, "Rating must be between 0 and 5");
            // Rating * 1,000 $BSTICK reward
            uint bsticksForRating = ratings[i] * bsticksPerReviewStar;
            require(bsticksForRating <= balanceOf(airdropBuffetWallet), "Airdrop Buffet wallet doesn't have enough $BSTICK for this claim");
            transfer(receivers[i], bsticksForRating);
        }
    }

    /// @notice Claim Breadsticks for proof of eating at (pic of yourself at Olive Garden w/ identity proof)
    /// @param receivers Address of receivers
    function airdropProofOfPasta(address[] memory receivers) external {
        // 10k $BSTICK for Proof of Pasta 
        require(_msgSender() == airdropBuffetWallet, "Can only be initiated by airdrop buffet wallet");
        require(bsticksPerProofOfPasta * receivers.length <= balanceOf(airdropBuffetWallet), "Airdrop Buffet wallet doesn't have enough $BSTICK for this claim");
       
        for(uint256 i = 0; i < receivers.length; i++) {
            transfer(receivers[i], bsticksPerProofOfPasta);
        }
    }

    /// @dev Internal function to mint Breadsticks upon claiming 
    function _claim(bool isNFOG, uint256 amount, uint256 tokenId, address tokenOwner) internal {   
        // Check that Breadsticks have not already been claimed this course for a given tokenId
        if (isNFOG) {
            require(tokenId >= nfogIdStart && tokenId <= nfogIdEnd);
            require(!courseClaimedByNFOGId[course][tokenId], "$BSTICK already claimed for this NFOG for this course");
            courseClaimedByNFOGId[course][tokenId] = true;
        } else {
            require(!courseClaimedByBreadstickId[course][tokenId], "$BSTICK already claimed for this Breadstick for this course");
            courseClaimedByBreadstickId[course][tokenId] = true;
        }

        transfer(tokenOwner, amount);
    }

    /// @notice Allows the DAO to mint new tokens for use (very unlikely this will be used)
    /// @param amountDisplayValue The amount of Breadsticks to mint. This should be
    /// input as the display value, not in raw decimals. If you want to mint
    /// 100 Breadsticks, you should enter "100" rather than the value of 100 * 10^18.
    function daoMint(uint256 amountDisplayValue) external onlyOwner {
        _mint(owner(), amountDisplayValue * (10**decimals()));
    }

    /// @notice Allows the DAO to set a course for new breadsticks claims
    /// @param course_ The course to use for claiming Breadsticks
    function daoSetCourse(uint256 course_) public onlyOwner {
        course = course_;
    }

    /// @notice Allows the DAO to set the amount of Breadsticks that is
    /// claimed per NFOG
    /// @param bsticksDisplayValue The amount of Breadsticks a user can claim.
    function daoSetBSTICKSPerNFOG(uint256 bsticksDisplayValue)
        public
        onlyOwner
    {
        bsticksPerNFOG = bsticksDisplayValue * (10**decimals());
    }

    /// @notice Allows the DAO to set the amount of Breadsticks that is
    /// claimed per Breadstick NFT
    /// @param bsticksDisplayValue The amount of Breadsticks a user can claim.
    function daoSetBSTICKSPerBreadstick(uint256 bsticksDisplayValue)
        public
        onlyOwner
    {
        bsticksPerBreadstick = bsticksDisplayValue * (10**decimals());
    }

    /// @notice Allows the DAO to set the amount of Breadsticks that is
    /// claimed per Burnt Breadstick NFT
    /// @param bsticksDisplayValue The amount of Breadsticks a user can claim.
    function daoSetBSTICKSPerBurntBreadstick(uint256 bsticksDisplayValue)
        public
        onlyOwner
    {
        bsticksPerBurntBreadstick = bsticksDisplayValue * (10**decimals());
    }

    /// @notice Allows the DAO to set the amount of Breadsticks that is
    /// claimed per Proof of Pasta
    /// @param bsticksDisplayValue The amount of Breadsticks a user can claim.
    function daoSetBSTICKSPerProofOfPasta(uint256 bsticksDisplayValue)
        public
        onlyOwner
    {
        bsticksPerProofOfPasta = bsticksDisplayValue * (10**decimals());
    }

    /// @notice Allows the DAO to change the address for airdrop buffet, 
    /// which is the only address allowed to initiate airdrops
    /// @param addr The new address
    function daoSetAirdropBuffetWallet(address addr)
        public
        onlyOwner
    {
        airdropBuffetWallet = addr;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"breadstickIds","type":"uint256[]"}],"name":"airdropBreadsticks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"breadstickId","type":"uint256"}],"name":"airdropBurntBreadstick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"nfogIds","type":"uint256[]"}],"name":"airdropNFOGFranchisors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"airdropProofOfPasta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint8[]","name":"ratings","type":"uint8[]"}],"name":"airdropReviewers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bsticksPerBreadstick","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bsticksPerBurntBreadstick","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bsticksPerNFOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bsticksPerProofOfPasta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bsticksPerReviewStar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"course","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"courseClaimedByBreadstickId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"courseClaimedByNFOGId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountDisplayValue","type":"uint256"}],"name":"daoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"daoSetAirdropBuffetWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bsticksDisplayValue","type":"uint256"}],"name":"daoSetBSTICKSPerBreadstick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bsticksDisplayValue","type":"uint256"}],"name":"daoSetBSTICKSPerBurntBreadstick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bsticksDisplayValue","type":"uint256"}],"name":"daoSetBSTICKSPerNFOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bsticksDisplayValue","type":"uint256"}],"name":"daoSetBSTICKSPerProofOfPasta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"course_","type":"uint256"}],"name":"daoSetCourse","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nfogIdEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nfogIdStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052620000126012600a62000572565b620000209061ddf262000640565b600655620000316012600a62000572565b6200003f906103e862000640565b600755620000506012600a62000572565b6200005d90600162000640565b6008556200006e6012600a62000572565b6200007c906109c462000640565b6009556200008d6012600a62000572565b6200009b9061271062000640565b600a556000600b81905561036f600c55600d55600e80546001600160a01b03199081167386c0aaa32b03a9ad61347372d7aafc96fe13de1117909155600f8054821673dd51520dd5100936fafcbe7c2f1d8f318ffeded3179055601080548216735e7fc6b11e68cbb731a3b5ec9b6da8b22692e8c61790556011805482167358f5d505919975f34e2fb646837b2d5dc8f578aa17905560128054821673e0d4df57ddb7555907312f4337087eb665462cd0908117909155601380548316909117905560148054909116735f870c2cd46dddb6b109b855c49296a91c4e540c1790553480156200018957600080fd5b506040518060400160405280600a8152602001694272656164737469636b60b01b8152506040518060400160405280600681526020016542535449434b60d01b815250620001e6620001e06200032c60201b60201c565b62000330565b8151620001fb90600490602085019062000468565b5080516200021190600590602084019062000468565b5050600e546200024b91506001600160a01b031660125b6200023590600a62000572565b62000245906305f5e10062000640565b62000380565b6010546200027c906001600160a01b031660125b6200026c90600a62000572565b62000245906302faf08062000640565b600f54620002ab906001600160a01b03166200029b6012600a62000572565b6200024590630ee6b28062000640565b601154620002da906001600160a01b0316620002ca6012600a62000572565b62000245906317d7840062000640565b601254620002f4906001600160a01b031662000228601290565b6013546200030d906001600160a01b031660126200025f565b60145462000326906001600160a01b031660126200025f565b620006b5565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216620003db5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060036000828254620003ef91906200050e565b90915550506001600160a01b038216600090815260016020526040812080548392906200041e9084906200050e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620004769062000662565b90600052602060002090601f0160209004810192826200049a5760008555620004e5565b82601f10620004b557805160ff1916838001178555620004e5565b82800160010185558215620004e5579182015b82811115620004e5578251825591602001919060010190620004c8565b50620004f3929150620004f7565b5090565b5b80821115620004f35760008155600101620004f8565b600082198211156200052457620005246200069f565b500190565b600181815b808511156200056a5781600019048211156200054e576200054e6200069f565b808516156200055c57918102915b93841c93908002906200052e565b509250929050565b60006200058360ff8416836200058a565b9392505050565b6000826200059b575060016200063a565b81620005aa575060006200063a565b8160018114620005c35760028114620005ce57620005ee565b60019150506200063a565b60ff841115620005e257620005e26200069f565b50506001821b6200063a565b5060208310610133831016604e8410600b841016171562000613575081810a6200063a565b6200061f838362000529565b80600019048211156200063657620006366200069f565b0290505b92915050565b60008160001904831182151516156200065d576200065d6200069f565b500290565b600181811c908216806200067757607f821691505b602082108114156200069957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b611d8380620006c56000396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c8063715018a611610125578063d35b29b7116100ad578063eaa92d391161007c578063eaa92d3914610499578063f2fde38b146104ac578063f5316f70146104bf578063f6ffdfd7146104d2578063fc188f3b146104e557600080fd5b8063d35b29b714610420578063dcf635911461044e578063dd62ed3e14610457578063e5ec58ac1461049057600080fd5b806398344aed116100f457806398344aed146103cb578063a457c2d7146103d4578063a9059cbb146103e7578063ab2e17bf146103fa578063c844b9b01461040d57600080fd5b8063715018a61461038d5780638da5cb5b1461039557806391b3c809146103b057806395d89b41146103c357600080fd5b8063384c5fb4116101a85780634f8cb4ae116101775780634f8cb4ae146103075780635279c00314610335578063532c76dc1461034857806362759f6c1461035157806370a082311461036457600080fd5b8063384c5fb4146102cf57806339509351146102d857806342afed5c146102eb5780634f53c753146102f457600080fd5b806318160ddd116101ef57806318160ddd1461027d57806323b872dd1461028557806328c7df4e14610298578063313ce567146102ad57806337fd0539146102bc57600080fd5b80620edb761461022057806302861aa51461023c57806306fdde0314610245578063095ea7b31461025a575b600080fd5b61022960065481565b6040519081526020015b60405180910390f35b61022960095481565b61024d6104f8565b6040516102339190611985565b61026d610268366004611752565b61058a565b6040519015158152602001610233565b600354610229565b61026d610293366004611716565b6105a1565b6102ab6102a636600461194a565b610650565b005b60405160128152602001610233565b6102ab6102ca36600461194a565b610696565b610229600a5481565b61026d6102e6366004611752565b6106dc565b610229600c5481565b6102ab6103023660046117b9565b610718565b61026d610315366004611963565b601560209081526000928352604080842090915290825290205460ff1681565b6102ab61034336600461194a565b610874565b61022960085481565b6102ab61035f36600461194a565b6108ba565b6102296103723660046116c1565b6001600160a01b031660009081526001602052604090205490565b6102ab610917565b6000546040516001600160a01b039091168152602001610233565b6102ab6103be3660046117b9565b61094d565b61024d610a8f565b610229600b5481565b61026d6103e2366004611752565b610a9e565b61026d6103f5366004611752565b610b37565b6102ab6104083660046116c1565b610b44565b6102ab61041b36600461177c565b610b90565b61026d61042e366004611963565b601660209081526000928352604080842090915290825290205460ff1681565b610229600d5481565b6102296104653660046116e3565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61022960075481565b6102ab6104a736600461194a565b610c9a565b6102ab6104ba3660046116c1565b610cc9565b6102ab6104cd36600461194a565b610d61565b6102ab6104e036600461187b565b610da7565b6102ab6104f3366004611752565b610f8d565b60606004805461050790611c93565b80601f016020809104026020016040519081016040528092919081815260200182805461053390611c93565b80156105805780601f1061055557610100808354040283529160200191610580565b820191906000526020600020905b81548152906001019060200180831161056357829003601f168201915b5050505050905090565b6000610597338484611064565b5060015b92915050565b60006105ae848484611188565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156106385760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6106458533858403611064565b506001949350505050565b6000546001600160a01b0316331461067a5760405162461bcd60e51b815260040161062f90611a86565b6106866012600a611bc9565b6106909082611c74565b60095550565b6000546001600160a01b031633146106c05760405162461bcd60e51b815260040161062f90611a86565b6106cc6012600a611bc9565b6106d69082611c74565b600a5550565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610597918590610713908690611b6e565b611064565b6011546001600160a01b0316336001600160a01b03161461074b5760405162461bcd60e51b815260040161062f906119da565b6011546001600160a01b031660009081526001602052604090205482516008546107759190611c74565b11156107935760405162461bcd60e51b815260040161062f90611abb565b805182511461080a5760405162461bcd60e51b815260206004820152603c60248201527f4d616b652073757265206e756d626572206f662072656365697665727320657160448201527f75616c73206e756d626572206f66206272656164737469636b49647300000000606482015260840161062f565b60005b825181101561086f57600083828151811061082a5761082a611d21565b6020026020010151905061085c600060085485858151811061084e5761084e611d21565b602002602001015184611357565b508061086781611cce565b91505061080d565b505050565b6000546001600160a01b0316331461089e5760405162461bcd60e51b815260040161062f90611a86565b6108aa6012600a611bc9565b6108b49082611c74565b60085550565b6000546001600160a01b031633146108e45760405162461bcd60e51b815260040161062f90611a86565b6109146108f96000546001600160a01b031690565b6109056012600a611bc9565b61090f9084611c74565b6114fd565b50565b6000546001600160a01b031633146109415760405162461bcd60e51b815260040161062f90611a86565b61094b60006115dc565b565b6010546001600160a01b0316336001600160a01b0316146109805760405162461bcd60e51b815260040161062f906119da565b6010546001600160a01b031660009081526001602052604090205482516006546109aa9190611c74565b11156109c85760405162461bcd60e51b815260040161062f90611abb565b8051825114610a385760405162461bcd60e51b815260206004820152603660248201527f4d616b652073757265206e756d626572206f662072656365697665727320657160448201527575616c73206e756d626572206f66206e666f6749447360501b606482015260840161062f565b60005b825181101561086f576000838281518110610a5857610a58611d21565b60200260200101519050610a7c600160065485858151811061084e5761084e611d21565b5080610a8781611cce565b915050610a3b565b60606005805461050790611c93565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015610b205760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161062f565b610b2d3385858403611064565b5060019392505050565b6000610597338484611188565b6000546001600160a01b03163314610b6e5760405162461bcd60e51b815260040161062f90611a86565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b6011546001600160a01b0316336001600160a01b031614610c0a5760405162461bcd60e51b815260206004820152602e60248201527f43616e206f6e6c7920626520696e697469617465642062792061697264726f7060448201526d08189d5999995d081dd85b1b195d60921b606482015260840161062f565b6011546001600160a01b03166000908152600160205260409020548151600a54610c349190611c74565b1115610c525760405162461bcd60e51b815260040161062f90611a28565b60005b8151811015610c9657610c83828281518110610c7357610c73611d21565b6020026020010151600a54610b37565b5080610c8e81611cce565b915050610c55565b5050565b6000546001600160a01b03163314610cc45760405162461bcd60e51b815260040161062f90611a86565b600d55565b6000546001600160a01b03163314610cf35760405162461bcd60e51b815260040161062f90611a86565b6001600160a01b038116610d585760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161062f565b610914816115dc565b6000546001600160a01b03163314610d8b5760405162461bcd60e51b815260040161062f90611a86565b610d976012600a611bc9565b610da19082611c74565b60065550565b6011546001600160a01b0316336001600160a01b031614610dda5760405162461bcd60e51b815260040161062f906119da565b8051825114610e4a5760405162461bcd60e51b815260206004820152603660248201527f4d616b652073757265206e756d626572206f662072656365697665727320657160448201527575616c73206e756d626572206f6620726174696e677360501b606482015260840161062f565b60005b825181101561086f576005828281518110610e6a57610e6a611d21565b602002602001015160ff1611158015610ea057506000828281518110610e9257610e92611d21565b602002602001015160ff1610155b610eec5760405162461bcd60e51b815260206004820152601e60248201527f526174696e67206d757374206265206265747765656e203020616e6420350000604482015260640161062f565b6000600754838381518110610f0357610f03611d21565b602002602001015160ff16610f189190611c74565b6011546001600160a01b0316600090815260016020526040902054909150811115610f555760405162461bcd60e51b815260040161062f90611a28565b610f78848381518110610f6a57610f6a611d21565b602002602001015182610b37565b50508080610f8590611cce565b915050610e4d565b6011546001600160a01b0316336001600160a01b031614610fc05760405162461bcd60e51b815260040161062f906119da565b6011546001600160a01b03166000908152600160205260409020546009541115610ffc5760405162461bcd60e51b815260040161062f90611abb565b6110086103e882611ce9565b156110555760405162461bcd60e51b815260206004820152601760248201527f4e6f742061206275726e74206272656164737469636b21000000000000000000604482015260640161062f565b610c9660006009548385611357565b6001600160a01b0383166110c65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161062f565b6001600160a01b0382166111275760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161062f565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166111ec5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161062f565b6001600160a01b03821661124e5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161062f565b6001600160a01b038316600090815260016020526040902054818110156112c65760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161062f565b6001600160a01b038085166000908152600160205260408082208585039055918516815290812080548492906112fd908490611b6e565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161134991815260200190565b60405180910390a350505050565b831561143157600b5482101580156113715750600c548211155b61137a57600080fd5b600d54600090815260156020908152604080832085845290915290205460ff16156114055760405162461bcd60e51b815260206004820152603560248201527f2442535449434b20616c726561647920636c61696d656420666f722074686973604482015274204e464f4720666f72207468697320636f7572736560581b606482015260840161062f565b600d5460009081526015602090815260408083208584529091529020805460ff191660011790556114ec565b600d54600090815260166020908152604080832085845290915290205460ff16156114c45760405162461bcd60e51b815260206004820152603b60248201527f2442535449434b20616c726561647920636c61696d656420666f72207468697360448201527f204272656164737469636b20666f72207468697320636f757273650000000000606482015260840161062f565b600d5460009081526016602090815260408083208584529091529020805460ff191660011790555b6114f68184610b37565b5050505050565b6001600160a01b0382166115535760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161062f565b80600360008282546115659190611b6e565b90915550506001600160a01b03821660009081526001602052604081208054839290611592908490611b6e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b038116811461164357600080fd5b919050565b600082601f83011261165957600080fd5b8135602061166e61166983611b4a565b611b19565b80838252828201915082860187848660051b890101111561168e57600080fd5b60005b858110156116b4576116a28261162c565b84529284019290840190600101611691565b5090979650505050505050565b6000602082840312156116d357600080fd5b6116dc8261162c565b9392505050565b600080604083850312156116f657600080fd5b6116ff8361162c565b915061170d6020840161162c565b90509250929050565b60008060006060848603121561172b57600080fd5b6117348461162c565b92506117426020850161162c565b9150604084013590509250925092565b6000806040838503121561176557600080fd5b61176e8361162c565b946020939093013593505050565b60006020828403121561178e57600080fd5b813567ffffffffffffffff8111156117a557600080fd5b6117b184828501611648565b949350505050565b600080604083850312156117cc57600080fd5b823567ffffffffffffffff808211156117e457600080fd5b6117f086838701611648565b935060209150818501358181111561180757600080fd5b85019050601f8101861361181a57600080fd5b803561182861166982611b4a565b80828252848201915084840189868560051b870101111561184857600080fd5b600094505b8385101561186b57803583526001949094019391850191850161184d565b5080955050505050509250929050565b6000806040838503121561188e57600080fd5b823567ffffffffffffffff808211156118a657600080fd5b6118b286838701611648565b93506020915081850135818111156118c957600080fd5b85019050601f810186136118dc57600080fd5b80356118ea61166982611b4a565b80828252848201915084840189868560051b870101111561190a57600080fd5b60009450845b8481101561193a57813560ff81168114611928578687fd5b84529286019290860190600101611910565b5096999098509650505050505050565b60006020828403121561195c57600080fd5b5035919050565b6000806040838503121561197657600080fd5b50508035926020909101359150565b600060208083528351808285015260005b818110156119b257858101830151858201604001528201611996565b818111156119c4576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252602e908201527f43616e206f6e6c7920626520696e697469617465642062792041697264726f7060408201526d08109d5999995d0815d85b1b195d60921b606082015260800190565b602080825260409082018190527f41697264726f70204275666665742077616c6c657420646f65736e2774206861908201527f766520656e6f756768202442535449434b20666f72207468697320636c61696d606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260409082018190527f41697264726f70204275666665742057616c6c657420646f65736e2774206861908201527f766520656e6f756768202442535449434b20666f72207468697320636c61696d606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715611b4257611b42611d37565b604052919050565b600067ffffffffffffffff821115611b6457611b64611d37565b5060051b60200190565b60008219821115611b8157611b81611d0b565b500190565b600181815b80851115611bc1578160001904821115611ba757611ba7611d0b565b80851615611bb457918102915b93841c9390800290611b8b565b509250929050565b60006116dc60ff841683600082611be25750600161059b565b81611bef5750600061059b565b8160018114611c055760028114611c0f57611c2b565b600191505061059b565b60ff841115611c2057611c20611d0b565b50506001821b61059b565b5060208310610133831016604e8410600b8410161715611c4e575081810a61059b565b611c588383611b86565b8060001904821115611c6c57611c6c611d0b565b029392505050565b6000816000190483118215151615611c8e57611c8e611d0b565b500290565b600181811c90821680611ca757607f821691505b60208210811415611cc857634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ce257611ce2611d0b565b5060010190565b600082611d0657634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220e3e449b433e487b7897b015e653b2dcbe4310bbcc98f62f20ee88e3272dbcd3664736f6c63430008070033

Deployed ByteCode Sourcemap

19348:10515:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19542:56;;;;;;;;;14795:25:1;;;14783:2;14768:18;19542:56:0;;;;;;;;20001:66;;;;;;8857:100;;;:::i;:::-;;;;;;;:::i;11165:210::-;;;;;;:::i;:::-;;:::i;:::-;;;5520:14:1;;5513:22;5495:41;;5483:2;5468:18;11165:210:0;5355:187:1;9977:108:0;10065:12;;9977:108;;11857:529;;;;;;:::i;:::-;;:::i;28961:195::-;;;;;;:::i;:::-;;:::i;:::-;;9819:93;;;9902:2;14973:36:1;;14961:2;14946:18;9819:93:0;14831:184:1;29353:189:0;;;;;;:::i;:::-;;:::i;20136:64::-;;;;;;12795:297;;;;;;:::i;:::-;;:::i;20298:30::-;;;;;;23323:689;;;;;;:::i;:::-;;:::i;21233:73::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;28573:185;;;;;;:::i;:::-;;:::i;19851:58::-;;;;;;27639:136;;;;;;:::i;:::-;;:::i;10148:177::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10299:18:0;10267:7;10299:18;;;:9;:18;;;;;;;10148:177;2841:94;;;:::i;2190:87::-;2236:7;2263:6;2190:87;;-1:-1:-1;;;;;2263:6:0;;;5293:51:1;;5281:2;5266:18;2190:87:0;5147:203:1;22434:652:0;;;;;;:::i;:::-;;:::i;9076:104::-;;;:::i;20234:30::-;;;;;;13595:482;;;;;;:::i;:::-;;:::i;10538:216::-;;;;;;:::i;:::-;;:::i;29726:134::-;;;;;;:::i;:::-;;:::i;25949:524::-;;;;;;:::i;:::-;;:::i;21313:79::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20462:25;;;;;;10817:201;;;;;;:::i;:::-;-1:-1:-1;;;;;10983:18:0;;;10951:7;10983:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10817:201;19708:61;;;;;;27925:91;;;;;;:::i;:::-;;:::i;3090:229::-;;;;;;:::i;:::-;;:::i;28203:173::-;;;;;;:::i;:::-;;:::i;24892:892::-;;;;;;:::i;:::-;;:::i;24195:493::-;;;;;;:::i;:::-;;:::i;8857:100::-;8911:13;8944:5;8937:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8857:100;:::o;11165:210::-;11284:4;11306:39;1121:10;11329:7;11338:6;11306:8;:39::i;:::-;-1:-1:-1;11363:4:0;11165:210;;;;;:::o;11857:529::-;11997:4;12014:36;12024:6;12032:9;12043:6;12014:9;:36::i;:::-;-1:-1:-1;;;;;12090:19:0;;12063:24;12090:19;;;:11;:19;;;;;;;;1121:10;12090:33;;;;;;;;12156:26;;;;12134:116;;;;-1:-1:-1;;;12134:116:0;;10377:2:1;12134:116:0;;;10359:21:1;10416:2;10396:18;;;10389:30;10455:34;10435:18;;;10428:62;-1:-1:-1;;;10506:18:1;;;10499:38;10554:19;;12134:116:0;;;;;;;;;12286:57;12295:6;1121:10;12336:6;12317:16;:25;12286:8;:57::i;:::-;-1:-1:-1;12374:4:0;;11857:529;-1:-1:-1;;;;11857:529:0:o;28961:195::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;29133:14:::1;9902:2:::0;29133::::1;:14;:::i;:::-;29110:38;::::0;:19;:38:::1;:::i;:::-;29082:25;:66:::0;-1:-1:-1;28961:195:0:o;29353:189::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;29519:14:::1;9902:2:::0;29519::::1;:14;:::i;:::-;29496:38;::::0;:19;:38:::1;:::i;:::-;29471:22;:63:::0;-1:-1:-1;29353:189:0:o;12795:297::-;1121:10;12910:4;13004:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13004:34:0;;;;;;;;;;12910:4;;12932:130;;12982:7;;13004:47;;13041:10;;13004:47;:::i;:::-;12932:8;:130::i;23323:689::-;23455:19;;-1:-1:-1;;;;;23455:19:0;1121:10;-1:-1:-1;;;;;23439:35:0;;23431:94;;;;-1:-1:-1;;;23431:94:0;;;;;;;:::i;:::-;23597:19;;-1:-1:-1;;;;;23597:19:0;10267:7;10299:18;;;:9;:18;;;;;;23567:9;:16;23544:20;;:39;;;;:::i;:::-;:73;;23536:150;;;;-1:-1:-1;;;23536:150:0;;;;;;;:::i;:::-;23725:13;:20;23705:9;:16;:40;23697:113;;;;-1:-1:-1;;;23697:113:0;;11981:2:1;23697:113:0;;;11963:21:1;12020:2;12000:18;;;11993:30;12059:34;12039:18;;;12032:62;12130:30;12110:18;;;12103:58;12178:19;;23697:113:0;11779:424:1;23697:113:0;23827:9;23823:182;23846:9;:16;23842:1;:20;23823:182;;;23884:16;23903:9;23913:1;23903:12;;;;;;;;:::i;:::-;;;;;;;23884:31;;23930:63;23937:5;23944:20;;23966:13;23980:1;23966:16;;;;;;;;:::i;:::-;;;;;;;23984:8;23930:6;:63::i;:::-;-1:-1:-1;23864:3:0;;;;:::i;:::-;;;;23823:182;;;;23323:689;;:::o;28573:185::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;28735:14:::1;9902:2:::0;28735::::1;:14;:::i;:::-;28712:38;::::0;:19;:38:::1;:::i;:::-;28689:20;:61:::0;-1:-1:-1;28573:185:0:o;27639:136::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;27714:53:::1;27720:7;2236::::0;2263:6;-1:-1:-1;;;;;2263:6:0;;2190:87;27720:7:::1;27751:14;9902:2:::0;27751::::1;:14;:::i;:::-;27729:37;::::0;:18;:37:::1;:::i;:::-;27714:5;:53::i;:::-;27639:136:::0;:::o;2841:94::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;2906:21:::1;2924:1;2906:9;:21::i;:::-;2841:94::o:0;22434:652::-;22564:17;;-1:-1:-1;;;;;22564:17:0;1121:10;-1:-1:-1;;;;;22548:33:0;;22540:92;;;;-1:-1:-1;;;22540:92:0;;;;;;;:::i;:::-;22698:17;;-1:-1:-1;;;;;22698:17:0;10267:7;10299:18;;;:9;:18;;;;;;22668:9;:16;22651:14;;:33;;;;:::i;:::-;:65;;22643:142;;;;-1:-1:-1;;;22643:142:0;;;;;;;:::i;:::-;22824:7;:14;22804:9;:16;:34;22796:101;;;;-1:-1:-1;;;22796:101:0;;8683:2:1;22796:101:0;;;8665:21:1;8722:2;8702:18;;;8695:30;8761:34;8741:18;;;8734:62;-1:-1:-1;;;8812:18:1;;;8805:52;8874:19;;22796:101:0;8481:418:1;22796:101:0;22914:9;22910:169;22933:9;:16;22929:1;:20;22910:169;;;22971:16;22990:9;23000:1;22990:12;;;;;;;;:::i;:::-;;;;;;;22971:31;;23017:50;23024:4;23030:14;;23046:7;23054:1;23046:10;;;;;;;;:::i;23017:50::-;-1:-1:-1;22951:3:0;;;;:::i;:::-;;;;22910:169;;9076:104;9132:13;9165:7;9158:14;;;;;:::i;13595:482::-;1121:10;13715:4;13764:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13764:34:0;;;;;;;;;;13831:35;;;;13809:122;;;;-1:-1:-1;;;13809:122:0;;13663:2:1;13809:122:0;;;13645:21:1;13702:2;13682:18;;;13675:30;13741:34;13721:18;;;13714:62;-1:-1:-1;;;13792:18:1;;;13785:35;13837:19;;13809:122:0;13461:401:1;13809:122:0;13967:67;1121:10;13990:7;14018:15;13999:16;:34;13967:8;:67::i;:::-;-1:-1:-1;14065:4:0;;13595:482;-1:-1:-1;;;13595:482:0:o;10538:216::-;10660:4;10682:42;1121:10;10706:9;10717:6;10682:9;:42::i;29726:134::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;29826:19:::1;:26:::0;;-1:-1:-1;;;;;;29826:26:0::1;-1:-1:-1::0;;;;;29826:26:0;;;::::1;::::0;;;::::1;::::0;;29726:134::o;25949:524::-;26094:19;;-1:-1:-1;;;;;26094:19:0;1121:10;-1:-1:-1;;;;;26078:35:0;;26070:94;;;;-1:-1:-1;;;26070:94:0;;13248:2:1;26070:94:0;;;13230:21:1;13287:2;13267:18;;;13260:30;13326:34;13306:18;;;13299:62;-1:-1:-1;;;13377:18:1;;;13370:44;13431:19;;26070:94:0;13046:410:1;26070:94:0;26238:19;;-1:-1:-1;;;;;26238:19:0;10267:7;10299:18;;;:9;:18;;;;;;26208:9;:16;26183:22;;:41;;;;:::i;:::-;:75;;26175:152;;;;-1:-1:-1;;;26175:152:0;;;;;;;:::i;:::-;26351:9;26347:119;26370:9;:16;26366:1;:20;26347:119;;;26408:46;26417:9;26427:1;26417:12;;;;;;;;:::i;:::-;;;;;;;26431:22;;26408:8;:46::i;:::-;-1:-1:-1;26388:3:0;;;;:::i;:::-;;;;26347:119;;;;25949:524;:::o;27925:91::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;27992:6:::1;:16:::0;27925:91::o;3090:229::-;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3193:22:0;::::1;3171:110;;;::::0;-1:-1:-1;;;3171:110:0;;6755:2:1;3171:110:0::1;::::0;::::1;6737:21:1::0;6794:2;6774:18;;;6767:30;6833:34;6813:18;;;6806:62;-1:-1:-1;;;6884:18:1;;;6877:36;6930:19;;3171:110:0::1;6553:402:1::0;3171:110:0::1;3292:19;3302:8;3292:9;:19::i;28203:173::-:0;2236:7;2263:6;-1:-1:-1;;;;;2263:6:0;1121:10;2410:23;2402:68;;;;-1:-1:-1;;;2402:68:0;;;;;;;:::i;:::-;28353:14:::1;9902:2:::0;28353::::1;:14;:::i;:::-;28330:38;::::0;:19;:38:::1;:::i;:::-;28313:14;:55:::0;-1:-1:-1;28203:173:0:o;24892:892::-;25110:19;;-1:-1:-1;;;;;25110:19:0;1121:10;-1:-1:-1;;;;;25094:35:0;;25086:94;;;;-1:-1:-1;;;25086:94:0;;;;;;;:::i;:::-;25219:7;:14;25199:9;:16;:34;25191:101;;;;-1:-1:-1;;;25191:101:0;;9106:2:1;25191:101:0;;;9088:21:1;9145:2;9125:18;;;9118:30;9184:34;9164:18;;;9157:62;-1:-1:-1;;;9235:18:1;;;9228:52;9297:19;;25191:101:0;8904:418:1;25191:101:0;25316:9;25312:465;25335:9;:16;25331:1;:20;25312:465;;;25395:1;25381:7;25389:1;25381:10;;;;;;;;:::i;:::-;;;;;;;:15;;;;:34;;;;;25414:1;25400:7;25408:1;25400:10;;;;;;;;:::i;:::-;;;;;;;:15;;;;25381:34;25373:77;;;;-1:-1:-1;;;25373:77:0;;7565:2:1;25373:77:0;;;7547:21:1;7604:2;7584:18;;;7577:30;7643:32;7623:18;;;7616:60;7693:18;;25373:77:0;7363:354:1;25373:77:0;25511:21;25548:20;;25535:7;25543:1;25535:10;;;;;;;;:::i;:::-;;;;;;;:33;;;;;;:::i;:::-;25621:19;;-1:-1:-1;;;;;25621:19:0;10267:7;10299:18;;;:9;:18;;;;;;25511:57;;-1:-1:-1;25591:16:0;:50;;25583:127;;;;-1:-1:-1;;;25583:127:0;;;;;;;:::i;:::-;25725:40;25734:9;25744:1;25734:12;;;;;;;;:::i;:::-;;;;;;;25748:16;25725:8;:40::i;:::-;;25358:419;25353:3;;;;;:::i;:::-;;;;25312:465;;24195:493;24311:19;;-1:-1:-1;;;;;24311:19:0;1121:10;-1:-1:-1;;;;;24295:35:0;;24287:94;;;;-1:-1:-1;;;24287:94:0;;;;;;;:::i;:::-;24439:19;;-1:-1:-1;;;;;24439:19:0;10267:7;10299:18;;;:9;:18;;;;;;24400:25;;:59;;24392:136;;;;-1:-1:-1;;;24392:136:0;;;;;;;:::i;:::-;24547:19;24562:4;24547:12;:19;:::i;:::-;:24;24539:60;;;;-1:-1:-1;;;24539:60:0;;7924:2:1;24539:60:0;;;7906:21:1;7963:2;7943:18;;;7936:30;8002:25;7982:18;;;7975:53;8045:18;;24539:60:0;7722:347:1;24539:60:0;24616:64;24623:5;24630:25;;24657:12;24671:8;24616:6;:64::i;17385:380::-;-1:-1:-1;;;;;17521:19:0;;17513:68;;;;-1:-1:-1;;;17513:68:0;;12410:2:1;17513:68:0;;;12392:21:1;12449:2;12429:18;;;12422:30;12488:34;12468:18;;;12461:62;-1:-1:-1;;;12539:18:1;;;12532:34;12583:19;;17513:68:0;12208:400:1;17513:68:0;-1:-1:-1;;;;;17600:21:0;;17592:68;;;;-1:-1:-1;;;17592:68:0;;7162:2:1;17592:68:0;;;7144:21:1;7201:2;7181:18;;;7174:30;7240:34;7220:18;;;7213:62;-1:-1:-1;;;7291:18:1;;;7284:32;7333:19;;17592:68:0;6960:398:1;17592:68:0;-1:-1:-1;;;;;17673:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17725:32;;14795:25:1;;;17725:32:0;;14768:18:1;17725:32:0;;;;;;;17385:380;;;:::o;14567:770::-;-1:-1:-1;;;;;14707:20:0;;14699:70;;;;-1:-1:-1;;;14699:70:0;;11575:2:1;14699:70:0;;;11557:21:1;11614:2;11594:18;;;11587:30;11653:34;11633:18;;;11626:62;-1:-1:-1;;;11704:18:1;;;11697:35;11749:19;;14699:70:0;11373:401:1;14699:70:0;-1:-1:-1;;;;;14788:23:0;;14780:71;;;;-1:-1:-1;;;14780:71:0;;6351:2:1;14780:71:0;;;6333:21:1;6390:2;6370:18;;;6363:30;6429:34;6409:18;;;6402:62;-1:-1:-1;;;6480:18:1;;;6473:33;6523:19;;14780:71:0;6149:399:1;14780:71:0;-1:-1:-1;;;;;14948:17:0;;14924:21;14948:17;;;:9;:17;;;;;;14998:23;;;;14976:111;;;;-1:-1:-1;;;14976:111:0;;8276:2:1;14976:111:0;;;8258:21:1;8315:2;8295:18;;;8288:30;8354:34;8334:18;;;8327:62;-1:-1:-1;;;8405:18:1;;;8398:36;8451:19;;14976:111:0;8074:402:1;14976:111:0;-1:-1:-1;;;;;15123:17:0;;;;;;;:9;:17;;;;;;15143:22;;;15123:42;;15187:20;;;;;;;;:30;;15159:6;;15123:17;15187:30;;15159:6;;15187:30;:::i;:::-;;;;;;;;15252:9;-1:-1:-1;;;;;15235:35:0;15244:6;-1:-1:-1;;;;;15235:35:0;;15263:6;15235:35;;;;14795:25:1;;14783:2;14768:18;;14649:177;15235:35:0;;;;;;;;14688:649;14567:770;;;:::o;26548:740::-;26754:6;26750:490;;;26796:11;;26785:7;:22;;:46;;;;;26822:9;;26811:7;:20;;26785:46;26777:55;;;;;;26878:6;;26856:29;;;;:21;:29;;;;;;;;:38;;;;;;;;;;;26855:39;26847:105;;;;-1:-1:-1;;;26847:105:0;;14429:2:1;26847:105:0;;;14411:21:1;14468:2;14448:18;;;14441:30;14507:34;14487:18;;;14480:62;-1:-1:-1;;;14558:18:1;;;14551:51;14619:19;;26847:105:0;14227:417:1;26847:105:0;26989:6;;26967:29;;;;:21;:29;;;;;;;;:38;;;;;;;;:45;;-1:-1:-1;;26967:45:0;27008:4;26967:45;;;26750:490;;;27082:6;;27054:35;;;;:27;:35;;;;;;;;:44;;;;;;;;;;;27053:45;27045:117;;;;-1:-1:-1;;;27045:117:0;;11147:2:1;27045:117:0;;;11129:21:1;11186:2;11166:18;;;11159:30;11225:34;11205:18;;;11198:62;11296:29;11276:18;;;11269:57;11343:19;;27045:117:0;10945:423:1;27045:117:0;27205:6;;27177:35;;;;:27;:35;;;;;;;;:44;;;;;;;;:51;;-1:-1:-1;;27177:51:0;27224:4;27177:51;;;26750:490;27252:28;27261:10;27273:6;27252:8;:28::i;:::-;;26548:740;;;;:::o;15624:399::-;-1:-1:-1;;;;;15708:21:0;;15700:65;;;;-1:-1:-1;;;15700:65:0;;14069:2:1;15700:65:0;;;14051:21:1;14108:2;14088:18;;;14081:30;14147:33;14127:18;;;14120:61;14198:18;;15700:65:0;13867:355:1;15700:65:0;15856:6;15840:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15873:18:0;;;;;;:9;:18;;;;;:28;;15895:6;;15873:18;:28;;15895:6;;15873:28;:::i;:::-;;;;-1:-1:-1;;15917:37:0;;14795:25:1;;;-1:-1:-1;;;;;15917:37:0;;;15934:1;;15917:37;;14783:2:1;14768:18;15917:37:0;;;;;;;26347:119;25949:524;:::o;3327:173::-;3383:16;3402:6;;-1:-1:-1;;;;;3419:17:0;;;-1:-1:-1;;;;;;3419:17:0;;;;;;3452:40;;3402:6;;;;;;;3452:40;;3383:16;3452:40;3372:128;3327:173;:::o;14::1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:679::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;403:60;419:43;459:2;419:43;:::i;:::-;403:60;:::i;:::-;485:3;509:2;504:3;497:15;537:2;532:3;528:12;521:19;;572:2;564:6;560:15;624:3;619:2;613;610:1;606:10;598:6;594:23;590:32;587:41;584:61;;;641:1;638;631:12;584:61;663:1;673:169;687:2;684:1;681:9;673:169;;;744:23;763:3;744:23;:::i;:::-;732:36;;788:12;;;;820;;;;705:1;698:9;673:169;;;-1:-1:-1;860:5:1;;192:679;-1:-1:-1;;;;;;;192:679:1:o;876:186::-;935:6;988:2;976:9;967:7;963:23;959:32;956:52;;;1004:1;1001;994:12;956:52;1027:29;1046:9;1027:29;:::i;:::-;1017:39;876:186;-1:-1:-1;;;876:186:1:o;1067:260::-;1135:6;1143;1196:2;1184:9;1175:7;1171:23;1167:32;1164:52;;;1212:1;1209;1202:12;1164:52;1235:29;1254:9;1235:29;:::i;:::-;1225:39;;1283:38;1317:2;1306:9;1302:18;1283:38;:::i;:::-;1273:48;;1067:260;;;;;:::o;1332:328::-;1409:6;1417;1425;1478:2;1466:9;1457:7;1453:23;1449:32;1446:52;;;1494:1;1491;1484:12;1446:52;1517:29;1536:9;1517:29;:::i;:::-;1507:39;;1565:38;1599:2;1588:9;1584:18;1565:38;:::i;:::-;1555:48;;1650:2;1639:9;1635:18;1622:32;1612:42;;1332:328;;;;;:::o;1665:254::-;1733:6;1741;1794:2;1782:9;1773:7;1769:23;1765:32;1762:52;;;1810:1;1807;1800:12;1762:52;1833:29;1852:9;1833:29;:::i;:::-;1823:39;1909:2;1894:18;;;;1881:32;;-1:-1:-1;;;1665:254:1:o;1924:348::-;2008:6;2061:2;2049:9;2040:7;2036:23;2032:32;2029:52;;;2077:1;2074;2067:12;2029:52;2117:9;2104:23;2150:18;2142:6;2139:30;2136:50;;;2182:1;2179;2172:12;2136:50;2205:61;2258:7;2249:6;2238:9;2234:22;2205:61;:::i;:::-;2195:71;1924:348;-1:-1:-1;;;;1924:348:1:o;2277:1149::-;2395:6;2403;2456:2;2444:9;2435:7;2431:23;2427:32;2424:52;;;2472:1;2469;2462:12;2424:52;2512:9;2499:23;2541:18;2582:2;2574:6;2571:14;2568:34;;;2598:1;2595;2588:12;2568:34;2621:61;2674:7;2665:6;2654:9;2650:22;2621:61;:::i;:::-;2611:71;;2701:2;2691:12;;2756:2;2745:9;2741:18;2728:32;2785:2;2775:8;2772:16;2769:36;;;2801:1;2798;2791:12;2769:36;2824:24;;;-1:-1:-1;2879:4:1;2871:13;;2867:27;-1:-1:-1;2857:55:1;;2908:1;2905;2898:12;2857:55;2944:2;2931:16;2967:60;2983:43;3023:2;2983:43;:::i;2967:60::-;3049:3;3073:2;3068:3;3061:15;3101:2;3096:3;3092:12;3085:19;;3132:2;3128;3124:11;3180:7;3175:2;3169;3166:1;3162:10;3158:2;3154:19;3150:28;3147:41;3144:61;;;3201:1;3198;3191:12;3144:61;3223:1;3214:10;;3233:163;3247:2;3244:1;3241:9;3233:163;;;3304:17;;3292:30;;3265:1;3258:9;;;;;3342:12;;;;3374;;3233:163;;;3237:3;3415:5;3405:15;;;;;;;2277:1149;;;;;:::o;3431:1273::-;3547:6;3555;3608:2;3596:9;3587:7;3583:23;3579:32;3576:52;;;3624:1;3621;3614:12;3576:52;3664:9;3651:23;3693:18;3734:2;3726:6;3723:14;3720:34;;;3750:1;3747;3740:12;3720:34;3773:61;3826:7;3817:6;3806:9;3802:22;3773:61;:::i;:::-;3763:71;;3853:2;3843:12;;3908:2;3897:9;3893:18;3880:32;3937:2;3927:8;3924:16;3921:36;;;3953:1;3950;3943:12;3921:36;3976:24;;;-1:-1:-1;4031:4:1;4023:13;;4019:27;-1:-1:-1;4009:55:1;;4060:1;4057;4050:12;4009:55;4096:2;4083:16;4119:60;4135:43;4175:2;4135:43;:::i;4119:60::-;4201:3;4225:2;4220:3;4213:15;4253:2;4248:3;4244:12;4237:19;;4284:2;4280;4276:11;4332:7;4327:2;4321;4318:1;4314:10;4310:2;4306:19;4302:28;4299:41;4296:61;;;4353:1;4350;4343:12;4296:61;4375:1;4366:10;;4396:1;4406:268;4422:2;4417:3;4414:11;4406:268;;;4497:3;4484:17;4545:4;4538:5;4534:16;4527:5;4524:27;4514:55;;4565:1;4562;4555:12;4514:55;4582:18;;4620:12;;;;4652;;;;4444:1;4435:11;4406:268;;;-1:-1:-1;3431:1273:1;;4693:5;;-1:-1:-1;3431:1273:1;-1:-1:-1;;;;;;;3431:1273:1:o;4709:180::-;4768:6;4821:2;4809:9;4800:7;4796:23;4792:32;4789:52;;;4837:1;4834;4827:12;4789:52;-1:-1:-1;4860:23:1;;4709:180;-1:-1:-1;4709:180:1:o;4894:248::-;4962:6;4970;5023:2;5011:9;5002:7;4998:23;4994:32;4991:52;;;5039:1;5036;5029:12;4991:52;-1:-1:-1;;5062:23:1;;;5132:2;5117:18;;;5104:32;;-1:-1:-1;4894:248:1:o;5547:597::-;5659:4;5688:2;5717;5706:9;5699:21;5749:6;5743:13;5792:6;5787:2;5776:9;5772:18;5765:34;5817:1;5827:140;5841:6;5838:1;5835:13;5827:140;;;5936:14;;;5932:23;;5926:30;5902:17;;;5921:2;5898:26;5891:66;5856:10;;5827:140;;;5985:6;5982:1;5979:13;5976:91;;;6055:1;6050:2;6041:6;6030:9;6026:22;6022:31;6015:42;5976:91;-1:-1:-1;6128:2:1;6107:15;-1:-1:-1;;6103:29:1;6088:45;;;;6135:2;6084:54;;5547:597;-1:-1:-1;;;5547:597:1:o;9327:410::-;9529:2;9511:21;;;9568:2;9548:18;;;9541:30;9607:34;9602:2;9587:18;;9580:62;-1:-1:-1;;;9673:2:1;9658:18;;9651:44;9727:3;9712:19;;9327:410::o;9742:428::-;9944:2;9926:21;;;9983:2;9963:18;;;9956:30;;;10022:34;10002:18;;;9995:62;10093:34;10088:2;10073:18;;10066:62;10160:3;10145:19;;9742:428::o;10584:356::-;10786:2;10768:21;;;10805:18;;;10798:30;10864:34;10859:2;10844:18;;10837:62;10931:2;10916:18;;10584:356::o;12613:428::-;12815:2;12797:21;;;12854:2;12834:18;;;12827:30;;;12893:34;12873:18;;;12866:62;12964:34;12959:2;12944:18;;12937:62;13031:3;13016:19;;12613:428::o;15020:275::-;15091:2;15085:9;15156:2;15137:13;;-1:-1:-1;;15133:27:1;15121:40;;15191:18;15176:34;;15212:22;;;15173:62;15170:88;;;15238:18;;:::i;:::-;15274:2;15267:22;15020:275;;-1:-1:-1;15020:275:1:o;15300:183::-;15360:4;15393:18;15385:6;15382:30;15379:56;;;15415:18;;:::i;:::-;-1:-1:-1;15460:1:1;15456:14;15472:4;15452:25;;15300:183::o;15488:128::-;15528:3;15559:1;15555:6;15552:1;15549:13;15546:39;;;15565:18;;:::i;:::-;-1:-1:-1;15601:9:1;;15488:128::o;15621:422::-;15710:1;15753:5;15710:1;15767:270;15788:7;15778:8;15775:21;15767:270;;;15847:4;15843:1;15839:6;15835:17;15829:4;15826:27;15823:53;;;15856:18;;:::i;:::-;15906:7;15896:8;15892:22;15889:55;;;15926:16;;;;15889:55;16005:22;;;;15965:15;;;;15767:270;;;15771:3;15621:422;;;;;:::o;16048:140::-;16106:5;16135:47;16176:4;16166:8;16162:19;16156:4;16242:5;16272:8;16262:80;;-1:-1:-1;16313:1:1;16327:5;;16262:80;16361:4;16351:76;;-1:-1:-1;16398:1:1;16412:5;;16351:76;16443:4;16461:1;16456:59;;;;16529:1;16524:130;;;;16436:218;;16456:59;16486:1;16477:10;;16500:5;;;16524:130;16561:3;16551:8;16548:17;16545:43;;;16568:18;;:::i;:::-;-1:-1:-1;;16624:1:1;16610:16;;16639:5;;16436:218;;16738:2;16728:8;16725:16;16719:3;16713:4;16710:13;16706:36;16700:2;16690:8;16687:16;16682:2;16676:4;16673:12;16669:35;16666:77;16663:159;;;-1:-1:-1;16775:19:1;;;16807:5;;16663:159;16854:34;16879:8;16873:4;16854:34;:::i;:::-;16924:6;16920:1;16916:6;16912:19;16903:7;16900:32;16897:58;;;16935:18;;:::i;:::-;16973:20;;16193:806;-1:-1:-1;;;16193:806:1:o;17004:168::-;17044:7;17110:1;17106;17102:6;17098:14;17095:1;17092:21;17087:1;17080:9;17073:17;17069:45;17066:71;;;17117:18;;:::i;:::-;-1:-1:-1;17157:9:1;;17004:168::o;17177:380::-;17256:1;17252:12;;;;17299;;;17320:61;;17374:4;17366:6;17362:17;17352:27;;17320:61;17427:2;17419:6;17416:14;17396:18;17393:38;17390:161;;;17473:10;17468:3;17464:20;17461:1;17454:31;17508:4;17505:1;17498:15;17536:4;17533:1;17526:15;17390:161;;17177:380;;;:::o;17562:135::-;17601:3;-1:-1:-1;;17622:17:1;;17619:43;;;17642:18;;:::i;:::-;-1:-1:-1;17689:1:1;17678:13;;17562:135::o;17702:209::-;17734:1;17760;17750:132;;17804:10;17799:3;17795:20;17792:1;17785:31;17839:4;17836:1;17829:15;17867:4;17864:1;17857:15;17750:132;-1:-1:-1;17896:9:1;;17702:209::o;17916:127::-;17977:10;17972:3;17968:20;17965:1;17958:31;18008:4;18005:1;17998:15;18032:4;18029:1;18022:15;18048:127;18109:10;18104:3;18100:20;18097:1;18090:31;18140:4;18137:1;18130:15;18164:4;18161:1;18154:15;18180:127;18241:10;18236:3;18232:20;18229:1;18222:31;18272:4;18269:1;18262:15;18296:4;18293:1;18286:15

Swarm Source

ipfs://e3e449b433e487b7897b015e653b2dcbe4310bbcc98f62f20ee88e3272dbcd36
Loading