ETH Price: $1,854.02 (-13.60%)
 

Overview

Max Total Supply

256 EGGS

Holders

5

Transfers

-
0

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Eggs

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 2: Eggs.sol
/****************************************************
 *                                                  *
 *                EGGS Token (EGGS)                 *
 *                ERC-20721 Standard                *
 *                                                  *
 *  • Total Supply: 256 tokens only                 *
 *  • Initial Liquidity: 1 ETH + 128 EGGS           *
 *  • Mint Price: 0.1 ETH from contract             *
 *  • Available on Uniswap & OpenSea                *
 *                                                  *
 *   Official Links:                                *
 *  - Website: https://eggs.wtf                     *
 *  - X (Twitter): https://x.com/eggs20721          *
 *  - Telegram: https://t.me/eggs20721              *
 *                                                  *
 ****************************************************/


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

import "./Metadata.sol";



interface Receiver {
	function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns (bytes4);
}

interface Router {
	function WETH() external pure returns (address);
	function factory() external pure returns (address);
	function addLiquidityETH(address, uint256, uint256, uint256, address, uint256) external payable returns (uint256, uint256, uint256);
}

interface Factory {
	function createPair(address, address) external returns (address);
}


contract Eggs {

	uint256 constant private UINT_MAX = type(uint256).max;
	uint256 constant private TOTAL_SUPPLY = 256;
	uint256 constant private LIQUIDITY_TOKENS = 128;
	Router constant private ROUTER = Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

	uint256 constant private M1 = 0x5555555555555555555555555555555555555555555555555555555555555555;
	uint256 constant private M2 = 0x3333333333333333333333333333333333333333333333333333333333333333;
	uint256 constant private M4 = 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f;
	uint256 constant private H01 = 0x0101010101010101010101010101010101010101010101010101010101010101;
	bytes32 constant private TRANSFER_TOPIC = keccak256(bytes("Transfer(address,address,uint256)"));
	bytes32 constant private APPROVAL_TOPIC = keccak256(bytes("Approval(address,address,uint256)"));

	uint256 constant public MINT_COST = 0.1 ether;

	uint8 constant public decimals = 0;

	struct User {
		bytes32 mask;
		mapping(address => uint256) allowance;
		mapping(address => bool) approved;
	}

	struct Info {
		bytes32 salt;
		address pair;
		address owner;
		Metadata metadata;
		mapping(address => User) users;
		mapping(uint256 => address) approved;
		address[] holders;
	}
	Info private info;

	mapping(bytes4 => bool) public supportsInterface;


	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
	event ERC20Transfer(bytes32 indexed topic0, address indexed from, address indexed to, uint256 tokens) anonymous;
	event Approval(address indexed owner, address indexed spender, uint256 indexed tokenId);
	event ERC20Approval(bytes32 indexed topic0, address indexed owner, address indexed spender, uint256 tokens) anonymous;
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);


	modifier _onlyOwner() {
		require(msg.sender == owner());
		_;
	}


	constructor() payable {
		require(msg.value > 0);
		info.owner = 0xee112A6CaAFf9d16D12433F5C952ce871Ca95418;
		info.metadata = new Metadata();
		supportsInterface[0x01ffc9a7] = true; // ERC-165
		supportsInterface[0x80ac58cd] = true; // ERC-721
		supportsInterface[0x5b5e139f] = true; // Metadata
		info.salt = keccak256(abi.encodePacked("Salt:", blockhash(block.number - 1)));
	}

	function setOwner(address _owner) external _onlyOwner {
		info.owner = _owner;
	}

	function setMetadata(Metadata _metadata) external _onlyOwner {
		info.metadata = _metadata;
	}


	function initialize() external {
		require(pair() == address(0x0));
		address _this = address(this);
		address _weth = ROUTER.WETH();
		info.users[_this].mask = bytes32(UINT_MAX);
		info.holders.push(_this);
		emit ERC20Transfer(TRANSFER_TOPIC, address(0x0), _this, TOTAL_SUPPLY);
		for (uint256 i = 0; i < TOTAL_SUPPLY; i++) {
			emit Transfer(address(0x0), _this, TOTAL_SUPPLY + i + 1);
		}
		_approveERC20(_this, address(ROUTER), LIQUIDITY_TOKENS);
		info.pair = Factory(ROUTER.factory()).createPair(_weth, _this);
		ROUTER.addLiquidityETH{value:_this.balance}(_this, LIQUIDITY_TOKENS, 0, 0, owner(), block.timestamp);
		_transferERC20(_this, 0xee112A6CaAFf9d16D12433F5C952ce871Ca95418, 10); // marketing + giveaways
		_transferERC20(_this, owner(), 10); // developer tokens
	}

	function mint(uint256 _tokens) external payable {
		address _this = address(this);
		uint256 _available = balanceOf(_this);
		require(_tokens <= _available);
		uint256 _cost = _tokens * MINT_COST;
		require(msg.value >= _cost);
		_transferERC20(_this, msg.sender, _tokens);
		payable(owner()).transfer(_cost);
		if (msg.value > _cost) {
			payable(msg.sender).transfer(msg.value - _cost);
		}
	}
	
	function approve(address _spender, uint256 _tokens) external returns (bool) {
		if (_tokens > TOTAL_SUPPLY && _tokens <= 2 * TOTAL_SUPPLY) {
			_approveNFT(_spender, _tokens);
		} else {
			_approveERC20(msg.sender, _spender, _tokens);
		}
		return true;
	}

	function setApprovalForAll(address _operator, bool _approved) external {
		info.users[msg.sender].approved[_operator] = _approved;
		emit ApprovalForAll(msg.sender, _operator, _approved);
	}

	function transfer(address _to, uint256 _tokens) external returns (bool) {
		_transferERC20(msg.sender, _to, _tokens);
		return true;
	}

	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
		if (_tokens > TOTAL_SUPPLY && _tokens <= 2 * TOTAL_SUPPLY) {
			_transferNFT(_from, _to, _tokens);
		} else {
			uint256 _allowance = allowance(_from, msg.sender);
			require(_allowance >= _tokens);
			if (_allowance != UINT_MAX) {
				info.users[_from].allowance[msg.sender] -= _tokens;
			}
			_transferERC20(_from, _to, _tokens);
		}
		return true;
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
		safeTransferFrom(_from, _to, _tokenId, "");
	}

	function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
		_transferNFT(_from, _to, _tokenId);
		uint32 _size;
		assembly {
			_size := extcodesize(_to)
		}
		if (_size > 0) {
			require(Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) == 0x150b7a02);
		}
	}

	function bulkTransfer(address _to, uint256[] memory _tokenIds) external {
		_transferNFTs(_to, _tokenIds);
	}
	

	function owner() public view returns (address) {
		return info.owner;
	}

	function pair() public view returns (address) {
		return info.pair;
	}

	function holders() public view returns (address[] memory) {
		return info.holders;
	}

	function salt() external view returns (bytes32) {
		return info.salt;
	}

	function metadata() external view returns (address) {
		return address(info.metadata);
	}

	function name() external view returns (string memory) {
		return info.metadata.name();
	}

	function symbol() external view returns (string memory) {
		return info.metadata.symbol();
	}

	function tokenURI(uint256 _tokenId) public view returns (string memory) {
		return info.metadata.tokenURI(_tokenId);
	}

	function totalSupply() public pure returns (uint256) {
		return TOTAL_SUPPLY;
	}

	function maskOf(address _user) public view returns (bytes32) {
		return info.users[_user].mask;
	}

	function balanceOf(address _user) public view returns (uint256) {
		return _popcount(maskOf(_user));
	}

	function allowance(address _user, address _spender) public view returns (uint256) {
		return info.users[_user].allowance[_spender];
	}

	function ownerOf(uint256 _tokenId) public view returns (address) {
		unchecked {
			require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY);
			bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1));
			address[] memory _holders = holders();
			for (uint256 i = 0; i < _holders.length; i++) {
				if (maskOf(_holders[i]) & _mask == _mask) {
					return _holders[i];
				}
			}
			return address(0x0);
		}
	}

	function getApproved(uint256 _tokenId) public view returns (address) {
		require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY);
		return info.approved[_tokenId];
	}

	function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
		return info.users[_owner].approved[_operator];
	}

	function getToken(uint256 _tokenId) public view returns (address tokenOwner, address approved, string memory uri) {
		return (ownerOf(_tokenId), getApproved(_tokenId), tokenURI(_tokenId));
	}

	function getTokens(uint256[] memory _tokenIds) external view returns (address[] memory owners, address[] memory approveds, string[] memory uris) {
		uint256 _length = _tokenIds.length;
		owners = new address[](_length);
		approveds = new address[](_length);
		uris = new string[](_length);
		for (uint256 i = 0; i < _length; i++) {
			(owners[i], approveds[i], uris[i]) = getToken(_tokenIds[i]);
		}
	}


	function _approveERC20(address _owner, address _spender, uint256 _tokens) internal {
		info.users[_owner].allowance[_spender] = _tokens;
		emit ERC20Approval(APPROVAL_TOPIC, _owner, _spender, _tokens);
	}

	function _approveNFT(address _spender, uint256 _tokenId) internal {
		bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1));
		require(maskOf(msg.sender) & _mask == _mask);
		info.approved[_tokenId] = _spender;
		emit Approval(msg.sender, _spender, _tokenId);
	}
	
	function _transferERC20(address _from, address _to, uint256 _tokens) internal {
		unchecked {
			bytes32 _mask;
			uint256 _pos = 0;
			uint256 _count = 0;
			uint256 _n = uint256(maskOf(_from));
			uint256[] memory _tokenIds = new uint256[](_tokens);
			while (_n > 0 && _count < _tokens) {
				if (_n & 1 == 1) {
					_mask |= bytes32(1 << _pos);
					_tokenIds[_count++] = TOTAL_SUPPLY + _pos + 1;
				}
				_pos++;
				_n >>= 1;
			}
			require(_count == _tokens);
			require(maskOf(_from) & _mask == _mask);
			_transfer(_from, _to, _mask, _tokenIds);
		}
	}
	
	function _transferNFT(address _from, address _to, uint256 _tokenId) internal {
		unchecked {
			require(_tokenId > TOTAL_SUPPLY && _tokenId <= 2 * TOTAL_SUPPLY);
			bytes32 _mask = bytes32(1 << (_tokenId - TOTAL_SUPPLY - 1));
			require(maskOf(_from) & _mask == _mask);
			require(msg.sender == _from || msg.sender == getApproved(_tokenId) || isApprovedForAll(_from, msg.sender));
			uint256[] memory _tokenIds = new uint256[](1);
			_tokenIds[0] = _tokenId;
			_transfer(_from, _to, _mask, _tokenIds);
		}
	}
	
	function _transferNFTs(address _to, uint256[] memory _tokenIds) internal {
		unchecked {
			bytes32 _mask;
			for (uint256 i = 0; i < _tokenIds.length; i++) {
				_mask |= bytes32(1 << (_tokenIds[i] - TOTAL_SUPPLY - 1));
			}
			require(_popcount(_mask) == _tokenIds.length);
			require(maskOf(msg.sender) & _mask == _mask);
			_transfer(msg.sender, _to, _mask, _tokenIds);
		}
	}

	function _transfer(address _from, address _to, bytes32 _mask, uint256[] memory _tokenIds) internal {
		unchecked {
			require(_tokenIds.length > 0);
			for (uint256 i = 0; i < _tokenIds.length; i++) {
				if (getApproved(_tokenIds[i]) != address(0x0)) {
					info.approved[_tokenIds[i]] = address(0x0);
					emit Approval(address(0x0), address(0x0), _tokenIds[i]);
				}
				emit Transfer(_from, _to, _tokenIds[i]);
			}
			info.users[_from].mask ^= _mask;
			bool _from0 = maskOf(_from) == 0x0;
			bool _to0 = maskOf(_to) == 0x0;
			info.users[_to].mask |= _mask;
			if (_from0) {
				uint256 _index;
				address[] memory _holders = holders();
				for (uint256 i = 0; i < _holders.length; i++) {
					if (_holders[i] == _from) {
						_index = i;
						break;
					}
				}
				if (_to0) {
					info.holders[_index] = _to;
				} else {
					info.holders[_index] = _holders[_holders.length - 1];
					info.holders.pop();
				}
			} else if (_to0) {
				info.holders.push(_to);
			}
			require(maskOf(_from) & maskOf(_to) == 0x0);
			emit ERC20Transfer(TRANSFER_TOPIC, _from, _to, _tokenIds.length);
		}
	}


	function _popcount(bytes32 _b) internal pure returns (uint256) {
		uint256 _n = uint256(_b);
		if (_n == UINT_MAX) {
			return 256;
		}
		unchecked {
			_n -= (_n >> 1) & M1;
			_n = (_n & M2) + ((_n >> 2) & M2);
			_n = (_n + (_n >> 4)) & M4;
			_n = (_n * H01) >> 248;
		}
		return _n;
	}
}


contract Deploy {
	Eggs immutable public eggs;
	constructor() payable {
		eggs = new Eggs{value:msg.value}();
		eggs.initialize();
	}
}

File 2 of 2: Metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

interface CM {
	function salt() external view returns (bytes32);
}

