ETH Price: $2,943.57 (-0.48%)
 

Overview

Max Total Supply

15,000,000 TRUFFI

Holders

8,340 (0.00%)

Market

Price

$0.0021 @ 0.000001 ETH (-0.08%)

Onchain Market Cap

$30,842.70

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 9 Decimals)

Balance
379 TRUFFI

Value
$0.78 ( ~0.000264984201025815 ETH) [0.0025%]
0x7b68a28d7ad85451188fa0608fb3ea2d83155bde
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Truffi is an ERC20 on-chain art project which was designed and animated by Shameless Art Studio. The goal is to create fun on-chain art and to take ERC-20 inscriptions to the next level by introducing a flexible tier system and incorporating gamified elements like Seasonal Collections with rewards.

Contract Source Code Verified (Exact Match)

Contract Name:
Truffi

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, MIT license
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import "./Erc20.sol";
import "./PoolCreatableErc20i.sol";
import "../Generator.sol";

library ExtraSeedLibrary {
	function extra(address account, uint extraSeed) internal pure returns (uint256) {
		return uint(keccak256(abi.encodePacked(account, extraSeed)));
	}

	function seed_data(address account, uint seed, uint extraSeed) internal pure returns (SeedData memory) {
		return SeedData(seed, extra(account, extraSeed), account);
	}
}

abstract contract Inscriptions is PoolCreatableErc20i {
	using ExtraSeedLibrary for address;
	mapping(address owner => uint) _counts;
	mapping(address owner => mapping(uint index => SeedData seed_data)) _ownedTokens;
	mapping(address owner => mapping(uint tokenId => uint)) _ownedTokensIndex;
	mapping(address owner => mapping(uint => bool)) _owns;
	mapping(address owner => SeedData seed_data) _dynamicInscription;
	mapping(uint index => address user) _holderList;
	mapping(address user => uint index) _holderListIndexes;
	uint _inscriptionsTotalCount;
	uint _holdersCount;
	uint _dynamicInscriptionTotalCount;
	uint _random_nonce;

	event OnMushroomTransfer(address indexed from, address indexed to, SeedData seed_data);
	event OnSporesGrow(address indexed holder, SeedData seed_data);
	event OnSporesShrink(address indexed holder, SeedData seed_data);

	constructor() PoolCreatableErc20i("Truffi", "TRUFFI", msg.sender) {}

	modifier holder_calculate(address acc1, address acc2) {
		bool before1 = _isHolder(acc1);
		bool before2 = _isHolder(acc2);
		_;
		bool after1 = _isHolder(acc1);
		bool after2 = _isHolder(acc2);
		if (!before1 && after1) _addHolder(acc1);
		if (before1 && !after1) _removeHolder(acc1);
		if (!before2 && after2) _addHolder(acc2);
		if (before2 && !after2) _removeHolder(acc2);
	}

	function _isHolder(address account) private view returns (bool) {
		if (account == address(this) || account == _pool || account == address(0)) return false;

		return (_dynamicInscription[account].seed + this.inscriptionCount(account)) > 0;
	}

	function trySeedTransfer(address from, address to, uint amount) internal holder_calculate(from, to) {
		if (from == address(this)) return;
		uint seed = amount / (10 ** decimals());

		if (seed > 0 && from != _pool && to != _pool) {
			// transfer growing inscription
			if (_dynamicInscription[from].seed == seed && !_owns[to][seed]) {
				SeedData memory data = _dynamicInscription[from];
				_removeSeedCount(from, seed);
				_addTokenToOwnerEnumeration(to, data);
				emit OnMushroomTransfer(from, to, data);
				return;
			}

			// transfer collected inscription
			if (_owns[from][seed] && !_owns[to][seed]) {
				SeedData memory data = _ownedTokens[from][_ownedTokensIndex[from][seed]];
				_removeTokenFromOwnerEnumeration(from, seed);
				_addTokenToOwnerEnumeration(to, data);
				emit OnMushroomTransfer(from, to, data);
				return;
			}
		}

		// transfer dynamicInscription
		uint lastBalanceFromSeed = _balances[from] / (10 ** decimals());
		uint newBalanceFromSeed = (_balances[from] - amount) / (10 ** decimals());
		_removeSeedCount(from, lastBalanceFromSeed - newBalanceFromSeed);
		_addSeedCount(to, seed);
	}

	function _addHolder(address account) private {
		_holderList[_holdersCount] = account;
		_holderListIndexes[account] = _holdersCount;
		++_holdersCount;
	}

	function _removeHolder(address account) private {
		if (_holdersCount == 0) return;
		uint removingIndex = _holderListIndexes[account];
		if (removingIndex != _holdersCount - 1) {
			address lastHolder = _holderList[_holdersCount - 1];
			_holderList[removingIndex] = lastHolder;
			_holderListIndexes[lastHolder] = removingIndex;
		}

		--_holdersCount;
		delete _holderListIndexes[account];
		delete _holderList[_holdersCount];
	}

	function getHolderByIndex(uint index) public view returns (address) {
		return _holderList[index];
	}

	function getHoldersList(uint startIndex, uint count) public view returns (address[] memory) {
		address[] memory holders = new address[](count);
		for (uint i = 0; i < count; ++i) holders[i] = getHolderByIndex(startIndex + i);
		return holders;
	}

	function _addSeedCount(address account, uint seed) private {
		if (seed == 0) return;
		if (account == _pool) return;
		SeedData memory last = _dynamicInscription[account];

		_dynamicInscription[account].seed += seed;
		_dynamicInscription[account].extra = account.extra(++_random_nonce);
		_dynamicInscription[account].creator = account;

		if (last.seed == 0 && _dynamicInscription[account].seed > 0) ++_dynamicInscriptionTotalCount;

		emit OnSporesGrow(account, _dynamicInscription[account]);
	}

	function _removeSeedCount(address account, uint seed) private {
		if (seed == 0) return;
		if (account == _pool) return;
		SeedData memory lastSpores = _dynamicInscription[account];
		if (_dynamicInscription[account].seed >= seed) {
			_dynamicInscription[account].seed -= seed;
			_dynamicInscription[account].extra = account.extra(++_random_nonce);
			_dynamicInscription[account].creator = account;
			if (lastSpores.seed > 0 && _dynamicInscription[account].seed == 0) --_dynamicInscriptionTotalCount;
			emit OnSporesShrink(account, _dynamicInscription[account]);
			return;
		}
		uint seedRemains = seed - _dynamicInscription[account].seed;
		_dynamicInscription[account].seed = 0;
		_dynamicInscription[account].extra = account.extra(++_random_nonce);
		_dynamicInscription[account].creator = account;

		// remove inscriptions
		uint count = _counts[account];
		uint removed;
		for (uint i = 0; i < count && removed < seedRemains; ++i) {
			removed += _removeFirstTokenFromOwner(account);
		}

		if (removed > seedRemains) {
			_dynamicInscription[account].seed += removed - seedRemains;
			_dynamicInscription[account].extra = account.extra(++_random_nonce);
			_dynamicInscription[account].creator = account;
		}
		if (lastSpores.seed > 0 && _dynamicInscription[account].seed == 0) --_dynamicInscriptionTotalCount;
		if (lastSpores.seed == 0 && _dynamicInscription[account].seed > 0) ++_dynamicInscriptionTotalCount;
		emit OnSporesShrink(account, _dynamicInscription[account]);
	}

	function _addTokenToOwnerEnumeration(address to, SeedData memory data) private {
		if (to == _pool) return;
		++_counts[to];
		++_inscriptionsTotalCount;
		uint length = _counts[to] - 1;
		_ownedTokens[to][length] = data;
		_ownedTokensIndex[to][data.seed] = length;
		_owns[to][data.seed] = true;
	}

	function _removeTokenFromOwnerEnumeration(address from, uint seed) private {
		if (from == _pool) return;
		--_counts[from];
		--_inscriptionsTotalCount;
		_owns[from][seed] = false;
		uint lastTokenIndex = _counts[from];
		uint tokenIndex = _ownedTokensIndex[from][seed];
		SeedData memory data = _ownedTokens[from][tokenIndex];

		// When the token to delete is the last token, the swap operation is unnecessary
		if (tokenIndex != lastTokenIndex) {
			SeedData memory lastTokenId = _ownedTokens[from][lastTokenIndex];

			_ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
			_ownedTokensIndex[from][lastTokenId.seed] = tokenIndex; // Update the moved token's index
		}

		delete _ownedTokensIndex[from][data.seed];
		delete _ownedTokens[from][lastTokenIndex];
	}

	function _removeFirstTokenFromOwner(address owner) private returns (uint) {
		uint count = _counts[owner];
		if (count == 0) return 0;
		uint seed = _ownedTokens[owner][0].seed;
		_removeTokenFromOwnerEnumeration(owner, seed);
		return seed;
	}

	function isOwnerOf(address owner, uint seed) external view returns (bool) {
		return _owns[owner][seed];
	}

	function dynamicInscription(address owner) external view returns (SeedData memory data) {
		return _dynamicInscription[owner];
	}

	function inscriptionCount(address owner) external view returns (uint) {
		return _counts[owner];
	}

	function inscriptionOfOwnerByIndex(address owner, uint index) external view returns (SeedData memory data) {
		return _ownedTokens[owner][index];
	}

	function inscriptionsTotalCount() external view returns (uint) {
		return _inscriptionsTotalCount;
	}

	function holdersCount() external view returns (uint) {
		return _holdersCount;
	}

	function dynamicInscriptionTotalCount() external view returns (uint) {
		return _dynamicInscriptionTotalCount;
	}

	function getHolderIndex(address account) external view returns (uint) {
		return _holderListIndexes[account];
	}
}

contract Truffi is Inscriptions, Generator, ReentrancyGuard {
	uint constant _startTotalSupply = 15e6 * (10 ** _decimals);
	uint constant _startMaxBuyCount = (_startTotalSupply * 5) / 10000;
	uint constant _addMaxBuyPercentPerSec = 5; // 100%=_addMaxBuyPrecesion add 0.005%/second
	uint constant _addMaxBuyPrecesion = 100000;

	constructor() {
		_mint(msg.sender, _startTotalSupply);
	}

	modifier maxBuyLimit(uint256 amount) {
		require(amount <= maxBuy(), "max buy limit");
		_;
	}

	function maxBuy() public view returns (uint256) {
		if (!isStarted()) return _startTotalSupply;
		uint256 count = _startMaxBuyCount + (_startTotalSupply * (block.timestamp - _startTime) * _addMaxBuyPercentPerSec) / _addMaxBuyPrecesion;
		if (count > _startTotalSupply) count = _startTotalSupply;
		return count;
	}

	function _transfer(address from, address to, uint256 amount) internal override {
		if (isStarted()) {
			trySeedTransfer(from, to, amount);
		} else {
			require(from == _owner || to == _owner, "not started");
		}

		// allow burning
		if (to == address(0)) {
			_burn(from, amount);
			return;
		}

		// system transfers
		if (from == address(this)) {
			super._transfer(from, to, amount);
			return;
		}

		if (_feeLocked) {
			super._transfer(from, to, amount);
			return;
		} else {
			if (from == _pool) {
				buy(to, amount);
				return;
			}
		}

		super._transfer(from, to, amount);
	}

	function buy(address to, uint256 amount) private maxBuyLimit(amount) lockFee {
		super._transfer(_pool, to, amount);
	}

	function burnCount() public view returns (uint256) {
		return _startTotalSupply - totalSupply();
	}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

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

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

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

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

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import "./lib/Ownable.sol";

uint8 constant colorsCount = 10;
address constant special = 0x07339c13953afAD77B783E1e783f7bbA94Bb8677;
string constant description = "Random Token Generator";
string constant web = "https://random.art/";

struct MushroomData {
	uint skyType;
	uint skyColor;
	uint horizonType;
	uint horizonColor;
	uint groundType;
	uint groundColor;
	uint faceType;
	uint stemType;
	uint stemColor;
	uint capType;
	uint capColor;
	uint dotsColor;
	bool isSpecial;
}

struct SeedData {
	uint seed;
	uint extra;
	address creator;
}
struct Rand {
	uint seed;
	uint nonce;
	uint extra;
	bool isSpecial;
}

library RandLib {
	function next(Rand memory rnd) internal pure returns (uint) {
		return uint(keccak256(abi.encodePacked(rnd.isSpecial, rnd.seed + rnd.nonce++ - 1, rnd.extra)));
	}

	function chances(uint seed, bool isSpecial) internal pure returns (uint16[4] memory) {
		uint16[4] memory thresholds = [300, 1200, 2100, 3000];
		uint16[4][6] memory tears = [[3164, 492, 61, 6], [4011, 805, 115, 16], [4902, 1183, 182, 24], [5718, 1553, 252, 31], [6296, 1798, 302, 37], [8000, 6000, 4000, 2000]];
		if (isSpecial) return tears[5];
		if (seed < thresholds[0]) return tears[0];
		if (seed < thresholds[1]) return tears[1];
		if (seed < thresholds[2]) return tears[2];
		if (seed < thresholds[3]) return tears[3];
		return tears[4];
	}

	function lvl(Rand memory rnd) internal pure returns (uint) {
		uint chance = next(rnd) % 10000;
		if (chance < chances(rnd.seed, rnd.isSpecial)[3]) return 4;
		if (chance < chances(rnd.seed, rnd.isSpecial)[2]) return 3;
		if (chance < chances(rnd.seed, rnd.isSpecial)[1]) return 2;
		if (chance < chances(rnd.seed, rnd.isSpecial)[0]) return 1;
		return 0;
	}
}

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

library MetaLib {
	using StringLib for uint;

	function meta(MushroomData memory data) internal pure returns (string memory) {
		bytes memory str = abi.encodePacked('"skyColor": ', data.skyColor.toString(), ', "skyType": ', data.skyType.toString(), ', "horizonType": ', (data.horizonType).toString());
		str = abi.encodePacked(str, ', "horizonColor": ', data.horizonColor.toString(), ', "groundType": ', (data.groundType).toString(), ', "groundColor": ', data.groundColor.toString());
		str = abi.encodePacked(str, ', "faceType": ', (data.faceType).toString(), ', "stemType": ', (data.stemType).toString(), ', "stemColor": ', data.stemColor.toString());
		str = abi.encodePacked(str, ', "capType": ', (data.capType).toString(), ', "capColor": ', data.capColor.toString(), ', "dotsColor": ', data.dotsColor.toString(), ', "isSpecial": ', data.isSpecial ? "true" : "false");
		return string(abi.encodePacked("{", str, "}"));
	}
}

contract Generator is Ownable {
	using RandLib for Rand;
	using MetaLib for MushroomData;
	using StringLib for uint;

	string[10][3] private colors;
	string[5][6] private backgrounds;
	string[6][5][7] private shapes;

	constructor() {}

	function setMushrooms(string[6][5] calldata data, uint origin) external onlyOwner returns (bool) {
		for (uint i = 0; i < 5; i++) {
			for (uint y = 0; y < 6; y++) {
				shapes[origin][i][y] = data[i][y];
			}
		}
		return true;
	}

	function setBackgrounds(string[5] calldata data, uint origin) external onlyOwner returns (bool) {
		for (uint i = 0; i < 5; i++) {
			backgrounds[origin][i] = data[i];
		}
		return true;
	}

	function setColors(string[10][3] calldata data) external onlyOwner returns (bool) {
		for (uint i = 0; i < 3; i++) {
			for (uint y = 0; y < 10; y++) {
				colors[i][y] = data[i][y];
			}
		}
		return true;
	}

	function getSvg(SeedData calldata seed_data) external view returns (string memory) {
		return toSvg(getData(seed_data), false);
	}

	function getAnimatedSvg(SeedData calldata seed_data) external view returns (string memory) {
		return toSvg(getData(seed_data), true);
	}

	function getMeta(SeedData calldata seed_data) external pure returns (string memory) {
		return getData(seed_data).meta();
	}

	function toSvg(MushroomData memory data, bool ani) private view returns (string memory) {
		return string(abi.encodePacked("<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 220 220'>", "<def>", aniDef(ani), filterDef(), "</def>", mainSvg(data, ani), "</svg>"));
	}

	function getData(SeedData calldata seed_data) internal pure returns (MushroomData memory) {
		MushroomData memory data;
		data.isSpecial = seed_data.creator == special;
		Rand memory rnd = Rand(seed_data.seed, 0, seed_data.extra, data.isSpecial);
		data.skyType = rnd.lvl();
		data.skyColor = rnd.next() % colorsCount;
		data.horizonType = rnd.lvl();
		data.horizonColor = rnd.next() % colorsCount;
		data.groundType = rnd.lvl();
		data.groundColor = rnd.next() % colorsCount;
		data.faceType = rnd.lvl();
		data.stemType = rnd.lvl();
		data.stemColor = rnd.next() % colorsCount;
		data.capType = rnd.lvl();
		data.capColor = rnd.next() % colorsCount;
		data.dotsColor = rnd.lvl() > 1 ? rnd.next() % colorsCount : data.capColor;
		return data;
	}

	function mainSvg(MushroomData memory data, bool ani) private view returns (string memory) {
		bytes memory svgBackground = abi.encodePacked("<rect width='220' height='220' fill='white'/>", "<rect opacity='0.5' width='220' height='220' fill='", colors[0][data.skyColor], "'/>");
		bytes memory svgGrain = abi.encodePacked("<g><rect filter='url(#grains)' ", !ani ? "" : "transform='translate(-440, 0)'", " width='", uint(!ani ? 220 : 880).toString(), "' height='220' opacity='0.8'/>", transGen(30, ani), "</g>");
		bytes memory svgCombined = abi.encodePacked(skySvg(data, ani), horizonSvg(data, ani), groundSvg(data, ani), svgGrain);
		return string(abi.encodePacked("<g filter='url(#grains)'>", svgBackground, svgCombined, shroomSvg(data, ani), frontSvg(data, ani), "</g>"));
	}

	function skySvg(MushroomData memory data, bool ani) private view returns (string memory) {
		bytes memory svgBox = abi.encodePacked("<rect opacity='0' width='", uint(!ani ? 220 : 880).toString(), "' height='220'/>");
		bytes memory svgSky = abi.encodePacked("<path d='", backgrounds[0][data.skyType], "' fill='white' />");
		svgSky = !ani ? svgSky : abi.encodePacked(svgSky, "<path transform='translate(-440, 0)' d='", backgrounds[0][data.skyType], "' fill='white' stroke='white'/>");
		return string(abi.encodePacked("<g>", svgBox, svgSky, transGen(60, ani), "</g>"));
	}

	function horizonSvg(MushroomData memory data, bool ani) private view returns (string memory) {
		bytes memory svgBox = abi.encodePacked("<rect opacity='0' width='", uint(!ani ? 220 : 880).toString(), "' height='220'/>");
		bytes memory svgBehind = abi.encodePacked("<path d='", backgrounds[1][data.horizonType], "' stroke-width='0.1' stroke='", colors[0][data.skyColor], "' fill='", colors[0][data.skyColor], "'/>");
		svgBehind = !ani ? svgBehind : abi.encodePacked(svgBehind, "<path transform='translate(-440, 0)' d='", backgrounds[1][data.horizonType], "' stroke-width='0.1' stroke='", colors[0][data.skyColor], "' fill='", colors[0][data.skyColor], "'/>");
		bytes memory svgMid = abi.encodePacked("<path opacity='0.75' d='", backgrounds[1][data.horizonType], "' stroke-width='0.1' stroke='", colors[0][data.horizonColor], "' fill='", colors[0][data.horizonColor], "'/>");
		svgMid = !ani ? svgMid : abi.encodePacked(svgMid, "<path transform='translate(-440, 0)' opacity='0.75' d='", backgrounds[1][data.horizonType], "' stroke-width='0.1' stroke='", colors[0][data.horizonColor], "' fill='", colors[0][data.horizonColor], "'/>");
		return string(abi.encodePacked("<g>", svgBox, svgBehind, svgMid, transGen(45, ani), "</g>"));
	}

	function groundSvg(MushroomData memory data, bool ani) private view returns (string memory) {
		bytes memory svgBox = abi.encodePacked("<rect opacity='0' width='", uint(!ani ? 220 : 880).toString(), "' height='220'/>");
		bytes memory svgGround = abi.encodePacked("<path d='", backgrounds[2][data.groundType], "' stroke='", colors[0][data.groundColor], "' fill='", colors[0][data.groundColor], "'/>");
		svgGround = !ani ? svgGround : abi.encodePacked(svgGround, "<path transform='translate(-440, 0)' d='", backgrounds[2][data.groundType], "' stroke='", colors[0][data.groundColor], "' fill='", colors[0][data.groundColor], "'/>");
		bytes memory svgDetails = abi.encodePacked("<path d='", backgrounds[3][data.groundType], "' fill='#383838' opacity='0.8' />");
		svgDetails = !ani ? svgDetails : abi.encodePacked(svgDetails, "<path transform='translate(-440, 0)' d='", backgrounds[3][data.groundType], "' fill='#383838' opacity='0.8' />");
		return string(abi.encodePacked("<g>", svgBox, svgGround, svgDetails, transGen(25, ani), "</g>"));
	}

	function shroomSvg(MushroomData memory data, bool ani) private view returns (string memory) {
		bool equal = data.capColor == data.dotsColor;
		bytes memory cap = abi.encodePacked("<path d='", shapes[0][data.capType][0], "' fill='", colors[1][data.capColor], "' stroke='black'>", aniGen(shapes[0][data.capType], ani), "</path>");
		cap = abi.encodePacked(cap, "<path d='", shapes[1][data.capType][0], "' fill='#383838' opacity='0.8'>", aniGen(shapes[1][data.capType], ani), "</path>");
		bytes memory capOn = abi.encodePacked("<path d='", shapes[2][data.capType][0], "' fill='", colors[1][data.dotsColor], "' stroke='black'>", aniGen(shapes[2][data.capType], ani), "</path>");
		capOn = abi.encodePacked(capOn, "<path d='", shapes[3][data.capType][0], "' fill='#383838' opacity='0.8'>", aniGen(shapes[3][data.capType], ani), "</path>");
		cap = abi.encodePacked(cap, equal ? bytes("") : capOn);
		bytes memory stem = abi.encodePacked("<path d='", shapes[4][data.stemType][0], "' fill='", colors[2][data.stemColor], "' stroke='black'>", aniGen(shapes[4][data.stemType], ani), "</path>");
		stem = abi.encodePacked(stem, "<path d='", shapes[5][data.stemType][0], "' fill='#383838' opacity='0.8'>", aniGen(shapes[5][data.stemType], ani), "</path>");
		stem = abi.encodePacked(stem, "<path d='", shapes[6][data.faceType][0], "' fill='black'>", aniGen(shapes[6][data.faceType], ani), "</path>");
		bytes memory transform = abi.encodePacked("transform='translate()'");
		return string(abi.encodePacked("<g ", transform, ">", cap, stem, "</g>"));
	}

	function frontSvg(MushroomData memory data, bool ani) private view returns (string memory) {
		bytes memory svgBox = abi.encodePacked("<rect opacity='0' width='", uint(!ani ? 220 : 880).toString(), "' height='220'/>");
		bytes memory svgFront = abi.encodePacked("<path d='", backgrounds[4][data.groundType], "' fill='", colors[0][data.skyColor], "'/>");
		svgFront = !ani ? svgFront : abi.encodePacked(svgFront, "<path transform='translate(-440, 0)' d='", backgrounds[4][data.groundType], "' fill='", colors[0][data.skyColor], "'/>");
		return string(abi.encodePacked("<g>", svgBox, svgFront, transGen(10, ani), "</g>"));
	}

	function aniDef(bool ani) private pure returns (string memory) {
		if (!ani) return "";
		string memory anim;
		for (uint i; i < 10; i++) {
			string memory begin = i < 1 ? "0;f10" : string(abi.encodePacked("f", i.toString()));
			anim = string(abi.encodePacked(anim, "<animate id='f", (i + 1).toString(), "' begin='", begin, ".end' dur='100ms'/>"));
		}
		return anim;
	}

	function filterDef() private pure returns (string memory) {
		return
			string(
				abi.encodePacked(
					"<filter id='grains'>",
					"<feTurbulence seed='12' type='fractalNoise' baseFrequency='15' numOctaves='1' result='turbulence' />",
					"<feComponentTransfer width='100%' height='100%' in='turbulence' result='componentTransfer'><feFuncA type='table' tableValues='0 0.35'/></feComponentTransfer>",
					"<feBlend in='SourceGraphic' mode='hue'/>",
					"</filter>"
				)
			);
	}

	function aniGen(string[6] memory values, bool ani) private pure returns (string memory) {
		if (!ani) return "";
		string memory anim;
		uint r = 0;
		for (uint i = 1; i <= 10; i++) {
			anim = string(abi.encodePacked(anim, "<animate begin='f", i.toString(), ".end' fill='freeze' attributeName='d' dur='300ms' to='", values[i - r], "'/>"));
			r = i < 5 ? 0 : r + 2;
		}
		return anim;
	}

	function transGen(uint8 dur, bool ani) private pure returns (string memory) {
		if (!ani) return "";
		return string(abi.encodePacked("<animateTransform begin='0' fill='freeze' attributeName='transform' type='translate' dur='", uint(dur).toString(), "s' from='0 0' to='440 0' repeatCount='indefinite'/>"));
	}
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

contract Ownable {
	address _owner;

	event RenounceOwnership();

	constructor() {
		_owner = msg.sender;
	}

	modifier onlyOwner() {
		require(_owner == msg.sender, "only owner");
		_;
	}

	function owner() external view virtual returns (address) {
		return _owner;
	}

	function ownerRenounce() public onlyOwner {
		_owner = address(0);
		emit RenounceOwnership();
	}

	function transferOwnership(address newOwner) external onlyOwner {
		_owner = newOwner;
	}
}

pragma solidity ^0.8.25;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Context.sol";

contract ERC20 is Context, IERC20, IERC20Metadata {
	mapping(address => uint256) internal _balances;

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

	uint256 internal _totalSupply;
	uint8 internal constant _decimals = 9;

	string private _name;
	string private _symbol;

	/**
	 * @dev Sets the values for {name} and {symbol}.
	 *
	 * 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 default value returned by this function, unless
	 * it's 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 pure returns (uint8) {
		return _decimals;
	}

	/**
	 * @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:
	 *
	 * - `to` cannot be the zero address.
	 * - the caller must have a balance of at least `amount`.
	 */
	function transfer(
		address to,
		uint256 amount
	) public virtual override returns (bool) {
		address owner = _msgSender();
		_transfer(owner, to, 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}.
	 *
	 * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
	 * `transferFrom`. This is semantically equivalent to an infinite approval.
	 *
	 * Requirements:
	 *
	 * - `spender` cannot be the zero address.
	 */
	function approve(
		address spender,
		uint256 amount
	) public virtual override returns (bool) {
		address owner = _msgSender();
		_approve(owner, 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}.
	 *
	 * NOTE: Does not update the allowance if the current allowance
	 * is the maximum `uint256`.
	 *
	 * Requirements:
	 *
	 * - `from` and `to` cannot be the zero address.
	 * - `from` must have a balance of at least `amount`.
	 * - the caller must have allowance for ``from``'s tokens of at least
	 * `amount`.
	 */
	function transferFrom(
		address from,
		address to,
		uint256 amount
	) public virtual override returns (bool) {
		address spender = _msgSender();
		_spendAllowance(from, spender, amount);
		_transfer(from, to, 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) {
		address owner = _msgSender();
		_approve(owner, spender, allowance(owner, 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) {
		address owner = _msgSender();
		uint256 currentAllowance = allowance(owner, spender);
		require(
			currentAllowance >= subtractedValue,
			"ERC20: decreased allowance below zero"
		);
		unchecked {
			_approve(owner, spender, currentAllowance - subtractedValue);
		}

		return true;
	}

	/**
	 * @dev Moves `amount` of tokens from `from` to `to`.
	 *
	 * 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:
	 *
	 * - `from` cannot be the zero address.
	 * - `to` cannot be the zero address.
	 * - `from` must have a balance of at least `amount`.
	 */
	function _transfer(
		address from,
		address to,
		uint256 amount
	) internal virtual {
		require(from != address(0), "ERC20: transfer from the zero address");

		uint256 fromBalance = _balances[from];
		require(
			fromBalance >= amount,
			"ERC20: transfer amount exceeds balance"
		);
		unchecked {
			_balances[from] = fromBalance - amount;
			// Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
			// decrementing then incrementing.
			_balances[to] += amount;
		}

		emit Transfer(from, to, 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");

		_totalSupply += amount;
		unchecked {
			// Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
			_balances[account] += amount;
		}
		emit Transfer(address(0), account, amount);
	}

	/**
	 * @dev Erases `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");

		uint256 accountBalance = _balances[account];
		require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
		unchecked {
			_balances[account] = accountBalance - amount;
			// Overflow not possible: amount <= accountBalance <= totalSupply.
			_totalSupply -= amount;
		}

		emit Transfer(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 Updates `owner` s allowance for `spender` based on spent `amount`.
	 *
	 * Does not update the allowance amount in case of infinite allowance.
	 * Revert if not enough allowance is available.
	 *
	 * Might emit an {Approval} event.
	 */
	function _spendAllowance(
		address owner,
		address spender,
		uint256 amount
	) internal virtual {
		uint256 currentAllowance = allowance(owner, spender);
		if (currentAllowance != type(uint256).max) {
			require(
				currentAllowance >= amount,
				"ERC20: insufficient allowance"
			);
			unchecked {
				_approve(owner, spender, currentAllowance - amount);
			}
		}
	}
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.25;

import "./Erc20.sol";

abstract contract PoolCreatableErc20i is ERC20 {
	address internal _pool;
	uint256 internal _startTime;
	bool internal _feeLocked;
	address immutable _pairCreator;

	constructor(string memory name_, string memory symbol_, address pairCreator) ERC20(name_, symbol_) {
		_pairCreator = pairCreator;
	}

	modifier lockFee() {
		_feeLocked = true;
		_;
		_feeLocked = false;
	}

	function launch(address poolAddress) external {
		require(msg.sender == _pairCreator);
		require(!isStarted());
		_pool = poolAddress;
		_startTime = block.timestamp;
	}

	function isStarted() internal view returns (bool) {
		return true;
	}

	function pool() external view returns (address) {
		return _pool;
	}
}

Settings
{
  "evmVersion": "cancun",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "viaIR": true,
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnMushroomTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesGrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesShrink","type":"event"},{"anonymous":false,"inputs":[],"name":"RenounceOwnership","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":"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":"burnCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"owner","type":"address"}],"name":"dynamicInscription","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dynamicInscriptionTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getAnimatedSvg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getHolderByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getHolderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getHoldersList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getSvg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"inscriptionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"inscriptionOfOwnerByIndex","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"},{"internalType":"address","name":"creator","type":"address"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inscriptionsTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolAddress","type":"address"}],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxBuy","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":[],"name":"ownerRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[5]","name":"data","type":"string[5]"},{"internalType":"uint256","name":"origin","type":"uint256"}],"name":"setBackgrounds","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[10][3]","name":"data","type":"string[10][3]"}],"name":"setColors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[6][5]","name":"data","type":"string[6][5]"},{"internalType":"uint256","name":"origin","type":"uint256"}],"name":"setMushrooms","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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"}]