contract Metadata {
	
	string public name = "Eggs";
	string public symbol = "EGGS";

	string constant private TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
	bytes3 constant private BG_COLOR = 0xd1d3dc;
	uint256 constant private PADDING = 2;

	struct Size {
		uint248 size;
		uint8 chance;
	}
	Size[] private sizes;

	struct Color {
		bytes3 primaryColor;
		bytes3 outlineColor;
		uint8 chance;
		string name;
	}
	Color[] private colors;

	CM immutable public eggs;


	constructor() {
		eggs = CM(msg.sender);

		// sizes
		sizes.push(Size(14, 120));
		sizes.push(Size(16, 80));
		sizes.push(Size(18, 50));
		sizes.push(Size(20, 20));
		sizes.push(Size(22, 10));
		sizes.push(Size(24, 5));
		
		// colors
		colors.push(Color(0x179629, 0x15491f, 100, "Slimy Green"));
		colors.push(Color(0xc9a91c, 0x5f5120, 75, "Pacific Blue"));
		colors.push(Color(0x009fff, 0x144d79, 55, "Orange Peel"));
		colors.push(Color(0x3bb5cf, 0x235763, 35, "Old Gold"));
		colors.push(Color(0x908070, 0x463f38, 25, "Slate Gray"));
		colors.push(Color(0xac8fe6, 0x53466d, 15, "Charm Pink"));
		colors.push(Color(0x2b2ca6, 0x191d52, 10, "Metallic Red"));
		colors.push(Color(0xa95178, 0x522b3d, 5, "Royal Purple"));
	}

	function tokenURI(uint256 _tokenId) external view returns (string memory) {
		unchecked {
			( , uint256 _size, uint256 _colorIndex) = _getTokenInfo(_tokenId);
			string memory _json = string(abi.encodePacked('{"name":"EGG #', _uint2str(_tokenId), '","description":"Experimental hybrid ERC-20 & ERC-721","external_url":"https://eggs.wtf/#/token/', _uint2str(_tokenId), '",'));
			_json = string(abi.encodePacked(_json, '"image":"', svgURI(_tokenId), '","attributes":['));
			_json = string(abi.encodePacked(_json, '{"trait_type":"Size","value":', _uint2str(_size - 2 * PADDING), '},'));
			_json = string(abi.encodePacked(_json, '{"trait_type":"Color","value":"', colors[_colorIndex].name, '"}'));
			_json = string(abi.encodePacked(_json, ']}'));
			return string(abi.encodePacked('data:application/json;base64,', _encode(bytes(_json))));
		}
	}

	function svgURI(uint256 _tokenId) public view returns (string memory) {
		return string(abi.encodePacked('data:image/svg+xml;base64,', _encode(bytes(getSVG(_tokenId)))));
	}
	
	function bmpURI(uint256 _tokenId) public view returns (string memory) {
		return string(abi.encodePacked('data:image/bmp;base64,', _encode(getBMP(_tokenId))));
	}

	function getSVG(uint256 _tokenId) public view returns (string memory) {
		return string(abi.encodePacked('<svg xmlns="http://www.w3.org/2000/svg" version="1.1" preserveAspectRatio="xMidYMid meet" viewBox="0 0 512 512" width="100%" height="100%"><defs><style type="text/css">svg{image-rendering:optimizeSpeed;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-optimize-contrast;image-rendering:pixelated;image-rendering:optimize-contrast;-ms-interpolation-mode:nearest-neighbor;background-color:', _col2str(BG_COLOR), ';background-image:url(', bmpURI(_tokenId), ');background-repeat:no-repeat;background-size:contain;background-position:50% 50%;}</style></defs></svg>'));
	}
	
	function getBMP(uint256 _tokenId) public view returns (bytes memory) {
		(bytes32 _seed, uint256 _size, uint256 _colorIndex) = _getTokenInfo(_tokenId);
		return _getBMP(_makePalette(colors[_colorIndex].primaryColor, colors[_colorIndex].outlineColor), _convertToColors(_addOutline(_expandAndReflect(_step(_step(_getInitialState(_seed, _size)))))), _size);
	}
	
	
	function _getTokenInfo(uint256 _tokenId) internal view returns (bytes32 seed, uint256 size, uint256 colorIndex) {
		unchecked {
			seed = keccak256(abi.encodePacked("Seed:", _tokenId, eggs.salt()));
			size = _sampleSize(seed);
			colorIndex = _sampleColor(seed);
		}
	}

	function _sampleSize(bytes32 _seed) internal view returns (uint256 size) {
		unchecked {
			uint256 _total = 0;
			for (uint256 i = 0; i < sizes.length; i++) {
				_total += sizes[i].chance;
			}
			uint256 _target = uint256(keccak256(abi.encodePacked("Size:", _seed))) % _total;
			_total = 0;
			for (uint256 i = 0; i < sizes.length; i++) {
				_total += sizes[i].chance;
				if (_target < _total) {
					return sizes[i].size;
				}
			}
		}
	}

	function _sampleColor(bytes32 _seed) internal view returns (uint256 colorIndex) {
		unchecked {
			uint256 _total = 0;
			for (uint256 i = 0; i < colors.length; i++) {
				_total += colors[i].chance;
			}
			uint256 _target = uint256(keccak256(abi.encodePacked("Color:", _seed))) % _total;
			_total = 0;
			for (uint256 i = 0; i < colors.length; i++) {
				_total += colors[i].chance;
				if (_target < _total) {
					return i;
				}
			}
		}
	}

	function _getInitialState(bytes32 _seed, uint256 _size) internal pure returns (uint8[][] memory state) {
		unchecked {
			uint256 _rollingSeed = uint256(keccak256(abi.encodePacked("State:", _seed)));
			state = new uint8[][](_size - 2 * PADDING - 2);
			for (uint256 y = 0; y < state.length; y++) {
				state[y] = new uint8[](_size / 2 - PADDING - 1);
				for (uint256 x = 0; x < state[y].length; x++) {
					state[y][x] = uint8(_rollingSeed % 2);
					if (_rollingSeed < type(uint16).max) {
						_rollingSeed = uint256(keccak256(abi.encodePacked("Roll:", _seed, _rollingSeed)));
					} else {
						_rollingSeed /= 2;
					}
				}
			}
		}
	}

	function _getNeighborhood(uint8[][] memory _state) internal pure returns (uint8[][] memory neighborhood) {
		unchecked {
			neighborhood = new uint8[][](_state.length);
			for (uint256 y = 0; y < _state.length; y++) {
				neighborhood[y] = new uint8[](_state[y].length);
				for (uint256 x = 0; x < _state[y].length; x++) {
					uint8 _count = 0;
					if (y > 0) {
						_count += _state[y - 1][x];
					}
					if (y < _state.length - 1) {
						_count += _state[y + 1][x];
					}
					if (x > 0) {
						_count += _state[y][x - 1];
					}
					if (x < _state[y].length - 1) {
						_count += _state[y][x + 1];
					}
					neighborhood[y][x] = _count;
				}
			}
		}
	}

	function _step(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) {
		unchecked {
			uint8[][] memory _neighborhood = _getNeighborhood(_state);
			newState = new uint8[][](_state.length);
			for (uint256 y = 0; y < _state.length; y++) {
				newState[y] = new uint8[](_state[y].length);
				for (uint256 x = 0; x < _state[y].length; x++) {
					newState[y][x] = ((_state[y][x] == 0 && _neighborhood[y][x] <= 1) || (_state[y][x] == 1 && (_neighborhood[y][x] == 2 || _neighborhood[y][x] == 3))) ? 1 : 0;
				}
			}
		}
	}

	function _expandAndReflect(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) {
		unchecked {
			newState = new uint8[][](_state.length + 2 * PADDING + 2);
			for (uint256 y = 0; y < newState.length; y++) {
				newState[y] = new uint8[](_state.length + 2 * PADDING + 2);
				for (uint256 x = 0; x < newState[y].length; x++) {
					if (y > PADDING && y <= _state.length + PADDING && x > PADDING && x <= _state.length + PADDING) {
						newState[y][x] = _state[y - PADDING - 1][x > _state[y - PADDING - 1].length + PADDING ? _state.length + PADDING - x : x - PADDING - 1];
					} else {
						newState[y][x] = 0;
					}
				}
			}
		}
	}

	function _addOutline(uint8[][] memory _state) internal pure returns (uint8[][] memory newState) {
		unchecked {
			uint8[][] memory _neighborhood = _getNeighborhood(_state);
			newState = new uint8[][](_state.length);
			for (uint256 y = 0; y < _state.length; y++) {
				newState[y] = new uint8[](_state[y].length);
				for (uint256 x = 0; x < _state[y].length; x++) {
					newState[y][x] = _state[y][x] == 0 && _neighborhood[y][x] > 0 ? 2 : _state[y][x];
				}
			}
		}
	}

	function _convertToColors(uint8[][] memory _state) internal pure returns (bytes memory cols) {
		unchecked {
			uint256 _scanline = _state[0].length;
			if (_scanline % 4 != 0) {
				_scanline += 4 - (_scanline % 4);
			}
			cols = new bytes(_state.length * _scanline);
			for (uint256 y = 0; y < _state.length; y++) {
				for (uint256 x = 0; x < _state[y].length; x++) {
					cols[(_state.length - y - 1) * _scanline + x] = bytes1(_state[y][x]);
				}
			}
		}
	}
	
	function _makePalette(bytes3 _primaryColor, bytes3 _outlineColor) internal pure returns (bytes memory) {
		unchecked {
			return abi.encodePacked(BG_COLOR, bytes1(0), _primaryColor, bytes1(0), _outlineColor, bytes1(0));
		}
	}

	function _getBMP(bytes memory _palette, bytes memory _colors, uint256 _size) internal pure returns (bytes memory) {
		unchecked {
			uint32 _bufSize = 14 + 40 + uint32(_palette.length);
			bytes memory _buf = new bytes(_bufSize - _palette.length);
			_buf[0] = 0x42;
			_buf[1] = 0x4d;
			uint32 _tmp = _bufSize + uint32(_colors.length);
			uint32 b;
			for (uint i = 2; i < 6; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
			}
			_tmp = _bufSize;
			for (uint i = 10; i < 14; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
			}
			_buf[14] = 0x28;
			_tmp = uint32(_size);
			for (uint i = 18; i < 22; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
				_buf[i + 4] = bytes1(uint8(b));
			}
			_buf[26] = 0x01;
			_buf[28] = 0x08;
			_tmp = uint32(_colors.length);
			for (uint i = 34; i < 38; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
			}
			_tmp = uint32(_palette.length / 4);
			for (uint i = 46; i < 50; i++) {
				assembly {
					b := and(_tmp, 0xff)
					_tmp := shr(8, _tmp)
				}
				_buf[i] = bytes1(uint8(b));
				_buf[i + 4] = bytes1(uint8(b));
			}
			return abi.encodePacked(_buf, _palette, _colors);
		}
	}

	function _uint2str(uint256 _value) internal pure returns (string memory) {
		unchecked {
			uint256 _digits = 1;
			uint256 _n = _value;
			while (_n > 9) {
				_n /= 10;
				_digits++;
			}
			bytes memory _out = new bytes(_digits);
			for (uint256 i = 0; i < _out.length; i++) {
				uint256 _dec = (_value / (10**(_out.length - i - 1))) % 10;
				_out[i] = bytes1(uint8(_dec) + 48);
			}
			return string(_out);
		}
	}

	function _col2str(bytes3 _col) internal pure returns (string memory str) {
		unchecked {
			str = "#";
			for (uint256 i = 0; i < 6; i++) {
				uint256 _hex = (uint24(_col) >> (4 * (i + 1 - 2 * (i % 2)))) % 16;
				bytes memory _char = new bytes(1);
				_char[0] = bytes1(uint8(_hex) + (_hex > 9 ? 87 : 48));
				str = string(abi.encodePacked(str, string(_char)));
			}
		}
	}

	function _encode(bytes memory _data) internal pure returns (string memory result) {
		unchecked {
			if (_data.length == 0) return '';
			string memory _table = TABLE;
			uint256 _encodedLen = 4 * ((_data.length + 2) / 3);
			result = new string(_encodedLen + 32);

			assembly {
				mstore(result, _encodedLen)
				let tablePtr := add(_table, 1)
				let dataPtr := _data
				let endPtr := add(dataPtr, mload(_data))
				let resultPtr := add(result, 32)

				for {} lt(dataPtr, endPtr) {}
				{
					dataPtr := add(dataPtr, 3)
					let input := mload(dataPtr)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
					resultPtr := add(resultPtr, 1)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
					resultPtr := add(resultPtr, 1)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
					resultPtr := add(resultPtr, 1)
					mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
					resultPtr := add(resultPtr, 1)
				}
				switch mod(mload(_data), 3)
				case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
				case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
			}
			return result;
		}
	}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Approval","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes32","name":"topic0","type":"bytes32"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","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":"_tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"bulkTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getToken","outputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"approved","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"getTokens","outputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"address[]","name":"approveds","type":"address[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"maskOf","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"salt","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract Metadata","name":"_metadata","type":"address"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","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":"_tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040525f341161000f575f5ffd5b600280546001600160a01b03191673ee112a6caaff9d16d12433f5c952ce871ca9541817905560405161004190610152565b604051809103905ff08015801561005a573d5f5f3e3d5ffd5b50600380546001600160a01b0319166001600160a01b039290921691909117905560076020527f1142c8ae8ad77901cd97fce843895a9ccf91a8cbd5b191350a94c1d957b07f74805460ff1990811660019081179092557f2379132be4428a30bdcf8f40c0757cba23c7e3f4204cd933dabcc3d42093e8048054821683179055635b5e139f60e01b5f527f7108cf076693445f3e0461801864e91d74eb5e0eee196ef60b5961a16cd35b93805490911682179055610118904361015f565b6040516429b0b63a1d60d91b60208201529040602582015260450160408051601f1981840301815291905280516020909101205f55610184565b612b9c8061218b83390190565b8181038181111561017e57634e487b7160e01b5f52601160045260245ffd5b92915050565b611ffa806101915f395ff3fe6080604052600436106101d0575f3560e01c80638188f71c116100fd578063bfa0b13311610092578063dd62ed3e11610062578063dd62ed3e14610537578063e4b50cb81461057f578063e985e9c5146105ad578063f3cb8385146105f8575f5ffd5b8063bfa0b133146104cb578063c662e481146104de578063c87b56dd146104f9578063d28a476114610518575f5ffd5b8063a22cb465116100cd578063a22cb46514610451578063a8aa1b3114610470578063a9059cbb1461048d578063b88d4fde146104ac575f5ffd5b80638188f71c146103ec5780638da5cb5b1461040d57806395d89b411461042a578063a0712d681461043e575f5ffd5b80632497ab151161017357806342842e0e1161014357806342842e0e1461037b5780636352211e1461039a57806370a08231146103b95780638129fc1c146103d8575f5ffd5b80632497ab15146102ec578063313ce5671461030b57806332ba0a1e14610330578063392f37e91461035e575f5ffd5b8063095ea7b3116101ae578063095ea7b31461026f57806313af40351461028e57806318160ddd146102af57806323b872dd146102cd575f5ffd5b806301ffc9a7146101d457806306fdde0314610217578063081812fc14610238575b5f5ffd5b3480156101df575f5ffd5b506102026101ee36600461195c565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610222575f5ffd5b5061022b610617565b60405161020e91906119ac565b348015610243575f5ffd5b506102576102523660046119be565b61068a565b6040516001600160a01b03909116815260200161020e565b34801561027a575f5ffd5b506102026102893660046119e9565b6106cb565b348015610299575f5ffd5b506102ad6102a8366004611a13565b610712565b005b3480156102ba575f5ffd5b506101005b60405190815260200161020e565b3480156102d8575f5ffd5b506102026102e7366004611a2e565b61074a565b3480156102f7575f5ffd5b506102bf610306366004611a13565b610809565b348015610316575f5ffd5b5061031e5f81565b60405160ff909116815260200161020e565b34801561033b575f5ffd5b5061034f61034a366004611b31565b610823565b60405161020e93929190611bae565b348015610369575f5ffd5b506003546001600160a01b0316610257565b348015610386575f5ffd5b506102ad610395366004611a2e565b6109a7565b3480156103a5575f5ffd5b506102576103b43660046119be565b6109c6565b3480156103c4575f5ffd5b506102bf6103d3366004611a13565b610a61565b3480156103e3575f5ffd5b506102ad610a73565b3480156103f7575f5ffd5b50610400610e38565b60405161020e9190611c38565b348015610418575f5ffd5b506002546001600160a01b0316610257565b348015610435575f5ffd5b5061022b610e9a565b6102ad61044c3660046119be565b610ee1565b34801561045c575f5ffd5b506102ad61046b366004611c4a565b610fa1565b34801561047b575f5ffd5b506001546001600160a01b0316610257565b348015610498575f5ffd5b506102026104a73660046119e9565b611010565b3480156104b7575f5ffd5b506102ad6104c6366004611cac565b61101c565b3480156104d6575f5ffd5b505f546102bf565b3480156104e9575f5ffd5b506102bf67016345785d8a000081565b348015610504575f5ffd5b5061022b6105133660046119be565b6110c2565b348015610523575f5ffd5b506102ad610532366004611d54565b611130565b348015610542575f5ffd5b506102bf610551366004611da1565b6001600160a01b039182165f9081526004602090815260408083209390941682526001909201909152205490565b34801561058a575f5ffd5b5061059e6105993660046119be565b61113a565b60405161020e93929190611dcd565b3480156105b8575f5ffd5b506102026105c7366004611da1565b6001600160a01b039182165f9081526004602090815260408083209390941682526002909201909152205460ff1690565b348015610603575f5ffd5b506102ad610612366004611a13565b611166565b600354604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301925f9291908290030181865afa15801561065e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106859190810190611e01565b905090565b5f610100821180156106a857506106a46101006002611e8a565b8211155b6106b0575f5ffd5b505f908152600560205260409020546001600160a01b031690565b5f610100821180156106e957506106e56101006002611e8a565b8211155b156106fd576106f8838361119e565b610708565b61070833848461122b565b5060015b92915050565b6002546001600160a01b03163314610728575f5ffd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6101008211801561076857506107646101006002611e8a565b8211155b1561077d57610778848484611294565b6107ff565b6001600160a01b0384165f908152600460209081526040808320338452600101909152902054828110156107af575f5ffd5b5f1981146107f2576001600160a01b0385165f908152600460209081526040808320338452600101909152812080548592906107ec908490611ea1565b90915550505b6107fd858585611381565b505b5060019392505050565b6001600160a01b03165f9081526004602052604090205490565b60608060605f845190508067ffffffffffffffff81111561084657610846611a6c565b60405190808252806020026020018201604052801561086f578160200160208202803683370190505b5093508067ffffffffffffffff81111561088b5761088b611a6c565b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b5092508067ffffffffffffffff8111156108d0576108d0611a6c565b60405190808252806020026020018201604052801561090357816020015b60608152602001906001900390816108ee5790505b5091505f5b8181101561099e5761093286828151811061092557610925611eb4565b602002602001015161113a565b87848151811061094457610944611eb4565b6020026020010187858151811061095d5761095d611eb4565b6020026020010187868151811061097657610976611eb4565b60209081029190910101929092526001600160a01b0392831690915291169052600101610908565b50509193909250565b6109c183838360405180602001604052805f81525061101c565b505050565b5f610100821180156109da57506102008211155b6109e2575f5ffd5b60016101001983011b5f6109f4610e38565b90505f5b8151811015610a57578283610a25848481518110610a1857610a18611eb4565b6020026020010151610809565b1603610a4f57818181518110610a3d57610a3d611eb4565b60200260200101519350505050919050565b6001016109f8565b505f949350505050565b5f61070c610a6e83610809565b61146e565b5f610a866001546001600160a01b031690565b6001600160a01b031614610a98575f5ffd5b5f3090505f737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b119190611ec8565b6001600160a01b0383165f8181526004602090815260408083205f199055600680546001810182559084527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916851790558051606081019091526021808252949550929391929190611fa49083013980519060200120610100604051610ba591815260200190565b60405180910390a35f5b610100811015610c0d57610bc581610100611ee3565b610bd0906001611ee3565b6040516001600160a01b038516905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610baf565b50610c2e82737a250d5630b4cf539739df2c5dacb4c659f2488d608061122b565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca29190611ec8565b6040516364e329cb60e11b81526001600160a01b0383811660048301528481166024830152919091169063c9c65396906044016020604051808303815f875af1158015610cf1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190611ec8565b600180546001600160a01b039283166001600160a01b0319909116179055737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d719908416318460805f80610d696002546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dcf573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610df49190611ef6565b505050610e178273ee112a6caaff9d16d12433f5c952ce871ca95418600a611381565b610e3482610e2d6002546001600160a01b031690565b600a611381565b5050565b60605f600601805480602002602001604051908101604052809291908181526020018280548015610e9057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e72575b5050505050905090565b600354604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa15801561065e573d5f5f3e3d5ffd5b305f610eec82610a61565b905080831115610efa575f5ffd5b5f610f0d67016345785d8a000085611e8a565b905080341015610f1b575f5ffd5b610f26833386611381565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610f5d573d5f5f3e3d5ffd5b5080341115610f9b57336108fc610f748334611ea1565b6040518115909202915f818181858888f19350505050158015610f99573d5f5f3e3d5ffd5b505b50505050565b335f8181526004602090815260408083206001600160a01b0387168085526002909101835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610708338484611381565b611027848484611294565b823b63ffffffff811615610f9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611067903390899088908890600401611f21565b6020604051808303815f875af1158015611083573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a79190611f53565b6001600160e01b03191663150b7a0260e01b14610f99575f5ffd5b60035460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd906024015f60405180830381865afa158015611109573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070c9190810190611e01565b610e34828261152b565b5f5f6060611147846109c6565b6111508561068a565b611159866110c2565b9250925092509193909250565b6002546001600160a01b0316331461117c575f5ffd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f60016111ad61010084611ea1565b6111b79190611ea1565b6001901b905080806111c833610809565b16146111d2575f5ffd5b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6001600160a01b038084165f8181526004602090815260408083209487168084526001909501825291829020859055815160608101909252602180835290611f8390830139805190602001208360405161128791815260200190565b60405180910390a3505050565b610100811180156112a757506102008111155b6112af575f5ffd5b60016101001982011b80806112c386610809565b16146112cd575f5ffd5b336001600160a01b03851614806112fd57506112e88261068a565b6001600160a01b0316336001600160a01b0316145b8061132d57506001600160a01b0384165f90815260046020908152604080832033845260020190915290205460ff165b611335575f5ffd5b6040805160018082528183019092525f916020808301908036833701905050905082815f8151811061136957611369611eb4565b602002602001018181525050610f99858584846115a1565b5f80808061138e87610809565b90505f8567ffffffffffffffff8111156113aa576113aa611a6c565b6040519080825280602002602001820160405280156113d3578160200160208202803683370190505b5090505b5f821180156113e557508583105b156114385781600116600103611428578051600180861b9690961795840193610101860191839190811061141b5761141b611eb4565b6020026020010181815250505b6001938401939190911c906113d7565b858314611443575f5ffd5b848561144e8a610809565b1614611458575f5ffd5b611464888887846115a1565b5050505050505050565b5f8160018101611482575061010092915050565b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c92915050565b5f805b825181101561156f57600161010084838151811061154e5761154e611eb4565b602002602001015103036001901b5f1b82179150808060010191505061152e565b50815161157b8261146e565b14611584575f5ffd5b808161158f33610809565b1614611599575f5ffd5b6109c1338483855b5f8151116115ad575f5ffd5b5f5b81518110156116ee575f6001600160a01b03166115e48383815181106115d7576115d7611eb4565b602002602001015161068a565b6001600160a01b03161461168c575f5f6005015f84848151811061160a5761160a611eb4565b602002602001015181526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061165457611654611eb4565b60209081029190910101516040515f9081907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908290a45b81818151811061169e5761169e611eb4565b6020026020010151846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016115af565b506001600160a01b0384165f90815260046020526040812080548418905561171585610809565b1590505f61172285610809565b6001600160a01b0386165f9081526004602052604090208054861790551590508115611882575f5f611752610e38565b90505f5b81518110156117a157886001600160a01b031682828151811061177b5761177b611eb4565b60200260200101516001600160a01b031603611799578092506117a1565b600101611756565b5082156117ee57865f60060183815481106117be576117be611eb4565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061187b565b8060018251038151811061180457611804611eb4565b60200260200101515f600601838154811061182157611821611eb4565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600680548061185a5761185a611f6e565b5f8281526020902081015f1990810180546001600160a01b03191690550190555b50506118d3565b80156118d357600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0387161790555b6118dc85610809565b6118e587610809565b16156118ef575f5ffd5b846001600160a01b0316866001600160a01b0316604051806060016040528060218152602001611fa46021913980519060200120855160405161193491815260200190565b60405180910390a3505050505050565b6001600160e01b031981168114611959575f5ffd5b50565b5f6020828403121561196c575f5ffd5b813561197781611944565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611977602083018461197e565b5f602082840312156119ce575f5ffd5b5035919050565b6001600160a01b0381168114611959575f5ffd5b5f5f604083850312156119fa575f5ffd5b8235611a05816119d5565b946020939093013593505050565b5f60208284031215611a23575f5ffd5b8135611977816119d5565b5f5f5f60608486031215611a40575f5ffd5b8335611a4b816119d5565b92506020840135611a5b816119d5565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611aa957611aa9611a6c565b604052919050565b5f82601f830112611ac0575f5ffd5b813567ffffffffffffffff811115611ada57611ada611a6c565b8060051b611aea60208201611a80565b91825260208185018101929081019086841115611b05575f5ffd5b6020860192505b83831015611b27578235825260209283019290910190611b0c565b9695505050505050565b5f60208284031215611b41575f5ffd5b813567ffffffffffffffff811115611b57575f5ffd5b611b6384828501611ab1565b949350505050565b5f8151808452602084019350602083015f5b82811015611ba45781516001600160a01b0316865260209586019590910190600101611b7d565b5093949350505050565b606081525f611bc06060830186611b6b565b8281036020840152611bd28186611b6b565b9050828103604084015280845180835260208301915060208160051b840101602087015f5b83811015611c2957601f19868403018552611c1383835161197e565b6020958601959093509190910190600101611bf7565b50909998505050505050505050565b602081525f6119776020830184611b6b565b5f5f60408385031215611c5b575f5ffd5b8235611c66816119d5565b915060208301358015158114611c7a575f5ffd5b809150509250929050565b5f67ffffffffffffffff821115611c9e57611c9e611a6c565b50601f01601f191660200190565b5f5f5f5f60808587031215611cbf575f5ffd5b8435611cca816119d5565b93506020850135611cda816119d5565b925060408501359150606085013567ffffffffffffffff811115611cfc575f5ffd5b8501601f81018713611d0c575f5ffd5b8035611d1f611d1a82611c85565b611a80565b818152886020838501011115611d33575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f60408385031215611d65575f5ffd5b8235611d70816119d5565b9150602083013567ffffffffffffffff811115611d8b575f5ffd5b611d9785828601611ab1565b9150509250929050565b5f5f60408385031215611db2575f5ffd5b8235611dbd816119d5565b91506020830135611c7a816119d5565b6001600160a01b038481168252831660208201526060604082018190525f90611df89083018461197e565b95945050505050565b5f60208284031215611e11575f5ffd5b815167ffffffffffffffff811115611e27575f5ffd5b8201601f81018413611e37575f5ffd5b8051611e45611d1a82611c85565b818152856020838501011115611e59575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761070c5761070c611e76565b8181038181111561070c5761070c611e76565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611ed8575f5ffd5b8151611977816119d5565b8082018082111561070c5761070c611e76565b5f5f5f60608486031215611f08575f5ffd5b5050815160208301516040909301519094929350919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611b279083018461197e565b5f60208284031215611f63575f5ffd5b815161197781611944565b634e487b7160e01b5f52603160045260245ffdfe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a2646970667358221220ac814d6a826d8cbc0d76ce603b2fe422677d1d6037f174ad1d5182dac34413aa64736f6c634300081e003360e0604052600460a0908152634567677360e01b60c0525f90610022908261091f565b506040805180820190915260048152634547475360e01b602082015260019061004b908261091f565b50348015610057575f5ffd5b50336080908152604080518082018252600e81526078602080830191825260028054600181810183555f8381529551945160ff908116600160f81b9081026001600160f81b03978816177f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace948501558851808a018a5260108152605081880190815286548086018855878b52915190518416830290891617908501558851808a018a5260128152603281880190815286548086018855878b52915190518416830290891617908501558851808a018a52601480825281880190815286548086018855878b52915190518416830290891617908501558851808a018a5260168152600a81880190815286548086018855878b52915190518416830290891617908501558851808a018a5260188152600581880190815286548086018855878b5291519051841690920291909716179590920194909455855196870186526217962960e81b87526215491f60e81b87840190815260648888019081528751808901909852600b88526a29b634b6bc9023b932b2b760a91b94880194909452606088019687526003805495860181559095528651939091025f516020612b7c5f395f51905f52810180549551935190921666010000000000000260ff60301b1960e894851c63010000000265ffffffffffff199097169590941c94909417949094179190911691909117815591515f516020612b5c5f395f51905f529091019061027e908261091f565b50506040805160808101825262326a4760ea1b81526202fa8960ed1b6020808301918252604b8385019081528451808601909552600c85526b5061636966696320426c756560a01b9185019190915260608301938452600380546001810182555f91909152835160029091025f516020612b7c5f395f51905f52810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f516020612b5c5f395f51905f52019061035b908261091f565b505060408051608081018252619fff60e81b815262144d7960e81b602080830191825260378385019081528451808601909552600b85526a13dc985b99d9481419595b60aa1b9185019190915260608301938452600380546001810182555f91909152835160029091025f516020612b7c5f395f51905f52810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f516020612b5c5f395f51905f520190610436908261091f565b505060408051608081018252623bb5cf60e81b81526223576360e81b602080830191825260238385019081528451808601909552600885526713db190811dbdb1960c21b9185019190915260608301938452600380546001810182555f91909152835160029091025f516020612b7c5f395f51905f52810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f516020612b5c5f395f51905f52019061050f908261091f565b5050604080516080810182526209080760ec1b81526208c7e760eb1b602080830191825260198385019081528451808601909552600a855269536c617465204772617960b01b9185019190915260608301938452600380546001810182555f91909152835160029091025f516020612b7c5f395f51905f52810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f516020612b5c5f395f51905f5201906105ea908261091f565b505060408051608081018252625647f360e91b81526253466d60e81b6020808301918252600f8385019081528451808601909552600a855269436861726d2050696e6b60b01b9185019190915260608301938452600380546001810182555f91909152835160029091025f516020612b7c5f395f51905f52810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f516020612b5c5f395f51905f5201906106c5908261091f565b5050604080516080810182526215965360e91b8152620c8ea960e91b6020808301918252600a8385019081528451808601909552600c85526b13595d185b1b1a58c814995960a21b9185019190915260608301938452600380546001810182555f91909152835160029091025f516020612b7c5f395f51905f52810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f516020612b5c5f395f51905f5201906107a2908261091f565b50506040805160808101825262152a2f60eb1b815262522b3d60e81b602080830191825260058385019081528451808601909552600c85526b526f79616c20507572706c6560a01b9185019190915260608301938452600380546001810182555f91909152835160029091025f516020612b7c5f395f51905f52810180549451935160ff1666010000000000000260ff60301b1960e895861c63010000000265ffffffffffff199097169490951c9390931794909417929092161782559251919350915f516020612b5c5f395f51905f52019061087f908261091f565b5050506109d9565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806108af57607f821691505b6020821081036108cd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561091a57805f5260205f20601f840160051c810160208510156108f85750805b601f840160051c820191505b81811015610917575f8155600101610904565b50505b505050565b81516001600160401b0381111561093857610938610887565b61094c81610946845461089b565b846108d3565b6020601f82116001811461097e575f83156109675750848201515b5f19600385901b1c1916600184901b178455610917565b5f84815260208120601f198516915b828110156109ad578785015182556020948501946001909201910161098d565b50848210156109ca57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6080516121646109f85f395f818161011201526105f801526121645ff3fe608060405234801561000f575f5ffd5b5060043610610084575f3560e01c8063be985ac911610058578063be985ac9146100d4578063c87b56dd146100e7578063ca54cc3f146100fa578063e33f76cf1461010d575f5ffd5b8062b958f31461008857806306fdde03146100b157806348b62fe4146100b957806395d89b41146100cc575b5f5ffd5b61009b610096366004611a26565b61014c565b6040516100a89190611a6b565b60405180910390f35b61009b610185565b61009b6100c7366004611a26565b610210565b61009b610316565b61009b6100e2366004611a26565b610323565b61009b6100f5366004611a26565b61034e565b61009b610108366004611a26565b61048b565b6101347f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100a8565b606061015f61015a83610210565b6104a9565b60405160200161016f9190611a9b565b6040516020818303038152906040529050919050565b5f805461019190611ac5565b80601f01602080910402602001604051908101604052809291908181526020018280546101bd90611ac5565b80156102085780601f106101df57610100808354040283529160200191610208565b820191905f5260205f20905b8154815290600101906020018083116101eb57829003601f168201915b505050505081565b60605f5f5f61021e856105f2565b92509250925061030d6102da6003838154811061023d5761023d611af7565b5f9182526020909120600290910201546003805460e89290921b918590811061026857610268611af7565b5f9182526020909120600290910201546301000000900460e81b604051623474f760ea1b60208201525f602382018190526001600160e81b031980851660248401526027830182905283166028830152602b820152606090602c01604051602081830303815290604052905092915050565b6103076103026102fd6102f86102f36102f38a8a6106cb565b610899565b610b39565b610d65565b610f6f565b8461109e565b95945050505050565b6001805461019190611ac5565b6060610334623474f760ea1b61140e565b61033d8361014c565b60405160200161016f929190611b0b565b60605f5f61035b846105f2565b92509250505f61036a856114d7565b610373866114d7565b604051602001610384929190611ddc565b60405160208183030381529060405290508061039f8661048b565b6040516020016103b0929190611e8e565b60408051601f198184030181529190529050806103d060031985016114d7565b6040516020016103e1929190611ed7565b6040516020818303038152906040529050806003838154811061040657610406611af7565b905f5260205f209060020201600101604051602001610426929190611f26565b6040516020818303038152906040529050806040516020016104489190612005565b6040516020818303038152906040529050610462816104a9565b6040516020016104729190612022565b6040516020818303038152906040529350505050919050565b606061049961015a83610323565b60405160200161016f9190612053565b606081515f036104c657505060408051602081019091525f815290565b5f6040518060600160405280604081526020016120ef6040913990505f60038451600201816104f7576104f7612084565b046004029050806020016001600160401b0381111561051857610518612098565b6040519080825280601f01601f191660200182016040528015610542576020820181803683370190505b509250808352600182018485518101602086015b818310156105b05760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401610556565b6003885106600181146105ca57600281146105db576105e6565b613d3d60f01b6001198301526105e6565b603d60f81b5f198301525b50505050505050919050565b5f5f5f837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bfa0b1336040518163ffffffff1660e01b8152600401602060405180830381865afa158015610652573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061067691906120ac565b6040516429b2b2b21d60d91b6020820152602581019290925260458201526065016040516020818303038152906040528051906020012092506106b8836115b4565b91506106c3836116c3565b929491935050565b6040516529ba30ba329d60d11b6020820152602681018390526060905f9060460160408051601f198184030181529190528051602090910120905060051983016001600160401b0381111561072257610722612098565b60405190808252806020026020018201604052801561075557816020015b60608152602001906001900390816107405790505b5091505f5b82518110156108915760021960028504016001600160401b0381111561078257610782612098565b6040519080825280602002602001820160405280156107ab578160200160208202803683370190505b508382815181106107be576107be611af7565b60209081029190910101525f5b8382815181106107dd576107dd611af7565b602002602001015151811015610888576002830684838151811061080357610803611af7565b6020026020010151828151811061081c5761081c611af7565b60ff9092166020928302919091019091015261ffff83101561087957604051642937b6361d60d91b60208201526025810187905260458101849052606501604051602081830303815290604052805190602001205f1c9250610880565b6002830492505b6001016107cb565b5060010161075a565b505092915050565b60605f6108a5836117b3565b905082516001600160401b038111156108c0576108c0612098565b6040519080825280602002602001820160405280156108f357816020015b60608152602001906001900390816108de5790505b5091505f5b8351811015610b325783818151811061091357610913611af7565b6020026020010151516001600160401b0381111561093357610933612098565b60405190808252806020026020018201604052801561095c578160200160208202803683370190505b5083828151811061096f5761096f611af7565b60209081029190910101525f5b84828151811061098e5761098e611af7565b602002602001015151811015610b29578482815181106109b0576109b0611af7565b602002602001015181815181106109c9576109c9611af7565b602002602001015160ff165f148015610a18575060018383815181106109f1576109f1611af7565b60200260200101518281518110610a0a57610a0a611af7565b602002602001015160ff1611155b80610ad75750848281518110610a3057610a30611af7565b60200260200101518181518110610a4957610a49611af7565b602002602001015160ff166001148015610ad75750828281518110610a7057610a70611af7565b60200260200101518181518110610a8957610a89611af7565b602002602001015160ff1660021480610ad75750828281518110610aaf57610aaf611af7565b60200260200101518181518110610ac857610ac8611af7565b602002602001015160ff166003145b610ae1575f610ae4565b60015b848381518110610af657610af6611af7565b60200260200101518281518110610b0f57610b0f611af7565b60ff9092166020928302919091019091015260010161097c565b506001016108f8565b5050919050565b80516060906006016001600160401b03811115610b5857610b58612098565b604051908082528060200260200182016040528015610b8b57816020015b6060815260200190600190039081610b765790505b5090505f5b8151811015610d5f5782516006016001600160401b03811115610bb557610bb5612098565b604051908082528060200260200182016040528015610bde578160200160208202803683370190505b50828281518110610bf157610bf1611af7565b60209081029190910101525f5b828281518110610c1057610c10611af7565b602002602001015151811015610d5657600282118015610c34575060028451018211155b8015610c405750600281115b8015610c50575060028451018111155b15610d0d57836001600284030381518110610c6d57610c6d611af7565b60200260200101516002856001600286030381518110610c8f57610c8f611af7565b602002602001015151018211610ca9576002198201610cb1565b816002865101035b81518110610cc157610cc1611af7565b6020026020010151838381518110610cdb57610cdb611af7565b60200260200101518281518110610cf457610cf4611af7565b602002602001019060ff16908160ff1681525050610d4e565b5f838381518110610d2057610d20611af7565b60200260200101518281518110610d3957610d39611af7565b602002602001019060ff16908160ff16815250505b600101610bfe565b50600101610b90565b50919050565b60605f610d71836117b3565b905082516001600160401b03811115610d8c57610d8c612098565b604051908082528060200260200182016040528015610dbf57816020015b6060815260200190600190039081610daa5790505b5091505f5b8351811015610b3257838181518110610ddf57610ddf611af7565b6020026020010151516001600160401b03811115610dff57610dff612098565b604051908082528060200260200182016040528015610e28578160200160208202803683370190505b50838281518110610e3b57610e3b611af7565b60209081029190910101525f5b848281518110610e5a57610e5a611af7565b602002602001015151811015610f6657848281518110610e7c57610e7c611af7565b60200260200101518181518110610e9557610e95611af7565b602002602001015160ff165f148015610ee257505f838381518110610ebc57610ebc611af7565b60200260200101518281518110610ed557610ed5611af7565b602002602001015160ff16115b610f1e57848281518110610ef857610ef8611af7565b60200260200101518181518110610f1157610f11611af7565b6020026020010151610f21565b60025b848381518110610f3357610f33611af7565b60200260200101518281518110610f4c57610f4c611af7565b60ff90921660209283029190910190910152600101610e48565b50600101610dc4565b60605f825f81518110610f8457610f84611af7565b602002602001015151905060048181610f9f57610f9f612084565b0615610fae5760048106600403015b808351026001600160401b03811115610fc957610fc9612098565b6040519080825280601f01601f191660200182016040528015610ff3576020820181803683370190505b5091505f5b8351811015610b32575f5b84828151811061101557611015611af7565b6020026020010151518110156110955784828151811061103757611037611af7565b6020026020010151818151811061105057611050611af7565b602002602001015160f81b8482856001868a51030302018151811061107757611077611af7565b60200101906001600160f81b03191690815f1a905350600101611003565b50600101610ff8565b825160609060368101905f9063ffffffff8316036001600160401b038111156110c9576110c9612098565b6040519080825280601f01601f1916602001820160405280156110f3576020820181803683370190505b509050604260f81b815f8151811061110d5761110d611af7565b60200101906001600160f81b03191690815f1a905350604d60f81b8160018151811061113b5761113b611af7565b60200101906001600160f81b03191690815f1a905350845182015f60025b60068110156111a25760ff831691508260081c92508160f81b84828151811061118457611184611af7565b60200101906001600160f81b03191690815f1a905350600101611159565b50839150600a5b600e8110156111f25760ff831691508260081c92508160f81b8482815181106111d4576111d4611af7565b60200101906001600160f81b03191690815f1a9053506001016111a9565b50602860f81b83600e8151811061120b5761120b611af7565b60200101906001600160f81b03191690815f1a90535085915060125b601681101561129f5760ff831691508260081c92508160f81b84828151811061125257611252611af7565b60200101906001600160f81b03191690815f1a9053508160f81b84826004018151811061128157611281611af7565b60200101906001600160f81b03191690815f1a905350600101611227565b50600160f81b83601a815181106112b8576112b8611af7565b60200101906001600160f81b03191690815f1a905350600860f81b83601c815181106112e6576112e6611af7565b60200101906001600160f81b03191690815f1a9053508651915060225b602681101561134c5760ff831691508260081c92508160f81b84828151811061132e5761132e611af7565b60200101906001600160f81b03191690815f1a905350600101611303565b50600488518161135e5761135e612084565b049150602e5b60328110156113dc5760ff831691508260081c92508160f81b84828151811061138f5761138f611af7565b60200101906001600160f81b03191690815f1a9053508160f81b8482600401815181106113be576113be611af7565b60200101906001600160f81b03191690815f1a905350600101611364565b508288886040516020016113f2939291906120c3565b6040516020818303038152906040529450505050509392505050565b6040805180820190915260018152602360f81b60208201525f5b6006811015610d5f57604080516001808252818301909252600f60e886901c600285851602850384016004021c16915f91906020820181803683370190505090506009821161147857603061147b565b60575b820160f81b815f8151811061149257611492611af7565b60200101906001600160f81b03191690815f1a90535083816040516020016114bb9291906120e0565b60408051808303601f1901815291905293505050600101611428565b60606001825b60098111156114f65760019190910190600a90046114dd565b5f826001600160401b0381111561150f5761150f612098565b6040519080825280601f01601f191660200182016040528015611539576020820181803683370190505b5090505f5b81518110156115ab575f600a60018385510303600a0a888161156257611562612084565b048161157057611570612084565b0690508060300160f81b83838151811061158c5761158c611af7565b60200101906001600160f81b03191690815f1a9053505060010161153e565b50949350505050565b5f80805b6002548110156115f757600281815481106115d5576115d5611af7565b5f91825260209091200154600160f81b900460ff1691909101906001016115b8565b506040516429b4bd329d60d91b6020820152602581018490525f908290604501604051602081830303815290604052805190602001205f1c8161163c5761163c612084565b5f9350069050815b6002548110156116bb576002818154811061166157611661611af7565b5f91825260209091200154600160f81b900460ff169290920191828210156116b3576002818154811061169657611696611af7565b5f918252602090912001546001600160f81b031695945050505050565b600101611644565b505050919050565b5f80805b60035481101561170e57600381815481106116e4576116e4611af7565b5f9182526020909120600290910201546601000000000000900460ff1691909101906001016116c7565b506040516521b7b637b91d60d11b6020820152602681018490525f908290604601604051602081830303815290604052805190602001205f1c8161175457611754612084565b5f9350069050815b6003548110156116bb576003818154811061177957611779611af7565b5f9182526020909120600290910201546601000000000000900460ff169290920191828210156117ab57949350505050565b60010161175c565b606081516001600160401b038111156117ce576117ce612098565b60405190808252806020026020018201604052801561180157816020015b60608152602001906001900390816117ec5790505b5090505f5b8251811015610d5f5782818151811061182157611821611af7565b6020026020010151516001600160401b0381111561184157611841612098565b60405190808252806020026020018201604052801561186a578160200160208202803683370190505b5082828151811061187d5761187d611af7565b60209081029190910101525f5b83828151811061189c5761189c611af7565b602002602001015151811015611a1d575f82156118ee578460018403815181106118c8576118c8611af7565b602002602001015182815181106118e1576118e1611af7565b6020026020010151810190505b60018551038310156119355784836001018151811061190f5761190f611af7565b6020026020010151828151811061192857611928611af7565b6020026020010151810190505b81156119765784838151811061194d5761194d611af7565b6020026020010151600183038151811061196957611969611af7565b6020026020010151810190505b600185848151811061198a5761198a611af7565b602002602001015151038210156119d6578483815181106119ad576119ad611af7565b602002602001015182600101815181106119c9576119c9611af7565b6020026020010151810190505b808484815181106119e9576119e9611af7565b60200260200101518381518110611a0257611a02611af7565b60ff909216602092830291909101909101525060010161188a565b50600101611806565b5f60208284031215611a36575f5ffd5b5035919050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611a7d6020830184611a3d565b9392505050565b5f81518060208401855e5f93019283525090919050565b7519185d184e9a5b5859d94bd89b5c0ed8985cd94d8d0b60521b81525f611a7d6016830184611a84565b600181811c90821680611ad957607f821691505b602082108103610d5f57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323081527f30302f737667222076657273696f6e3d22312e3122207072657365727665417360208201527f70656374526174696f3d22784d6964594d6964206d656574222076696577426f60408201527f783d223020302035313220353132222077696474683d2231303025222068656960608201527f6768743d2231303025223e3c646566733e3c7374796c6520747970653d22746560808201527f78742f637373223e7376677b696d6167652d72656e646572696e673a6f70746960a08201527f6d697a6553706565643b696d6167652d72656e646572696e673a2d6d6f7a2d6360c08201527f726973702d65646765733b696d6167652d72656e646572696e673a2d6f2d637260e08201527f6973702d65646765733b696d6167652d72656e646572696e673a2d7765626b696101008201527f742d6f7074696d697a652d636f6e74726173743b696d6167652d72656e6465726101208201527f696e673a706978656c617465643b696d6167652d72656e646572696e673a6f706101408201527f74696d697a652d636f6e74726173743b2d6d732d696e746572706f6c6174696f6101608201527f6e2d6d6f64653a6e6561726573742d6e65696768626f723b6261636b67726f7561018082015268373216b1b7b637b91d60b91b6101a08201525f611dd4611d4e611d48611d266101a9860188611a84565b75076c4c2c6d6cee4deeadcc85ad2dac2ceca74eae4d8560531b815260160190565b85611a84565b7f293b6261636b67726f756e642d7265706561743a6e6f2d7265706561743b626181527f636b67726f756e642d73697a653a636f6e7461696e3b6261636b67726f756e6460208201527f2d706f736974696f6e3a353025203530253b7d3c2f7374796c653e3c2f646566604082015267399f1e17b9bb339f60c11b606082015260680190565b949350505050565b6d7b226e616d65223a22454747202360901b81525f611dfe600e830185611a84565b7f222c226465736372697074696f6e223a224578706572696d656e74616c20687981527f62726964204552432d32302026204552432d373231222c2265787465726e616c60208201527f5f75726c223a2268747470733a2f2f656767732e7774662f232f746f6b656e2f6040820152611e7a6060820185611a84565b61088b60f21b815260020195945050505050565b5f611e998285611a84565b681134b6b0b3b2911d1160b91b8152611eb56009820185611a84565b6f222c2261747472696275746573223a5b60801b815260100195945050505050565b5f611ee28285611a84565b7f7b2274726169745f74797065223a2253697a65222c2276616c7565223a0000008152611f12601d820185611a84565b611f4b60f21b815260020195945050505050565b5f611f318285611a84565b7f7b2274726169745f74797065223a22436f6c6f72222c2276616c7565223a2200815283545f90600181811c90821680611f6c57607f821691505b602082108103611f8a57634e487b7160e01b5f52602260045260245ffd5b808015611f9e5760018114611fb957611fed565b60ff198416601f870152601f83151584028701019450611fed565b5f898152602090205f5b84811015611fe2578154888201601f0152600190910190602001611fc3565b5050601f8387010194505b505061227d60f01b8352505060020195945050505050565b5f6120108284611a84565b615d7d60f01b81526002019392505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081525f611a7d601d830184611a84565b7f646174613a696d6167652f7376672b786d6c3b6261736536342c00000000000081525f611a7d601a830184611a84565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156120bc575f5ffd5b5051919050565b5f61030d6120da6120d48488611a84565b86611a84565b84611a84565b5f611dd46120da8386611a8456fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220595317fb5876a78754b8b07476d3165b7311991109206380826cb9690e535b7064736f6c634300081e0033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85cc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b

Deployed Bytecode

0x6080604052600436106101d0575f3560e01c80638188f71c116100fd578063bfa0b13311610092578063dd62ed3e11610062578063dd62ed3e14610537578063e4b50cb81461057f578063e985e9c5146105ad578063f3cb8385146105f8575f5ffd5b8063bfa0b133146104cb578063c662e481146104de578063c87b56dd146104f9578063d28a476114610518575f5ffd5b8063a22cb465116100cd578063a22cb46514610451578063a8aa1b3114610470578063a9059cbb1461048d578063b88d4fde146104ac575f5ffd5b80638188f71c146103ec5780638da5cb5b1461040d57806395d89b411461042a578063a0712d681461043e575f5ffd5b80632497ab151161017357806342842e0e1161014357806342842e0e1461037b5780636352211e1461039a57806370a08231146103b95780638129fc1c146103d8575f5ffd5b80632497ab15146102ec578063313ce5671461030b57806332ba0a1e14610330578063392f37e91461035e575f5ffd5b8063095ea7b3116101ae578063095ea7b31461026f57806313af40351461028e57806318160ddd146102af57806323b872dd146102cd575f5ffd5b806301ffc9a7146101d457806306fdde0314610217578063081812fc14610238575b5f5ffd5b3480156101df575f5ffd5b506102026101ee36600461195c565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610222575f5ffd5b5061022b610617565b60405161020e91906119ac565b348015610243575f5ffd5b506102576102523660046119be565b61068a565b6040516001600160a01b03909116815260200161020e565b34801561027a575f5ffd5b506102026102893660046119e9565b6106cb565b348015610299575f5ffd5b506102ad6102a8366004611a13565b610712565b005b3480156102ba575f5ffd5b506101005b60405190815260200161020e565b3480156102d8575f5ffd5b506102026102e7366004611a2e565b61074a565b3480156102f7575f5ffd5b506102bf610306366004611a13565b610809565b348015610316575f5ffd5b5061031e5f81565b60405160ff909116815260200161020e565b34801561033b575f5ffd5b5061034f61034a366004611b31565b610823565b60405161020e93929190611bae565b348015610369575f5ffd5b506003546001600160a01b0316610257565b348015610386575f5ffd5b506102ad610395366004611a2e565b6109a7565b3480156103a5575f5ffd5b506102576103b43660046119be565b6109c6565b3480156103c4575f5ffd5b506102bf6103d3366004611a13565b610a61565b3480156103e3575f5ffd5b506102ad610a73565b3480156103f7575f5ffd5b50610400610e38565b60405161020e9190611c38565b348015610418575f5ffd5b506002546001600160a01b0316610257565b348015610435575f5ffd5b5061022b610e9a565b6102ad61044c3660046119be565b610ee1565b34801561045c575f5ffd5b506102ad61046b366004611c4a565b610fa1565b34801561047b575f5ffd5b506001546001600160a01b0316610257565b348015610498575f5ffd5b506102026104a73660046119e9565b611010565b3480156104b7575f5ffd5b506102ad6104c6366004611cac565b61101c565b3480156104d6575f5ffd5b505f546102bf565b3480156104e9575f5ffd5b506102bf67016345785d8a000081565b348015610504575f5ffd5b5061022b6105133660046119be565b6110c2565b348015610523575f5ffd5b506102ad610532366004611d54565b611130565b348015610542575f5ffd5b506102bf610551366004611da1565b6001600160a01b039182165f9081526004602090815260408083209390941682526001909201909152205490565b34801561058a575f5ffd5b5061059e6105993660046119be565b61113a565b60405161020e93929190611dcd565b3480156105b8575f5ffd5b506102026105c7366004611da1565b6001600160a01b039182165f9081526004602090815260408083209390941682526002909201909152205460ff1690565b348015610603575f5ffd5b506102ad610612366004611a13565b611166565b600354604080516306fdde0360e01b815290516060926001600160a01b0316916306fdde03916004808301925f9291908290030181865afa15801561065e573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106859190810190611e01565b905090565b5f610100821180156106a857506106a46101006002611e8a565b8211155b6106b0575f5ffd5b505f908152600560205260409020546001600160a01b031690565b5f610100821180156106e957506106e56101006002611e8a565b8211155b156106fd576106f8838361119e565b610708565b61070833848461122b565b5060015b92915050565b6002546001600160a01b03163314610728575f5ffd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6101008211801561076857506107646101006002611e8a565b8211155b1561077d57610778848484611294565b6107ff565b6001600160a01b0384165f908152600460209081526040808320338452600101909152902054828110156107af575f5ffd5b5f1981146107f2576001600160a01b0385165f908152600460209081526040808320338452600101909152812080548592906107ec908490611ea1565b90915550505b6107fd858585611381565b505b5060019392505050565b6001600160a01b03165f9081526004602052604090205490565b60608060605f845190508067ffffffffffffffff81111561084657610846611a6c565b60405190808252806020026020018201604052801561086f578160200160208202803683370190505b5093508067ffffffffffffffff81111561088b5761088b611a6c565b6040519080825280602002602001820160405280156108b4578160200160208202803683370190505b5092508067ffffffffffffffff8111156108d0576108d0611a6c565b60405190808252806020026020018201604052801561090357816020015b60608152602001906001900390816108ee5790505b5091505f5b8181101561099e5761093286828151811061092557610925611eb4565b602002602001015161113a565b87848151811061094457610944611eb4565b6020026020010187858151811061095d5761095d611eb4565b6020026020010187868151811061097657610976611eb4565b60209081029190910101929092526001600160a01b0392831690915291169052600101610908565b50509193909250565b6109c183838360405180602001604052805f81525061101c565b505050565b5f610100821180156109da57506102008211155b6109e2575f5ffd5b60016101001983011b5f6109f4610e38565b90505f5b8151811015610a57578283610a25848481518110610a1857610a18611eb4565b6020026020010151610809565b1603610a4f57818181518110610a3d57610a3d611eb4565b60200260200101519350505050919050565b6001016109f8565b505f949350505050565b5f61070c610a6e83610809565b61146e565b5f610a866001546001600160a01b031690565b6001600160a01b031614610a98575f5ffd5b5f3090505f737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aed573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b119190611ec8565b6001600160a01b0383165f8181526004602090815260408083205f199055600680546001810182559084527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b031916851790558051606081019091526021808252949550929391929190611fa49083013980519060200120610100604051610ba591815260200190565b60405180910390a35f5b610100811015610c0d57610bc581610100611ee3565b610bd0906001611ee3565b6040516001600160a01b038516905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600101610baf565b50610c2e82737a250d5630b4cf539739df2c5dacb4c659f2488d608061122b565b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c7e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca29190611ec8565b6040516364e329cb60e11b81526001600160a01b0383811660048301528481166024830152919091169063c9c65396906044016020604051808303815f875af1158015610cf1573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190611ec8565b600180546001600160a01b039283166001600160a01b0319909116179055737a250d5630b4cf539739df2c5dacb4c659f2488d9063f305d719908416318460805f80610d696002546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015610dcf573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190610df49190611ef6565b505050610e178273ee112a6caaff9d16d12433f5c952ce871ca95418600a611381565b610e3482610e2d6002546001600160a01b031690565b600a611381565b5050565b60605f600601805480602002602001604051908101604052809291908181526020018280548015610e9057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610e72575b5050505050905090565b600354604080516395d89b4160e01b815290516060926001600160a01b0316916395d89b41916004808301925f9291908290030181865afa15801561065e573d5f5f3e3d5ffd5b305f610eec82610a61565b905080831115610efa575f5ffd5b5f610f0d67016345785d8a000085611e8a565b905080341015610f1b575f5ffd5b610f26833386611381565b6002546040516001600160a01b039091169082156108fc029083905f818181858888f19350505050158015610f5d573d5f5f3e3d5ffd5b5080341115610f9b57336108fc610f748334611ea1565b6040518115909202915f818181858888f19350505050158015610f99573d5f5f3e3d5ffd5b505b50505050565b335f8181526004602090815260408083206001600160a01b0387168085526002909101835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b5f610708338484611381565b611027848484611294565b823b63ffffffff811615610f9957604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611067903390899088908890600401611f21565b6020604051808303815f875af1158015611083573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a79190611f53565b6001600160e01b03191663150b7a0260e01b14610f99575f5ffd5b60035460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd906024015f60405180830381865afa158015611109573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261070c9190810190611e01565b610e34828261152b565b5f5f6060611147846109c6565b6111508561068a565b611159866110c2565b9250925092509193909250565b6002546001600160a01b0316331461117c575f5ffd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b5f60016111ad61010084611ea1565b6111b79190611ea1565b6001901b905080806111c833610809565b16146111d2575f5ffd5b5f8281526005602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b6001600160a01b038084165f8181526004602090815260408083209487168084526001909501825291829020859055815160608101909252602180835290611f8390830139805190602001208360405161128791815260200190565b60405180910390a3505050565b610100811180156112a757506102008111155b6112af575f5ffd5b60016101001982011b80806112c386610809565b16146112cd575f5ffd5b336001600160a01b03851614806112fd57506112e88261068a565b6001600160a01b0316336001600160a01b0316145b8061132d57506001600160a01b0384165f90815260046020908152604080832033845260020190915290205460ff165b611335575f5ffd5b6040805160018082528183019092525f916020808301908036833701905050905082815f8151811061136957611369611eb4565b602002602001018181525050610f99858584846115a1565b5f80808061138e87610809565b90505f8567ffffffffffffffff8111156113aa576113aa611a6c565b6040519080825280602002602001820160405280156113d3578160200160208202803683370190505b5090505b5f821180156113e557508583105b156114385781600116600103611428578051600180861b9690961795840193610101860191839190811061141b5761141b611eb4565b6020026020010181815250505b6001938401939190911c906113d7565b858314611443575f5ffd5b848561144e8a610809565b1614611458575f5ffd5b611464888887846115a1565b5050505050505050565b5f8160018101611482575061010092915050565b7f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f7f5555555555555555555555555555555555555555555555555555555555555555600183901c16909103600281901c7f3333333333333333333333333333333333333333333333333333333333333333908116911601600481901c01167f01010101010101010101010101010101010101010101010101010101010101010260f81c92915050565b5f805b825181101561156f57600161010084838151811061154e5761154e611eb4565b602002602001015103036001901b5f1b82179150808060010191505061152e565b50815161157b8261146e565b14611584575f5ffd5b808161158f33610809565b1614611599575f5ffd5b6109c1338483855b5f8151116115ad575f5ffd5b5f5b81518110156116ee575f6001600160a01b03166115e48383815181106115d7576115d7611eb4565b602002602001015161068a565b6001600160a01b03161461168c575f5f6005015f84848151811061160a5761160a611eb4565b602002602001015181526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555081818151811061165457611654611eb4565b60209081029190910101516040515f9081907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908290a45b81818151811061169e5761169e611eb4565b6020026020010151846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46001016115af565b506001600160a01b0384165f90815260046020526040812080548418905561171585610809565b1590505f61172285610809565b6001600160a01b0386165f9081526004602052604090208054861790551590508115611882575f5f611752610e38565b90505f5b81518110156117a157886001600160a01b031682828151811061177b5761177b611eb4565b60200260200101516001600160a01b031603611799578092506117a1565b600101611756565b5082156117ee57865f60060183815481106117be576117be611eb4565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555061187b565b8060018251038151811061180457611804611eb4565b60200260200101515f600601838154811061182157611821611eb4565b5f91825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055600680548061185a5761185a611f6e565b5f8281526020902081015f1990810180546001600160a01b03191690550190555b50506118d3565b80156118d357600680546001810182555f919091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180546001600160a01b0319166001600160a01b0387161790555b6118dc85610809565b6118e587610809565b16156118ef575f5ffd5b846001600160a01b0316866001600160a01b0316604051806060016040528060218152602001611fa46021913980519060200120855160405161193491815260200190565b60405180910390a3505050505050565b6001600160e01b031981168114611959575f5ffd5b50565b5f6020828403121561196c575f5ffd5b813561197781611944565b9392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f611977602083018461197e565b5f602082840312156119ce575f5ffd5b5035919050565b6001600160a01b0381168114611959575f5ffd5b5f5f604083850312156119fa575f5ffd5b8235611a05816119d5565b946020939093013593505050565b5f60208284031215611a23575f5ffd5b8135611977816119d5565b5f5f5f60608486031215611a40575f5ffd5b8335611a4b816119d5565b92506020840135611a5b816119d5565b929592945050506040919091013590565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611aa957611aa9611a6c565b604052919050565b5f82601f830112611ac0575f5ffd5b813567ffffffffffffffff811115611ada57611ada611a6c565b8060051b611aea60208201611a80565b91825260208185018101929081019086841115611b05575f5ffd5b6020860192505b83831015611b27578235825260209283019290910190611b0c565b9695505050505050565b5f60208284031215611b41575f5ffd5b813567ffffffffffffffff811115611b57575f5ffd5b611b6384828501611ab1565b949350505050565b5f8151808452602084019350602083015f5b82811015611ba45781516001600160a01b0316865260209586019590910190600101611b7d565b5093949350505050565b606081525f611bc06060830186611b6b565b8281036020840152611bd28186611b6b565b9050828103604084015280845180835260208301915060208160051b840101602087015f5b83811015611c2957601f19868403018552611c1383835161197e565b6020958601959093509190910190600101611bf7565b50909998505050505050505050565b602081525f6119776020830184611b6b565b5f5f60408385031215611c5b575f5ffd5b8235611c66816119d5565b915060208301358015158114611c7a575f5ffd5b809150509250929050565b5f67ffffffffffffffff821115611c9e57611c9e611a6c565b50601f01601f191660200190565b5f5f5f5f60808587031215611cbf575f5ffd5b8435611cca816119d5565b93506020850135611cda816119d5565b925060408501359150606085013567ffffffffffffffff811115611cfc575f5ffd5b8501601f81018713611d0c575f5ffd5b8035611d1f611d1a82611c85565b611a80565b818152886020838501011115611d33575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f60408385031215611d65575f5ffd5b8235611d70816119d5565b9150602083013567ffffffffffffffff811115611d8b575f5ffd5b611d9785828601611ab1565b9150509250929050565b5f5f60408385031215611db2575f5ffd5b8235611dbd816119d5565b91506020830135611c7a816119d5565b6001600160a01b038481168252831660208201526060604082018190525f90611df89083018461197e565b95945050505050565b5f60208284031215611e11575f5ffd5b815167ffffffffffffffff811115611e27575f5ffd5b8201601f81018413611e37575f5ffd5b8051611e45611d1a82611c85565b818152856020838501011115611e59575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761070c5761070c611e76565b8181038181111561070c5761070c611e76565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611ed8575f5ffd5b8151611977816119d5565b8082018082111561070c5761070c611e76565b5f5f5f60608486031215611f08575f5ffd5b5050815160208301516040909301519094929350919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611b279083018461197e565b5f60208284031215611f63575f5ffd5b815161197781611944565b634e487b7160e01b5f52603160045260245ffdfe417070726f76616c28616464726573732c616464726573732c75696e74323536295472616e7366657228616464726573732c616464726573732c75696e7432353629a2646970667358221220ac814d6a826d8cbc0d76ce603b2fe422677d1d6037f174ad1d5182dac34413aa64736f6c634300081e0033

Deployed Bytecode Sourcemap

1503:11410:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2793:48;;;;;;;;;;-1:-1:-1;2793:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;565:14:2;;558:22;540:41;;528:2;513:18;2793:48:0;;;;;;;;7314:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;8517:178::-;;;;;;;;;;-1:-1:-1;8517:178:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1506:32:2;;;1488:51;;1476:2;1461:18;8517:178:0;1342:203:2;5224:264:0;;;;;;;;;;-1:-1:-1;5224:264:0;;;;;:::i;:::-;;:::i;3821:83::-;;;;;;;;;;-1:-1:-1;3821:83:0;;;;;:::i;:::-;;:::i;:::-;;7636:82;;;;;;;;;;-1:-1:-1;1620:3:0;7636:82;;;2456:25:2;;;2444:2;2429:18;7636:82:0;2310:177:2;5834:461:0;;;;;;;;;;-1:-1:-1;5834:461:0;;;;;:::i;:::-;;:::i;7723:100::-;;;;;;;;;;-1:-1:-1;7723:100:0;;;;;:::i;:::-;;:::i;2419:34::-;;;;;;;;;;;;2452:1;2419:34;;;;;3359:4:2;3347:17;;;3329:36;;3317:2;3302:18;2419:34:0;3187:184:2;9046:410:0;;;;;;;;;;-1:-1:-1;9046:410:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;7218:91::-;;;;;;;;;;-1:-1:-1;7290:13:0;;-1:-1:-1;;;;;7290:13:0;7218:91;;6300:133;;;;;;;;;;-1:-1:-1;6300:133:0;;;;;:::i;:::-;;:::i;8079:433::-;;;;;;;;;;-1:-1:-1;8079:433:0;;;;;:::i;:::-;;:::i;7828:105::-;;;;;;;;;;-1:-1:-1;7828:105:0;;;;;:::i;:::-;;:::i;4012:795::-;;;;;;;;;;;;;:::i;7047:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;6891:74::-;;;;;;;;;;-1:-1:-1;6950:10:0;;-1:-1:-1;;;;;6950:10:0;6891:74;;7410:95;;;;;;;;;;;;;:::i;4812:406::-;;;;;;:::i;:::-;;:::i;5493:193::-;;;;;;;;;;-1:-1:-1;5493:193:0;;;;;:::i;:::-;;:::i;6970:72::-;;;;;;;;;;-1:-1:-1;7028:9:0;;-1:-1:-1;;;;;7028:9:0;6970:72;;5691:138;;;;;;;;;;-1:-1:-1;5691:138:0;;;;;:::i;:::-;;:::i;6438:329::-;;;;;;;;;;-1:-1:-1;6438:329:0;;;;;:::i;:::-;;:::i;7139:74::-;;;;;;;;;;-1:-1:-1;7178:7:0;7199:9;7139:74;;2368:45;;;;;;;;;;;;2404:9;2368:45;;7510:121;;;;;;;;;;-1:-1:-1;7510:121:0;;;;;:::i;:::-;;:::i;6772:111::-;;;;;;;;;;-1:-1:-1;6772:111:0;;;;;:::i;:::-;;:::i;7938:136::-;;;;;;;;;;-1:-1:-1;7938:136:0;;;;;:::i;:::-;-1:-1:-1;;;;;8032:17:0;;;8011:7;8032:17;;;:10;:17;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;7938:136;8848:193;;;;;;;;;;-1:-1:-1;8848:193:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;8700:143::-;;;;;;;;;;-1:-1:-1;8700:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;8800:18:0;;;8782:4;8800:18;;;:10;:18;;;;;;;;:38;;;;;;:27;;;;:38;;;;;;;;8700:143;3909:96;;;;;;;;;;-1:-1:-1;3909:96:0;;;;;:::i;:::-;;:::i;7314:91::-;7380:13;;:20;;;-1:-1:-1;;;7380:20:0;;;;7353:13;;-1:-1:-1;;;;;7380:13:0;;:18;;:20;;;;;:4;;:20;;;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7380:20:0;;;;;;;;;;;;:::i;:::-;7373:27;;7314:91;:::o;8517:178::-;8577:7;1620:3;8599:8;:23;:55;;;;-1:-1:-1;8638:16:0;1620:3;8638:1;:16;:::i;:::-;8626:8;:28;;8599:55;8591:64;;;;;;-1:-1:-1;8667:4:0;:23;;;:13;:23;;;;;;-1:-1:-1;;;;;8667:23:0;;8517:178::o;5224:264::-;5294:4;1620:3;5309:7;:22;:53;;;;-1:-1:-1;5346:16:0;1620:3;5346:1;:16;:::i;:::-;5335:7;:27;;5309:53;5305:163;;;5370:30;5382:8;5392:7;5370:11;:30::i;:::-;5305:163;;;5418:44;5432:10;5444:8;5454:7;5418:13;:44::i;:::-;-1:-1:-1;5479:4:0;5224:264;;;;;:::o;3821:83::-;6950:10;;-1:-1:-1;;;;;6950:10:0;3388;:21;3380:30;;;;;;3880:10:::1;:19:::0;;-1:-1:-1;;;;;;3880:19:0::1;-1:-1:-1::0;;;;;3880:19:0;;;::::1;::::0;;;::::1;::::0;;3821:83::o;5834:461::-;5919:4;1620:3;5934:7;:22;:53;;;;-1:-1:-1;5971:16:0;1620:3;5971:1;:16;:::i;:::-;5960:7;:27;;5934:53;5930:345;;;5995:33;6008:5;6015:3;6020:7;5995:12;:33::i;:::-;5930:345;;;-1:-1:-1;;;;;8032:17:0;;6046:18;8032:17;;;:10;:17;;;;;;;;6084:10;8032:37;;:27;;:37;;;;;;6109:21;;;;6101:30;;;;;;-1:-1:-1;;6141:10:0;:22;6137:92;;-1:-1:-1;;;;;6172:17:0;;:4;:17;;;:10;:17;;;;;;;;6200:10;6172:39;;:27;;:39;;;;;:50;;6215:7;;6172:4;:50;;6215:7;;6172:50;:::i;:::-;;;;-1:-1:-1;;6137:92:0;6234:35;6249:5;6256:3;6261:7;6234:14;:35::i;:::-;6040:235;5930:345;-1:-1:-1;6286:4:0;5834:461;;;;;:::o;7723:100::-;-1:-1:-1;;;;;7796:17:0;7775:7;7796:17;;;:10;:17;;;;;:22;;7723:100::o;9046:410::-;9116:23;9141:26;9169:20;9196:15;9214:9;:16;9196:34;;9258:7;9244:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9244:22:0;;9235:31;;9297:7;9283:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9283:22:0;;9271:34;;9330:7;9317:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9310:28:0;-1:-1:-1;9348:9:0;9343:109;9367:7;9363:1;:11;9343:109;;;9424:22;9433:9;9443:1;9433:12;;;;;;;;:::i;:::-;;;;;;;9424:8;:22::i;:::-;9388:6;9395:1;9388:9;;;;;;;;:::i;:::-;;;;;;9399;9409:1;9399:12;;;;;;;;:::i;:::-;;;;;;9413:4;9418:1;9413:7;;;;;;;;:::i;:::-;;;;;;;;;;9387:59;;;;-1:-1:-1;;;;;9387:59:0;;;;;;;;;;9376:3;;9343:109;;;;9191:265;9046:410;;;;;:::o;6300:133::-;6386:42;6403:5;6410:3;6415:8;6386:42;;;;;;;;;;;;:16;:42::i;:::-;6300:133;;;:::o;8079:433::-;8135:7;1620:3;8173:8;:23;:55;;;;-1:-1:-1;8212:16:0;8200:28;;;8173:55;8165:64;;;;;;8291:1;-1:-1:-1;;8265:27:0;;8259:34;8235:13;8328:9;:7;:9::i;:::-;8300:37;-1:-1:-1;8348:9:0;8343:135;8367:8;:15;8363:1;:19;8343:135;;;8431:5;8422;8400:19;8407:8;8416:1;8407:11;;;;;;;;:::i;:::-;;;;;;;8400:6;:19::i;:::-;:27;:36;8396:76;;8453:8;8462:1;8453:11;;;;;;;;:::i;:::-;;;;;;;8446:18;;;;;8079:433;;;:::o;8396:76::-;8384:3;;8343:135;;;-1:-1:-1;8498:3:0;;8079:433;-1:-1:-1;;;;8079:433:0:o;7828:105::-;7883:7;7904:24;7914:13;7921:5;7914:6;:13::i;:::-;7904:9;:24::i;4012:795::-;4074:3;4056:6;7028:9;;-1:-1:-1;;;;;7028:9:0;;6970:72;4056:6;-1:-1:-1;;;;;4056:22:0;;4048:31;;;;;;4084:13;4108:4;4084:29;;4118:13;1718:42;-1:-1:-1;;;;;4134:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;4152:17:0;;4177;4152;;;:10;:17;;;;;;;;-1:-1:-1;;4152:42:0;;4199:12;:24;;;;;;;;;;;;;;-1:-1:-1;;;;;;4199:24:0;;;;;2220:42;;;;;;;;;;;;4118:29;;-1:-1:-1;4152:17:0;;4177;;2220:42;;;;;;;2210:53;;;;;;1620:3;4233:64;;;;2456:25:2;;2444:2;2429:18;;2310:177;4233:64:0;;;;;;;;4307:9;4302:111;1620:3;4322:1;:16;4302:111;;;4386:16;4401:1;1620:3;4386:16;:::i;:::-;:20;;4405:1;4386:20;:::i;:::-;4356:51;;-1:-1:-1;;;;;4356:51:0;;;4373:3;;4356:51;;4373:3;;4356:51;4340:3;;4302:111;;;;4417:55;4431:5;1718:42;1671:3;4417:13;:55::i;:::-;1718:42;-1:-1:-1;;;;;4497:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4489:50;;-1:-1:-1;;;4489:50:0;;-1:-1:-1;;;;;11912:32:2;;;4489:50:0;;;11894:51:2;11981:32;;;11961:18;;;11954:60;4489:36:0;;;;;;;11867:18:2;;4489:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4477:9;:62;;-1:-1:-1;;;;;4477:62:0;;;-1:-1:-1;;;;;;4477:62:0;;;;;;1718:42;;4544:22;;4573:13;;;:5;1671:3;4477:4;;4619:7;6950:10;;-1:-1:-1;;;;;6950:10:0;;6891:74;4619:7;4544:100;;;;;;-1:-1:-1;;;;;;4544:100:0;;;-1:-1:-1;;;;;12346:32:2;;;4544:100:0;;;12328:51:2;12395:18;;;12388:34;;;;12438:18;;;12431:34;;;;12481:18;;;12474:34;12545:32;;;12524:19;;;12517:61;4628:15:0;12594:19:2;;;12587:35;12300:19;;4544:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4649:69;4664:5;4671:42;4715:2;4649:14;:69::i;:::-;4748:34;4763:5;4770:7;6950:10;;-1:-1:-1;;;;;6950:10:0;;6891:74;4770:7;4779:2;4748:14;:34::i;:::-;4043:764;;4012:795::o;7047:87::-;7087:16;7117:4;:12;;7110:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7110:19:0;;;;;;;;;;;;;;;;;;;;;;;7047:87;:::o;7410:95::-;7478:13;;:22;;;-1:-1:-1;;;7478:22:0;;;;7451:13;;-1:-1:-1;;;;;7478:13:0;;:20;;:22;;;;;:4;;:22;;;;;;;:13;:22;;;;;;;;;;;;;;4812:406;4889:4;4865:13;4920:16;4889:4;4920:9;:16::i;:::-;4899:37;;4960:10;4949:7;:21;;4941:30;;;;;;4976:13;4992:19;2404:9;4992:7;:19;:::i;:::-;4976:35;;5037:5;5024:9;:18;;5016:27;;;;;;5048:42;5063:5;5070:10;5082:7;5048:14;:42::i;:::-;6950:10;;5095:32;;-1:-1:-1;;;;;6950:10:0;;;;5095:32;;;;;5121:5;;5095:32;;;;5121:5;6950:10;5095:32;;;;;;;;;;;;;;;;;;;;;5148:5;5136:9;:17;5132:82;;;5169:10;5161:47;5190:17;5202:5;5190:9;:17;:::i;:::-;5161:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5132:82;4860:358;;;4812:406;:::o;5493:193::-;5580:10;5569:4;:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;5569:42:0;;;;;:31;;;;:42;;;;;;:54;;-1:-1:-1;;5569:54:0;;;;;;;;;;5633:48;;540:41:2;;;5569:42:0;;5580:10;5633:48;;513:18:2;5633:48:0;;;;;;;5493:193;;:::o;5691:138::-;5757:4;5768:40;5783:10;5795:3;5800:7;5768:14;:40::i;6438:329::-;6542:34;6555:5;6562:3;6567:8;6542:12;:34::i;:::-;6622:16;;6651:9;;;;6647:116;;6676:66;;-1:-1:-1;;;6676:66:0;;-1:-1:-1;;;;;6676:30:0;;;;;:66;;6707:10;;6719:5;;6726:8;;6736:5;;6676:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;6676:80:0;;6746:10;6676:80;;;6668:89;;;;;7510:121;7594:13;;:32;;-1:-1:-1;;;7594:32:0;;;;;2456:25:2;;;7567:13:0;;-1:-1:-1;;;;;7594:13:0;;:22;;2429:18:2;;7594:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7594:32:0;;;;;;;;;;;;:::i;6772:111::-;6849:29;6863:3;6868:9;6849:13;:29::i;8848:193::-;8905:18;8925:16;8943:17;8975;8983:8;8975:7;:17::i;:::-;8994:21;9006:8;8994:11;:21::i;:::-;9017:18;9026:8;9017;:18::i;:::-;8967:69;;;;;;8848:193;;;;;:::o;3909:96::-;6950:10;;-1:-1:-1;;;;;6950:10:0;3388;:21;3380:30;;;;;;3975:13:::1;:25:::0;;-1:-1:-1;;;;;;3975:25:0::1;-1:-1:-1::0;;;;;3975:25:0;;;::::1;::::0;;;::::1;::::0;;3909:96::o;9675:273::-;9746:13;9802:1;9776:23;1620:3;9776:8;:23;:::i;:::-;:27;;;;:::i;:::-;9770:1;:34;;;-1:-1:-1;9770:34:0;;9818:18;9825:10;9818:6;:18::i;:::-;:26;:35;9810:44;;;;;;9859:4;:23;;;:13;:23;;;;;;:34;;-1:-1:-1;;;;;;9859:34:0;-1:-1:-1;;;;;9859:34:0;;;;;;;;9903:40;;9859:23;;9912:10;;9903:40;;9859:4;9903:40;9741:207;9675:273;;:::o;9463:207::-;-1:-1:-1;;;;;9551:18:0;;;:4;:18;;;:10;:18;;;;;;;;:38;;;;;;:28;;;;:38;;;;;;:48;;;2319:42;;;;;;;;;;;;;;;;;;2309:53;;;;;;9657:7;9609:56;;;;2456:25:2;;2444:2;2429:18;;2310:177;9609:56:0;;;;;;;;9463:207;;;:::o;10542:519::-;1620:3;10648:8;:23;:55;;;;-1:-1:-1;10687:16:0;10675:28;;;10648:55;10640:64;;;;;;10766:1;-1:-1:-1;;10740:27:0;;10734:34;;;10783:13;10790:5;10783:6;:13::i;:::-;:21;:30;10775:39;;;;;;10828:10;-1:-1:-1;;;;;10828:19:0;;;;:58;;;10865:21;10877:8;10865:11;:21::i;:::-;-1:-1:-1;;;;;10851:35:0;:10;-1:-1:-1;;;;;10851:35:0;;10828:58;:97;;;-1:-1:-1;;;;;;8800:18:0;;8782:4;8800:18;;;:10;:18;;;;;;;;10914:10;8800:38;;:27;;:38;;;;;;;;10890:35;10820:106;;;;;;10961:16;;;10975:1;10961:16;;;;;;;;;10932:26;;10961:16;;;;;;;;;;;-1:-1:-1;10961:16:0;10932:45;;10998:8;10983:9;10993:1;10983:12;;;;;;;;:::i;:::-;;;;;;:23;;;;;11012:39;11022:5;11029:3;11034:5;11041:9;11012;:39::i;9954:582::-;10053:13;;;;10139;10146:5;10139:6;:13::i;:::-;10131:22;-1:-1:-1;10131:22:0;10202:7;10188:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10188:22:0;;10159:51;;10216:189;10228:1;10223:2;:6;:26;;;;;10242:7;10233:6;:16;10223:26;10216:189;;;10262:2;10267:1;10262:6;10272:1;10262:11;10258:113;;10318:19;;10300:1;:9;;;10283:27;;;;;10328:8;;;10340:23;;;;10318:9;;10328:8;10318:19;;;;;;:::i;:::-;;;;;;:45;;;;;10258:113;10377:6;;;;;10390:8;;;;;10216:189;;;10428:7;10418:6;:17;10410:26;;;;;;10475:5;10466;10450:13;10457:5;10450:6;:13::i;:::-;:21;:30;10442:39;;;;;;10487;10497:5;10504:3;10509:5;10516:9;10487;:39::i;:::-;10037:495;;;;;9954:582;;;:::o;12608:302::-;12662:7;12697:2;12709:14;;;12705:42;;-1:-1:-1;12738:3:0;;12608:302;-1:-1:-1;;12608:302:0:o;12705:42::-;1997:66;1797;12780:1;12774:7;;;12773:14;12767:20;;;12818:1;12812:7;;;1897:66;12811:14;;;12799:7;;12798:28;12850:1;12844:7;;;12838:14;12837:21;2098:66;12870:8;12883:3;12869:17;;;-1:-1:-1;;12608:302:0:o;11067:390::-;11161:13;;11180:117;11204:9;:16;11200:1;:20;11180:117;;;11287:1;1620:3;11257:9;11267:1;11257:12;;;;;;;;:::i;:::-;;;;;;;:27;:31;11251:1;:38;;11243:47;;11234:56;;;;11222:3;;;;;;;11180:117;;;;11330:9;:16;11310;11320:5;11310:9;:16::i;:::-;:36;11302:45;;;;;;11391:5;11382;11361:18;11368:10;11361:6;:18::i;:::-;:26;:35;11353:44;;;;;;11403;11413:10;11425:3;11430:5;11437:9;11462:1139;11609:1;11590:9;:16;:20;11582:29;;;;;;11622:9;11617:274;11641:9;:16;11637:1;:20;11617:274;;;11712:3;-1:-1:-1;;;;;11675:41:0;:25;11687:9;11697:1;11687:12;;;;;;;;:::i;:::-;;;;;;;11675:11;:25::i;:::-;-1:-1:-1;;;;;11675:41:0;;11671:168;;11764:3;11726:4;:13;;:27;11740:9;11750:1;11740:12;;;;;;;;:::i;:::-;;;;;;;11726:27;;;;;;;;;;;;:42;;;;;-1:-1:-1;;;;;11726:42:0;;;;;-1:-1:-1;;;;;11726:42:0;;;;;;11818:9;11828:1;11818:12;;;;;;;;:::i;:::-;;;;;;;;;;;11781:50;;11812:3;;;;11781:50;;11812:3;;11781:50;11671:168;11871:9;11881:1;11871:12;;;;;;;;:::i;:::-;;;;;;;11866:3;-1:-1:-1;;;;;11850:34:0;11859:5;-1:-1:-1;;;;;11850:34:0;;;;;;;;;;;11659:3;;11617:274;;;-1:-1:-1;;;;;;11896:17:0;;:4;:17;;;:10;:17;;;;;:31;;;;;;11947:13;11907:5;11947:6;:13::i;:::-;:20;;-1:-1:-1;11964:3:0;11985:11;11992:3;11985:6;:11::i;:::-;-1:-1:-1;;;;;12009:15:0;;12000:3;12009:15;;;:10;:15;;;;;:29;;;;;;11985:18;;-1:-1:-1;12044:429:0;;;;12063:14;12084:25;12112:9;:7;:9::i;:::-;12084:37;-1:-1:-1;12133:9:0;12128:129;12152:8;:15;12148:1;:19;12128:129;;;12201:5;-1:-1:-1;;;;;12186:20:0;:8;12195:1;12186:11;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;12186:20:0;;12182:68;;12226:1;12217:10;;12236:5;;12182:68;12169:3;;12128:129;;;;12267:4;12263:152;;;12304:3;12281:4;:12;;12294:6;12281:20;;;;;;;;:::i;:::-;;;;;;;;;:26;;;;;-1:-1:-1;;;;;12281:26:0;;;;;-1:-1:-1;;;;;12281:26:0;;;;;;12263:152;;;12352:8;12379:1;12361:8;:15;:19;12352:29;;;;;;;;:::i;:::-;;;;;;;12329:4;:12;;12342:6;12329:20;;;;;;;;:::i;:::-;;;;;;;;;;:52;;-1:-1:-1;;;;;;12329:52:0;-1:-1:-1;;;;;12329:52:0;;;;;;;;;;12389:12;:18;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;12389:18:0;;;;;-1:-1:-1;;;;;;12389:18:0;;;;;;12263:152;12056:365;;12044:429;;;12431:4;12427:46;;;12444:12;:22;;;;;;;-1:-1:-1;12444:22:0;;;;;;;;-1:-1:-1;;;;;;12444:22:0;-1:-1:-1;;;;;12444:22:0;;;;;12427:46;12502:11;12509:3;12502:6;:11::i;:::-;12486:13;12493:5;12486:6;:13::i;:::-;:27;:34;12478:43;;;;;;12569:3;-1:-1:-1;;;;;12532:59:0;12562:5;-1:-1:-1;;;;;12532:59:0;2220:42;;;;;;;;;;;;;;;;;2210:53;;;;;;12574:9;:16;12532:59;;;;2456:25:2;;2444:2;2429:18;;2310:177;12532:59:0;;;;;;;;11566:1031;;11462:1139;;;;:::o;14:131:2:-;-1:-1:-1;;;;;;88:32:2;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:2:o;592:289::-;634:3;672:5;666:12;699:6;694:3;687:19;755:6;748:4;741:5;737:16;730:4;725:3;721:14;715:47;807:1;800:4;791:6;786:3;782:16;778:27;771:38;870:4;863:2;859:7;854:2;846:6;842:15;838:29;833:3;829:39;825:50;818:57;;;592:289;;;;:::o;886:220::-;1035:2;1024:9;1017:21;998:4;1055:45;1096:2;1085:9;1081:18;1073:6;1055:45;:::i;1111:226::-;1170:6;1223:2;1211:9;1202:7;1198:23;1194:32;1191:52;;;1239:1;1236;1229:12;1191:52;-1:-1:-1;1284:23:2;;1111:226;-1:-1:-1;1111:226:2:o;1550:131::-;-1:-1:-1;;;;;1625:31:2;;1615:42;;1605:70;;1671:1;1668;1661:12;1686:367;1754:6;1762;1815:2;1803:9;1794:7;1790:23;1786:32;1783:52;;;1831:1;1828;1821:12;1783:52;1870:9;1857:23;1889:31;1914:5;1889:31;:::i;:::-;1939:5;2017:2;2002:18;;;;1989:32;;-1:-1:-1;;;1686:367:2:o;2058:247::-;2117:6;2170:2;2158:9;2149:7;2145:23;2141:32;2138:52;;;2186:1;2183;2176:12;2138:52;2225:9;2212:23;2244:31;2269:5;2244:31;:::i;2492:508::-;2569:6;2577;2585;2638:2;2626:9;2617:7;2613:23;2609:32;2606:52;;;2654:1;2651;2644:12;2606:52;2693:9;2680:23;2712:31;2737:5;2712:31;:::i;:::-;2762:5;-1:-1:-1;2819:2:2;2804:18;;2791:32;2832:33;2791:32;2832:33;:::i;:::-;2492:508;;2884:7;;-1:-1:-1;;;2964:2:2;2949:18;;;;2936:32;;2492:508::o;3376:127::-;3437:10;3432:3;3428:20;3425:1;3418:31;3468:4;3465:1;3458:15;3492:4;3489:1;3482:15;3508:275;3579:2;3573:9;3644:2;3625:13;;-1:-1:-1;;3621:27:2;3609:40;;3679:18;3664:34;;3700:22;;;3661:62;3658:88;;;3726:18;;:::i;:::-;3762:2;3755:22;3508:275;;-1:-1:-1;3508:275:2:o;3788:775::-;3842:5;3895:3;3888:4;3880:6;3876:17;3872:27;3862:55;;3913:1;3910;3903:12;3862:55;3953:6;3940:20;3983:18;3975:6;3972:30;3969:56;;;4005:18;;:::i;:::-;4051:6;4048:1;4044:14;4078:30;4102:4;4098:2;4094:13;4078:30;:::i;:::-;4144:19;;;4188:4;4220:15;;;4216:26;;;4179:14;;;;4254:15;;;4251:35;;;4282:1;4279;4272:12;4251:35;4318:4;4310:6;4306:17;4295:28;;4332:200;4348:6;4343:3;4340:15;4332:200;;;4440:17;;4470:18;;4517:4;4365:14;;;;4508;;;;4332:200;;;4550:7;3788:775;-1:-1:-1;;;;;;3788:775:2:o;4568:348::-;4652:6;4705:2;4693:9;4684:7;4680:23;4676:32;4673:52;;;4721:1;4718;4711:12;4673:52;4761:9;4748:23;4794:18;4786:6;4783:30;4780:50;;;4826:1;4823;4816:12;4780:50;4849:61;4902:7;4893:6;4882:9;4878:22;4849:61;:::i;:::-;4839:71;4568:348;-1:-1:-1;;;;4568:348:2:o;4921:446::-;4974:3;5012:5;5006:12;5039:6;5034:3;5027:19;5071:4;5066:3;5062:14;5055:21;;5110:4;5103:5;5099:16;5133:1;5143:199;5157:6;5154:1;5151:13;5143:199;;;5222:13;;-1:-1:-1;;;;;5218:39:2;5206:52;;5287:4;5278:14;;;;5315:17;;;;5254:1;5172:9;5143:199;;;-1:-1:-1;5358:3:2;;4921:446;-1:-1:-1;;;;4921:446:2:o;5372:1152::-;5727:2;5716:9;5709:21;5690:4;5753:56;5805:2;5794:9;5790:18;5782:6;5753:56;:::i;:::-;5857:9;5849:6;5845:22;5840:2;5829:9;5825:18;5818:50;5891:44;5928:6;5920;5891:44;:::i;:::-;5877:58;;5983:9;5975:6;5971:22;5966:2;5955:9;5951:18;5944:50;6014:6;6049;6043:13;6080:6;6072;6065:22;6115:2;6107:6;6103:15;6096:22;;6174:2;6164:6;6161:1;6157:14;6149:6;6145:27;6141:36;6212:2;6204:6;6200:15;6233:1;6243:252;6257:6;6254:1;6251:13;6243:252;;;6347:2;6343:7;6334:6;6326;6322:19;6318:33;6313:3;6306:46;6375:40;6408:6;6399;6393:13;6375:40;:::i;:::-;6450:2;6473:12;;;;6365:50;;-1:-1:-1;6438:15:2;;;;;6279:1;6272:9;6243:252;;;-1:-1:-1;6512:6:2;;5372:1152;-1:-1:-1;;;;;;;;;5372:1152:2:o;6529:261::-;6708:2;6697:9;6690:21;6671:4;6728:56;6780:2;6769:9;6765:18;6757:6;6728:56;:::i;6795:416::-;6860:6;6868;6921:2;6909:9;6900:7;6896:23;6892:32;6889:52;;;6937:1;6934;6927:12;6889:52;6976:9;6963:23;6995:31;7020:5;6995:31;:::i;:::-;7045:5;-1:-1:-1;7102:2:2;7087:18;;7074:32;7144:15;;7137:23;7125:36;;7115:64;;7175:1;7172;7165:12;7115:64;7198:7;7188:17;;;6795:416;;;;;:::o;7216:186::-;7264:4;7297:18;7289:6;7286:30;7283:56;;;7319:18;;:::i;:::-;-1:-1:-1;7385:2:2;7364:15;-1:-1:-1;;7360:29:2;7391:4;7356:40;;7216:186::o;7407:1092::-;7502:6;7510;7518;7526;7579:3;7567:9;7558:7;7554:23;7550:33;7547:53;;;7596:1;7593;7586:12;7547:53;7635:9;7622:23;7654:31;7679:5;7654:31;:::i;:::-;7704:5;-1:-1:-1;7761:2:2;7746:18;;7733:32;7774:33;7733:32;7774:33;:::i;:::-;7826:7;-1:-1:-1;7906:2:2;7891:18;;7878:32;;-1:-1:-1;7987:2:2;7972:18;;7959:32;8014:18;8003:30;;8000:50;;;8046:1;8043;8036:12;8000:50;8069:22;;8122:4;8114:13;;8110:27;-1:-1:-1;8100:55:2;;8151:1;8148;8141:12;8100:55;8191:2;8178:16;8216:52;8232:35;8260:6;8232:35;:::i;:::-;8216:52;:::i;:::-;8291:6;8284:5;8277:21;8339:7;8334:2;8325:6;8321:2;8317:15;8313:24;8310:37;8307:57;;;8360:1;8357;8350:12;8307:57;8415:6;8410:2;8406;8402:11;8397:2;8390:5;8386:14;8373:49;8467:1;8462:2;8453:6;8446:5;8442:18;8438:27;8431:38;8488:5;8478:15;;;;;7407:1092;;;;;;;:::o;8504:483::-;8597:6;8605;8658:2;8646:9;8637:7;8633:23;8629:32;8626:52;;;8674:1;8671;8664:12;8626:52;8713:9;8700:23;8732:31;8757:5;8732:31;:::i;:::-;8782:5;-1:-1:-1;8838:2:2;8823:18;;8810:32;8865:18;8854:30;;8851:50;;;8897:1;8894;8887:12;8851:50;8920:61;8973:7;8964:6;8953:9;8949:22;8920:61;:::i;:::-;8910:71;;;8504:483;;;;;:::o;8992:388::-;9060:6;9068;9121:2;9109:9;9100:7;9096:23;9092:32;9089:52;;;9137:1;9134;9127:12;9089:52;9176:9;9163:23;9195:31;9220:5;9195:31;:::i;:::-;9245:5;-1:-1:-1;9302:2:2;9287:18;;9274:32;9315:33;9274:32;9315:33;:::i;9385:414::-;-1:-1:-1;;;;;9590:32:2;;;9572:51;;9659:32;;9654:2;9639:18;;9632:60;9728:2;9723;9708:18;;9701:30;;;-1:-1:-1;;9748:45:2;;9774:18;;9766:6;9748:45;:::i;:::-;9740:53;9385:414;-1:-1:-1;;;;;9385:414:2:o;10073:686::-;10153:6;10206:2;10194:9;10185:7;10181:23;10177:32;10174:52;;;10222:1;10219;10212:12;10174:52;10255:9;10249:16;10288:18;10280:6;10277:30;10274:50;;;10320:1;10317;10310:12;10274:50;10343:22;;10396:4;10388:13;;10384:27;-1:-1:-1;10374:55:2;;10425:1;10422;10415:12;10374:55;10458:2;10452:9;10483:52;10499:35;10527:6;10499:35;:::i;10483:52::-;10558:6;10551:5;10544:21;10606:7;10601:2;10592:6;10588:2;10584:15;10580:24;10577:37;10574:57;;;10627:1;10624;10617:12;10574:57;10675:6;10670:2;10666;10662:11;10657:2;10650:5;10646:14;10640:42;10727:1;10702:18;;;10722:2;10698:27;10691:38;;;;10706:5;10073:686;-1:-1:-1;;;;10073:686:2:o;10764:127::-;10825:10;10820:3;10816:20;10813:1;10806:31;10856:4;10853:1;10846:15;10880:4;10877:1;10870:15;10896:168;10969:9;;;11000;;11017:15;;;11011:22;;10997:37;10987:71;;11038:18;;:::i;11069:128::-;11136:9;;;11157:11;;;11154:37;;;11171:18;;:::i;11202:127::-;11263:10;11258:3;11254:20;11251:1;11244:31;11294:4;11291:1;11284:15;11318:4;11315:1;11308:15;11334:251;11404:6;11457:2;11445:9;11436:7;11432:23;11428:32;11425:52;;;11473:1;11470;11463:12;11425:52;11505:9;11499:16;11524:31;11549:5;11524:31;:::i;11590:125::-;11655:9;;;11676:10;;;11673:36;;;11689:18;;:::i;12633:456::-;12721:6;12729;12737;12790:2;12778:9;12769:7;12765:23;12761:32;12758:52;;;12806:1;12803;12796:12;12758:52;-1:-1:-1;;12851:16:2;;12957:2;12942:18;;12936:25;13053:2;13038:18;;;13032:25;12851:16;;12936:25;;-1:-1:-1;13032:25:2;12633:456;-1:-1:-1;12633:456:2:o;13094:485::-;-1:-1:-1;;;;;13325:32:2;;;13307:51;;13394:32;;13389:2;13374:18;;13367:60;13458:2;13443:18;;13436:34;;;13506:3;13501:2;13486:18;;13479:31;;;-1:-1:-1;;13527:46:2;;13553:19;;13545:6;13527:46;:::i;13584:249::-;13653:6;13706:2;13694:9;13685:7;13681:23;13677:32;13674:52;;;13722:1;13719;13712:12;13674:52;13754:9;13748:16;13773:30;13797:5;13773:30;:::i;13838:127::-;13899:10;13894:3;13890:20;13887:1;13880:31;13930:4;13927:1;13920:15;13954:4;13951:1;13944:15

Swarm Source

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