60a0604052346103875761001161038b565b6020906554727566666960d01b8282015261002a61038b565b916554525546464960d01b81840152815160018060401b039283821161029e576003938454926001928385811c9516801561037d575b86861014610369578190601f9586811161031b575b5086908683116001146102bd575f926102b2575b50505f1982881b1c191690831b1785555b855190811161029e5760049485548381811c91168015610294575b868210146102815784811161023e575b50848483116001146101dd578293949596975f936101d2575b505082841b925f19911b1c19161784555b336080523360018060a01b03196013541617601355610122553315610191575060025466354a6ba7a180009283820180921161017e57505f917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91600255338352828152604083208481540190556040519384523393a3604051615e9490816103af823960805181613e890152f35b601190634e487b7160e01b5f525260245ffd5b606492916040519262461bcd60e51b845283015260248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b015191505f806100de565b90601f19831691875f52865f20925f5b81811061022957509884869798999a10610210575b50505050811b0184556100ef565b01519060f8845f19921b161c191690555f808080610202565b8a8301518555938601939188019188016101ed565b865f52855f208580850160051c820192888610610278575b0160051c019084905b82811061026d5750506100c5565b5f815501849061025f565b92508192610256565b602287634e487b7160e01b5f525260245ffd5b90607f16906100b5565b634e487b7160e01b5f52604160045260245ffd5b015190505f80610089565b90859350601f19831691895f52885f20925f5b8a82821061030557505084116102ee575b505050811b01855561009a565b01515f19838a1b60f8161c191690555f80806102e1565b83850151865589979095019493840193016102d0565b909150875f52865f208680850160051c820192898610610360575b918791869594930160051c01915b828110610352575050610075565b5f8155859450879101610344565b92508192610336565b634e487b7160e01b5f52602260045260245ffd5b94607f1694610060565b5f80fd5b60408051919082016001600160401b0381118382101761029e576040526006825256fe6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde0314613f2657508063095ea7b314613f0057806316f0115b14613ed857806318160ddd14613ebb578063214013ca14613e6d57806323b872dd14613db45780632bd1a01114613d6a578063313ce56714613d4f578063333a007214613cf557806335ad0cea14613bf857806337b7e88c1461383357806339509351146137e65780634ed8cc8014611bb9578063524773ce14611b755780635ded3c7c14611ad25780636b4ed21b14611ab557806370a0823114611a7e57806370db69d614611a5c5780638904970a146119f95780638da5cb5b146119d157806395d89b41146118f557806395e4b21b146118bd57806399f65c8f146118a0578063a457c2d7146117fd578063a62f5b1b146105b2578063a9059cbb14610581578063c5b8f77214610538578063c7218d5b14610498578063cb8106f414610458578063dd62ed3e1461040b578063e0d97502146103ee578063f2fde38b146103a7578063f7b6f6b8146101ce5763fb700e5b14610192575f80fd5b346101ca5760203660031901126101ca576001600160a01b036101b3613ff2565b165f526008602052602060405f2054604051908152f35b5f80fd5b346101ca576020806003193601126101ca576004356001600160401b038082116101ca573660648301116101ca5761021160018060a01b03601354163314614169565b5f9261014219833603015b60039485811015928361039e575f5b600a948582101561038e5761037a576005600484821b89010135858112156101ca5761026390890160048085851b83010191016141d3565b90916014845f99880201019289831161036657610280845461404f565b601f9283821161032c575b50505f9183116001146102c8576001949392915f91836102bd575b50505f19828d1b1c191690841b1790555b0161022b565b013590508c806102a6565b601f19831691845f52865f20925f5b8882821061031657505090846001979695949392106102ff575b505050831b830190556102b7565b01355f19838e1b60f8161c191690558b80806102f1565b60018496829395870135815501950192016102d7565b855f52875f209084808701821c8301938a881061035d575b01901c01905b8181101561028b575f815560010161034a565b93508293610344565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b505092506001919550019361021c565b60405160018152f35b346101ca5760203660031901126101ca576103c0613ff2565b601354906001600160a01b03906103da8284163314614169565b6001600160a01b0319909216911617601355005b346101ca575f3660031901126101ca576020601154604051908152f35b346101ca5760403660031901126101ca57610424613ff2565b61042c614008565b9060018060a01b038091165f52600160205260405f2091165f52602052602060405f2054604051908152f35b346101ca5760203660031901126101ca576004355f908152600d60209081526040909120546001600160a01b03166040516001600160a01b039091168152f35b346101ca5760403660031901126101ca576105346104b4613ff2565b6104bc61414b565b5060018060a01b038091165f52600960205260405f206024355f5260205260405f20906002604051926104ee84614087565b80548452600181015460208501520154166040820152604051918291829190916040606082019380518352602081015160208401528160018060a01b0391015116910152565b0390f35b346101ca5760403660031901126101ca576001600160a01b03610559613ff2565b165f52600b60205260405f206024355f52602052602060ff60405f2054166040519015158152f35b346101ca5760403660031901126101ca576105a761059d613ff2565b602435903361457d565b602060405160018152f35b346101ca5760603660031901126101ca576105cb61486a565b6040516105d78161410f565b5f8152604051731e3334b63a32b91034b21e93b3b930b4b739939f60611b60208201527f3c666554757262756c656e636520736565643d2731322720747970653d27667260348201527f616374616c4e6f6973652720626173654672657175656e63793d27313527206e60548201527f756d4f6374617665733d27312720726573756c743d2774757262756c656e63656074820152631390179f60e11b60948201527f3c6665436f6d706f6e656e745472616e736665722077696474683d273130302560988201527f27206865696768743d27313030252720696e3d2774757262756c656e6365272060b88201527f726573756c743d27636f6d706f6e656e745472616e73666572273e3c6665467560d88201527f6e634120747970653d277461626c6527207461626c6556616c7565733d27302060f88201527f302e3335272f3e3c2f6665436f6d706f6e656e745472616e736665723e0000006101188201527f3c6665426c656e6420696e3d27536f757263654772617068696327206d6f6465610135820152671e93b43ab293979f60c11b610155820152681e17b334b63a32b91f60b91b61015d820152610146815291610793836140f3565b60208101516107a19061444c565b50906040518092602082017f3c726563742077696474683d2732323027206865696768743d273232302720669052604082016c34b6361e93bbb434ba3293979f60991b9052604d82017f3c72656374206f7061636974793d27302e35272077696474683d2732323027209052606d8201726865696768743d27323230272066696c6c3d2760681b90526080820161083791614f2f565b6213979f60e91b815203601c1981018352600301610855908361412a565b6040516108618161410f565b5f815261086c614ebd565b906040516108798161410f565b5f8152604051928392602084017f3c673e3c726563742066696c7465723d2775726c2823677261696e7329272000905280516020819201603f86015e8301603f8101672077696474683d2760c01b905281516020819301604783015e01604781017f27206865696768743d2732323027206f7061636974793d27302e38272f3e0000905281516020819301606583015e818101606501631e17b39f60e11b9052010360498101825260690161092e908261412a565b610936614ebd565b6040518091602082015f80516020615d9f833981519152905280516020819201603984015e8082016039016f13903432b4b3b43a1e9399191813979f60811b905281818101036029018252810103604901610991908261412a565b825161099c906143f7565b5090604051809260208201683c7061746820643d2760b81b9052602982016109c391614f2f565b7013903334b6361e93bbb434ba329390179f60791b8152600e19828203018252036011016109f1908361412a565b6040516109fd8161410f565b5f815260405192839260208401621e339f60e91b905280516020819201602386015e830160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018252602701610a69908261412a565b610a71614ebd565b916040518093602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018452604901610ac7908461412a565b6040840151610ad590614408565b50926020850151610ae59061444c565b50936020860151610af59061444c565b5060405195869260208401683c7061746820643d2760b81b905260298401610b1c91614f2f565b5f80516020615ddf8339815191528152601d01610b3891614f2f565b67272066696c6c3d2760c01b8152600801610b5291614f2f565b6213979f60e91b815203601c1981018552600301610b70908561412a565b6040850151610b7e90614408565b5060608601908151610b8f9061444c565b509151610b9b9061444c565b5060405192839260208401773c70617468206f7061636974793d27302e37352720643d2760401b905260388401610bd191614f2f565b5f80516020615ddf8339815191528152601d01610bed91614f2f565b67272066696c6c3d2760c01b8152600801610c0791614f2f565b6213979f60e91b815203601c1981018252600301610c25908261412a565b60405190610c328261410f565b5f825260405195869360208501621e339f60e91b905280516020819201602387015e840160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018452602701610cb1908461412a565b610cb9614ebd565b6040518091602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018252604901610d0e908261412a565b6080850151610d1c90614419565b509060a08601918251610d2e9061444c565b509251610d3a9061444c565b50926040519384916020830193683c7061746820643d2760b81b855260298401610d6391614f2f565b6927207374726f6b653d2760b01b8152600a01610d7f91614f2f565b67272066696c6c3d2760c01b8152600801610d9991614f2f565b6213979f60e91b815203601c1981018452600301610db7908461412a565b6080870151610dc59061442a565b50604051806020810192683c7061746820643d2760b81b845260298201610deb91614f2f565b610df4906159ed565b03601f1981018252610e06908261412a565b60405192610e138461410f565b5f845260405195869560208701621e339f60e91b905280516020819201602389015e86019060238201905f8252519283915e019060238201905f8252519283915e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018252602701610e8a908261412a565b60405193838594516020819201602087015e840160208101915f83528051926020849201905e0160208101915f83528051926020849201905e0160208101915f83528051926020849201905e01602081015f905203808252602001610eef908261412a565b6101408201516101608301511491610120810151610f0c90614205565b5092610140820151610f1d9061445d565b5093610120830151610f2e90614205565b50610f3890615a20565b50604051610f458161410f565b5f815260405195869260208401683c7061746820643d2760b81b905260298401610f6e91614f2f565b67272066696c6c3d2760c01b8152600801610f8891614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e818101601101661e17b830ba341f60c91b905260071983838301030183520103601801610fd8908561412a565b610120820151610fe790614219565b5093610120830151610ff890614219565b5061100290615a20565b5060405161100f8161410f565b5f815260405195828793516020819201602086015e830160208101683c7061746820643d2760b81b905260290161104591614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b905203600681018552602601611087908561412a565b6101208201516110969061422d565b50906101608301516110a79061445d565b50916101208401516110b89061422d565b506110c290615a20565b506040516110cf8161410f565b5f815260405193849260208401683c7061746820643d2760b81b9052602984016110f891614f2f565b67272066696c6c3d2760c01b815260080161111291614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e0160118101661e17b830ba341f60c91b9052036007198101835260180161115c908361412a565b61012083015161116b90614241565b509161012084015161117c90614241565b5061118690615a20565b506040516111938161410f565b5f815260405193828593516020819201602086015e830160208101683c7061746820643d2760b81b90526029016111c991614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b90520360068101835260260161120b908361412a565b156117f7575060405161121d8161410f565b5f8152925b60405193818592516020819201602085015e820160208101915f83528051926020849201905e01602081015f905203808452602001611261908461412a565b60e081015161126f90614255565b5061010082015161127f9061446e565b509060e083015161128f90614255565b5061129990615a20565b506040516112a68161410f565b5f815260405192839260208401683c7061746820643d2760b81b9052602984016112cf91614f2f565b67272066696c6c3d2760c01b81526008016112e991614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e0160118101661e17b830ba341f60c91b90520360071981018252601801611333908261412a565b60e082015161134190614269565b5060e083015161135090614269565b5061135a90615a20565b50604051906113688261410f565b5f8252604051918291602083019480516020819201875e830160208101683c7061746820643d2760b81b90526029016113a091614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b9052036006810182526026016113e2908261412a565b60c0830180516113f19061427d565b5090516113fd9061427d565b5061140790615a20565b50604051906114158261410f565b5f8252604051938493518091602086015e830160208101683c7061746820643d2760b81b905260290161144791614f2f565b6e13903334b6361e93b13630b1b5939f60891b815281516020819301600f83015e01600f8101661e17b830ba341f60c91b9052036009198101825260160161148f908261412a565b604051767472616e73666f726d3d277472616e736c61746528292760481b602082015260178152906114c0826140d8565b604051948592602084016201e33960ed1b905280516020819201602386015e830160238101601f60f91b905281516020819301602483015e0160248101915f83528051926020849201905e0160248101631e17b39f60e11b90520360088101845260280161152e908461412a565b611536614ebd565b6040518091602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b90520360298101825260490161158b908261412a565b60808201516115999061443b565b5091602001516115a89061444c565b509160405192839160208301683c7061746820643d2760b81b9052602983016115d091614f2f565b67272066696c6c3d2760c01b81526008016115ea91614f2f565b6213979f60e91b815203601c1981018352600301611608908361412a565b6040516116148161410f565b5f815260405192839260208401621e339f60e91b905280516020819201602386015e830160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018252602701611680908261412a565b6040519283926020840195781e33903334b63a32b91e93bab9361411b3b930b4b73994939f60391b875280516020819201603987015e840160398101915f83528051926020849201905e0160398101915f83528051926020849201905e0160398101915f83528051926020849201905e0160398101631e17b39f60e11b905203601d81018252603d01611713908261412a565b604051938493602085017f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f32309052604085017f30302f737667272066696c6c3d276e6f6e65272076696577426f783d27302030905260608501691019191810191918139f60b11b9052606a8501641e3232b31f60d91b905280516020819201606f87015e8401606f8101915f83528051926020849201905e0190606f8201651e17b232b31f60d11b9052518092607583015e0160758101651e17b9bb339f60d11b905203605b81018252607b016117e9908261412a565b604051610534819282613fc8565b92611222565b346101ca5760403660031901126101ca57611816613ff2565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f20549180831061184d576105a79203903361447f565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b346101ca575f3660031901126101ca576020600f54604051908152f35b346101ca5760203660031901126101ca576001600160a01b036118de613ff2565b165f52600e602052602060405f2054604051908152f35b346101ca575f3660031901126101ca576040515f6004546119158161404f565b808452906020906001908181169081156119a7575060011461194e575b610534856119428187038261412a565b60405191829182613fc8565b60045f90815293507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106119945750505050810160200161194282610534611932565b8054868601840152938201938101611978565b8695506105349693506020925061194294915060ff191682840152151560051b8201019293611932565b346101ca575f3660031901126101ca576013546040516001600160a01b039091168152602090f35b346101ca57611a073661401e565b611a1c60018060a01b03601354163314614169565b5f5b600590818110156105a757611a3781831b8501856141d3565b600685949294101561037a57600193603284611a569488020101614292565b01611a1e565b346101ca575f3660031901126101ca576020611a76614397565b604051908152f35b346101ca5760203660031901126101ca576001600160a01b03611a9f613ff2565b165f525f602052602060405f2054604051908152f35b346101ca575f3660031901126101ca576020601054604051908152f35b346101ca57611ae03661401e565b611af560018060a01b03601354163314614169565b5f905b6005918281101593846105a7575f5b60069586821015611b665761037a5782851b82013560be19833603018112156101ca57611b3b90830182871b8101906141d3565b9190600786101561037a57600192611b60916050845f9b8902601e8b02010101614292565b01611b07565b50909450506001019150611af8565b346101ca575f3660031901126101ca5760025466354a6ba7a18000908103908111611ba557602090604051908152f35b634e487b7160e01b5f52601160045260245ffd5b346101ca5760603660031901126101ca57611bd261486a565b60605f5b600a81106136cf5750611e3c60405192731e3334b63a32b91034b21e93b3b930b4b739939f60611b60208501527f3c666554757262756c656e636520736565643d2731322720747970653d27667260348501527f616374616c4e6f6973652720626173654672657175656e63793d27313527206e60548501527f756d4f6374617665733d27312720726573756c743d2774757262756c656e63656074850152631390179f60e11b60948501527f3c6665436f6d706f6e656e745472616e736665722077696474683d273130302560988501527f27206865696768743d27313030252720696e3d2774757262756c656e6365272060b88501527f726573756c743d27636f6d706f6e656e745472616e73666572273e3c6665467560d88501527f6e634120747970653d277461626c6527207461626c6556616c7565733d27302060f88501527f302e3335272f3e3c2f6665436f6d706f6e656e745472616e736665723e0000006101188501527f3c6665426c656e6420696e3d27536f757263654772617068696327206d6f6465610135850152671e93b43ab293979f60c11b610155850152681e17b334b63a32b91f60b91b61015d8501526101468452611d9b846140f3565b611e546003611dad602084015161444c565b506040519485917f3c726563742077696474683d2732323027206865696768743d2732323027206660208401526c34b6361e93bbb434ba3293979f60991b60408401527f3c72656374206f7061636974793d27302e35272077696474683d273232302720604d840152726865696768743d27323230272066696c6c3d2760681b606d8401526080830190614f2f565b6213979f60e91b815203601c1981018552018361412a565b60405192611e61846140d8565b601e84527f7472616e73666f726d3d277472616e736c617465282d3434302c2030292700006020850152611e93614e1c565b94601e92601e94855f965b6136b75750611eac866149aa565b95611eba604051978861412a565b808752611ec6816149aa565b601f19013660208901375b80958015611f21575f198201918211611ba5578196603092600a830684018411611ba5578951111561037a57600a928383060160f81b6001600160f81b0319165f1a908901601f01530494611ed1565b5050909194602096879550606961206b918780808d611fc560ad83996040519586915f80516020615d7f833981519152828401525f80516020615e1f83398151915260408401525f80516020615e3f8339815191526060840152805191829101607a84015e81015f80516020615dff833981519152607a8201527237bab73a1e93b4b73232b334b734ba3293979f60691b609a82015203608d81018652018461412a565b6040519788957f3c673e3c726563742066696c7465723d2775726c2823677261696e732927200082880152805191829101603f88015e850190672077696474683d2760c01b603f830152805192839101604783015e01907f27206865696768743d2732323027206f7061636974793d27302e38272f3e00006047830152805192839101606583015e631e17b39f60e11b606583830101520103604981018452018261412a565b6120c66049612078614e1c565b604051998a915f80516020615d9f83398151915282840152805191829101603984015e81016f13903432b4b3b43a1e9399191813979f60811b6039820152602982820301825203018861412a565b61218d601f6120ff61212760116120dd88516143f7565b50604051938491683c7061746820643d2760b81b8d8401526029830190614f2f565b7013903334b6361e93bbb434ba329390179f60791b8152600e1982820301825203018261412a565b61215a61213487516143f7565b506121548a6040519b858d9651918291018388015e8501015f81526159b3565b90614f2f565b7f272066696c6c3d27776869746527207374726f6b653d277768697465272f3e0081525f1982820301825203018661412a565b603c93603c95865f975b61369f57506121a5876149aa565b966121b3604051988961412a565b8088526121bf816149aa565b601f19013660208a01375b8096801561221a575f198201918211611ba5578197603092600a830684018411611ba5578a51111561037a57600a928383060160f81b6001600160f81b0319165f1a908a01601f015304956121ca565b5050878988959394956040518091602082015f80516020615d7f8339815191529052604082015f80516020615e1f8339815191529052606082015f80516020615e3f833981519152905280516020819201607a84015e8101607a81015f80516020615dff8339815191529052609a81017237bab73a1e93b4b73232b334b734ba3293979f60691b905203608d8101825260ad016122b7908261412a565b60405193849260208401621e339f60e91b905280516020819201602386015e830160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018352602701612320908361412a565b612328614e1c565b946040518096602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b90520360298101875260490161237e908761412a565b604087015161238c90614408565b5091602088015161239c9061444c565b509260208901516123ac9061444c565b5060405194859260208401683c7061746820643d2760b81b9052602984016123d391614f2f565b5f80516020615ddf8339815191528152601d016123ef91614f2f565b67272066696c6c3d2760c01b815260080161240991614f2f565b6213979f60e91b815203601c1981018452600301612427908461412a565b604088015161243590614408565b509260208901516124459061444c565b5060208a01516124549061444c565b509060405195838794516020819201602087015e84016020015f8152612479906159b3565b61248291614f2f565b5f80516020615ddf8339815191528152601d0161249e91614f2f565b67272066696c6c3d2760c01b81526008016124b891614f2f565b6213979f60e91b815203601c19810184526003016124d6908461412a565b60408801516124e490614408565b50976060810180516124f59061444c565b509080516125029061444c565b5091604051928391602083019d773c70617468206f7061636974793d27302e37352720643d2760401b8f526038840161253a91614f2f565b5f80516020615ddf8339815191528152601d0161255691614f2f565b67272066696c6c3d2760c01b815260080161257091614f2f565b6213979f60e91b815203601c198101835260030161258e908361412a565b604083015161259c90614408565b509080516125a99061444c565b5090516125b59061444c565b50916040519c8d94518091602087015e8401602081017f3c70617468207472616e73666f726d3d277472616e736c617465282d3434302c9052604081017f20302927206f7061636974793d27302e37352720643d27000000000000000000905260570161262191614f2f565b5f80516020615ddf8339815191528152601d0161263d91614f2f565b67272066696c6c3d2760c01b815260080161265791614f2f565b6213979f60e91b815203601c1981018a52600301612675908a61412a565b602d95602d97885f995b613687575061268d896149aa565b9861269b6040519a8b61412a565b808a526126a7816149aa565b601f19013660208c01375b80988015612702575f198201918211611ba5578199603092600a830684018411611ba5578c51111561037a57600a928383060160f81b6001600160f81b0319165f1a908c01601f015304976126b2565b505089898c979596976040518092602082015f80516020615d7f8339815191529052604082015f80516020615e1f8339815191529052606082015f80516020615e3f833981519152905280516020819201607a84015e8101607a81015f80516020615dff8339815191529052609a81017237bab73a1e93b4b73232b334b734ba3293979f60691b905203608d8101835260ad0161279f908361412a565b60405196879360208501621e339f60e91b905280516020819201602387015e840160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b90520360078101855260270161281b908561412a565b612823614e1c565b946040518096602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018752604901612879908761412a565b608084015161288790614419565b509760a08501516128979061444c565b509860a08601516128a79061444c565b506040519a8b9260208401683c7061746820643d2760b81b9052602984016128ce91614f2f565b6927207374726f6b653d2760b01b8152600a016128ea91614f2f565b67272066696c6c3d2760c01b815260080161290491614f2f565b6213979f60e91b815203601c1981018a52600301612922908a61412a565b608085015161293090614419565b509860a08601516129409061444c565b5060a087015161294f9061444c565b50906040519b838d94516020819201602087015e84016020015f8152612974906159b3565b61297d91614f2f565b6927207374726f6b653d2760b01b8152600a0161299991614f2f565b67272066696c6c3d2760c01b81526008016129b391614f2f565b6213979f60e91b815203601c1981018a526003016129d1908a61412a565b60808501516129df9061442a565b509760405180602081019a683c7061746820643d2760b81b8c5260298201612a0691614f2f565b612a0f906159ed565b03601f1981018252612a21908261412a565b6080870151612a2f9061442a565b506040519a8b92518091602085015e82016020015f8152612a4f906159b3565b612a5891614f2f565b612a61906159ed565b03601f1981018a52612a73908a61412a565b601996601998895f9a5b61366f5750612a8b8a6149aa565b99612a996040519b8c61412a565b808b52612aa5816149aa565b601f19013660208d01375b80998015612b00575f198201918211611ba557819a603092600a830684018411611ba5578d51111561037a57600a928383060160f81b6001600160f81b0319165f1a908d01601f01530498612ab0565b5050602080809c819b5093612c1e612c70999b9f83999b9e95848080809b9a81602796612bb260ad839e6040519788915f80516020615d7f833981519152828401525f80516020615e1f83398151915260408401525f80516020615e3f8339815191526060840152805191829101607a84015e81015f80516020615dff833981519152607a8201527237bab73a1e93b4b73232b334b734ba3293979f60691b609a82015203608d81018852018661412a565b6040519b8c97621e339f60e91b828a015280519182910160238a015e870190602382015f8152815193849201905e0190602382015f8152815193849201905e0190602382015f8152815193849201905e01631e17b39f60e11b602382015203600781018652018461412a565b6040519b878d985191829101848a015e8701908282015f8152815193849201905e01908282015f8152815193849201905e01908282015f8152815193849201905e015f8382015203808652018461412a565b8461014087015161016088015114612dda6026612cf2612d4c60188c87612c9b610120830151614205565b5091612d07612cce612cc9612cc3610120612cba61014087015161445d565b50950151614205565b50615a20565b615b4b565b916008604051988996683c7061746820643d2760b81b878901526029880190614f2f565b67272066696c6c3d2760c01b81520190614f2f565b9070139039ba3937b5b29e93b13630b1b5939f60791b8252805192839101601183015e661e17b830ba341f60c91b60118383010152010360071981018452018261412a565b848b612d9f612d72612cc9612cc3610120612d6981870151614219565b50950151614219565b9160296040519e8f968051918291018789015e8601683c7061746820643d2760b81b868201520190614f2f565b905f80516020615dbf8339815191528252805192839101601f83015e01661e17b830ba341f60c91b601f82015203600681018a52018861412a565b612ef56026612cf2612e6260188c87612df761012083015161422d565b5091612e1f612cce612cc9612cc3610120612e1661016087015161445d565b5095015161422d565b9070139039ba3937b5b29e93b13630b1b5939f60791b8252805192839101601183015e01661e17b830ba341f60c91b60118201520360071981018452018261412a565b848b612eba612e8d612e88612cc3610120612e7f81870151614241565b50950151614241565b615c65565b91602960405199868b9751918291018789015e8601683c7061746820643d2760b81b868201520190614f2f565b905f80516020615dbf8339815191528252805192839101601f83015e01661e17b830ba341f60c91b601f82015203600681018552018361412a565b156136675750604051612f078161410f565b5f81529293945b60405193818592516020819201602085015e820160208101915f83528051926020849201905e01602081015f905203808452602001612f4d908461412a565b60e0860151612f5b90614255565b50610100870151612f6b9061446e565b509060e0880151612f7b90614255565b50612f8590615a20565b612f8e90615c65565b60405192839260208401683c7061746820643d2760b81b905260298401612fb491614f2f565b67272066696c6c3d2760c01b8152600801612fce91614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e0160118101661e17b830ba341f60c91b90520360071981018252601801613018908261412a565b60e087015161302690614269565b509060e088015161303690614269565b5061304090615a20565b61304990615c65565b60405192828493516020819201602086015e830160208101683c7061746820643d2760b81b905260290161307c91614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b9052036006810182526026016130be908261412a565b60c087019081516130ce9061427d565b5091516130da9061427d565b506130e490615a20565b6130ed90615c65565b60405192828493516020819201602086015e830160208101683c7061746820643d2760b81b905260290161312091614f2f565b6e13903334b6361e93b13630b1b5939f60891b815281516020819301600f83015e01600f8101661e17b830ba341f60c91b90520360091981018252601601613168908261412a565b604051767472616e73666f726d3d277472616e736c61746528292760481b60208201526017815290613199826140d8565b604051948592602084016201e33960ed1b905280516020819201602386015e808401602301601f60f91b9052815160208193018286016024015e83010160248101915f83528051926020849201905e0160248101631e17b39f60e11b90520360088101845260280161320b908461412a565b613213614e1c565b946040518096602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018752604901613269908761412a565b60808701516132779061443b565b5060208801516132869061444c565b509060405191829160208301683c7061746820643d2760b81b9052602983016132ae91614f2f565b67272066696c6c3d2760c01b81526008016132c891614f2f565b6213979f60e91b815203601c19810182526003016132e6908261412a565b60808801516132f49061443b565b5097602001516133039061444c565b5060405198828a93516020819201602086015e83016020015f8152613327906159b3565b61333091614f2f565b67272066696c6c3d2760c01b815260080161334a91614f2f565b6213979f60e91b815203601c1981018852600301613368908861412a565b600a93600a95865f975b61364f5750613380876149aa565b9661338e604051988961412a565b80885261339a816149aa565b601f19013660208a01375b809680156133f5575f198201918211611ba5578197603092600a830684018411611ba5578a51111561037a57600a928383060160f81b6001600160f81b0319165f1a908a01601f015304956133a5565b505084781e33903334b63a32b91e93bab9361411b3b930b4b73994939f60391b60208061053497613589603d8f998f8f866119429c819e607b9d6135246027621e339f60e91b978697879586604051916134d060ad8484808201975f80516020615d7f83398151915289525f80516020615e1f83398151915260408401525f80516020615e3f8339815191526060840152805191829101607a84015e81015f80516020615dff833981519152607a8201527237bab73a1e93b4b73232b334b734ba3293979f60691b609a82015203608d81018652018461412a565b6040519b8c958187019e8f52805191829101602388015e850190602382015f8152815193849201905e019060238201905f8252519283915e01631e17b39f60e11b602382015203600781018852018661412a565b6040519b8c978189019e8f5280519182910160398a015e870190603982015f8152815193849201905e0190603982015f8152815193849201905e019060398201905f8252519283915e01631e17b39f60e11b603982015203601d81018652018461412a565b6040519788957f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f3230828801527f30302f737667272066696c6c3d276e6f6e65272076696577426f783d273020306040880152691019191810191918139f60b11b6060880152641e3232b31f60d91b606a880152805191829101606f88015e850190606f82015f8152815193849201905e0190651e17b232b31f60d11b606f830152518092607583015e01651e17b9bb339f60d11b607582015203605b81018452018261412a565b95979661365d600a91614dae565b9798960480613372565b929394612f0e565b989a9961367d600a91614dae565b9a9b990480612a7d565b979998613695600a91614dae565b999a98048061267f565b9597966136ad600a91614dae565b9798960480612197565b9496956136c5600a91614dae565b9697950480611e9e565b9190600190818410156137a3576040516136e8816140d8565b60058152640303b6631360dc1b6020820152915b840191828511611ba557604a61379b91613717600195614ee5565b90721732b7321390323ab91e9398981836b993979f60691b604051958693682720626567696e3d2760b81b6020808481955191829101838a015e87016d1e30b734b6b0ba329034b21e93b360911b82820152602e938051928391018583015e01918201526037938051928391018583015e019182015203602a81018452018261412a565b919201611bd6565b6137ac84614ee5565b6137e060405191826020603360f91b818301526021928051918291018484015e81015f83820152038581018452018261412a565b916136fc565b346101ca5760403660031901126101ca576105a7613802613ff2565b335f52600160205260405f2060018060a01b0382165f5260205261382c60243560405f20546141b9565b903361447f565b346101ca5760603660031901126101ca57610534607b60f81b611942602261385961486a565b602081613ba9605961386e8480960151614ee5565b613911604a61387d8651614ee5565b8761388b6040890151614ee5565b604051998a9381808601986b01139b5bca1b7b637b9111d160a51b8a52805191829101602c88015e8501906c016101139b5bcaa3cb832911d1609d1b602c830152805192839101603983015e01907001610113437b934bd37b72a3cb832911d1607d1b60398301528051928391018583015e015f8382015203602a81018852018661412a565b6139db60536139236060870151614ee5565b92886139326080890151614ee5565b8161394060a08b0151614ee5565b91816040519889968288019e8f90519182915e8701907101610113437b934bd37b721b7b637b9111d160751b83830152805192839101603283015e01906f016101133b937bab7322a3cb832911d160851b6032830152805192839101604283015e019070016101133b937bab73221b7b637b9111d1607d1b60428301528051928391018583015e015f8382015203603381018452018261412a565b613a9c604b6139ed60c0870151614ee5565b96886139fc60e0890151614ee5565b81613a0b6101008b0151614ee5565b91816040519c8d968288019a5180918c5e8701906d01610113330b1b2aa3cb832911d160951b83830152805192839101602e83015e01906d016101139ba32b6aa3cb832911d160951b602e830152805192839101603c83015e01906e016101139ba32b6a1b7b637b9111d1608d1b603c8301528051928391018583015e015f8382015203602b81018852018661412a565b85613aab610120860151614ee5565b9481613abb610140830151614ee5565b91610180613acd610160830151614ee5565b91015115613bd45781604051613ae2816140d8565b60048152637472756560e01b82820152935b816040519a8b98828a01809e519182915e8901906c016101131b0b82a3cb832911d1609d1b83830152805192839101602d83015e01906d016101131b0b821b7b637b9111d160951b602d830152805192839101603b83015e01906e01610113237ba39a1b7b637b9111d1608d1b603b830152805192839101604a83015e01906e016101134b9a9b832b1b4b0b6111d1608d1b604a8301528051928391018583015e015f8382015203603981018452018261412a565b604051958693840152518091602184015e8101607d60f81b602182015203600281018452018261412a565b81604051613be1816140d8565b600581526466616c736560d81b8282015293613af4565b346101ca5760403660031901126101ca576004356024803590613c1a826141a2565b90613c28604051928361412a565b828252613c34836141a2565b6020948386019491601f19013686375f5b828110613c975786858760405192839281840190828552518091526040840192915f5b828110613c7757505050500390f35b83516001600160a01b031685528695509381019392810192600101613c68565b613cbe613ca482846141b9565b5f908152600d60205260409020546001600160a01b031690565b8551821015613ce2576001600160a01b0316600582901b8601880152600101613c45565b84634e487b7160e01b5f5260326004525ffd5b346101ca575f3660031901126101ca57601354613d1c6001600160a01b0382163314614169565b6001600160a01b0319166013557f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb5f80a1005b346101ca575f3660031901126101ca57602060405160098152f35b346101ca5760203660031901126101ca57610534613d86613ff2565b613d8e61414b565b5060018060a01b038091165f52600c60205260405f20906002604051926104ee84614087565b346101ca5760603660031901126101ca57613dcd613ff2565b613dd5614008565b6044359060018060a01b0383165f52600160205260405f20335f5260205260405f2054925f198403613e0c575b6105a7935061457d565b828410613e2857613e23836105a79503338361447f565b613e02565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b346101ca5760203660031901126101ca57613e86613ff2565b507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101ca575f80fd5b346101ca575f3660031901126101ca576020600254604051908152f35b346101ca575f3660031901126101ca576005546040516001600160a01b039091168152602090f35b346101ca5760403660031901126101ca576105a7613f1c613ff2565b602435903361447f565b346101ca575f3660031901126101ca575f600354613f438161404f565b808452906020906001908181169081156119a75750600114613f6f57610534856119428187038261412a565b60035f90815293507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b838510613fb55750505050810160200161194282610534611932565b8054868601840152938201938101613f99565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101ca57565b602435906001600160a01b03821682036101ca57565b60406003198201126101ca57600435906001600160401b0382116101ca5760a48201116101ca576004019060243590565b90600182811c9216801561407d575b602083101461406957565b634e487b7160e01b5f52602260045260245ffd5b91607f169161405e565b606081019081106001600160401b0382111761036657604052565b608081019081106001600160401b0382111761036657604052565b60c081019081106001600160401b0382111761036657604052565b604081019081106001600160401b0382111761036657604052565b61018081019081106001600160401b0382111761036657604052565b602081019081106001600160401b0382111761036657604052565b90601f801991011681019081106001600160401b0382111761036657604052565b6040519061415882614087565b5f6040838281528260208201520152565b1561417057565b60405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606490fd5b6001600160401b0381116103665760051b60200190565b91908201809211611ba557565b91908203918211611ba557565b903590601e19813603018212156101ca57018035906001600160401b0382116101ca576020019181360383136101ca57565b600581101561037a57600602605001905f90565b600581101561037a57600602606e01905f90565b600581101561037a57600602608c01905f90565b600581101561037a5760060260aa01905f90565b600581101561037a5760060260c801905f90565b600581101561037a5760060260e601905f90565b600581101561037a5760060261010401905f90565b9092916001600160401b038111610366576142ad825461404f565b601f8111614352575b505f601f82116001146142ee57819293945f926142e3575b50508160011b915f199060031b1c1916179055565b013590505f806142ce565b601f19821694835f5260209160205f20925f905b88821061433a57505083600195969710614321575b505050811b019055565b01355f19600384901b60f8161c191690555f8080614317565b80600184968294958701358155019501920190614302565b825f5260205f20601f830160051c8101916020841061438d575b601f0160051c01905b81811061438257506142b6565b5f8155600101614375565b909150819061436c565b6143a3600654426141c6565b66354a6ba7a18000818102918183048103611ba55767010a741a46278000029180830460051490151715611ba557620186a06506d23ad5f80092048201809211611ba5578082116143f2575090565b905090565b600581101561037a57603201905f90565b600581101561037a57603701905f90565b600581101561037a57603c01905f90565b600581101561037a57604101905f90565b600581101561037a57604601905f90565b600a81101561037a57601401905f90565b600a81101561037a57601e01905f90565b600a81101561037a57602801905f90565b6001600160a01b0390811691821561452c57169182156144dc5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b919061458883614faf565b61459182614faf565b9061459d8484876149c5565b6145a685614faf565b906145b084614faf565b918115806147f3575b6147e5575b816147dc575b506147ce575b8115806147c7575b6147b9575b816147b0575b506147a2575b6001600160a01b03928184161561469f57838116308114614694576007549460ff8616156146195750506146179350614bf3565b565b6005541680911461462f57506146179350614bf3565b9291905061463b614397565b821161465f5760ff1993841660011760075561465692614bf3565b60075416600755565b60405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b6044820152606490fd5b506146179350614bf3565b905091909116801561475357805f525f60205260405f205491808310614703576020817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef925f958587528684520360408620558060025403600255604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b6147ab816150c9565b6145e3565b9050155f6145dd565b6147c283615074565b6145d7565b50806145d2565b6147d7856150c9565b6145ca565b9050155f6145c4565b6147ee87615074565b6145be565b50806145b9565b604051906101a082018281106001600160401b03821117610366576040525f610180838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201520152565b6148726147fa565b5061487b6147fa565b6044356001600160a01b038116908190036101ca577307339c13953afad77b783e1e783f7bba94bb86771480610180830152604051906148ba826140a2565b60043582525f6020830152602435604083015260608201526148db81614d0b565b8252600a90816148ea82614dbc565b0660208401526148f981614d0b565b60408401528161490882614dbc565b06606084015261491781614d0b565b60808401528161492682614dbc565b0660a084015261493581614d0b565b60c084015261494381614d0b565b60e08401528161495282614dbc565b0661010084015261496281614d0b565b6101208401528161497282614dbc565b066101408401908152600161498683614d0b565b11156149a1575061499690614dbc565b065b61016082015290565b91505051614998565b6001600160401b03811161036657601f01601f191660200190565b90916001600160a01b039190828216308114614bec57633b9aca00908183049485151580614bde575b80614bce575b614a31575b50614a2c92614617969492614a26925f525f60205280614a1e60405f205493846141c6565b0491046141c6565b90615176565b6156dc565b815f52602090600c8252604087815f20541480614baf575b614b4d57835f52600b8352805f20885f52835260ff815f20541680614b2e575b614a745750506149f9565b919793509350614aed82967f6a8e447c9916dceac1c68ef70944c2885cf9840edb9d6ee4c6fa9f2eb983ea4e96614b29945f5260098a52835f20600a8b52845f20835f528b52845f20545f528a52866002855f208651809d614ad582614087565b825482526001830154910152015416848b0152615567565b614af7878461549f565b5186518152602080880151908201526040968701516001600160a01b0316968101969096529116939081906060820190565b0390a3565b508189165f52600b8352805f20885f52835260ff815f20541615614a69565b919793509350614aed82967f6a8e447c9916dceac1c68ef70944c2885cf9840edb9d6ee4c6fa9f2eb983ea4e96614b29945f52600c8a52866002855f208651809d614b9782614087565b825482526001830154910152015416848b0152615176565b508189165f52600b8352805f20885f52835260ff815f20541615614a49565b50806005541681881614156149f4565b5080600554168214156149ee565b5050505050565b6001600160a01b0390811691908215614cb857825f525f60205260405f205490848210614c64577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9285602093865f525f85520360405f20551693845f5260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b614d35612710614d1a83614dbc565b069180516060820190606061ffff94859284511515906157fd565b0151168410614da557826040614d50845184511515906157fd565b0151168410614d9c57826020614d6b845184511515906157fd565b0151168410614d9357614d83915190511515906157fd565b511611614d8e575f90565b600190565b50505050600290565b50505050600390565b50505050600490565b5f198114611ba55760010190565b6060810151151590614de181516020830190815191614dda83614dae565b90526141b9565b5f19810191908211611ba5576040015160405191602083019360f81b84526021830152604182015260418152614e16816140a2565b51902090565b6103705f81805b614ea95750614e31816149aa565b90614e3f604051928361412a565b808252601f19614e4e826149aa565b013660208401375b80928015614ea2575f198201918211611ba5578193600a926030908484068201809211611ba5578551111561037a5760f81b6001600160f81b0319165f1a908401601f01530491614e56565b5050905090565b90614eb5600a91614dae565b910480614e23565b60dc5f81805b614ed15750614e31816149aa565b90614edd600a91614dae565b910480614ec3565b8015614f11575f81805b614efd5750614e31816149aa565b90614f09600a91614dae565b910480614eef565b50604051614f1e816140d8565b60018152600360fc1b602082015290565b5f92918154614f3d8161404f565b92600191808316908115614f945750600114614f5a575b50505050565b9091929394505f5260209060205f20905f915b858310614f83575050505001905f808080614f54565b805485840152918301918101614f6d565b60ff191684525050508115159091020191505f808080614f54565b6001600160a01b0390811690308214908115615066575b50801561505e575b61505957805f52600c60205260405f20546040519163fb700e5b60e01b83526004830152602082602481305afa90811561504e575f91615018575b61501392506141b9565b151590565b90506020823d602011615046575b816150336020938361412a565b810103126101ca57615013915190615009565b3d9150615026565b6040513d5f823e3d90fd5b505f90565b508015614fce565b90506005541681145f614fc6565b6150b8906010545f52600d60205260405f209060018060a01b031690816001600160601b0360a01b825416179055601054905f52600e6020528060405f2055614dae565b601055565b8015611ba5575f190190565b60105480156151725760018060a01b0380921690815f52600e602052604092835f2054915f198101908111611ba55780830361513b575b50505061510e6010546150bd565b6010555f52600e6020525f818120556010545f52600d6020525f206001600160601b0360a01b8154169055565b5f52600d602052835f205416815f52835f20816001600160601b0360a01b8254161790555f52600e602052825f20555f8080615100565b5050565b908015615172576005546001600160a01b0383811693909182168414614f5457835f52600c91602091838352604094855f20908651936151b585614087565b82548552600260019360018101548888015201541687850152875f52858552865f208054828110156153e4575050906151f98892835f52878752885f2054906141c6565b825f528686525f88812055600261521e615214601254614dae565b8060125586615ae1565b845f52888852895f2090600182015501936001600160601b0360a01b94848682541617905560088752885f205492805f945f925b615391575b50505091817f6ddbe98834305de55ea2ec4b2a06a0512f09e1c1d725411e4b8242e234bbbf5b999795936152e8999795938311615336575b50505050508051151580615325575b615312575b511580615300575b6152ed575b5f868152919052819020905181548152600182015460208201526002909101546001600160a01b031660408201529081906060820190565b0390a2565b6152f8601154614dae565b6011556152b0565b50855f52818152825f205415156152ab565b61531d6011546150bd565b6011556152a3565b50865f52828252835f20541561529e565b615345615370926002946141c6565b845f528888526153598a5f209182546141b9565b9055615366601254614dae565b9081601255615ae1565b825f52868652875f2090600182015501918254161790555f8781808061528f565b91958287969294959610806153db575b156153d057506153bd6153c3916153b786615b0d565b906141b9565b95614dae565b90918b9594939281615252565b958195949350615257565b508582106153a1565b6152e8979593509061535961541d937f6ddbe98834305de55ea2ec4b2a06a0512f09e1c1d725411e4b8242e234bbbf5b9a9896936141c6565b90875f52838352845f2091600183015560028201886001600160601b0360a01b8254161790555115159081615495575b5061548a575f868152919052819020905181548152600182015460208201526002909101546001600160a01b031660408201529081906060820190565b6152f86011546150bd565b905054155f61544d565b6005546001600160a01b0392918316908316811461556257805f5260209060088252604093845f206154d18154614dae565b90556154de600f54614dae565b600f55815f5260088352845f2054905f198201918211611ba557825f5260098452855f20825f5284526002865f2086518155858701516001820155019086860151166001600160601b0360a01b825416179055815f52600a8352845f2084515f528352845f20555f52600b8152825f2091515f52525f20600160ff19825416179055565b505050565b6005546001600160a01b03918216919081168214615562575f928260029385526020906008825260409384872061559e81546150bd565b90556155ab600f546150bd565b600f55818752600b8352848720848852835284872060ff198154169055818752600883528487205493600a845285882090885283528487205482885260098452858820818952845285882091808888519461560586614087565b8054865260018101548887015201541687840152858203615654575b5050818752600a835284872090518752825285848120558552600981528285209185525282208281558260018201550155565b83895260098552868920868a52855286892087519161567283614087565b815483528981816001850154948a8701958652015416928a8501938452878d52600989528a8d20868e5289528a8d209085518255516001820155019151166001600160601b0360a01b825416179055838952600a8552868920905189528452858820555f80615621565b8115615172576005546001600160a01b038281169390929183168414614f54577fcd2561f5bdc6e0cb93c359922c8dc410ee971417c06196509399047747f4707b9261576d6152e893865f52600c602052604093845f2093600286519561574287614087565b805487526001810154602088015201541685850152875f52600c602052615359855f209182546141b9565b90855f52600c602052825f2091600183015560028201866001600160601b0360a01b825416179055511590816157f2575b506157df575b835f52600c602052805f20905191829182919091604060608201938054835260018101546020840152600260018060a01b0391015416910152565b6157ea601154614dae565b6011556157a4565b90505415155f61579e565b604090815161580b816140a2565b3660809137815161581b816140a2565b61012c8152602093848201906104b08252848301610834815260609687850193610bb88552875161584b816140bd565b8851615856816140a2565b610c5c81526101ec84820152603d8a82015260068b820152815288519261587c846140a2565b610fab84526103258185015260738a85015260108b8501528181019384528951956158a6876140a2565b611326875261049f8288015260b68b88015260188c880152828b019687528a519a8c906158d28d6140a2565b6116568d52610611848e015260fc818e0152601f828e01528482019c8d5280519d8e6158fd816140a2565b61189881526107068682015261012e838201526025910152608085019d8e52805193615928856140a2565b611f408552840161177090528301610fa0905282016107d090528160a08401526159a5575061ffff8097511688106159975750518516861061598b57505183168410615981575051161161597b57505190565b90505190565b9450505050505190565b96505050505050505190565b985050505050505050505190565b995050505050505050505090565b7f3c70617468207472616e73666f726d3d277472616e736c617465282d3434302c8152672030292720643d2760c01b602082015260280190565b7f272066696c6c3d272333383338333827206f7061636974793d27302e3827202f8152601f60f91b602082015260210190565b9060409160405192615a31846140bd565b5f91845b60068410615a435750505050565b82518254915f91615a538461404f565b9283825260209360019586811690815f14615ac55750600114615a92575b5090615a8481600196959493038261412a565b815201920193019290615a35565b5f8781528581209092505b818310615ab257505081018301615a84615a71565b8054848401870152918501918601615a9d565b60ff19168685015250151560051b820184019050615a84615a71565b906040519060208201926001600160601b03199060601b168352603482015260348152614e1681614087565b6001600160a01b0381165f908152600860205260409020541561505957600960205260405f205f8052602052615b4860405f20548092615567565b90565b6060906001905f5b600a831115615b625750505090565b615b6b83614ee5565b93615b7682856141c6565b94600686101561037a57606a615c3791600597881b8601516213979f60e91b6040519586937f2e656e64272066696c6c3d27667265657a6527206174747269627574654e616d6020808481955191829101838a015e8701701e30b734b6b0ba32903132b3b4b71e93b360791b828201526031938051928391018583015e019182015275653d276427206475723d273330306d732720746f3d2760501b60518201526067938051928391018583015e019182015203604a81018452018261412a565b93831015615c515750615c4b5f5b92614dae565b91615b53565b60028101809111611ba557615c4b90615c45565b6060906001905f5b600a831115615c7c5750505090565b615c8583614ee5565b93615c9082856141c6565b94600686101561037a57606a615d5191600597881b8601516213979f60e91b6040519586937f2e656e64272066696c6c3d27667265657a6527206174747269627574654e616d6020808481955191829101838a015e8701701e30b734b6b0ba32903132b3b4b71e93b360791b828201526031938051928391018583015e019182015275653d276427206475723d273330306d732720746f3d2760501b60518201526067938051928391018583015e019182015203604a81018452018261412a565b93831015615d6a5750615d645f92614dae565b91615c6d565b60028101809111611ba557615d6490615c4556fe3c616e696d6174655472616e73666f726d20626567696e3d2730272066696c6c3c72656374206f7061636974793d2730272077696474683d2700000000000000272066696c6c3d272333383338333827206f7061636974793d27302e38273e0027207374726f6b652d77696474683d27302e3127207374726f6b653d2700000073272066726f6d3d273020302720746f3d2734343020302720726570656174433d27667265657a6527206174747269627574654e616d653d277472616e73666f726d2720747970653d277472616e736c61746527206475723d27000000000000a264697066735822122016fa089f61eb921f1e0c982a7a464085a4472c4504c719f89e3266d148101ada64736f6c63430008190033

Deployed Bytecode

0x6080806040526004361015610012575f80fd5b5f3560e01c90816306fdde0314613f2657508063095ea7b314613f0057806316f0115b14613ed857806318160ddd14613ebb578063214013ca14613e6d57806323b872dd14613db45780632bd1a01114613d6a578063313ce56714613d4f578063333a007214613cf557806335ad0cea14613bf857806337b7e88c1461383357806339509351146137e65780634ed8cc8014611bb9578063524773ce14611b755780635ded3c7c14611ad25780636b4ed21b14611ab557806370a0823114611a7e57806370db69d614611a5c5780638904970a146119f95780638da5cb5b146119d157806395d89b41146118f557806395e4b21b146118bd57806399f65c8f146118a0578063a457c2d7146117fd578063a62f5b1b146105b2578063a9059cbb14610581578063c5b8f77214610538578063c7218d5b14610498578063cb8106f414610458578063dd62ed3e1461040b578063e0d97502146103ee578063f2fde38b146103a7578063f7b6f6b8146101ce5763fb700e5b14610192575f80fd5b346101ca5760203660031901126101ca576001600160a01b036101b3613ff2565b165f526008602052602060405f2054604051908152f35b5f80fd5b346101ca576020806003193601126101ca576004356001600160401b038082116101ca573660648301116101ca5761021160018060a01b03601354163314614169565b5f9261014219833603015b60039485811015928361039e575f5b600a948582101561038e5761037a576005600484821b89010135858112156101ca5761026390890160048085851b83010191016141d3565b90916014845f99880201019289831161036657610280845461404f565b601f9283821161032c575b50505f9183116001146102c8576001949392915f91836102bd575b50505f19828d1b1c191690841b1790555b0161022b565b013590508c806102a6565b601f19831691845f52865f20925f5b8882821061031657505090846001979695949392106102ff575b505050831b830190556102b7565b01355f19838e1b60f8161c191690558b80806102f1565b60018496829395870135815501950192016102d7565b855f52875f209084808701821c8301938a881061035d575b01901c01905b8181101561028b575f815560010161034a565b93508293610344565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b505092506001919550019361021c565b60405160018152f35b346101ca5760203660031901126101ca576103c0613ff2565b601354906001600160a01b03906103da8284163314614169565b6001600160a01b0319909216911617601355005b346101ca575f3660031901126101ca576020601154604051908152f35b346101ca5760403660031901126101ca57610424613ff2565b61042c614008565b9060018060a01b038091165f52600160205260405f2091165f52602052602060405f2054604051908152f35b346101ca5760203660031901126101ca576004355f908152600d60209081526040909120546001600160a01b03166040516001600160a01b039091168152f35b346101ca5760403660031901126101ca576105346104b4613ff2565b6104bc61414b565b5060018060a01b038091165f52600960205260405f206024355f5260205260405f20906002604051926104ee84614087565b80548452600181015460208501520154166040820152604051918291829190916040606082019380518352602081015160208401528160018060a01b0391015116910152565b0390f35b346101ca5760403660031901126101ca576001600160a01b03610559613ff2565b165f52600b60205260405f206024355f52602052602060ff60405f2054166040519015158152f35b346101ca5760403660031901126101ca576105a761059d613ff2565b602435903361457d565b602060405160018152f35b346101ca5760603660031901126101ca576105cb61486a565b6040516105d78161410f565b5f8152604051731e3334b63a32b91034b21e93b3b930b4b739939f60611b60208201527f3c666554757262756c656e636520736565643d2731322720747970653d27667260348201527f616374616c4e6f6973652720626173654672657175656e63793d27313527206e60548201527f756d4f6374617665733d27312720726573756c743d2774757262756c656e63656074820152631390179f60e11b60948201527f3c6665436f6d706f6e656e745472616e736665722077696474683d273130302560988201527f27206865696768743d27313030252720696e3d2774757262756c656e6365272060b88201527f726573756c743d27636f6d706f6e656e745472616e73666572273e3c6665467560d88201527f6e634120747970653d277461626c6527207461626c6556616c7565733d27302060f88201527f302e3335272f3e3c2f6665436f6d706f6e656e745472616e736665723e0000006101188201527f3c6665426c656e6420696e3d27536f757263654772617068696327206d6f6465610135820152671e93b43ab293979f60c11b610155820152681e17b334b63a32b91f60b91b61015d820152610146815291610793836140f3565b60208101516107a19061444c565b50906040518092602082017f3c726563742077696474683d2732323027206865696768743d273232302720669052604082016c34b6361e93bbb434ba3293979f60991b9052604d82017f3c72656374206f7061636974793d27302e35272077696474683d2732323027209052606d8201726865696768743d27323230272066696c6c3d2760681b90526080820161083791614f2f565b6213979f60e91b815203601c1981018352600301610855908361412a565b6040516108618161410f565b5f815261086c614ebd565b906040516108798161410f565b5f8152604051928392602084017f3c673e3c726563742066696c7465723d2775726c2823677261696e7329272000905280516020819201603f86015e8301603f8101672077696474683d2760c01b905281516020819301604783015e01604781017f27206865696768743d2732323027206f7061636974793d27302e38272f3e0000905281516020819301606583015e818101606501631e17b39f60e11b9052010360498101825260690161092e908261412a565b610936614ebd565b6040518091602082015f80516020615d9f833981519152905280516020819201603984015e8082016039016f13903432b4b3b43a1e9399191813979f60811b905281818101036029018252810103604901610991908261412a565b825161099c906143f7565b5090604051809260208201683c7061746820643d2760b81b9052602982016109c391614f2f565b7013903334b6361e93bbb434ba329390179f60791b8152600e19828203018252036011016109f1908361412a565b6040516109fd8161410f565b5f815260405192839260208401621e339f60e91b905280516020819201602386015e830160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018252602701610a69908261412a565b610a71614ebd565b916040518093602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018452604901610ac7908461412a565b6040840151610ad590614408565b50926020850151610ae59061444c565b50936020860151610af59061444c565b5060405195869260208401683c7061746820643d2760b81b905260298401610b1c91614f2f565b5f80516020615ddf8339815191528152601d01610b3891614f2f565b67272066696c6c3d2760c01b8152600801610b5291614f2f565b6213979f60e91b815203601c1981018552600301610b70908561412a565b6040850151610b7e90614408565b5060608601908151610b8f9061444c565b509151610b9b9061444c565b5060405192839260208401773c70617468206f7061636974793d27302e37352720643d2760401b905260388401610bd191614f2f565b5f80516020615ddf8339815191528152601d01610bed91614f2f565b67272066696c6c3d2760c01b8152600801610c0791614f2f565b6213979f60e91b815203601c1981018252600301610c25908261412a565b60405190610c328261410f565b5f825260405195869360208501621e339f60e91b905280516020819201602387015e840160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018452602701610cb1908461412a565b610cb9614ebd565b6040518091602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018252604901610d0e908261412a565b6080850151610d1c90614419565b509060a08601918251610d2e9061444c565b509251610d3a9061444c565b50926040519384916020830193683c7061746820643d2760b81b855260298401610d6391614f2f565b6927207374726f6b653d2760b01b8152600a01610d7f91614f2f565b67272066696c6c3d2760c01b8152600801610d9991614f2f565b6213979f60e91b815203601c1981018452600301610db7908461412a565b6080870151610dc59061442a565b50604051806020810192683c7061746820643d2760b81b845260298201610deb91614f2f565b610df4906159ed565b03601f1981018252610e06908261412a565b60405192610e138461410f565b5f845260405195869560208701621e339f60e91b905280516020819201602389015e86019060238201905f8252519283915e019060238201905f8252519283915e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018252602701610e8a908261412a565b60405193838594516020819201602087015e840160208101915f83528051926020849201905e0160208101915f83528051926020849201905e0160208101915f83528051926020849201905e01602081015f905203808252602001610eef908261412a565b6101408201516101608301511491610120810151610f0c90614205565b5092610140820151610f1d9061445d565b5093610120830151610f2e90614205565b50610f3890615a20565b50604051610f458161410f565b5f815260405195869260208401683c7061746820643d2760b81b905260298401610f6e91614f2f565b67272066696c6c3d2760c01b8152600801610f8891614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e818101601101661e17b830ba341f60c91b905260071983838301030183520103601801610fd8908561412a565b610120820151610fe790614219565b5093610120830151610ff890614219565b5061100290615a20565b5060405161100f8161410f565b5f815260405195828793516020819201602086015e830160208101683c7061746820643d2760b81b905260290161104591614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b905203600681018552602601611087908561412a565b6101208201516110969061422d565b50906101608301516110a79061445d565b50916101208401516110b89061422d565b506110c290615a20565b506040516110cf8161410f565b5f815260405193849260208401683c7061746820643d2760b81b9052602984016110f891614f2f565b67272066696c6c3d2760c01b815260080161111291614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e0160118101661e17b830ba341f60c91b9052036007198101835260180161115c908361412a565b61012083015161116b90614241565b509161012084015161117c90614241565b5061118690615a20565b506040516111938161410f565b5f815260405193828593516020819201602086015e830160208101683c7061746820643d2760b81b90526029016111c991614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b90520360068101835260260161120b908361412a565b156117f7575060405161121d8161410f565b5f8152925b60405193818592516020819201602085015e820160208101915f83528051926020849201905e01602081015f905203808452602001611261908461412a565b60e081015161126f90614255565b5061010082015161127f9061446e565b509060e083015161128f90614255565b5061129990615a20565b506040516112a68161410f565b5f815260405192839260208401683c7061746820643d2760b81b9052602984016112cf91614f2f565b67272066696c6c3d2760c01b81526008016112e991614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e0160118101661e17b830ba341f60c91b90520360071981018252601801611333908261412a565b60e082015161134190614269565b5060e083015161135090614269565b5061135a90615a20565b50604051906113688261410f565b5f8252604051918291602083019480516020819201875e830160208101683c7061746820643d2760b81b90526029016113a091614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b9052036006810182526026016113e2908261412a565b60c0830180516113f19061427d565b5090516113fd9061427d565b5061140790615a20565b50604051906114158261410f565b5f8252604051938493518091602086015e830160208101683c7061746820643d2760b81b905260290161144791614f2f565b6e13903334b6361e93b13630b1b5939f60891b815281516020819301600f83015e01600f8101661e17b830ba341f60c91b9052036009198101825260160161148f908261412a565b604051767472616e73666f726d3d277472616e736c61746528292760481b602082015260178152906114c0826140d8565b604051948592602084016201e33960ed1b905280516020819201602386015e830160238101601f60f91b905281516020819301602483015e0160248101915f83528051926020849201905e0160248101631e17b39f60e11b90520360088101845260280161152e908461412a565b611536614ebd565b6040518091602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b90520360298101825260490161158b908261412a565b60808201516115999061443b565b5091602001516115a89061444c565b509160405192839160208301683c7061746820643d2760b81b9052602983016115d091614f2f565b67272066696c6c3d2760c01b81526008016115ea91614f2f565b6213979f60e91b815203601c1981018352600301611608908361412a565b6040516116148161410f565b5f815260405192839260208401621e339f60e91b905280516020819201602386015e830160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018252602701611680908261412a565b6040519283926020840195781e33903334b63a32b91e93bab9361411b3b930b4b73994939f60391b875280516020819201603987015e840160398101915f83528051926020849201905e0160398101915f83528051926020849201905e0160398101915f83528051926020849201905e0160398101631e17b39f60e11b905203601d81018252603d01611713908261412a565b604051938493602085017f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f32309052604085017f30302f737667272066696c6c3d276e6f6e65272076696577426f783d27302030905260608501691019191810191918139f60b11b9052606a8501641e3232b31f60d91b905280516020819201606f87015e8401606f8101915f83528051926020849201905e0190606f8201651e17b232b31f60d11b9052518092607583015e0160758101651e17b9bb339f60d11b905203605b81018252607b016117e9908261412a565b604051610534819282613fc8565b92611222565b346101ca5760403660031901126101ca57611816613ff2565b60243590335f52600160205260405f2060018060a01b0382165f5260205260405f20549180831061184d576105a79203903361447f565b60405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608490fd5b346101ca575f3660031901126101ca576020600f54604051908152f35b346101ca5760203660031901126101ca576001600160a01b036118de613ff2565b165f52600e602052602060405f2054604051908152f35b346101ca575f3660031901126101ca576040515f6004546119158161404f565b808452906020906001908181169081156119a7575060011461194e575b610534856119428187038261412a565b60405191829182613fc8565b60045f90815293507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b5b8385106119945750505050810160200161194282610534611932565b8054868601840152938201938101611978565b8695506105349693506020925061194294915060ff191682840152151560051b8201019293611932565b346101ca575f3660031901126101ca576013546040516001600160a01b039091168152602090f35b346101ca57611a073661401e565b611a1c60018060a01b03601354163314614169565b5f5b600590818110156105a757611a3781831b8501856141d3565b600685949294101561037a57600193603284611a569488020101614292565b01611a1e565b346101ca575f3660031901126101ca576020611a76614397565b604051908152f35b346101ca5760203660031901126101ca576001600160a01b03611a9f613ff2565b165f525f602052602060405f2054604051908152f35b346101ca575f3660031901126101ca576020601054604051908152f35b346101ca57611ae03661401e565b611af560018060a01b03601354163314614169565b5f905b6005918281101593846105a7575f5b60069586821015611b665761037a5782851b82013560be19833603018112156101ca57611b3b90830182871b8101906141d3565b9190600786101561037a57600192611b60916050845f9b8902601e8b02010101614292565b01611b07565b50909450506001019150611af8565b346101ca575f3660031901126101ca5760025466354a6ba7a18000908103908111611ba557602090604051908152f35b634e487b7160e01b5f52601160045260245ffd5b346101ca5760603660031901126101ca57611bd261486a565b60605f5b600a81106136cf5750611e3c60405192731e3334b63a32b91034b21e93b3b930b4b739939f60611b60208501527f3c666554757262756c656e636520736565643d2731322720747970653d27667260348501527f616374616c4e6f6973652720626173654672657175656e63793d27313527206e60548501527f756d4f6374617665733d27312720726573756c743d2774757262756c656e63656074850152631390179f60e11b60948501527f3c6665436f6d706f6e656e745472616e736665722077696474683d273130302560988501527f27206865696768743d27313030252720696e3d2774757262756c656e6365272060b88501527f726573756c743d27636f6d706f6e656e745472616e73666572273e3c6665467560d88501527f6e634120747970653d277461626c6527207461626c6556616c7565733d27302060f88501527f302e3335272f3e3c2f6665436f6d706f6e656e745472616e736665723e0000006101188501527f3c6665426c656e6420696e3d27536f757263654772617068696327206d6f6465610135850152671e93b43ab293979f60c11b610155850152681e17b334b63a32b91f60b91b61015d8501526101468452611d9b846140f3565b611e546003611dad602084015161444c565b506040519485917f3c726563742077696474683d2732323027206865696768743d2732323027206660208401526c34b6361e93bbb434ba3293979f60991b60408401527f3c72656374206f7061636974793d27302e35272077696474683d273232302720604d840152726865696768743d27323230272066696c6c3d2760681b606d8401526080830190614f2f565b6213979f60e91b815203601c1981018552018361412a565b60405192611e61846140d8565b601e84527f7472616e73666f726d3d277472616e736c617465282d3434302c2030292700006020850152611e93614e1c565b94601e92601e94855f965b6136b75750611eac866149aa565b95611eba604051978861412a565b808752611ec6816149aa565b601f19013660208901375b80958015611f21575f198201918211611ba5578196603092600a830684018411611ba5578951111561037a57600a928383060160f81b6001600160f81b0319165f1a908901601f01530494611ed1565b5050909194602096879550606961206b918780808d611fc560ad83996040519586915f80516020615d7f833981519152828401525f80516020615e1f83398151915260408401525f80516020615e3f8339815191526060840152805191829101607a84015e81015f80516020615dff833981519152607a8201527237bab73a1e93b4b73232b334b734ba3293979f60691b609a82015203608d81018652018461412a565b6040519788957f3c673e3c726563742066696c7465723d2775726c2823677261696e732927200082880152805191829101603f88015e850190672077696474683d2760c01b603f830152805192839101604783015e01907f27206865696768743d2732323027206f7061636974793d27302e38272f3e00006047830152805192839101606583015e631e17b39f60e11b606583830101520103604981018452018261412a565b6120c66049612078614e1c565b604051998a915f80516020615d9f83398151915282840152805191829101603984015e81016f13903432b4b3b43a1e9399191813979f60811b6039820152602982820301825203018861412a565b61218d601f6120ff61212760116120dd88516143f7565b50604051938491683c7061746820643d2760b81b8d8401526029830190614f2f565b7013903334b6361e93bbb434ba329390179f60791b8152600e1982820301825203018261412a565b61215a61213487516143f7565b506121548a6040519b858d9651918291018388015e8501015f81526159b3565b90614f2f565b7f272066696c6c3d27776869746527207374726f6b653d277768697465272f3e0081525f1982820301825203018661412a565b603c93603c95865f975b61369f57506121a5876149aa565b966121b3604051988961412a565b8088526121bf816149aa565b601f19013660208a01375b8096801561221a575f198201918211611ba5578197603092600a830684018411611ba5578a51111561037a57600a928383060160f81b6001600160f81b0319165f1a908a01601f015304956121ca565b5050878988959394956040518091602082015f80516020615d7f8339815191529052604082015f80516020615e1f8339815191529052606082015f80516020615e3f833981519152905280516020819201607a84015e8101607a81015f80516020615dff8339815191529052609a81017237bab73a1e93b4b73232b334b734ba3293979f60691b905203608d8101825260ad016122b7908261412a565b60405193849260208401621e339f60e91b905280516020819201602386015e830160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b905203600781018352602701612320908361412a565b612328614e1c565b946040518096602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b90520360298101875260490161237e908761412a565b604087015161238c90614408565b5091602088015161239c9061444c565b509260208901516123ac9061444c565b5060405194859260208401683c7061746820643d2760b81b9052602984016123d391614f2f565b5f80516020615ddf8339815191528152601d016123ef91614f2f565b67272066696c6c3d2760c01b815260080161240991614f2f565b6213979f60e91b815203601c1981018452600301612427908461412a565b604088015161243590614408565b509260208901516124459061444c565b5060208a01516124549061444c565b509060405195838794516020819201602087015e84016020015f8152612479906159b3565b61248291614f2f565b5f80516020615ddf8339815191528152601d0161249e91614f2f565b67272066696c6c3d2760c01b81526008016124b891614f2f565b6213979f60e91b815203601c19810184526003016124d6908461412a565b60408801516124e490614408565b50976060810180516124f59061444c565b509080516125029061444c565b5091604051928391602083019d773c70617468206f7061636974793d27302e37352720643d2760401b8f526038840161253a91614f2f565b5f80516020615ddf8339815191528152601d0161255691614f2f565b67272066696c6c3d2760c01b815260080161257091614f2f565b6213979f60e91b815203601c198101835260030161258e908361412a565b604083015161259c90614408565b509080516125a99061444c565b5090516125b59061444c565b50916040519c8d94518091602087015e8401602081017f3c70617468207472616e73666f726d3d277472616e736c617465282d3434302c9052604081017f20302927206f7061636974793d27302e37352720643d27000000000000000000905260570161262191614f2f565b5f80516020615ddf8339815191528152601d0161263d91614f2f565b67272066696c6c3d2760c01b815260080161265791614f2f565b6213979f60e91b815203601c1981018a52600301612675908a61412a565b602d95602d97885f995b613687575061268d896149aa565b9861269b6040519a8b61412a565b808a526126a7816149aa565b601f19013660208c01375b80988015612702575f198201918211611ba5578199603092600a830684018411611ba5578c51111561037a57600a928383060160f81b6001600160f81b0319165f1a908c01601f015304976126b2565b505089898c979596976040518092602082015f80516020615d7f8339815191529052604082015f80516020615e1f8339815191529052606082015f80516020615e3f833981519152905280516020819201607a84015e8101607a81015f80516020615dff8339815191529052609a81017237bab73a1e93b4b73232b334b734ba3293979f60691b905203608d8101835260ad0161279f908361412a565b60405196879360208501621e339f60e91b905280516020819201602387015e840160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101915f83528051926020849201905e0160238101631e17b39f60e11b90520360078101855260270161281b908561412a565b612823614e1c565b946040518096602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018752604901612879908761412a565b608084015161288790614419565b509760a08501516128979061444c565b509860a08601516128a79061444c565b506040519a8b9260208401683c7061746820643d2760b81b9052602984016128ce91614f2f565b6927207374726f6b653d2760b01b8152600a016128ea91614f2f565b67272066696c6c3d2760c01b815260080161290491614f2f565b6213979f60e91b815203601c1981018a52600301612922908a61412a565b608085015161293090614419565b509860a08601516129409061444c565b5060a087015161294f9061444c565b50906040519b838d94516020819201602087015e84016020015f8152612974906159b3565b61297d91614f2f565b6927207374726f6b653d2760b01b8152600a0161299991614f2f565b67272066696c6c3d2760c01b81526008016129b391614f2f565b6213979f60e91b815203601c1981018a526003016129d1908a61412a565b60808501516129df9061442a565b509760405180602081019a683c7061746820643d2760b81b8c5260298201612a0691614f2f565b612a0f906159ed565b03601f1981018252612a21908261412a565b6080870151612a2f9061442a565b506040519a8b92518091602085015e82016020015f8152612a4f906159b3565b612a5891614f2f565b612a61906159ed565b03601f1981018a52612a73908a61412a565b601996601998895f9a5b61366f5750612a8b8a6149aa565b99612a996040519b8c61412a565b808b52612aa5816149aa565b601f19013660208d01375b80998015612b00575f198201918211611ba557819a603092600a830684018411611ba5578d51111561037a57600a928383060160f81b6001600160f81b0319165f1a908d01601f01530498612ab0565b5050602080809c819b5093612c1e612c70999b9f83999b9e95848080809b9a81602796612bb260ad839e6040519788915f80516020615d7f833981519152828401525f80516020615e1f83398151915260408401525f80516020615e3f8339815191526060840152805191829101607a84015e81015f80516020615dff833981519152607a8201527237bab73a1e93b4b73232b334b734ba3293979f60691b609a82015203608d81018852018661412a565b6040519b8c97621e339f60e91b828a015280519182910160238a015e870190602382015f8152815193849201905e0190602382015f8152815193849201905e0190602382015f8152815193849201905e01631e17b39f60e11b602382015203600781018652018461412a565b6040519b878d985191829101848a015e8701908282015f8152815193849201905e01908282015f8152815193849201905e01908282015f8152815193849201905e015f8382015203808652018461412a565b8461014087015161016088015114612dda6026612cf2612d4c60188c87612c9b610120830151614205565b5091612d07612cce612cc9612cc3610120612cba61014087015161445d565b50950151614205565b50615a20565b615b4b565b916008604051988996683c7061746820643d2760b81b878901526029880190614f2f565b67272066696c6c3d2760c01b81520190614f2f565b9070139039ba3937b5b29e93b13630b1b5939f60791b8252805192839101601183015e661e17b830ba341f60c91b60118383010152010360071981018452018261412a565b848b612d9f612d72612cc9612cc3610120612d6981870151614219565b50950151614219565b9160296040519e8f968051918291018789015e8601683c7061746820643d2760b81b868201520190614f2f565b905f80516020615dbf8339815191528252805192839101601f83015e01661e17b830ba341f60c91b601f82015203600681018a52018861412a565b612ef56026612cf2612e6260188c87612df761012083015161422d565b5091612e1f612cce612cc9612cc3610120612e1661016087015161445d565b5095015161422d565b9070139039ba3937b5b29e93b13630b1b5939f60791b8252805192839101601183015e01661e17b830ba341f60c91b60118201520360071981018452018261412a565b848b612eba612e8d612e88612cc3610120612e7f81870151614241565b50950151614241565b615c65565b91602960405199868b9751918291018789015e8601683c7061746820643d2760b81b868201520190614f2f565b905f80516020615dbf8339815191528252805192839101601f83015e01661e17b830ba341f60c91b601f82015203600681018552018361412a565b156136675750604051612f078161410f565b5f81529293945b60405193818592516020819201602085015e820160208101915f83528051926020849201905e01602081015f905203808452602001612f4d908461412a565b60e0860151612f5b90614255565b50610100870151612f6b9061446e565b509060e0880151612f7b90614255565b50612f8590615a20565b612f8e90615c65565b60405192839260208401683c7061746820643d2760b81b905260298401612fb491614f2f565b67272066696c6c3d2760c01b8152600801612fce91614f2f565b70139039ba3937b5b29e93b13630b1b5939f60791b815281516020819301601183015e0160118101661e17b830ba341f60c91b90520360071981018252601801613018908261412a565b60e087015161302690614269565b509060e088015161303690614269565b5061304090615a20565b61304990615c65565b60405192828493516020819201602086015e830160208101683c7061746820643d2760b81b905260290161307c91614f2f565b5f80516020615dbf833981519152815281516020819301601f83015e01601f8101661e17b830ba341f60c91b9052036006810182526026016130be908261412a565b60c087019081516130ce9061427d565b5091516130da9061427d565b506130e490615a20565b6130ed90615c65565b60405192828493516020819201602086015e830160208101683c7061746820643d2760b81b905260290161312091614f2f565b6e13903334b6361e93b13630b1b5939f60891b815281516020819301600f83015e01600f8101661e17b830ba341f60c91b90520360091981018252601601613168908261412a565b604051767472616e73666f726d3d277472616e736c61746528292760481b60208201526017815290613199826140d8565b604051948592602084016201e33960ed1b905280516020819201602386015e808401602301601f60f91b9052815160208193018286016024015e83010160248101915f83528051926020849201905e0160248101631e17b39f60e11b90520360088101845260280161320b908461412a565b613213614e1c565b946040518096602082015f80516020615d9f833981519152905280516020819201603984015e8101603981016f13903432b4b3b43a1e9399191813979f60811b905203602981018752604901613269908761412a565b60808701516132779061443b565b5060208801516132869061444c565b509060405191829160208301683c7061746820643d2760b81b9052602983016132ae91614f2f565b67272066696c6c3d2760c01b81526008016132c891614f2f565b6213979f60e91b815203601c19810182526003016132e6908261412a565b60808801516132f49061443b565b5097602001516133039061444c565b5060405198828a93516020819201602086015e83016020015f8152613327906159b3565b61333091614f2f565b67272066696c6c3d2760c01b815260080161334a91614f2f565b6213979f60e91b815203601c1981018852600301613368908861412a565b600a93600a95865f975b61364f5750613380876149aa565b9661338e604051988961412a565b80885261339a816149aa565b601f19013660208a01375b809680156133f5575f198201918211611ba5578197603092600a830684018411611ba5578a51111561037a57600a928383060160f81b6001600160f81b0319165f1a908a01601f015304956133a5565b505084781e33903334b63a32b91e93bab9361411b3b930b4b73994939f60391b60208061053497613589603d8f998f8f866119429c819e607b9d6135246027621e339f60e91b978697879586604051916134d060ad8484808201975f80516020615d7f83398151915289525f80516020615e1f83398151915260408401525f80516020615e3f8339815191526060840152805191829101607a84015e81015f80516020615dff833981519152607a8201527237bab73a1e93b4b73232b334b734ba3293979f60691b609a82015203608d81018652018461412a565b6040519b8c958187019e8f52805191829101602388015e850190602382015f8152815193849201905e019060238201905f8252519283915e01631e17b39f60e11b602382015203600781018852018661412a565b6040519b8c978189019e8f5280519182910160398a015e870190603982015f8152815193849201905e0190603982015f8152815193849201905e019060398201905f8252519283915e01631e17b39f60e11b603982015203601d81018652018461412a565b6040519788957f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f3230828801527f30302f737667272066696c6c3d276e6f6e65272076696577426f783d273020306040880152691019191810191918139f60b11b6060880152641e3232b31f60d91b606a880152805191829101606f88015e850190606f82015f8152815193849201905e0190651e17b232b31f60d11b606f830152518092607583015e01651e17b9bb339f60d11b607582015203605b81018452018261412a565b95979661365d600a91614dae565b9798960480613372565b929394612f0e565b989a9961367d600a91614dae565b9a9b990480612a7d565b979998613695600a91614dae565b999a98048061267f565b9597966136ad600a91614dae565b9798960480612197565b9496956136c5600a91614dae565b9697950480611e9e565b9190600190818410156137a3576040516136e8816140d8565b60058152640303b6631360dc1b6020820152915b840191828511611ba557604a61379b91613717600195614ee5565b90721732b7321390323ab91e9398981836b993979f60691b604051958693682720626567696e3d2760b81b6020808481955191829101838a015e87016d1e30b734b6b0ba329034b21e93b360911b82820152602e938051928391018583015e01918201526037938051928391018583015e019182015203602a81018452018261412a565b919201611bd6565b6137ac84614ee5565b6137e060405191826020603360f91b818301526021928051918291018484015e81015f83820152038581018452018261412a565b916136fc565b346101ca5760403660031901126101ca576105a7613802613ff2565b335f52600160205260405f2060018060a01b0382165f5260205261382c60243560405f20546141b9565b903361447f565b346101ca5760603660031901126101ca57610534607b60f81b611942602261385961486a565b602081613ba9605961386e8480960151614ee5565b613911604a61387d8651614ee5565b8761388b6040890151614ee5565b604051998a9381808601986b01139b5bca1b7b637b9111d160a51b8a52805191829101602c88015e8501906c016101139b5bcaa3cb832911d1609d1b602c830152805192839101603983015e01907001610113437b934bd37b72a3cb832911d1607d1b60398301528051928391018583015e015f8382015203602a81018852018661412a565b6139db60536139236060870151614ee5565b92886139326080890151614ee5565b8161394060a08b0151614ee5565b91816040519889968288019e8f90519182915e8701907101610113437b934bd37b721b7b637b9111d160751b83830152805192839101603283015e01906f016101133b937bab7322a3cb832911d160851b6032830152805192839101604283015e019070016101133b937bab73221b7b637b9111d1607d1b60428301528051928391018583015e015f8382015203603381018452018261412a565b613a9c604b6139ed60c0870151614ee5565b96886139fc60e0890151614ee5565b81613a0b6101008b0151614ee5565b91816040519c8d968288019a5180918c5e8701906d01610113330b1b2aa3cb832911d160951b83830152805192839101602e83015e01906d016101139ba32b6aa3cb832911d160951b602e830152805192839101603c83015e01906e016101139ba32b6a1b7b637b9111d1608d1b603c8301528051928391018583015e015f8382015203602b81018852018661412a565b85613aab610120860151614ee5565b9481613abb610140830151614ee5565b91610180613acd610160830151614ee5565b91015115613bd45781604051613ae2816140d8565b60048152637472756560e01b82820152935b816040519a8b98828a01809e519182915e8901906c016101131b0b82a3cb832911d1609d1b83830152805192839101602d83015e01906d016101131b0b821b7b637b9111d160951b602d830152805192839101603b83015e01906e01610113237ba39a1b7b637b9111d1608d1b603b830152805192839101604a83015e01906e016101134b9a9b832b1b4b0b6111d1608d1b604a8301528051928391018583015e015f8382015203603981018452018261412a565b604051958693840152518091602184015e8101607d60f81b602182015203600281018452018261412a565b81604051613be1816140d8565b600581526466616c736560d81b8282015293613af4565b346101ca5760403660031901126101ca576004356024803590613c1a826141a2565b90613c28604051928361412a565b828252613c34836141a2565b6020948386019491601f19013686375f5b828110613c975786858760405192839281840190828552518091526040840192915f5b828110613c7757505050500390f35b83516001600160a01b031685528695509381019392810192600101613c68565b613cbe613ca482846141b9565b5f908152600d60205260409020546001600160a01b031690565b8551821015613ce2576001600160a01b0316600582901b8601880152600101613c45565b84634e487b7160e01b5f5260326004525ffd5b346101ca575f3660031901126101ca57601354613d1c6001600160a01b0382163314614169565b6001600160a01b0319166013557f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb5f80a1005b346101ca575f3660031901126101ca57602060405160098152f35b346101ca5760203660031901126101ca57610534613d86613ff2565b613d8e61414b565b5060018060a01b038091165f52600c60205260405f20906002604051926104ee84614087565b346101ca5760603660031901126101ca57613dcd613ff2565b613dd5614008565b6044359060018060a01b0383165f52600160205260405f20335f5260205260405f2054925f198403613e0c575b6105a7935061457d565b828410613e2857613e23836105a79503338361447f565b613e02565b60405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606490fd5b346101ca5760203660031901126101ca57613e86613ff2565b507f000000000000000000000000008a9cc742b4d3ac32b6379f1b9ecb191f14ab696001600160a01b031633036101ca575f80fd5b346101ca575f3660031901126101ca576020600254604051908152f35b346101ca575f3660031901126101ca576005546040516001600160a01b039091168152602090f35b346101ca5760403660031901126101ca576105a7613f1c613ff2565b602435903361447f565b346101ca575f3660031901126101ca575f600354613f438161404f565b808452906020906001908181169081156119a75750600114613f6f57610534856119428187038261412a565b60035f90815293507fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b838510613fb55750505050810160200161194282610534611932565b8054868601840152938201938101613f99565b602060409281835280519182918282860152018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b03821682036101ca57565b602435906001600160a01b03821682036101ca57565b60406003198201126101ca57600435906001600160401b0382116101ca5760a48201116101ca576004019060243590565b90600182811c9216801561407d575b602083101461406957565b634e487b7160e01b5f52602260045260245ffd5b91607f169161405e565b606081019081106001600160401b0382111761036657604052565b608081019081106001600160401b0382111761036657604052565b60c081019081106001600160401b0382111761036657604052565b604081019081106001600160401b0382111761036657604052565b61018081019081106001600160401b0382111761036657604052565b602081019081106001600160401b0382111761036657604052565b90601f801991011681019081106001600160401b0382111761036657604052565b6040519061415882614087565b5f6040838281528260208201520152565b1561417057565b60405162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b6044820152606490fd5b6001600160401b0381116103665760051b60200190565b91908201809211611ba557565b91908203918211611ba557565b903590601e19813603018212156101ca57018035906001600160401b0382116101ca576020019181360383136101ca57565b600581101561037a57600602605001905f90565b600581101561037a57600602606e01905f90565b600581101561037a57600602608c01905f90565b600581101561037a5760060260aa01905f90565b600581101561037a5760060260c801905f90565b600581101561037a5760060260e601905f90565b600581101561037a5760060261010401905f90565b9092916001600160401b038111610366576142ad825461404f565b601f8111614352575b505f601f82116001146142ee57819293945f926142e3575b50508160011b915f199060031b1c1916179055565b013590505f806142ce565b601f19821694835f5260209160205f20925f905b88821061433a57505083600195969710614321575b505050811b019055565b01355f19600384901b60f8161c191690555f8080614317565b80600184968294958701358155019501920190614302565b825f5260205f20601f830160051c8101916020841061438d575b601f0160051c01905b81811061438257506142b6565b5f8155600101614375565b909150819061436c565b6143a3600654426141c6565b66354a6ba7a18000818102918183048103611ba55767010a741a46278000029180830460051490151715611ba557620186a06506d23ad5f80092048201809211611ba5578082116143f2575090565b905090565b600581101561037a57603201905f90565b600581101561037a57603701905f90565b600581101561037a57603c01905f90565b600581101561037a57604101905f90565b600581101561037a57604601905f90565b600a81101561037a57601401905f90565b600a81101561037a57601e01905f90565b600a81101561037a57602801905f90565b6001600160a01b0390811691821561452c57169182156144dc5760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591835f526001825260405f20855f5282528060405f2055604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b919061458883614faf565b61459182614faf565b9061459d8484876149c5565b6145a685614faf565b906145b084614faf565b918115806147f3575b6147e5575b816147dc575b506147ce575b8115806147c7575b6147b9575b816147b0575b506147a2575b6001600160a01b03928184161561469f57838116308114614694576007549460ff8616156146195750506146179350614bf3565b565b6005541680911461462f57506146179350614bf3565b9291905061463b614397565b821161465f5760ff1993841660011760075561465692614bf3565b60075416600755565b60405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b6044820152606490fd5b506146179350614bf3565b905091909116801561475357805f525f60205260405f205491808310614703576020817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef925f958587528684520360408620558060025403600255604051908152a3565b60405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608490fd5b6147ab816150c9565b6145e3565b9050155f6145dd565b6147c283615074565b6145d7565b50806145d2565b6147d7856150c9565b6145ca565b9050155f6145c4565b6147ee87615074565b6145be565b50806145b9565b604051906101a082018281106001600160401b03821117610366576040525f610180838281528260208201528260408201528260608201528260808201528260a08201528260c08201528260e0820152826101008201528261012082015282610140820152826101608201520152565b6148726147fa565b5061487b6147fa565b6044356001600160a01b038116908190036101ca577307339c13953afad77b783e1e783f7bba94bb86771480610180830152604051906148ba826140a2565b60043582525f6020830152602435604083015260608201526148db81614d0b565b8252600a90816148ea82614dbc565b0660208401526148f981614d0b565b60408401528161490882614dbc565b06606084015261491781614d0b565b60808401528161492682614dbc565b0660a084015261493581614d0b565b60c084015261494381614d0b565b60e08401528161495282614dbc565b0661010084015261496281614d0b565b6101208401528161497282614dbc565b066101408401908152600161498683614d0b565b11156149a1575061499690614dbc565b065b61016082015290565b91505051614998565b6001600160401b03811161036657601f01601f191660200190565b90916001600160a01b039190828216308114614bec57633b9aca00908183049485151580614bde575b80614bce575b614a31575b50614a2c92614617969492614a26925f525f60205280614a1e60405f205493846141c6565b0491046141c6565b90615176565b6156dc565b815f52602090600c8252604087815f20541480614baf575b614b4d57835f52600b8352805f20885f52835260ff815f20541680614b2e575b614a745750506149f9565b919793509350614aed82967f6a8e447c9916dceac1c68ef70944c2885cf9840edb9d6ee4c6fa9f2eb983ea4e96614b29945f5260098a52835f20600a8b52845f20835f528b52845f20545f528a52866002855f208651809d614ad582614087565b825482526001830154910152015416848b0152615567565b614af7878461549f565b5186518152602080880151908201526040968701516001600160a01b0316968101969096529116939081906060820190565b0390a3565b508189165f52600b8352805f20885f52835260ff815f20541615614a69565b919793509350614aed82967f6a8e447c9916dceac1c68ef70944c2885cf9840edb9d6ee4c6fa9f2eb983ea4e96614b29945f52600c8a52866002855f208651809d614b9782614087565b825482526001830154910152015416848b0152615176565b508189165f52600b8352805f20885f52835260ff815f20541615614a49565b50806005541681881614156149f4565b5080600554168214156149ee565b5050505050565b6001600160a01b0390811691908215614cb857825f525f60205260405f205490848210614c64577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9285602093865f525f85520360405f20551693845f5260405f20818154019055604051908152a3565b60405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608490fd5b60405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b614d35612710614d1a83614dbc565b069180516060820190606061ffff94859284511515906157fd565b0151168410614da557826040614d50845184511515906157fd565b0151168410614d9c57826020614d6b845184511515906157fd565b0151168410614d9357614d83915190511515906157fd565b511611614d8e575f90565b600190565b50505050600290565b50505050600390565b50505050600490565b5f198114611ba55760010190565b6060810151151590614de181516020830190815191614dda83614dae565b90526141b9565b5f19810191908211611ba5576040015160405191602083019360f81b84526021830152604182015260418152614e16816140a2565b51902090565b6103705f81805b614ea95750614e31816149aa565b90614e3f604051928361412a565b808252601f19614e4e826149aa565b013660208401375b80928015614ea2575f198201918211611ba5578193600a926030908484068201809211611ba5578551111561037a5760f81b6001600160f81b0319165f1a908401601f01530491614e56565b5050905090565b90614eb5600a91614dae565b910480614e23565b60dc5f81805b614ed15750614e31816149aa565b90614edd600a91614dae565b910480614ec3565b8015614f11575f81805b614efd5750614e31816149aa565b90614f09600a91614dae565b910480614eef565b50604051614f1e816140d8565b60018152600360fc1b602082015290565b5f92918154614f3d8161404f565b92600191808316908115614f945750600114614f5a575b50505050565b9091929394505f5260209060205f20905f915b858310614f83575050505001905f808080614f54565b805485840152918301918101614f6d565b60ff191684525050508115159091020191505f808080614f54565b6001600160a01b0390811690308214908115615066575b50801561505e575b61505957805f52600c60205260405f20546040519163fb700e5b60e01b83526004830152602082602481305afa90811561504e575f91615018575b61501392506141b9565b151590565b90506020823d602011615046575b816150336020938361412a565b810103126101ca57615013915190615009565b3d9150615026565b6040513d5f823e3d90fd5b505f90565b508015614fce565b90506005541681145f614fc6565b6150b8906010545f52600d60205260405f209060018060a01b031690816001600160601b0360a01b825416179055601054905f52600e6020528060405f2055614dae565b601055565b8015611ba5575f190190565b60105480156151725760018060a01b0380921690815f52600e602052604092835f2054915f198101908111611ba55780830361513b575b50505061510e6010546150bd565b6010555f52600e6020525f818120556010545f52600d6020525f206001600160601b0360a01b8154169055565b5f52600d602052835f205416815f52835f20816001600160601b0360a01b8254161790555f52600e602052825f20555f8080615100565b5050565b908015615172576005546001600160a01b0383811693909182168414614f5457835f52600c91602091838352604094855f20908651936151b585614087565b82548552600260019360018101548888015201541687850152875f52858552865f208054828110156153e4575050906151f98892835f52878752885f2054906141c6565b825f528686525f88812055600261521e615214601254614dae565b8060125586615ae1565b845f52888852895f2090600182015501936001600160601b0360a01b94848682541617905560088752885f205492805f945f925b615391575b50505091817f6ddbe98834305de55ea2ec4b2a06a0512f09e1c1d725411e4b8242e234bbbf5b999795936152e8999795938311615336575b50505050508051151580615325575b615312575b511580615300575b6152ed575b5f868152919052819020905181548152600182015460208201526002909101546001600160a01b031660408201529081906060820190565b0390a2565b6152f8601154614dae565b6011556152b0565b50855f52818152825f205415156152ab565b61531d6011546150bd565b6011556152a3565b50865f52828252835f20541561529e565b615345615370926002946141c6565b845f528888526153598a5f209182546141b9565b9055615366601254614dae565b9081601255615ae1565b825f52868652875f2090600182015501918254161790555f8781808061528f565b91958287969294959610806153db575b156153d057506153bd6153c3916153b786615b0d565b906141b9565b95614dae565b90918b9594939281615252565b958195949350615257565b508582106153a1565b6152e8979593509061535961541d937f6ddbe98834305de55ea2ec4b2a06a0512f09e1c1d725411e4b8242e234bbbf5b9a9896936141c6565b90875f52838352845f2091600183015560028201886001600160601b0360a01b8254161790555115159081615495575b5061548a575f868152919052819020905181548152600182015460208201526002909101546001600160a01b031660408201529081906060820190565b6152f86011546150bd565b905054155f61544d565b6005546001600160a01b0392918316908316811461556257805f5260209060088252604093845f206154d18154614dae565b90556154de600f54614dae565b600f55815f5260088352845f2054905f198201918211611ba557825f5260098452855f20825f5284526002865f2086518155858701516001820155019086860151166001600160601b0360a01b825416179055815f52600a8352845f2084515f528352845f20555f52600b8152825f2091515f52525f20600160ff19825416179055565b505050565b6005546001600160a01b03918216919081168214615562575f928260029385526020906008825260409384872061559e81546150bd565b90556155ab600f546150bd565b600f55818752600b8352848720848852835284872060ff198154169055818752600883528487205493600a845285882090885283528487205482885260098452858820818952845285882091808888519461560586614087565b8054865260018101548887015201541687840152858203615654575b5050818752600a835284872090518752825285848120558552600981528285209185525282208281558260018201550155565b83895260098552868920868a52855286892087519161567283614087565b815483528981816001850154948a8701958652015416928a8501938452878d52600989528a8d20868e5289528a8d209085518255516001820155019151166001600160601b0360a01b825416179055838952600a8552868920905189528452858820555f80615621565b8115615172576005546001600160a01b038281169390929183168414614f54577fcd2561f5bdc6e0cb93c359922c8dc410ee971417c06196509399047747f4707b9261576d6152e893865f52600c602052604093845f2093600286519561574287614087565b805487526001810154602088015201541685850152875f52600c602052615359855f209182546141b9565b90855f52600c602052825f2091600183015560028201866001600160601b0360a01b825416179055511590816157f2575b506157df575b835f52600c602052805f20905191829182919091604060608201938054835260018101546020840152600260018060a01b0391015416910152565b6157ea601154614dae565b6011556157a4565b90505415155f61579e565b604090815161580b816140a2565b3660809137815161581b816140a2565b61012c8152602093848201906104b08252848301610834815260609687850193610bb88552875161584b816140bd565b8851615856816140a2565b610c5c81526101ec84820152603d8a82015260068b820152815288519261587c846140a2565b610fab84526103258185015260738a85015260108b8501528181019384528951956158a6876140a2565b611326875261049f8288015260b68b88015260188c880152828b019687528a519a8c906158d28d6140a2565b6116568d52610611848e015260fc818e0152601f828e01528482019c8d5280519d8e6158fd816140a2565b61189881526107068682015261012e838201526025910152608085019d8e52805193615928856140a2565b611f408552840161177090528301610fa0905282016107d090528160a08401526159a5575061ffff8097511688106159975750518516861061598b57505183168410615981575051161161597b57505190565b90505190565b9450505050505190565b96505050505050505190565b985050505050505050505190565b995050505050505050505090565b7f3c70617468207472616e73666f726d3d277472616e736c617465282d3434302c8152672030292720643d2760c01b602082015260280190565b7f272066696c6c3d272333383338333827206f7061636974793d27302e3827202f8152601f60f91b602082015260210190565b9060409160405192615a31846140bd565b5f91845b60068410615a435750505050565b82518254915f91615a538461404f565b9283825260209360019586811690815f14615ac55750600114615a92575b5090615a8481600196959493038261412a565b815201920193019290615a35565b5f8781528581209092505b818310615ab257505081018301615a84615a71565b8054848401870152918501918601615a9d565b60ff19168685015250151560051b820184019050615a84615a71565b906040519060208201926001600160601b03199060601b168352603482015260348152614e1681614087565b6001600160a01b0381165f908152600860205260409020541561505957600960205260405f205f8052602052615b4860405f20548092615567565b90565b6060906001905f5b600a831115615b625750505090565b615b6b83614ee5565b93615b7682856141c6565b94600686101561037a57606a615c3791600597881b8601516213979f60e91b6040519586937f2e656e64272066696c6c3d27667265657a6527206174747269627574654e616d6020808481955191829101838a015e8701701e30b734b6b0ba32903132b3b4b71e93b360791b828201526031938051928391018583015e019182015275653d276427206475723d273330306d732720746f3d2760501b60518201526067938051928391018583015e019182015203604a81018452018261412a565b93831015615c515750615c4b5f5b92614dae565b91615b53565b60028101809111611ba557615c4b90615c45565b6060906001905f5b600a831115615c7c5750505090565b615c8583614ee5565b93615c9082856141c6565b94600686101561037a57606a615d5191600597881b8601516213979f60e91b6040519586937f2e656e64272066696c6c3d27667265657a6527206174747269627574654e616d6020808481955191829101838a015e8701701e30b734b6b0ba32903132b3b4b71e93b360791b828201526031938051928391018583015e019182015275653d276427206475723d273330306d732720746f3d2760501b60518201526067938051928391018583015e019182015203604a81018452018261412a565b93831015615d6a5750615d645f92614dae565b91615c6d565b60028101809111611ba557615d6490615c4556fe3c616e696d6174655472616e73666f726d20626567696e3d2730272066696c6c3c72656374206f7061636974793d2730272077696474683d2700000000000000272066696c6c3d272333383338333827206f7061636974793d27302e38273e0027207374726f6b652d77696474683d27302e3127207374726f6b653d2700000073272066726f6d3d273020302720746f3d2734343020302720726570656174433d27667265657a6527206174747269627574654e616d653d277472616e73666f726d2720747970653d277472616e736c61746527206475723d27000000000000a264697066735822122016fa089f61eb921f1e0c982a7a464085a4472c4504c719f89e3266d148101ada64736f6c63430008190033

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.