ETH Price: $2,490.01 (-2.54%)

Contract

0xb6d80A462a40B39dA0A0D0F7101ec97F52A9Ef24
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Level Up Fairy67440712018-11-21 6:26:242164 days ago1542781584IN
0xb6d80A46...F52A9Ef24
0.01 ETH0.000185633
Birth Fairy67437972018-11-21 5:22:352164 days ago1542777755IN
0xb6d80A46...F52A9Ef24
0.05 ETH0.001315783
Increase Dark Po...67410542018-11-20 18:39:282165 days ago1542739168IN
0xb6d80A46...F52A9Ef24
0.02 ETH0.000140293
Increase Dark Po...67410382018-11-20 18:35:472165 days ago1542738947IN
0xb6d80A46...F52A9Ef24
0.01 ETH0.000308825
Level Up Fairy67410022018-11-20 18:26:532165 days ago1542738413IN
0xb6d80A46...F52A9Ef24
0.01 ETH0.000183683
Birth Fairy67409782018-11-20 18:20:552165 days ago1542738055IN
0xb6d80A46...F52A9Ef24
0.05 ETH0.001239513
0x60e0604066556142018-11-06 18:38:532179 days ago1541529533IN
 Create: EtherFairy
0 ETH0.057710219

Latest 12 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
67440712018-11-21 6:26:242164 days ago1542781584
0xb6d80A46...F52A9Ef24
0.005 ETH
67440712018-11-21 6:26:242164 days ago1542781584
0xb6d80A46...F52A9Ef24
0.005 ETH
67437972018-11-21 5:22:352164 days ago1542777755
0xb6d80A46...F52A9Ef24
0.025 ETH
67437972018-11-21 5:22:352164 days ago1542777755
0xb6d80A46...F52A9Ef24
0.025 ETH
67410542018-11-20 18:39:282165 days ago1542739168
0xb6d80A46...F52A9Ef24
0.01 ETH
67410542018-11-20 18:39:282165 days ago1542739168
0xb6d80A46...F52A9Ef24
0.01 ETH
67410382018-11-20 18:35:472165 days ago1542738947
0xb6d80A46...F52A9Ef24
0.005 ETH
67410382018-11-20 18:35:472165 days ago1542738947
0xb6d80A46...F52A9Ef24
0.005 ETH
67410022018-11-20 18:26:532165 days ago1542738413
0xb6d80A46...F52A9Ef24
0.005 ETH
67410022018-11-20 18:26:532165 days ago1542738413
0xb6d80A46...F52A9Ef24
0.005 ETH
67409782018-11-20 18:20:552165 days ago1542738055
0xb6d80A46...F52A9Ef24
0.025 ETH
67409782018-11-20 18:20:552165 days ago1542738055
0xb6d80A46...F52A9Ef24
0.025 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EtherFairy

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-23
*/

pragma solidity ^0.4.24;


interface ERC165 {
    /// @notice Query if a contract implements an interface
    /// @param interfaceID The interface identifier, as specified in ERC-165
    /// @dev Interface identification is specified in ERC-165. This function
    ///  uses less than 30,000 gas.
    /// @return `true` if the contract implements `interfaceID` and
    ///  `interfaceID` is not 0xffffffff, `false` otherwise
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

/// @title ERC-721 Non-Fungible Token Standard, optional metadata extension
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x5b5e139f.
interface ERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string _name);

    /// @notice An abbreviated name for NFTs in this contract
    function symbol() external view returns (string _symbol);

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string);
}

// 문자열 처리 유틸리티
library StringUtil {
	
	// 두 문자열을 합칩니다.
	function concat(string a, string b) internal pure returns (string c) {
		
		bytes memory ba = bytes(a);
		bytes memory bb = bytes(b);
		bytes memory bc = bytes(new string(ba.length + bb.length));
		
		uint256 i = 0;
		uint256 j = 0;
		
		for (j = 0; j < ba.length; j += 1) {
			bc[i] = ba[j];
			i += 1;
		}
		
		for (j = 0; j < bb.length; j += 1) {
			bc[i] = bb[j];
			i += 1;
		}
		
		return string(bc);
    }
	
	// uint256를 문자열로 변경합니다.
	function uint256ToString(uint256 i) internal pure returns (string str) {
        if (i == 0) {
        	return "0";
        }
        
        uint256 j = i;
        uint256 length;
        while (j != 0){
            length += 1;
            j /= 10;
        }
        
        bytes memory bstr = new bytes(length);
        uint256 k = length - 1;
        while (i != 0){
            bstr[k] = byte(48 + i % 10);
            i /= 10;
            k -= 1;
        }
        
        return string(bstr);
    }
}

// Ether Fairy의 기본적인 내용을 담고있는 계약
contract EtherFairyBase is ERC721Metadata {
	
	// 토큰 정보
	string constant public NAME = "Ether Fairy";
	string constant public SYMBOL = "FAIRY";
	string public tokenMetadataBaseURI = "https://etherfairy.com/api/tokenmetadata/";
	
	// 요정 원본의 가격
	uint256 public fairyOriginPrice = 0.05 ether;
	
	// 임의 레벨업 가격
	uint256 public customLevelUpPrice = 0.01 ether;
	
	// 임의로 포인트를 증가시키는데 드는 포인트당 가격
	uint256 public increasePointPricePerPoint = 0.01 ether;
	
	// 요정 정보
	struct Fairy {
		
		// 회사 서버에 저장된 요정 원본의 ID
		string fairyOriginId;
		
		// 요정 디자이너의 지갑
		address designer;
		
		// 요정의 이름
		string name;
		
		// 탄생 시간
		uint256 birthTime;
		
		// 소유주에 의해 추가된 레벨
		uint256 appendedLevel;
		
		// 기본 속성에 대한 레벨 당 증가 포인트들
		uint256 hpPointPerLevel;
		uint256 attackPointPerLevel;
		uint256 defencePointPerLevel;
		uint256 agilityPointPerLevel;
		uint256 dexterityPointPerLevel;
		
		// 원소 속성에 대한 레벨 당 증가 포인트들
		uint256 firePointPerLevel;
		uint256 waterPointPerLevel;
		uint256 windPointPerLevel;
		uint256 earthPointPerLevel;
		uint256 lightPointPerLevel;
		uint256 darkPointPerLevel;
	}
	
	// 요정들의 저장소
	Fairy[] internal fairies;
	
	function getFairyCount() view public returns (uint256) {
		return fairies.length;
	}
	
	// 원본 ID에 해당하는 요정의 개수를 반환합니다.
	function getFairyCountByOriginId(string fairyOriginId) view public returns (uint256) {
		bytes32 hash = keccak256(bytes(fairyOriginId));
		
		uint256 fairyCount = 0;
		for (uint256 i = 0; i < fairies.length; i += 1) {
			if (keccak256(bytes(fairies[i].fairyOriginId)) == hash) {
				fairyCount += 1;
			}
		}
		
		return fairyCount;
	}
	
	// 원본 ID에 해당하는 요정의 ID 목록을 반환합니다.
	function getFairyIdsByOriginId(string fairyOriginId) view public returns (uint256[]) {
		bytes32 hash = keccak256(bytes(fairyOriginId));
		
		uint256[] memory fairyIds = new uint256[](getFairyCountByOriginId(fairyOriginId));
		uint256 j = 0;
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			if (keccak256(bytes(fairies[i].fairyOriginId)) == hash) {
				fairyIds[j] = i;
				j += 1;
			}
		}
		
		return fairyIds;
	}
	
	// 소유주들 주소
	address[] public masters;
	
	function getMasterCount() view public returns (uint256) {
		return masters.length;
	}
	
	// 소유주가 이미 존재하는지
	mapping(address => bool) internal masterToIsExisted;
	
	// 소유주가 차단되었는지
	mapping(address => bool) public masterToIsBlocked;
	
	// 요정이 차단되었는지
	mapping(uint256 => bool) public fairyIdToIsBlocked;
	
	// 회사의 지갑 주소
	address public company;
	
	// 공식 마켓 계약 주소
	address public officialMarket;
	
	constructor() public {
		// 계약 생성자를 초기 회사 및 공식 마켓 주소로 등록
		company = msg.sender;
		officialMarket = msg.sender;
	}
	
	// 서비스가 일시중지 상태인지
	bool public servicePaused = false;
	
	// 서비스가 구동중일때만
	modifier whenServiceRunning() {
		require(servicePaused != true);
		_;
	}
	
	// 서비스가 일시정지 상태일때만
	modifier whenServicePaused() {
		require(servicePaused == true);
		_;
	}
	
	// 차단된 소유주가 아닐 경우에만
	modifier whenNotBlocked() {
		// 회사는 차단 불가
		require(msg.sender == company || masterToIsBlocked[msg.sender] != true);
		_;
	}
	
	// 차단된 요정이 아닐 경우에만
	modifier whenNotBlockedFairy(uint256 fairyId) {
		// 회사는 차단 불가
		require(msg.sender == company || fairyIdToIsBlocked[fairyId] != true);
		_;
	}
	
	// 주소를 잘못 사용하는 것인지 체크
	function checkAddressMisused(address target) internal view returns (bool) {
		return
			target == address(0) ||
			target == address(this);
	}
	
	//ERC721Metadata: 토큰의 이름 반환
	function name() view external returns (string) {
		return NAME;
	}
	
	//ERC721Metadata: 토큰의 심볼 반환
	function symbol() view external returns (string) {
		return SYMBOL;
	}
	
	//ERC721Metadata: 요정 정보의 메타데이터를 가져오는 경로를 반환합니다.
	function tokenURI(uint256 fairyId) view external returns (string) {
		return StringUtil.concat(tokenMetadataBaseURI, StringUtil.uint256ToString(fairyId));
	}
}

// Ether Fairy를 운영하는 회사에서 사용하는 기능들
contract EtherFairyCompany is EtherFairyBase {
	
	// 소유권 이전 이벤트
	event TransferOwnership(address oldCompany, address newCompany);
	
	// 서비스를 일시중지하거나 재개하면 발생하는 이벤트
	event PauseService();
	event ResumeService();
	
	// 기타 이벤트
	event ChangeFairyOriginPrice(uint256 price);
	event ChangeCustomLevelUpPrice(uint256 price);
	event ChangeIncreasePointPricePerPoint(uint256 price);
	event ChangeTokenMetadataBaseURI(string tokenMetadataBaseURI);
	event ChangeOfficialMarket(address officialMarket);
	event BlockMaster(address masterToBlock);
	event BlockFairy(uint256 fairyIdToBlock);
	event UnblockMaster(address masterToUnlock);
	event UnblockFairy(uint256 fairyIdToUnblock);
	
	// 회사만 처리 가능
	modifier onlyCompany {
		require(msg.sender == company);
		_;
	}
	
	// 소유권을 이전합니다.
	function transferOwnership(address newCompany) onlyCompany public {
		address oldCompany = company;
		company = newCompany;
		emit TransferOwnership(oldCompany, newCompany);
	}
	
	// 서비스의 작동을 중지합니다.
	function pauseService() onlyCompany whenServiceRunning public {
		servicePaused = true;
		emit PauseService();
	}
	
	// 서비스를 재개합니다.
	function resumeService() onlyCompany whenServicePaused public {
		servicePaused = false;
		emit ResumeService();
	}
	
	// 요정 원본의 가격을 변경합니다.
	function changeFairyOriginPrice(uint256 newFairyOriginPrice) onlyCompany public {
		fairyOriginPrice = newFairyOriginPrice;
		emit ChangeFairyOriginPrice(newFairyOriginPrice);
	}
	
	// 임의 레벨업 가격을 변경합니다.
	function changeCustomLevelUpPrice(uint256 newCustomLevelUpPrice) onlyCompany public {
		customLevelUpPrice = newCustomLevelUpPrice;
		emit ChangeCustomLevelUpPrice(newCustomLevelUpPrice);
	}
	
	// 임의로 포인트를 증가시키는데 드는 포인트당 가격을 변경합니다.
	function changeIncreasePointPricePerPoint(uint256 newIncreasePointPricePerPoint) onlyCompany public {
		increasePointPricePerPoint = newIncreasePointPricePerPoint;
		emit ChangeIncreasePointPricePerPoint(newIncreasePointPricePerPoint);
	}
	
	// tokenMetadataBaseURI을 변경합니다.
	function changeTokenMetadataBaseURI(string newTokenMetadataBaseURI) onlyCompany public {
		tokenMetadataBaseURI = newTokenMetadataBaseURI;
		emit ChangeTokenMetadataBaseURI(newTokenMetadataBaseURI);
	}
	
	// 공식 마켓 계약을 변경합니다.
	function changeOfficialMarket(address newOfficialMarket) onlyCompany public {
		officialMarket = newOfficialMarket;
		emit ChangeOfficialMarket(newOfficialMarket);
	}
	
	// 특정 소유주를 차단합니다.
	function blockMaster(address masterToBlock) onlyCompany public {
		masterToIsBlocked[masterToBlock] = true;
		emit BlockMaster(masterToBlock);
	}
	
	// 특정 요정을 차단합니다.
	function blockFairy(uint256 fairyIdToBlock) onlyCompany public {
		fairyIdToIsBlocked[fairyIdToBlock] = true;
		emit BlockFairy(fairyIdToBlock);
	}
	
	// 소유주 차단을 해제합니다.
	function unblockMaster(address masterToUnlock) onlyCompany public {
		delete masterToIsBlocked[masterToUnlock];
		emit UnblockMaster(masterToUnlock);
	}
	
	// 요정 차단을 해제합니다.
	function unblockFairy(uint256 fairyIdToUnblock) onlyCompany public {
		delete fairyIdToIsBlocked[fairyIdToUnblock];
		emit UnblockFairy(fairyIdToUnblock);
	}
}

/// @title ERC-721 Non-Fungible Token Standard
/// @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
///  Note: the ERC-165 identifier for this interface is 0x80ac58cd.
interface ERC721 /* is ERC165 */ {
    /// @dev This emits when ownership of any NFT changes by any mechanism.
    ///  This event emits when NFTs are created (`from` == 0) and destroyed
    ///  (`to` == 0). Exception: during contract creation, any number of NFTs
    ///  may be created and assigned without emitting Transfer. At the time of
    ///  any transfer, the approved address for that NFT (if any) is reset to none.
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    /// @dev This emits when the approved address for an NFT is changed or
    ///  reaffirmed. The zero address indicates there is no approved address.
    ///  When a Transfer event emits, this also indicates that the approved
    ///  address for that NFT (if any) is reset to none.
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    /// @dev This emits when an operator is enabled or disabled for an owner.
    ///  The operator can manage all NFTs of the owner.
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /// @notice Count all NFTs assigned to an owner
    /// @dev NFTs assigned to the zero address are considered invalid, and this
    ///  function throws for queries about the zero address.
    /// @param _owner An address for whom to query the balance
    /// @return The number of NFTs owned by `_owner`, possibly zero
    function balanceOf(address _owner) external view returns (uint256);

    /// @notice Find the owner of an NFT
    /// @dev NFTs assigned to zero address are considered invalid, and queries
    ///  about them do throw.
    /// @param _tokenId The identifier for an NFT
    /// @return The address of the owner of the NFT
    function ownerOf(uint256 _tokenId) external view returns (address);

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;

    /// @notice Change or reaffirm the approved address for an NFT
    /// @dev The zero address indicates there is no approved address.
    ///  Throws unless `msg.sender` is the current NFT owner, or an authorized
    ///  operator of the current owner.
    /// @param _approved The new approved NFT controller
    /// @param _tokenId The NFT to approve
    function approve(address _approved, uint256 _tokenId) external payable;

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///  all of `msg.sender`'s assets
    /// @dev Emits the ApprovalForAll event. The contract MUST allow
    ///  multiple operators per owner.
    /// @param _operator Address to add to the set of authorized operators
    /// @param _approved True if the operator is approved, false to revoke approval
    function setApprovalForAll(address _operator, bool _approved) external;

    /// @notice Get the approved address for a single NFT
    /// @dev Throws if `_tokenId` is not a valid NFT.
    /// @param _tokenId The NFT to find the approved address for
    /// @return The approved address for this NFT, or the zero address if there is none
    function getApproved(uint256 _tokenId) external view returns (address);

    /// @notice Query if an address is an authorized operator for another address
    /// @param _owner The address that owns the NFTs
    /// @param _operator The address that acts on behalf of the owner
    /// @return True if `_operator` is an approved operator for `_owner`, false otherwise
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes _data) external returns(bytes4);
}

// 숫자 계산 시 오버플로우 문제를 방지하기 위한 라이브러리
library SafeMath {
	
	function add(uint256 a, uint256 b) pure internal returns (uint256 c) {
		c = a + b;
		assert(c >= a);
		return c;
	}
	
	function sub(uint256 a, uint256 b) pure internal returns (uint256 c) {
		assert(b <= a);
		return a - b;
	}
	
	function mul(uint256 a, uint256 b) pure internal returns (uint256 c) {
		if (a == 0) {
			return 0;
		}
		c = a * b;
		assert(c / a == b);
		return c;
	}
	
	function div(uint256 a, uint256 b) pure internal returns (uint256 c) {
		return a / b;
	}
}

// 요정 소유권 관련 기능
contract FairyOwnership is EtherFairyBase, ERC721 {
	using SafeMath for uint256;
	
	// 요정의 소유주 정보
	mapping(uint256 => address) public fairyIdToMaster;
	
	// 소유주의 요정 ID 목록 정보
	mapping(address => uint256[]) public masterToFairyIds;
	
	// 요정의 요정 ID 목록에서의 index 정보
	mapping(uint256 => uint256) internal fairyIdToFairyIdsIndex;
	
	// 요정 거래 권한이 승인된 지갑 정보
	mapping(uint256 => address) private fairyIdToApproved;
	
	// 오퍼레이터가 승인되었는지에 대한 정보
	mapping(address => mapping(address => bool)) private masterToOperatorToIsApprovedForAll;
	
	// 요정 소유주만
	modifier onlyMasterOf(uint256 fairyId) {
		require(msg.sender == ownerOf(fairyId));
		_;
	}
	
	// 승인된 지갑만
	modifier onlyApprovedOf(uint256 fairyId) {
		require(
			msg.sender == ownerOf(fairyId) ||
			msg.sender == getApproved(fairyId) ||
			isApprovedForAll(ownerOf(fairyId), msg.sender) == true ||
			msg.sender == officialMarket
		);
		_;
	}
	
	//ERC721: 요정의 개수를 가져옵니다.
	function balanceOf(address master) view public returns (uint256) {
		// 주소 오용 차단
		require(checkAddressMisused(master) != true);
		return masterToFairyIds[master].length;
	}
	
	//ERC721: 요정의 소유주 지갑 주소를 가져옵니다.
	function ownerOf(uint256 fairyId) view public returns (address) {
		address master = fairyIdToMaster[fairyId];
		require(checkAddressMisused(master) != true);
		return master;
	}
	
	// 주어진 주소가 스마트 계약인지 확인합니다.
	function checkIsSmartContract(address addr) view private returns (bool) {
		uint32 size;
		assembly { size := extcodesize(addr) }
		return size > 0;
	}
	
	//ERC721: 요정을 받는 대상이 스마트 계약인 경우, onERC721Received 함수를 실행합니다.
	function safeTransferFrom(address from, address to, uint256 fairyId, bytes data) whenServiceRunning payable external {
		transferFrom(from, to, fairyId);
		if (checkIsSmartContract(to) == true) {
			// ERC721TokenReceiver
			require(ERC721TokenReceiver(to).onERC721Received(msg.sender, from, fairyId, data) == 0x150b7a02);
		}
	}
	
	//ERC721: 요정을 받는 대상이 스마트 계약인 경우, onERC721Received 함수를 실행합니다.
	function safeTransferFrom(address from, address to, uint256 fairyId) whenServiceRunning payable external {
		transferFrom(from, to, fairyId);
		if (checkIsSmartContract(to) == true) {
			// ERC721TokenReceiver
			require(ERC721TokenReceiver(to).onERC721Received(msg.sender, from, fairyId, "") == 0x150b7a02);
		}
	}
	
	//ERC721: 요정을 이전합니다.
	function transferFrom(address from, address to, uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyApprovedOf(fairyId) payable public {
		// 주소 오용 차단
		require(checkAddressMisused(to) != true);
		
		require(from == ownerOf(fairyId));
		require(to != ownerOf(fairyId));
		
		// 거래 권한 제거
		delete fairyIdToApproved[fairyId];
		emit Approval(from, 0, fairyId);
		
		// 기존 소유주로부터 요정 제거
		uint256 index = fairyIdToFairyIdsIndex[fairyId];
		uint256 lastIndex = balanceOf(from).sub(1);
		
		uint256 lastFairyId = masterToFairyIds[from][lastIndex];
		masterToFairyIds[from][index] = lastFairyId;
		
		delete masterToFairyIds[from][lastIndex];
		masterToFairyIds[from].length -= 1;
		
		fairyIdToFairyIdsIndex[lastFairyId] = index;
		
		// 요정 이전
		fairyIdToMaster[fairyId] = to;
		fairyIdToFairyIdsIndex[fairyId] = masterToFairyIds[to].push(fairyId).sub(1);
		
		emit Transfer(from, to, fairyId);
	}
	
	//ERC721: 특정 계약에 거래 권한을 부여합니다.
	function approve(address approved, uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable external {
		
		address master = ownerOf(fairyId);
		
		// 주소 오용 차단
		require(approved != master);
		require(checkAddressMisused(approved) != true);
		
		fairyIdToApproved[fairyId] = approved;
		emit Approval(master, approved, fairyId);
	}
	
	//ERC721: 오퍼레이터에게 거래 권한을 부여하거나 뺏습니다.
	function setApprovalForAll(address operator, bool isApproved) whenServiceRunning whenNotBlocked external {
		// 주소 오용 차단
		require(operator != msg.sender);
		require(checkAddressMisused(operator) != true);
		
		if (isApproved == true) {
			masterToOperatorToIsApprovedForAll[msg.sender][operator] = true;
		} else {
			delete masterToOperatorToIsApprovedForAll[msg.sender][operator];
		}
		
		emit ApprovalForAll(msg.sender, operator, isApproved);
	}
	
	//ERC721: 요정 거래 권한이 승인된 지갑 주소를 가져옵니다.
	function getApproved(uint256 fairyId) public view returns (address) {
		return fairyIdToApproved[fairyId];
	}
	
	//ERC721: 오퍼레이터가 거래 권한을 가지고 있는지 확인합니다.
	function isApprovedForAll(address master, address operator) view public returns (bool) {
		return masterToOperatorToIsApprovedForAll[master][operator] == true;
	}
}

// 돈을 지불하고 요정을 업그레이드 하는 기능들
contract FairyPayToUpgrade is FairyOwnership {
	
    event CustomLevelUp(uint256 indexed fairyId);
    event IncreaseHPPointPerLevel(uint256 indexed fairyId);
    event IncreaseAttackPointPerLevel(uint256 indexed fairyId);
    event IncreaseDefencePointPerLevel(uint256 indexed fairyId);
    event IncreaseAgilityPointPerLevel(uint256 indexed fairyId);
    event IncreaseDexterityPointPerLevel(uint256 indexed fairyId);
    event IncreaseFirePointPerLevel(uint256 indexed fairyId);
    event IncreaseWaterPointPerLevel(uint256 indexed fairyId);
    event IncreaseWindPointPerLevel(uint256 indexed fairyId);
    event IncreaseEarthPointPerLevel(uint256 indexed fairyId);
    event IncreaseLightPointPerLevel(uint256 indexed fairyId);
    event IncreaseDarkPointPerLevel(uint256 indexed fairyId);

	// 돈을 지불하고 레벨업 합니다.
	function levelUpFairy(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		// 임의 레벨업 가격과 비교합니다.
		require(msg.value == customLevelUpPrice);
		
		// 요정의 레벨을 올립니다.
		Fairy storage fairy = fairies[fairyId];
		fairy.appendedLevel = fairy.appendedLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit CustomLevelUp(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 HP 증가 포인트를 올립니다.
	function increaseHPPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.hpPointPerLevel);
		
		// 레벨 당 HP 증가 포인트를 올립니다.
		fairy.hpPointPerLevel = fairy.hpPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseHPPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 공격 증가 포인트를 올립니다.
	function increaseAttackPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.attackPointPerLevel);
		
		// 레벨 당 공격 증가 포인트를 올립니다.
		fairy.attackPointPerLevel = fairy.attackPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseAttackPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 방어 증가 포인트를 올립니다.
	function increaseDefencePointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.defencePointPerLevel);
		
		// 레벨 당 방어 증가 포인트를 올립니다.
		fairy.defencePointPerLevel = fairy.defencePointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseDefencePointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 민첩 증가 포인트를 올립니다.
	function increaseAgilityPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.agilityPointPerLevel);
		
		// 레벨 당 민첩 증가 포인트를 올립니다.
		fairy.agilityPointPerLevel = fairy.agilityPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseAgilityPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 재치 증가 포인트를 올립니다.
	function increaseDexterityPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.dexterityPointPerLevel);
		
		// 레벨 당 재치 증가 포인트를 올립니다.
		fairy.dexterityPointPerLevel = fairy.dexterityPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseDexterityPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 불 속성 증가 포인트를 올립니다.
	function increaseFirePointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.firePointPerLevel.add(1));
		
		// 레벨 당 불 속성 증가 포인트를 올립니다.
		fairy.firePointPerLevel = fairy.firePointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseFirePointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 물 속성 증가 포인트를 올립니다.
	function increaseWaterPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.waterPointPerLevel.add(1));
		
		// 레벨 당 물 속성 증가 포인트를 올립니다.
		fairy.waterPointPerLevel = fairy.waterPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseWaterPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 바람 속성 증가 포인트를 올립니다.
	function increaseWindPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.windPointPerLevel.add(1));
		
		// 레벨 당 바람 속성 증가 포인트를 올립니다.
		fairy.windPointPerLevel = fairy.windPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseWindPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 대지 속성 증가 포인트를 올립니다.
	function increaseEarthPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.earthPointPerLevel.add(1));
		
		// 레벨 당 대지 속성 증가 포인트를 올립니다.
		fairy.earthPointPerLevel = fairy.earthPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseEarthPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 빛 속성 증가 포인트를 올립니다.
	function increaseLightPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.lightPointPerLevel.add(1));
		
		// 레벨 당 빛 속성 증가 포인트를 올립니다.
		fairy.lightPointPerLevel = fairy.lightPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseLightPointPerLevel(fairyId);
	}
	
	// 돈을 지불하고 레벨 당 어둠 속성 증가 포인트를 올립니다.
	function increaseDarkPointPerLevel(uint256 fairyId) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) payable public {
		
		Fairy storage fairy = fairies[fairyId];
		
		// 임의로 포인트를 증가시키는데 드는 포인트당 가격과 비교합니다.
		require(msg.value == increasePointPricePerPoint * fairy.darkPointPerLevel.add(1));
		
		// 레벨 당 어둠 속성 증가 포인트를 올립니다.
		fairy.darkPointPerLevel = fairy.darkPointPerLevel.add(1);
		
        uint256 companyRevenue = msg.value.div(2);
        uint256 designerRevenue = msg.value.div(2);
        
        require(companyRevenue.add(designerRevenue) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(companyRevenue);
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		fairy.designer.transfer(designerRevenue);
		
		emit IncreaseDarkPointPerLevel(fairyId);
	}
}

// 요정 소유주가 사용하는 기능들
contract FairyMaster is FairyOwnership, FairyPayToUpgrade {
	using SafeMath for uint256;
	
	// 이벤트
    event BirthFairy(address indexed master, uint256 fairyId);
    event ChangeFairyName(uint256 indexed fairyId, string name);
	
	// 요정을 탄생시킵니다.
	function birthFairy(
		
		// 회사 서버에 저장된 요정 원본 ID
		string fairyOriginId,
		
		// 요정 디자이너의 지갑 주소
		address designer,
		
		// 요정의 이름
		string name,
		
		// 원소 속성에 대한 레벨 당 증가 포인트들
		uint256 firePointPerLevel,
		uint256 waterPointPerLevel,
		uint256 windPointPerLevel,
		uint256 earthPointPerLevel,
		uint256 lightPointPerLevel,
		uint256 darkPointPerLevel
		) whenServiceRunning whenNotBlocked payable public {
		
		// 주소 오용 차단
		require(checkAddressMisused(designer) != true);
		
		// 요정 원본의 가격과 비교합니다.
		require(msg.value == fairyOriginPrice);
		
		// 초기 속성 값들의 총합은 5가 되어야 합니다.
		uint256 totalPointPerLevel = firePointPerLevel;
		totalPointPerLevel = totalPointPerLevel.add(waterPointPerLevel);
		totalPointPerLevel = totalPointPerLevel.add(windPointPerLevel);
		totalPointPerLevel = totalPointPerLevel.add(earthPointPerLevel);
		totalPointPerLevel = totalPointPerLevel.add(lightPointPerLevel);
		totalPointPerLevel = totalPointPerLevel.add(darkPointPerLevel);
		require(totalPointPerLevel == 5);
		
		// 요정 데이터 생성
		uint256 fairyId = fairies.push(Fairy({
			
			fairyOriginId : fairyOriginId,
			designer : designer,
			name : name,
			birthTime : now,
			appendedLevel : 0,
			
			// EVM의 특성 상 너무 많은 변수를 한번에 할당 할 수 없으므로,
			// 기본 속성은 1로 통일하여 지정합니다.
			hpPointPerLevel : 1,
			attackPointPerLevel : 1,
			defencePointPerLevel : 1,
			agilityPointPerLevel : 1,
			dexterityPointPerLevel : 1,
			
			firePointPerLevel : firePointPerLevel,
			waterPointPerLevel : waterPointPerLevel,
			windPointPerLevel : windPointPerLevel,
			earthPointPerLevel : earthPointPerLevel,
			lightPointPerLevel : lightPointPerLevel,
			darkPointPerLevel : darkPointPerLevel
		})).sub(1);
		
		// msg.sender를 소유주로 등록
		fairyIdToMaster[fairyId] = msg.sender;
		fairyIdToFairyIdsIndex[fairyId] = masterToFairyIds[msg.sender].push(fairyId).sub(1);
		
		// 소유주 주소 등록
		if (masterToIsExisted[msg.sender] != true) {
			masters.push(msg.sender);
			masterToIsExisted[msg.sender] = true;
		}
		
		require(msg.value.div(2).mul(2) == msg.value);
		
		// 회사에게 금액의 50%를 지급합니다.
		company.transfer(msg.value.div(2));
		
		// 요정의 디자이너에게 금액의 50%를 지급합니다.
		designer.transfer(msg.value.div(2));
		
		// 이벤트 발생
		emit BirthFairy(msg.sender, fairyId);
		emit Transfer(0x0, msg.sender, fairyId);
	}

	// 요정의 이름을 변경합니다.
	function changeFairyName(uint256 fairyId, string newName) whenServiceRunning whenNotBlocked whenNotBlockedFairy(fairyId) onlyMasterOf(fairyId) public {
		fairies[fairyId].name = newName;
		
		emit ChangeFairyName(fairyId, newName);
	}
	
	// 요정을 많이 가진 순서대로 소유주의 ID 목록을 가져옵니다.
	function getMasterIdsByFairyCount() view public returns (uint256[]) {
		uint256[] memory masterIds = new uint256[](masters.length);
		
		for (uint256 i = 0; i < masters.length; i += 1) {
			
			uint256 fairyCount = balanceOf(masters[i]);
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (balanceOf(masters[masterIds[j - 1]]) < fairyCount) {
					masterIds[j] = masterIds[j - 1];
				} else {
					break;
				}
			}
			
			masterIds[j] = i;
		}
		
		return masterIds;
	}
}

// 요정 정보를 제공하는 계약
contract FairyInfo is EtherFairyBase {
	
	// 요정의 기본 정보를 반환합니다.
	function getFairyBasicInfo(uint256 fairyId) view public returns (
		string fairyOriginId,
		address designer,
		string name,
		uint256 birthTime,
		uint256 appendedLevel) {
		
		Fairy memory fairy = fairies[fairyId];
		
		return (
			fairy.fairyOriginId,
			fairy.designer,
			fairy.name,
			fairy.birthTime,
			fairy.appendedLevel
		);
	}
	
	// 요정의 기본 속성에 대한 레벨 당 증가 포인트들을 반환합니다.
	function getFairyBasicPointsPerLevel(uint256 fairyId) view public returns (
		uint256 hpPointPerLevel,
		uint256 attackPointPerLevel,
		uint256 defencePointPerLevel,
		uint256 agilityPointPerLevel,
		uint256 dexterityPointPerLevel) {
		
		Fairy memory fairy = fairies[fairyId];
		
		return (
			fairy.hpPointPerLevel,
			fairy.attackPointPerLevel,
			fairy.defencePointPerLevel,
			fairy.agilityPointPerLevel,
			fairy.dexterityPointPerLevel
		);
	}
	
	// 요정의 원소 속성에 대한 레벨 당 증가 포인트들을 반환합니다.
	function getFairyElementPointsPerLevel(uint256 fairyId) view public returns (
		uint256 firePointPerLevel,
		uint256 waterPointPerLevel,
		uint256 windPointPerLevel,
		uint256 earthPointPerLevel,
		uint256 lightPointPerLevel,
		uint256 darkPointPerLevel) {
		
		Fairy memory fairy = fairies[fairyId];
		
		return (
			fairy.firePointPerLevel,
			fairy.waterPointPerLevel,
			fairy.windPointPerLevel,
			fairy.earthPointPerLevel,
			fairy.lightPointPerLevel,
			fairy.darkPointPerLevel
		);
	}
}

// 요정의 랭킹을 제공하는 계약
contract FairyRank is EtherFairyBase {
	
	// 최근에 태어난 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByBirthTime() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 birthTime = fairies[i].birthTime;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].birthTime < birthTime) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 소유주에 의해 추가된 레벨이 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByAppendedLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 appendedLevel = fairies[i].appendedLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].appendedLevel < appendedLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 HP 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByHPPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 hpPointPerLevel = fairies[i].hpPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].hpPointPerLevel < hpPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 공격 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByAttackPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 attackPointPerLevel = fairies[i].attackPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].attackPointPerLevel < attackPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 방어 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByDefencePointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 defencePointPerLevel = fairies[i].defencePointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].defencePointPerLevel < defencePointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 민첩 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByAgilityPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 agilityPointPerLevel = fairies[i].agilityPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].agilityPointPerLevel < agilityPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 재치 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByDexterityPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 dexterityPointPerLevel = fairies[i].dexterityPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].dexterityPointPerLevel < dexterityPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 불 속성 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByFirePointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 firePointPerLevel = fairies[i].firePointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].firePointPerLevel < firePointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 물 속성 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByWaterPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 waterPointPerLevel = fairies[i].waterPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].waterPointPerLevel < waterPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 바람 속성 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByWindPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 windPointPerLevel = fairies[i].windPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].windPointPerLevel < windPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 대지 속성 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByEarthPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 earthPointPerLevel = fairies[i].earthPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].earthPointPerLevel < earthPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 빛 속성 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByLightPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 lightPointPerLevel = fairies[i].lightPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].lightPointPerLevel < lightPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
	
	// 레벨 당 어둠 속성 증가 포인트가 높은 순서대로 요정의 ID 목록을 가져옵니다.
	function getFairyIdsByDarkPointPerLevel() view public returns (uint256[]) {
		uint256[] memory fairyIds = new uint256[](fairies.length);
		
		for (uint256 i = 0; i < fairies.length; i += 1) {
			
			uint256 darkPointPerLevel = fairies[i].darkPointPerLevel;
			
			for (uint256 j = i; j > 0; j -= 1) {
				if (fairies[fairyIds[j - 1]].darkPointPerLevel < darkPointPerLevel) {
					fairyIds[j] = fairyIds[j - 1];
				} else {
					break;
				}
			}
			
			fairyIds[j] = i;
		}
		
		return fairyIds;
	}
}

// Ether Fairy 스마트 계약
contract EtherFairy is EtherFairyCompany, FairyMaster, FairyInfo, FairyRank, ERC165 {
	
	//ERC165: 주어진 인터페이스가 구현되어 있는지 확인합니다.
	function supportsInterface(bytes4 interfaceID) external view returns (bool) {
		return
			// ERC165
			interfaceID == this.supportsInterface.selector ||
			// ERC721
			interfaceID == 0x80ac58cd ||
			// ERC721Metadata
			interfaceID == 0x5b5e139f ||
			// ERC721Enumerable
			interfaceID == 0x780e9d63;
	}
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pauseService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"masterToBlock","type":"address"}],"name":"blockMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fairyOriginPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"approved","type":"address"},{"name":"fairyId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"getFairyBasicPointsPerLevel","outputs":[{"name":"hpPointPerLevel","type":"uint256"},{"name":"attackPointPerLevel","type":"uint256"},{"name":"defencePointPerLevel","type":"uint256"},{"name":"agilityPointPerLevel","type":"uint256"},{"name":"dexterityPointPerLevel","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseFirePointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"levelUpFairy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fairyIdToIsBlocked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newTokenMetadataBaseURI","type":"string"}],"name":"changeTokenMetadataBaseURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"officialMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"fairyId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"increasePointPricePerPoint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"fairyOriginId","type":"string"}],"name":"getFairyIdsByOriginId","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMasterIdsByFairyCount","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"fairyId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByBirthTime","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByAttackPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseDarkPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"servicePaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByAgilityPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyOriginId","type":"string"},{"name":"designer","type":"address"},{"name":"name","type":"string"},{"name":"firePointPerLevel","type":"uint256"},{"name":"waterPointPerLevel","type":"uint256"},{"name":"windPointPerLevel","type":"uint256"},{"name":"earthPointPerLevel","type":"uint256"},{"name":"lightPointPerLevel","type":"uint256"},{"name":"darkPointPerLevel","type":"uint256"}],"name":"birthFairy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseAttackPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByFirePointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"masters","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fairyIdToMaster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"masterToIsBlocked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"company","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"getFairyElementPointsPerLevel","outputs":[{"name":"firePointPerLevel","type":"uint256"},{"name":"waterPointPerLevel","type":"uint256"},{"name":"windPointPerLevel","type":"uint256"},{"name":"earthPointPerLevel","type":"uint256"},{"name":"lightPointPerLevel","type":"uint256"},{"name":"darkPointPerLevel","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newFairyOriginPrice","type":"uint256"}],"name":"changeFairyOriginPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCustomLevelUpPrice","type":"uint256"}],"name":"changeCustomLevelUpPrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"master","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyIdToUnblock","type":"uint256"}],"name":"unblockFairy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"masterToUnlock","type":"address"}],"name":"unblockMaster","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByWindPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseAgilityPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByWaterPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"isApproved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOfficialMarket","type":"address"}],"name":"changeOfficialMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"masterToFairyIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"getFairyBasicInfo","outputs":[{"name":"fairyOriginId","type":"string"},{"name":"designer","type":"address"},{"name":"name","type":"string"},{"name":"birthTime","type":"uint256"},{"name":"appendedLevel","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseDefencePointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"tokenMetadataBaseURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMasterCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"fairyId","type":"uint256"},{"name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseEarthPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByHPPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyIdToBlock","type":"uint256"}],"name":"blockFairy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByAppendedLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByDarkPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseLightPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseWindPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"resumeService","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"customLevelUpPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByLightPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newIncreasePointPricePerPoint","type":"uint256"}],"name":"changeIncreasePointPricePerPoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"master","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"},{"name":"newName","type":"string"}],"name":"changeFairyName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCompany","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByEarthPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByDexterityPointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseDexterityPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"SYMBOL","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFairyIdsByDefencePointPerLevel","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseHPPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"fairyOriginId","type":"string"}],"name":"getFairyCountByOriginId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fairyId","type":"uint256"}],"name":"increaseWaterPointPerLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"master","type":"address"},{"indexed":false,"name":"fairyId","type":"uint256"}],"name":"BirthFairy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"},{"indexed":false,"name":"name","type":"string"}],"name":"ChangeFairyName","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"CustomLevelUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseHPPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseAttackPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseDefencePointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseAgilityPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseDexterityPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseFirePointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseWaterPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseWindPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseEarthPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseLightPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"fairyId","type":"uint256"}],"name":"IncreaseDarkPointPerLevel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":true,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldCompany","type":"address"},{"indexed":false,"name":"newCompany","type":"address"}],"name":"TransferOwnership","type":"event"},{"anonymous":false,"inputs":[],"name":"PauseService","type":"event"},{"anonymous":false,"inputs":[],"name":"ResumeService","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"uint256"}],"name":"ChangeFairyOriginPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"uint256"}],"name":"ChangeCustomLevelUpPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"price","type":"uint256"}],"name":"ChangeIncreasePointPricePerPoint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenMetadataBaseURI","type":"string"}],"name":"ChangeTokenMetadataBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"officialMarket","type":"address"}],"name":"ChangeOfficialMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"masterToBlock","type":"address"}],"name":"BlockMaster","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fairyIdToBlock","type":"uint256"}],"name":"BlockFairy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"masterToUnlock","type":"address"}],"name":"UnblockMaster","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fairyIdToUnblock","type":"uint256"}],"name":"UnblockFairy","type":"event"}]

60e0604052602960808190527f68747470733a2f2f657468657266616972792e636f6d2f6170692f746f6b656e60a09081527f6d657461646174612f000000000000000000000000000000000000000000000060c052620000649160009190620000ae565b5066b1a2bc2ec50000600155662386f26fc100006002819055600355600a805460098054600160a060020a03191633908117909155600160a860020a031990911617905562000153565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000f157805160ff191683800117855562000121565b8280016001018555821562000121579182015b828111156200012157825182559160200191906001019062000104565b506200012f92915062000133565b5090565b6200015091905b808211156200012f57600081556001016200013a565b90565b615adb80620001636000396000f3006080604052600436106103635763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a781146103685780630552f9ff1461039e57806306fdde03146103b557806307583f491461043f578063081812fc146104605780630882e52d14610494578063095ea7b3146104bb5780630cd42cb2146104d25780630fc9c1b414610515578063172afda3146105205780631f3e41501461052b57806321d1f7bf14610543578063222419a91461059c57806323b872dd146105b157806328ca02fe146105ce5780632b38c045146105e35780633df33c341461068c57806342842e0e146106a15780634361b717146106be57806343a4d8cc146106d357806347a00498146106e85780634a2f60a1146106f35780634c48840f146107085780634df919451461071d5780635045280f146107d3578063556b2cbf146107de57806360961874146107f35780636352211e1461080b5780636513ae8e1461082357806366ec277c1461083b5780636904c94d1461085c578063694f058a146108715780636bc68403146108bc5780636e1ffc0d146108d457806370a08231146108ec5780637ddcac661461090d5780637eca6381146109255780638dfe3d31146109465780638fb1b7331461095b57806395d89b41146109665780639a8c27e51461097b578063a22cb46514610990578063a3f4df7e146109b6578063a87fa5c6146109cb578063aa323ea5146109ec578063af87e52d14610a10578063afddcdbc14610b2d578063b5cab1ce14610b38578063b5cc88b614610b4d578063b88d4fde14610b62578063c34d3f1c14610b8e578063c3e1fd5614610b99578063c4e9033014610bae578063c592c47514610bc3578063c68f010614610bdb578063c6d93e1314610bf0578063c87b56dd14610c05578063d0be686a14610c1d578063d46618ae14610c28578063db6003d114610c33578063e1a9810214610c48578063e485354a14610c5d578063e52ed74614610c72578063e985e9c514610c8a578063ec11573e14610cb1578063f2fde38b14610d0f578063f454f1a214610d30578063f511923d14610d45578063f73227d714610d5a578063f76f8d7814610d65578063fa1aa70e14610d7a578063fc8846e514610d8f578063febd42d114610d9a578063ff243e6914610df3575b600080fd5b34801561037457600080fd5b5061038a600160e060020a031960043516610dfe565b604080519115158252519081900360200190f35b3480156103aa57600080fd5b506103b3610ecf565b005b3480156103c157600080fd5b506103ca610f51565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104045781810151838201526020016103ec565b50505050905090810190601f1680156104315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044b57600080fd5b506103b3600160a060020a0360043516610f89565b34801561046c57600080fd5b50610478600435610ffb565b60408051600160a060020a039092168252519081900360200190f35b3480156104a057600080fd5b506104a9611016565b60408051918252519081900360200190f35b6103b3600160a060020a036004351660243561101c565b3480156104de57600080fd5b506104ea600435611166565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103b360043561138f565b6103b360043561158f565b34801561053757600080fd5b5061038a600435611778565b34801561054f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526103b394369492936024939284019190819084018382808284375094975061178d9650505050505050565b3480156105a857600080fd5b50610478611854565b6103b3600160a060020a0360043581169060243516604435611863565b3480156105da57600080fd5b506104a9611bd5565b3480156105ef57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261063c943694929360249392840191908190840183828082843750949750611bdb9650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610678578181015183820152602001610660565b505050509050019250505060405180910390f35b34801561069857600080fd5b5061063c611d55565b6103b3600160a060020a0360043581169060243516604435611e7e565b3480156106ca57600080fd5b5061063c611f75565b3480156106df57600080fd5b5061063c612098565b6103b36004356121bb565b3480156106ff57600080fd5b5061038a6123bb565b34801561071457600080fd5b5061063c6123cb565b6040805160206004803580820135601f81018490048402850184019095528484526103b394369492936024939284019190819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b600160a060020a038b35169b909a90999401975091955091820193509150819084018382808284375094975050843595505050602083013592604081013592506060810135915060808101359060a001356124ee565b6103b3600435612997565b3480156107ea57600080fd5b5061063c612b86565b3480156107ff57600080fd5b50610478600435612ca9565b34801561081757600080fd5b50610478600435612cd1565b34801561082f57600080fd5b50610478600435612d01565b34801561084757600080fd5b5061038a600160a060020a0360043516612d1c565b34801561086857600080fd5b50610478612d31565b34801561087d57600080fd5b50610889600435612d40565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156108c857600080fd5b506103b3600435612f75565b3480156108e057600080fd5b506103b3600435612fc7565b3480156108f857600080fd5b506104a9600160a060020a0360043516613019565b34801561091957600080fd5b506103b360043561304f565b34801561093157600080fd5b506103b3600160a060020a03600435166130b4565b34801561095257600080fd5b5061063c613123565b6103b3600435613246565b34801561097257600080fd5b506103ca613435565b34801561098757600080fd5b5061063c61346c565b34801561099c57600080fd5b506103b3600160a060020a0360043516602435151561358f565b3480156109c257600080fd5b506103ca6136c2565b3480156109d757600080fd5b506103b3600160a060020a03600435166136f9565b3480156109f857600080fd5b506104a9600160a060020a0360043516602435613764565b348015610a1c57600080fd5b50610a28600435613794565b604051808060200186600160a060020a0316600160a060020a0316815260200180602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b83811015610a8d578181015183820152602001610a75565b50505050905090810190601f168015610aba5780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610aed578181015183820152602001610ad5565b50505050905090810190601f168015610b1a5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6103b36004356139c2565b348015610b4457600080fd5b506103ca613bb1565b348015610b5957600080fd5b506104a9613c3f565b6103b3600160a060020a0360048035821691602480359091169160443591606435908101910135613c45565b6103b3600435613d55565b348015610ba557600080fd5b5061063c613f55565b348015610bba57600080fd5b506104a9614078565b348015610bcf57600080fd5b506103b360043561407e565b348015610be757600080fd5b5061063c6140e6565b348015610bfc57600080fd5b5061063c614209565b348015610c1157600080fd5b506103ca60043561432c565b6103b36004356143ce565b6103b36004356145ce565b348015610c3f57600080fd5b506103b36147ce565b348015610c5457600080fd5b506104a9614849565b348015610c6957600080fd5b5061063c61484f565b348015610c7e57600080fd5b506103b3600435614972565b348015610c9657600080fd5b5061038a600160a060020a03600435811690602435166149c4565b348015610cbd57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526103b39583359536956044949193909101919081908401838280828437509497506149f89650505050505050565b348015610d1b57600080fd5b506103b3600160a060020a0360043516614b7a565b348015610d3c57600080fd5b5061063c614bf8565b348015610d5157600080fd5b5061063c614d1b565b6103b3600435614e3e565b348015610d7157600080fd5b506103ca61502d565b348015610d8657600080fd5b5061063c615064565b6103b3600435615187565b348015610da657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526104a99436949293602493928401919081908401838280828437509497506153769650505050505050565b6103b3600435615499565b6000600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610e6157507f80ac58cd00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b80610e9557507f5b5e139f00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b80610ec957507f780e9d6300000000000000000000000000000000000000000000000000000000600160e060020a03198316145b92915050565b600954600160a060020a03163314610ee657600080fd5b600a5460a060020a900460ff16151560011415610f0257600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f1f8d764c113e8497eb5ee4b0d9d14459ce5adf3f688f37005fb6a0d610ca764190600090a1565b60408051808201909152600b81527f457468657220466169727900000000000000000000000000000000000000000060208201525b90565b600954600160a060020a03163314610fa057600080fd5b600160a060020a038116600081815260076020908152604091829020805460ff19166001179055815192835290517f3c362eaf8833b702c04434fdb4dc0c32e6d193886ebf80c1e7ac5f168e5f61019281900390910190a150565b6000908152600e6020526040902054600160a060020a031690565b60015481565b600a5460009060a060020a900460ff1615156001141561103b57600080fd5b600954600160a060020a031633148061106957503360009081526007602052604090205460ff161515600114155b151561107457600080fd5b6009548290600160a060020a03163314806110a3575060008181526008602052604090205460ff161515600114155b15156110ae57600080fd5b826110b881612cd1565b600160a060020a031633146110cc57600080fd5b6110d584612cd1565b9250600160a060020a0385811690841614156110f057600080fd5b6110f985615699565b15156001141561110857600080fd5b6000848152600e60205260408082208054600160a060020a031916600160a060020a0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b6000806000806000611176615970565b600480548890811061118457fe5b600091825260209182902060408051601093909302909101805460026001821615610100026000190190911604601f810185900490940283016102209081019092526102008301848152929390928492909184918401828280156112295780601f106111fe57610100808354040283529160200191611229565b820191906000526020600020905b81548152906001019060200180831161120c57829003601f168201915b5050509183525050600182810154600160a060020a0316602080840191909152600280850180546040805161010096831615969096026000190190911692909204601f810184900484028501840183528085529190940193918301828280156112d35780601f106112a8576101008083540402835291602001916112d3565b820191906000526020600020905b8154815290600101906020018083116112b657829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f8201548152505090508060a001518160c001518260e00151836101000151846101200151955095509550955095505091939590929450565b600a546000908190819060a060020a900460ff161515600114156113b257600080fd5b600954600160a060020a03163314806113e057503360009081526007602052604090205460ff161515600114155b15156113eb57600080fd5b6009548490600160a060020a031633148061141a575060008181526008602052604090205460ff161515600114155b151561142557600080fd5b8461142f81612cd1565b600160a060020a0316331461144357600080fd5b600480548790811061145157fe5b90600052602060002090601002019450611479600186600a01546156bb90919063ffffffff16565b60035402341461148857600080fd5b600a85015461149e90600163ffffffff6156bb16565b600a8601556114b434600263ffffffff6156c816565b93506114c734600263ffffffff6156c816565b9250346114da858563ffffffff6156bb16565b146114e457600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561151e573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f1935050505015801561155b573d6000803e3d6000fd5b5060405186907fb66c32e78f87dcd890038b1682f6b38e413dafbee346838a9d7f11d2f17c18fd90600090a2505050505050565b600a546000908190819060a060020a900460ff161515600114156115b257600080fd5b600954600160a060020a03163314806115e057503360009081526007602052604090205460ff161515600114155b15156115eb57600080fd5b6009548490600160a060020a031633148061161a575060008181526008602052604090205460ff161515600114155b151561162557600080fd5b8461162f81612cd1565b600160a060020a0316331461164357600080fd5b600254341461165157600080fd5b600480548790811061165f57fe5b90600052602060002090601002019450611687600186600401546156bb90919063ffffffff16565b600486015561169d34600263ffffffff6156c816565b93506116b034600263ffffffff6156c816565b9250346116c3858563ffffffff6156bb16565b146116cd57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015611707573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015611744573d6000803e3d6000fd5b5060405186907ff4d2e98be7eb5e03801b528e9a8da88caeaa79206f7ebd4ac478149d330cc07790600090a2505050505050565b60086020526000908152604090205460ff1681565b600954600160a060020a031633146117a457600080fd5b80516117b79060009060208401906159f7565b507f7add9568e7be20171f511d2bb7b953242b0b98a818c4f362dd1e71c3d7f9ce54816040518080602001828103825283818151815260200191508051906020019080838360005b838110156118175781810151838201526020016117ff565b50505050905090810190601f1680156118445780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b600a54600160a060020a031681565b600a546000908190819060a060020a900460ff1615156001141561188657600080fd5b600954600160a060020a03163314806118b457503360009081526007602052604090205460ff161515600114155b15156118bf57600080fd5b6009548490600160a060020a03163314806118ee575060008181526008602052604090205460ff161515600114155b15156118f957600080fd5b8461190381612cd1565b600160a060020a031633600160a060020a0316148061193b575061192681610ffb565b600160a060020a031633600160a060020a0316145b80611959575061195361194d82612cd1565b336149c4565b15156001145b8061196e5750600a54600160a060020a031633145b151561197957600080fd5b61198287615699565b15156001141561199157600080fd5b61199a86612cd1565b600160a060020a038981169116146119b157600080fd5b6119ba86612cd1565b600160a060020a03888116911614156119d257600080fd5b6000868152600e60205260408082208054600160a060020a031916905551879190600160a060020a038b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a46000868152600d60205260409020549450611a4e6001611a428a613019565b9063ffffffff6156dd16565b600160a060020a0389166000908152600c6020526040902080549195509085908110611a7657fe5b9060005260206000200154925082600c60008a600160a060020a0316600160a060020a0316815260200190815260200160002086815481101515611ab657fe5b6000918252602080832090910192909255600160a060020a038a168152600c90915260409020805485908110611ae857fe5b60009182526020808320909101829055600160a060020a038a168252600c90526040902080546000190190611b1d9082615a75565b506000838152600d60209081526040808320889055888352600b82528083208054600160a060020a031916600160a060020a038c169081179091558352600c825282208054600181810180845592855292909320909201889055611b8191906156dd565b6000878152600d60205260408082209290925590518791600160a060020a03808b1692908c16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050505050565b60035481565b606060006060600080856040518082805190602001908083835b60208310611c145780518252601f199092019160209182019101611bf5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209350611c4c86615376565b604051908082528060200260200182016040528015611c75578160200160208202803883390190505b50925060009150600090505b600454811015611d48576004805485919083908110611c9c57fe5b90600052602060002090601002016000016040518082805460018160011615610100020316600290048015611d085780601f10611ce6576101008083540402835291820191611d08565b820191906000526020600020905b815481529060010190602001808311611cf4575b50509150506040518091039020600019161415611d4057808383815181101515611d2e57fe5b60209081029091010152600191909101905b600101611c81565b8294505b50505050919050565b6060806000806000600580549050604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b509350600092505b600554831015611e7557611dca600584815481101515611db057fe5b600091825260209091200154600160a060020a0316613019565b91508290505b6000811115611e505781611e0460058660018503815181101515611df057fe5b6020908102909101015181548110611db057fe5b1015611e42578360018203815181101515611e1b57fe5b906020019060200201518482815181101515611e3357fe5b60209081029091010152611e47565b611e50565b60001901611dd0565b828482815181101515611e5f57fe5b6020908102909101015260019290920191611d94565b50919392505050565b600a5460a060020a900460ff16151560011415611e9a57600080fd5b611ea5838383611863565b611eae826156ef565b151560011415611f70576040805160e160020a630a85bd01028152336004820152600160a060020a038581166024830152604482018490526080606483015260006084830181905292519085169263150b7a029260c480820193602093909283900390910190829087803b158015611f2557600080fd5b505af1158015611f39573d6000803e3d6000fd5b505050506040513d6020811015611f4f57600080fd5b5051600160e060020a03191660e160020a630a85bd010214611f7057600080fd5b505050565b6060806000806000600480549050604051908082528060200260200182016040528015611fac578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110611fcc57fe5b90600052602060002090601002016003015491508290505b600081111561207357816004856001840381518110151561200157fe5b602090810290910101518154811061201557fe5b906000526020600020906010020160030154101561206557836001820381518110151561203e57fe5b90602001906020020151848281518110151561205657fe5b6020908102909101015261206a565b612073565b60001901611fe4565b82848281518110151561208257fe5b6020908102909101015260019290920191611fb4565b60608060008060006004805490506040519080825280602002602001820160405280156120cf578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106120ef57fe5b90600052602060002090601002016006015491508290505b600081111561219657816004856001840381518110151561212457fe5b602090810290910101518154811061213857fe5b906000526020600020906010020160060154101561218857836001820381518110151561216157fe5b90602001906020020151848281518110151561217957fe5b6020908102909101015261218d565b612196565b60001901612107565b8284828151811015156121a557fe5b60209081029091010152600192909201916120d7565b600a546000908190819060a060020a900460ff161515600114156121de57600080fd5b600954600160a060020a031633148061220c57503360009081526007602052604090205460ff161515600114155b151561221757600080fd5b6009548490600160a060020a0316331480612246575060008181526008602052604090205460ff161515600114155b151561225157600080fd5b8461225b81612cd1565b600160a060020a0316331461226f57600080fd5b600480548790811061227d57fe5b906000526020600020906010020194506122a5600186600f01546156bb90919063ffffffff16565b6003540234146122b457600080fd5b600f8501546122ca90600163ffffffff6156bb16565b600f8601556122e034600263ffffffff6156c816565b93506122f334600263ffffffff6156c816565b925034612306858563ffffffff6156bb16565b1461231057600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561234a573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015612387573d6000803e3d6000fd5b5060405186907f28ee3b4dbd85723acb16aff9d7ddaa9455c445a2d47e58e5a30d1372555056e990600090a2505050505050565b600a5460a060020a900460ff1681565b6060806000806000600480549050604051908082528060200260200182016040528015612402578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061242257fe5b90600052602060002090601002016008015491508290505b60008111156124c957816004856001840381518110151561245757fe5b602090810290910101518154811061246b57fe5b90600052602060002090601002016008015410156124bb57836001820381518110151561249457fe5b9060200190602002015184828151811015156124ac57fe5b602090810290910101526124c0565b6124c9565b6000190161243a565b8284828151811015156124d857fe5b602090810290910101526001929092019161240a565b600a54600090819060a060020a900460ff1615156001141561250f57600080fd5b600954600160a060020a031633148061253d57503360009081526007602052604090205460ff161515600114155b151561254857600080fd5b6125518a615699565b15156001141561256057600080fd5b600154341461256e57600080fd5b879150612581828863ffffffff6156bb16565b9150612593828763ffffffff6156bb16565b91506125a5828663ffffffff6156bb16565b91506125b7828563ffffffff6156bb16565b91506125c9828463ffffffff6156bb16565b9150600582146125d857600080fd5b60408051610200810182528c8152600160a060020a038c166020808301919091529181018b9052426060820152600060808201819052600160a0830181905260c0830181905260e083018190526101008301819052610120830181905261014083018c905261016083018b905261018083018a90526101a083018990526101c083018890526101e0830187905260048054808301808355919093528351805161278f9693959294929360109093027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01926126b79284929101906159f7565b50602082810151600183018054600160a060020a031916600160a060020a03909216919091179055604083015180516126f692600285019201906159f7565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a820155610160820151600b820155610180820151600c8201556101a0820151600d8201556101c0820151600e8201556101e090910151600f909101559063ffffffff6156dd16565b6000818152600b602090815260408083208054600160a060020a031916339081179091558352600c8252822080546001818101808455928552929093209092018390559192506127e49163ffffffff6156dd16565b6000828152600d602090815260408083209390935533825260069052205460ff161515600114612869576005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018054600160a060020a031916339081179091556000908152600660205260409020805460ff191690911790555b3461288b600261287f838263ffffffff6156c816565b9063ffffffff6156fd16565b1461289557600080fd5b600954600160a060020a03166108fc6128b534600263ffffffff6156c816565b6040518115909202916000818181858888f193505050501580156128dd573d6000803e3d6000fd5b50600160a060020a038a166108fc6128fc34600263ffffffff6156c816565b6040518115909202916000818181858888f19350505050158015612924573d6000803e3d6000fd5b5060408051828152905133917f3bb5ebaa518c4d975caed7769b9ddf3c2dc502f03628daaf6ed93c46376a9d57919081900360200190a2604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050505050505050505050565b600a546000908190819060a060020a900460ff161515600114156129ba57600080fd5b600954600160a060020a03163314806129e857503360009081526007602052604090205460ff161515600114155b15156129f357600080fd5b6009548490600160a060020a0316331480612a22575060008181526008602052604090205460ff161515600114155b1515612a2d57600080fd5b84612a3781612cd1565b600160a060020a03163314612a4b57600080fd5b6004805487908110612a5957fe5b9060005260206000209060100201945084600601546003540234141515612a7f57600080fd5b6006850154612a9590600163ffffffff6156bb16565b6006860155612aab34600263ffffffff6156c816565b9350612abe34600263ffffffff6156c816565b925034612ad1858563ffffffff6156bb16565b14612adb57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015612b15573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015612b52573d6000803e3d6000fd5b5060405186907f266ebb0c12a6c8922fd1f55e5d30ce25e605f0c9ce1846d022b5989f8ac3e99f90600090a2505050505050565b6060806000806000600480549050604051908082528060200260200182016040528015612bbd578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110612bdd57fe5b9060005260206000209060100201600a015491508290505b6000811115612c84578160048560018403815181101515612c1257fe5b6020908102909101015181548110612c2657fe5b9060005260206000209060100201600a01541015612c76578360018203815181101515612c4f57fe5b906020019060200201518482815181101515612c6757fe5b60209081029091010152612c7b565b612c84565b60001901612bf5565b828482815181101515612c9357fe5b6020908102909101015260019290920191612bc5565b6005805482908110612cb757fe5b600091825260209091200154600160a060020a0316905081565b6000818152600b6020526040812054600160a060020a0316612cf281615699565b151560011415610ec957600080fd5b600b60205260009081526040902054600160a060020a031681565b60076020526000908152604090205460ff1681565b600954600160a060020a031681565b600080600080600080612d51615970565b6004805489908110612d5f57fe5b600091825260209182902060408051601093909302909101805460026001821615610100026000190190911604601f81018590049094028301610220908101909252610200830184815292939092849290918491840182828015612e045780601f10612dd957610100808354040283529160200191612e04565b820191906000526020600020905b815481529060010190602001808311612de757829003601f168201915b5050509183525050600182810154600160a060020a0316602080840191909152600280850180546040805161010096831615969096026000190190911692909204601f81018490048402850184018352808552919094019391830182828015612eae5780601f10612e8357610100808354040283529160200191612eae565b820191906000526020600020905b815481529060010190602001808311612e9157829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f820154815250509050806101400151816101600151826101800151836101a00151846101c00151856101e001519650965096509650965096505091939550919395565b600954600160a060020a03163314612f8c57600080fd5b60018190556040805182815290517fc7f819d723891694b311ee508b284bd6f009f851f32f6d79ba4da222b5a5129c9181900360200190a150565b600954600160a060020a03163314612fde57600080fd5b60028190556040805182815290517fa0f6ecf36b6ac796a4a605ce1f0e4c3e9c1cdaab03dbd01719b1e56db0c58c4e9181900360200190a150565b600061302482615699565b15156001141561303357600080fd5b50600160a060020a03166000908152600c602052604090205490565b600954600160a060020a0316331461306657600080fd5b600081815260086020908152604091829020805460ff19169055815183815291517f4fdf7fd7aa97a5cfdc4c58ce5865199ff261625e3e683ce3cf14e78cc18b05089281900390910190a150565b600954600160a060020a031633146130cb57600080fd5b600160a060020a038116600081815260076020908152604091829020805460ff19169055815192835290517fde46e08696375206ec1a7e2b6abb03889d1bb91d94e2e18326878ada05c49d429281900390910190a150565b606080600080600060048054905060405190808252806020026020018201604052801561315a578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061317a57fe5b9060005260206000209060100201600c015491508290505b60008111156132215781600485600184038151811015156131af57fe5b60209081029091010151815481106131c357fe5b9060005260206000209060100201600c015410156132135783600182038151811015156131ec57fe5b90602001906020020151848281518110151561320457fe5b60209081029091010152613218565b613221565b60001901613192565b82848281518110151561323057fe5b6020908102909101015260019290920191613162565b600a546000908190819060a060020a900460ff1615156001141561326957600080fd5b600954600160a060020a031633148061329757503360009081526007602052604090205460ff161515600114155b15156132a257600080fd5b6009548490600160a060020a03163314806132d1575060008181526008602052604090205460ff161515600114155b15156132dc57600080fd5b846132e681612cd1565b600160a060020a031633146132fa57600080fd5b600480548790811061330857fe5b906000526020600020906010020194508460080154600354023414151561332e57600080fd5b600885015461334490600163ffffffff6156bb16565b600886015561335a34600263ffffffff6156c816565b935061336d34600263ffffffff6156c816565b925034613380858563ffffffff6156bb16565b1461338a57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f193505050501580156133c4573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015613401573d6000803e3d6000fd5b5060405186907fe2ab17eec57971877a65df5d2519c9f9337ad996fb19c1eed2bdaa06430fbd0390600090a2505050505050565b60408051808201909152600581527f4641495259000000000000000000000000000000000000000000000000000000602082015290565b60608060008060006004805490506040519080825280602002602001820160405280156134a3578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106134c357fe5b9060005260206000209060100201600b015491508290505b600081111561356a5781600485600184038151811015156134f857fe5b602090810290910101518154811061350c57fe5b9060005260206000209060100201600b0154101561355c57836001820381518110151561353557fe5b90602001906020020151848281518110151561354d57fe5b60209081029091010152613561565b61356a565b600019016134db565b82848281518110151561357957fe5b60209081029091010152600192909201916134ab565b600a5460a060020a900460ff161515600114156135ab57600080fd5b600954600160a060020a03163314806135d957503360009081526007602052604090205460ff161515600114155b15156135e457600080fd5b600160a060020a0382163314156135fa57600080fd5b61360382615699565b15156001141561361257600080fd5b6001811515141561365057336000908152600f60209081526040808320600160a060020a03861684529091529020805460ff1916600117905561367c565b336000908152600f60209081526040808320600160a060020a03861684529091529020805460ff191690555b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b60408051808201909152600b81527f4574686572204661697279000000000000000000000000000000000000000000602082015281565b600954600160a060020a0316331461371057600080fd5b600a8054600160a060020a038316600160a060020a0319909116811790915560408051918252517fcdcfc26641bf2eab45b914c10142d75e9a87fef645948316289d19b372af0f6c9181900360200190a150565b600c6020528160005260406000208181548110151561377f57fe5b90600052602060002001600091509150505481565b6060600060606000806137a5615970565b60048054889081106137b357fe5b600091825260209182902060408051601093909302909101805460026001821615610100026000190190911604601f810185900490940283016102209081019092526102008301848152929390928492909184918401828280156138585780601f1061382d57610100808354040283529160200191613858565b820191906000526020600020905b81548152906001019060200180831161383b57829003601f168201915b5050509183525050600182810154600160a060020a0316602080840191909152600280850180546040805161010096831615969096026000190190911692909204601f810184900484028501840183528085529190940193918301828280156139025780601f106138d757610100808354040283529160200191613902565b820191906000526020600020905b8154815290600101906020018083116138e557829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f82015481525050905080600001518160200151826040015183606001518460800151849450829250955095509550955095505091939590929450565b600a546000908190819060a060020a900460ff161515600114156139e557600080fd5b600954600160a060020a0316331480613a1357503360009081526007602052604090205460ff161515600114155b1515613a1e57600080fd5b6009548490600160a060020a0316331480613a4d575060008181526008602052604090205460ff161515600114155b1515613a5857600080fd5b84613a6281612cd1565b600160a060020a03163314613a7657600080fd5b6004805487908110613a8457fe5b9060005260206000209060100201945084600701546003540234141515613aaa57600080fd5b6007850154613ac090600163ffffffff6156bb16565b6007860155613ad634600263ffffffff6156c816565b9350613ae934600263ffffffff6156c816565b925034613afc858563ffffffff6156bb16565b14613b0657600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015613b40573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015613b7d573d6000803e3d6000fd5b5060405186907fa69b4ad0ab3d1c368d9690baf1f0dd4d3fca07aebf83c1553ecefce92d309c6790600090a2505050505050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015613c375780601f10613c0c57610100808354040283529160200191613c37565b820191906000526020600020905b815481529060010190602001808311613c1a57829003601f168201915b505050505081565b60055490565b600a5460a060020a900460ff16151560011415613c6157600080fd5b613c6c858585611863565b613c75846156ef565b151560011415613d4e5760405160e160020a630a85bd010281523360048201818152600160a060020a03888116602485015260448401879052608060648501908152608485018690529088169363150b7a0293928a92899289928992909160a40184848082843782019150509650505050505050602060405180830381600087803b158015613d0357600080fd5b505af1158015613d17573d6000803e3d6000fd5b505050506040513d6020811015613d2d57600080fd5b5051600160e060020a03191660e160020a630a85bd010214613d4e57600080fd5b5050505050565b600a546000908190819060a060020a900460ff16151560011415613d7857600080fd5b600954600160a060020a0316331480613da657503360009081526007602052604090205460ff161515600114155b1515613db157600080fd5b6009548490600160a060020a0316331480613de0575060008181526008602052604090205460ff161515600114155b1515613deb57600080fd5b84613df581612cd1565b600160a060020a03163314613e0957600080fd5b6004805487908110613e1757fe5b90600052602060002090601002019450613e3f600186600d01546156bb90919063ffffffff16565b600354023414613e4e57600080fd5b600d850154613e6490600163ffffffff6156bb16565b600d860155613e7a34600263ffffffff6156c816565b9350613e8d34600263ffffffff6156c816565b925034613ea0858563ffffffff6156bb16565b14613eaa57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015613ee4573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015613f21573d6000803e3d6000fd5b5060405186907f0ddc102415a9432e24d58997c8d6e49ed008254a4740bc68f91af5f5bb61b7e990600090a2505050505050565b6060806000806000600480549050604051908082528060200260200182016040528015613f8c578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110613fac57fe5b90600052602060002090601002016005015491508290505b6000811115614053578160048560018403815181101515613fe157fe5b6020908102909101015181548110613ff557fe5b906000526020600020906010020160050154101561404557836001820381518110151561401e57fe5b90602001906020020151848281518110151561403657fe5b6020908102909101015261404a565b614053565b60001901613fc4565b82848281518110151561406257fe5b6020908102909101015260019290920191613f94565b60045490565b600954600160a060020a0316331461409557600080fd5b600081815260086020908152604091829020805460ff19166001179055815183815291517f22601a1d2f47cbea52a8368355409c1292e7d987a53b53dc592dc8865d59b74a9281900390910190a150565b606080600080600060048054905060405190808252806020026020018201604052801561411d578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061413d57fe5b90600052602060002090601002016004015491508290505b60008111156141e457816004856001840381518110151561417257fe5b602090810290910101518154811061418657fe5b90600052602060002090601002016004015410156141d65783600182038151811015156141af57fe5b9060200190602002015184828151811015156141c757fe5b602090810290910101526141db565b6141e4565b60001901614155565b8284828151811015156141f357fe5b6020908102909101015260019290920191614125565b6060806000806000600480549050604051908082528060200260200182016040528015614240578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061426057fe5b9060005260206000209060100201600f015491508290505b600081111561430757816004856001840381518110151561429557fe5b60209081029091010151815481106142a957fe5b9060005260206000209060100201600f015410156142f95783600182038151811015156142d257fe5b9060200190602002015184828151811015156142ea57fe5b602090810290910101526142fe565b614307565b60001901614278565b82848281518110151561431657fe5b6020908102909101015260019290920191614248565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152606093610ec993919290918301828280156143bb5780601f10614390576101008083540402835291602001916143bb565b820191906000526020600020905b81548152906001019060200180831161439e57829003601f168201915b50505050506143c984615726565b61582c565b600a546000908190819060a060020a900460ff161515600114156143f157600080fd5b600954600160a060020a031633148061441f57503360009081526007602052604090205460ff161515600114155b151561442a57600080fd5b6009548490600160a060020a0316331480614459575060008181526008602052604090205460ff161515600114155b151561446457600080fd5b8461446e81612cd1565b600160a060020a0316331461448257600080fd5b600480548790811061449057fe5b906000526020600020906010020194506144b8600186600e01546156bb90919063ffffffff16565b6003540234146144c757600080fd5b600e8501546144dd90600163ffffffff6156bb16565b600e8601556144f334600263ffffffff6156c816565b935061450634600263ffffffff6156c816565b925034614519858563ffffffff6156bb16565b1461452357600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561455d573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f1935050505015801561459a573d6000803e3d6000fd5b5060405186907fa81139c94b432da5654d3ef267dda30c8b9986ce9be98b48ae657e9e131315a990600090a2505050505050565b600a546000908190819060a060020a900460ff161515600114156145f157600080fd5b600954600160a060020a031633148061461f57503360009081526007602052604090205460ff161515600114155b151561462a57600080fd5b6009548490600160a060020a0316331480614659575060008181526008602052604090205460ff161515600114155b151561466457600080fd5b8461466e81612cd1565b600160a060020a0316331461468257600080fd5b600480548790811061469057fe5b906000526020600020906010020194506146b8600186600c01546156bb90919063ffffffff16565b6003540234146146c757600080fd5b600c8501546146dd90600163ffffffff6156bb16565b600c8601556146f334600263ffffffff6156c816565b935061470634600263ffffffff6156c816565b925034614719858563ffffffff6156bb16565b1461472357600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561475d573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f1935050505015801561479a573d6000803e3d6000fd5b5060405186907fbb4a37ace80eb674c8d15b44877207404c8512694694a5bd85c7e3c25ce78acc90600090a2505050505050565b600954600160a060020a031633146147e557600080fd5b600a5460a060020a900460ff16151560011461480057600080fd5b600a805474ff0000000000000000000000000000000000000000191690556040517f0945a79720f403a98318a4f8fef6d479fd6770066e494ef9464ed372ad51d34290600090a1565b60025481565b6060806000806000600480549050604051908082528060200260200182016040528015614886578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106148a657fe5b9060005260206000209060100201600e015491508290505b600081111561494d5781600485600184038151811015156148db57fe5b60209081029091010151815481106148ef57fe5b9060005260206000209060100201600e0154101561493f57836001820381518110151561491857fe5b90602001906020020151848281518110151561493057fe5b60209081029091010152614944565b61494d565b600019016148be565b82848281518110151561495c57fe5b602090810290910101526001929092019161488e565b600954600160a060020a0316331461498957600080fd5b60038190556040805182815290517f5a1093c2d1e466101b19c30a33e1f82ca0442805aab8a0ce80e34689ea32a4da9181900360200190a150565b600160a060020a038083166000908152600f602090815260408083209385168352929052205460ff16151560011492915050565b600a5460a060020a900460ff16151560011415614a1457600080fd5b600954600160a060020a0316331480614a4257503360009081526007602052604090205460ff161515600114155b1515614a4d57600080fd5b6009548290600160a060020a0316331480614a7c575060008181526008602052604090205460ff161515600114155b1515614a8757600080fd5b82614a9181612cd1565b600160a060020a03163314614aa557600080fd5b82600485815481101515614ab557fe5b90600052602060002090601002016002019080519060200190614ad99291906159f7565b50837f24b7066d3a2edc32d25fff82a6169d835529a1adac01bc8b32f9bbece43f8b79846040518080602001828103825283818151815260200191508051906020019080838360005b83811015614b3a578181015183820152602001614b22565b50505050905090810190601f168015614b675780820380516001836020036101000a031916815260200191505b509250505060405180910390a250505050565b600954600090600160a060020a03163314614b9457600080fd5b5060098054600160a060020a03838116600160a060020a0319831681179093556040805191909216808252602082019390935281517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c929181900390910190a15050565b6060806000806000600480549050604051908082528060200260200182016040528015614c2f578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110614c4f57fe5b9060005260206000209060100201600d015491508290505b6000811115614cf6578160048560018403815181101515614c8457fe5b6020908102909101015181548110614c9857fe5b9060005260206000209060100201600d01541015614ce8578360018203815181101515614cc157fe5b906020019060200201518482815181101515614cd957fe5b60209081029091010152614ced565b614cf6565b60001901614c67565b828482815181101515614d0557fe5b6020908102909101015260019290920191614c37565b6060806000806000600480549050604051908082528060200260200182016040528015614d52578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110614d7257fe5b90600052602060002090601002016009015491508290505b6000811115614e19578160048560018403815181101515614da757fe5b6020908102909101015181548110614dbb57fe5b9060005260206000209060100201600901541015614e0b578360018203815181101515614de457fe5b906020019060200201518482815181101515614dfc57fe5b60209081029091010152614e10565b614e19565b60001901614d8a565b828482815181101515614e2857fe5b6020908102909101015260019290920191614d5a565b600a546000908190819060a060020a900460ff16151560011415614e6157600080fd5b600954600160a060020a0316331480614e8f57503360009081526007602052604090205460ff161515600114155b1515614e9a57600080fd5b6009548490600160a060020a0316331480614ec9575060008181526008602052604090205460ff161515600114155b1515614ed457600080fd5b84614ede81612cd1565b600160a060020a03163314614ef257600080fd5b6004805487908110614f0057fe5b9060005260206000209060100201945084600901546003540234141515614f2657600080fd5b6009850154614f3c90600163ffffffff6156bb16565b6009860155614f5234600263ffffffff6156c816565b9350614f6534600263ffffffff6156c816565b925034614f78858563ffffffff6156bb16565b14614f8257600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015614fbc573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015614ff9573d6000803e3d6000fd5b5060405186907ff136d08c266783dd2b521458dc72ee3890fefc8b6e89bb26191ecfc85ad59da990600090a2505050505050565b60408051808201909152600581527f4641495259000000000000000000000000000000000000000000000000000000602082015281565b606080600080600060048054905060405190808252806020026020018201604052801561509b578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106150bb57fe5b90600052602060002090601002016007015491508290505b60008111156151625781600485600184038151811015156150f057fe5b602090810290910101518154811061510457fe5b906000526020600020906010020160070154101561515457836001820381518110151561512d57fe5b90602001906020020151848281518110151561514557fe5b60209081029091010152615159565b615162565b600019016150d3565b82848281518110151561517157fe5b60209081029091010152600192909201916150a3565b600a546000908190819060a060020a900460ff161515600114156151aa57600080fd5b600954600160a060020a03163314806151d857503360009081526007602052604090205460ff161515600114155b15156151e357600080fd5b6009548490600160a060020a0316331480615212575060008181526008602052604090205460ff161515600114155b151561521d57600080fd5b8461522781612cd1565b600160a060020a0316331461523b57600080fd5b600480548790811061524957fe5b906000526020600020906010020194508460050154600354023414151561526f57600080fd5b600585015461528590600163ffffffff6156bb16565b600586015561529b34600263ffffffff6156c816565b93506152ae34600263ffffffff6156c816565b9250346152c1858563ffffffff6156bb16565b146152cb57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015615305573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015615342573d6000803e3d6000fd5b5060405186907f6894cff5292dafd789179621895e5f786a13c66f528543929bd14c93cb07b86c90600090a2505050505050565b600080600080846040518082805190602001908083835b602083106153ac5780518252601f19909201916020918201910161538d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020925060009150600090505b6004548110156154915760048054849190839081106153ff57fe5b9060005260206000209060100201600001604051808280546001816001161561010002031660029004801561546b5780601f1061544957610100808354040283529182019161546b565b820191906000526020600020905b815481529060010190602001808311615457575b50509150506040518091039020600019161415615489576001820191505b6001016153e4565b509392505050565b600a546000908190819060a060020a900460ff161515600114156154bc57600080fd5b600954600160a060020a03163314806154ea57503360009081526007602052604090205460ff161515600114155b15156154f557600080fd5b6009548490600160a060020a0316331480615524575060008181526008602052604090205460ff161515600114155b151561552f57600080fd5b8461553981612cd1565b600160a060020a0316331461554d57600080fd5b600480548790811061555b57fe5b90600052602060002090601002019450615583600186600b01546156bb90919063ffffffff16565b60035402341461559257600080fd5b600b8501546155a890600163ffffffff6156bb16565b600b8601556155be34600263ffffffff6156c816565b93506155d134600263ffffffff6156c816565b9250346155e4858563ffffffff6156bb16565b146155ee57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015615628573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015615665573d6000803e3d6000fd5b5060405186907f6040f20967d5c7935690014787ff47da23a95665b19602573f55013ca3341cc890600090a2505050505050565b6000600160a060020a0382161580610ec9575050600160a060020a0316301490565b81810182811015610ec957fe5b600081838115156156d557fe5b049392505050565b6000828211156156e957fe5b50900390565b6000903b63ffffffff161190565b600082151561570e57506000610ec9565b5081810281838281151561571e57fe5b0414610ec957fe5b6060600080828185151561576f5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450611d4c565b8593505b831561578b5760019290920191600a84049350615773565b826040519080825280601f01601f1916602001820160405280156157b9578160200160208202803883390190505b5091505060001982015b851561582357600a860660300160f860020a0282828151811015156157e457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550600019016157c3565b50949350505050565b60608060608060008087945086935083518551016040519080825280601f01601f19166020018201604052801561586d578160200160208202803883390190505b509250600091508190505b84518110156158ec57848181518110151561588f57fe5b90602001015160f860020a900460f860020a0283838151811015156158b057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019182019101615878565b5060005b835181101561596457838181518110151561590757fe5b90602001015160f860020a900460f860020a02838381518110151561592857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600191820191016158f0565b50909695505050505050565b61020060405190810160405280606081526020016000600160a060020a0316815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615a3857805160ff1916838001178555615a65565b82800160010185558215615a65579182015b82811115615a65578251825591602001919060010190615a4a565b50615a71929150615a95565b5090565b815481835581811115611f7057600083815260209020611f709181019083015b610f8691905b80821115615a715760008155600101615a9b5600a165627a7a723058203cee229dbe0a934f04e79b306f1edca4e8f537851e29777f87c83103d931af260029

Deployed Bytecode

0x6080604052600436106103635763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a781146103685780630552f9ff1461039e57806306fdde03146103b557806307583f491461043f578063081812fc146104605780630882e52d14610494578063095ea7b3146104bb5780630cd42cb2146104d25780630fc9c1b414610515578063172afda3146105205780631f3e41501461052b57806321d1f7bf14610543578063222419a91461059c57806323b872dd146105b157806328ca02fe146105ce5780632b38c045146105e35780633df33c341461068c57806342842e0e146106a15780634361b717146106be57806343a4d8cc146106d357806347a00498146106e85780634a2f60a1146106f35780634c48840f146107085780634df919451461071d5780635045280f146107d3578063556b2cbf146107de57806360961874146107f35780636352211e1461080b5780636513ae8e1461082357806366ec277c1461083b5780636904c94d1461085c578063694f058a146108715780636bc68403146108bc5780636e1ffc0d146108d457806370a08231146108ec5780637ddcac661461090d5780637eca6381146109255780638dfe3d31146109465780638fb1b7331461095b57806395d89b41146109665780639a8c27e51461097b578063a22cb46514610990578063a3f4df7e146109b6578063a87fa5c6146109cb578063aa323ea5146109ec578063af87e52d14610a10578063afddcdbc14610b2d578063b5cab1ce14610b38578063b5cc88b614610b4d578063b88d4fde14610b62578063c34d3f1c14610b8e578063c3e1fd5614610b99578063c4e9033014610bae578063c592c47514610bc3578063c68f010614610bdb578063c6d93e1314610bf0578063c87b56dd14610c05578063d0be686a14610c1d578063d46618ae14610c28578063db6003d114610c33578063e1a9810214610c48578063e485354a14610c5d578063e52ed74614610c72578063e985e9c514610c8a578063ec11573e14610cb1578063f2fde38b14610d0f578063f454f1a214610d30578063f511923d14610d45578063f73227d714610d5a578063f76f8d7814610d65578063fa1aa70e14610d7a578063fc8846e514610d8f578063febd42d114610d9a578063ff243e6914610df3575b600080fd5b34801561037457600080fd5b5061038a600160e060020a031960043516610dfe565b604080519115158252519081900360200190f35b3480156103aa57600080fd5b506103b3610ecf565b005b3480156103c157600080fd5b506103ca610f51565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104045781810151838201526020016103ec565b50505050905090810190601f1680156104315780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561044b57600080fd5b506103b3600160a060020a0360043516610f89565b34801561046c57600080fd5b50610478600435610ffb565b60408051600160a060020a039092168252519081900360200190f35b3480156104a057600080fd5b506104a9611016565b60408051918252519081900360200190f35b6103b3600160a060020a036004351660243561101c565b3480156104de57600080fd5b506104ea600435611166565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b6103b360043561138f565b6103b360043561158f565b34801561053757600080fd5b5061038a600435611778565b34801561054f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526103b394369492936024939284019190819084018382808284375094975061178d9650505050505050565b3480156105a857600080fd5b50610478611854565b6103b3600160a060020a0360043581169060243516604435611863565b3480156105da57600080fd5b506104a9611bd5565b3480156105ef57600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261063c943694929360249392840191908190840183828082843750949750611bdb9650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610678578181015183820152602001610660565b505050509050019250505060405180910390f35b34801561069857600080fd5b5061063c611d55565b6103b3600160a060020a0360043581169060243516604435611e7e565b3480156106ca57600080fd5b5061063c611f75565b3480156106df57600080fd5b5061063c612098565b6103b36004356121bb565b3480156106ff57600080fd5b5061038a6123bb565b34801561071457600080fd5b5061063c6123cb565b6040805160206004803580820135601f81018490048402850184019095528484526103b394369492936024939284019190819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b600160a060020a038b35169b909a90999401975091955091820193509150819084018382808284375094975050843595505050602083013592604081013592506060810135915060808101359060a001356124ee565b6103b3600435612997565b3480156107ea57600080fd5b5061063c612b86565b3480156107ff57600080fd5b50610478600435612ca9565b34801561081757600080fd5b50610478600435612cd1565b34801561082f57600080fd5b50610478600435612d01565b34801561084757600080fd5b5061038a600160a060020a0360043516612d1c565b34801561086857600080fd5b50610478612d31565b34801561087d57600080fd5b50610889600435612d40565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156108c857600080fd5b506103b3600435612f75565b3480156108e057600080fd5b506103b3600435612fc7565b3480156108f857600080fd5b506104a9600160a060020a0360043516613019565b34801561091957600080fd5b506103b360043561304f565b34801561093157600080fd5b506103b3600160a060020a03600435166130b4565b34801561095257600080fd5b5061063c613123565b6103b3600435613246565b34801561097257600080fd5b506103ca613435565b34801561098757600080fd5b5061063c61346c565b34801561099c57600080fd5b506103b3600160a060020a0360043516602435151561358f565b3480156109c257600080fd5b506103ca6136c2565b3480156109d757600080fd5b506103b3600160a060020a03600435166136f9565b3480156109f857600080fd5b506104a9600160a060020a0360043516602435613764565b348015610a1c57600080fd5b50610a28600435613794565b604051808060200186600160a060020a0316600160a060020a0316815260200180602001858152602001848152602001838103835288818151815260200191508051906020019080838360005b83811015610a8d578181015183820152602001610a75565b50505050905090810190601f168015610aba5780820380516001836020036101000a031916815260200191505b50838103825286518152865160209182019188019080838360005b83811015610aed578181015183820152602001610ad5565b50505050905090810190601f168015610b1a5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b6103b36004356139c2565b348015610b4457600080fd5b506103ca613bb1565b348015610b5957600080fd5b506104a9613c3f565b6103b3600160a060020a0360048035821691602480359091169160443591606435908101910135613c45565b6103b3600435613d55565b348015610ba557600080fd5b5061063c613f55565b348015610bba57600080fd5b506104a9614078565b348015610bcf57600080fd5b506103b360043561407e565b348015610be757600080fd5b5061063c6140e6565b348015610bfc57600080fd5b5061063c614209565b348015610c1157600080fd5b506103ca60043561432c565b6103b36004356143ce565b6103b36004356145ce565b348015610c3f57600080fd5b506103b36147ce565b348015610c5457600080fd5b506104a9614849565b348015610c6957600080fd5b5061063c61484f565b348015610c7e57600080fd5b506103b3600435614972565b348015610c9657600080fd5b5061038a600160a060020a03600435811690602435166149c4565b348015610cbd57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526103b39583359536956044949193909101919081908401838280828437509497506149f89650505050505050565b348015610d1b57600080fd5b506103b3600160a060020a0360043516614b7a565b348015610d3c57600080fd5b5061063c614bf8565b348015610d5157600080fd5b5061063c614d1b565b6103b3600435614e3e565b348015610d7157600080fd5b506103ca61502d565b348015610d8657600080fd5b5061063c615064565b6103b3600435615187565b348015610da657600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526104a99436949293602493928401919081908401838280828437509497506153769650505050505050565b6103b3600435615499565b6000600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610e6157507f80ac58cd00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b80610e9557507f5b5e139f00000000000000000000000000000000000000000000000000000000600160e060020a03198316145b80610ec957507f780e9d6300000000000000000000000000000000000000000000000000000000600160e060020a03198316145b92915050565b600954600160a060020a03163314610ee657600080fd5b600a5460a060020a900460ff16151560011415610f0257600080fd5b600a805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f1f8d764c113e8497eb5ee4b0d9d14459ce5adf3f688f37005fb6a0d610ca764190600090a1565b60408051808201909152600b81527f457468657220466169727900000000000000000000000000000000000000000060208201525b90565b600954600160a060020a03163314610fa057600080fd5b600160a060020a038116600081815260076020908152604091829020805460ff19166001179055815192835290517f3c362eaf8833b702c04434fdb4dc0c32e6d193886ebf80c1e7ac5f168e5f61019281900390910190a150565b6000908152600e6020526040902054600160a060020a031690565b60015481565b600a5460009060a060020a900460ff1615156001141561103b57600080fd5b600954600160a060020a031633148061106957503360009081526007602052604090205460ff161515600114155b151561107457600080fd5b6009548290600160a060020a03163314806110a3575060008181526008602052604090205460ff161515600114155b15156110ae57600080fd5b826110b881612cd1565b600160a060020a031633146110cc57600080fd5b6110d584612cd1565b9250600160a060020a0385811690841614156110f057600080fd5b6110f985615699565b15156001141561110857600080fd5b6000848152600e60205260408082208054600160a060020a031916600160a060020a0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b6000806000806000611176615970565b600480548890811061118457fe5b600091825260209182902060408051601093909302909101805460026001821615610100026000190190911604601f810185900490940283016102209081019092526102008301848152929390928492909184918401828280156112295780601f106111fe57610100808354040283529160200191611229565b820191906000526020600020905b81548152906001019060200180831161120c57829003601f168201915b5050509183525050600182810154600160a060020a0316602080840191909152600280850180546040805161010096831615969096026000190190911692909204601f810184900484028501840183528085529190940193918301828280156112d35780601f106112a8576101008083540402835291602001916112d3565b820191906000526020600020905b8154815290600101906020018083116112b657829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f8201548152505090508060a001518160c001518260e00151836101000151846101200151955095509550955095505091939590929450565b600a546000908190819060a060020a900460ff161515600114156113b257600080fd5b600954600160a060020a03163314806113e057503360009081526007602052604090205460ff161515600114155b15156113eb57600080fd5b6009548490600160a060020a031633148061141a575060008181526008602052604090205460ff161515600114155b151561142557600080fd5b8461142f81612cd1565b600160a060020a0316331461144357600080fd5b600480548790811061145157fe5b90600052602060002090601002019450611479600186600a01546156bb90919063ffffffff16565b60035402341461148857600080fd5b600a85015461149e90600163ffffffff6156bb16565b600a8601556114b434600263ffffffff6156c816565b93506114c734600263ffffffff6156c816565b9250346114da858563ffffffff6156bb16565b146114e457600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561151e573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f1935050505015801561155b573d6000803e3d6000fd5b5060405186907fb66c32e78f87dcd890038b1682f6b38e413dafbee346838a9d7f11d2f17c18fd90600090a2505050505050565b600a546000908190819060a060020a900460ff161515600114156115b257600080fd5b600954600160a060020a03163314806115e057503360009081526007602052604090205460ff161515600114155b15156115eb57600080fd5b6009548490600160a060020a031633148061161a575060008181526008602052604090205460ff161515600114155b151561162557600080fd5b8461162f81612cd1565b600160a060020a0316331461164357600080fd5b600254341461165157600080fd5b600480548790811061165f57fe5b90600052602060002090601002019450611687600186600401546156bb90919063ffffffff16565b600486015561169d34600263ffffffff6156c816565b93506116b034600263ffffffff6156c816565b9250346116c3858563ffffffff6156bb16565b146116cd57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015611707573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015611744573d6000803e3d6000fd5b5060405186907ff4d2e98be7eb5e03801b528e9a8da88caeaa79206f7ebd4ac478149d330cc07790600090a2505050505050565b60086020526000908152604090205460ff1681565b600954600160a060020a031633146117a457600080fd5b80516117b79060009060208401906159f7565b507f7add9568e7be20171f511d2bb7b953242b0b98a818c4f362dd1e71c3d7f9ce54816040518080602001828103825283818151815260200191508051906020019080838360005b838110156118175781810151838201526020016117ff565b50505050905090810190601f1680156118445780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b600a54600160a060020a031681565b600a546000908190819060a060020a900460ff1615156001141561188657600080fd5b600954600160a060020a03163314806118b457503360009081526007602052604090205460ff161515600114155b15156118bf57600080fd5b6009548490600160a060020a03163314806118ee575060008181526008602052604090205460ff161515600114155b15156118f957600080fd5b8461190381612cd1565b600160a060020a031633600160a060020a0316148061193b575061192681610ffb565b600160a060020a031633600160a060020a0316145b80611959575061195361194d82612cd1565b336149c4565b15156001145b8061196e5750600a54600160a060020a031633145b151561197957600080fd5b61198287615699565b15156001141561199157600080fd5b61199a86612cd1565b600160a060020a038981169116146119b157600080fd5b6119ba86612cd1565b600160a060020a03888116911614156119d257600080fd5b6000868152600e60205260408082208054600160a060020a031916905551879190600160a060020a038b16907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a46000868152600d60205260409020549450611a4e6001611a428a613019565b9063ffffffff6156dd16565b600160a060020a0389166000908152600c6020526040902080549195509085908110611a7657fe5b9060005260206000200154925082600c60008a600160a060020a0316600160a060020a0316815260200190815260200160002086815481101515611ab657fe5b6000918252602080832090910192909255600160a060020a038a168152600c90915260409020805485908110611ae857fe5b60009182526020808320909101829055600160a060020a038a168252600c90526040902080546000190190611b1d9082615a75565b506000838152600d60209081526040808320889055888352600b82528083208054600160a060020a031916600160a060020a038c169081179091558352600c825282208054600181810180845592855292909320909201889055611b8191906156dd565b6000878152600d60205260408082209290925590518791600160a060020a03808b1692908c16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45050505050505050565b60035481565b606060006060600080856040518082805190602001908083835b60208310611c145780518252601f199092019160209182019101611bf5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209350611c4c86615376565b604051908082528060200260200182016040528015611c75578160200160208202803883390190505b50925060009150600090505b600454811015611d48576004805485919083908110611c9c57fe5b90600052602060002090601002016000016040518082805460018160011615610100020316600290048015611d085780601f10611ce6576101008083540402835291820191611d08565b820191906000526020600020905b815481529060010190602001808311611cf4575b50509150506040518091039020600019161415611d4057808383815181101515611d2e57fe5b60209081029091010152600191909101905b600101611c81565b8294505b50505050919050565b6060806000806000600580549050604051908082528060200260200182016040528015611d8c578160200160208202803883390190505b509350600092505b600554831015611e7557611dca600584815481101515611db057fe5b600091825260209091200154600160a060020a0316613019565b91508290505b6000811115611e505781611e0460058660018503815181101515611df057fe5b6020908102909101015181548110611db057fe5b1015611e42578360018203815181101515611e1b57fe5b906020019060200201518482815181101515611e3357fe5b60209081029091010152611e47565b611e50565b60001901611dd0565b828482815181101515611e5f57fe5b6020908102909101015260019290920191611d94565b50919392505050565b600a5460a060020a900460ff16151560011415611e9a57600080fd5b611ea5838383611863565b611eae826156ef565b151560011415611f70576040805160e160020a630a85bd01028152336004820152600160a060020a038581166024830152604482018490526080606483015260006084830181905292519085169263150b7a029260c480820193602093909283900390910190829087803b158015611f2557600080fd5b505af1158015611f39573d6000803e3d6000fd5b505050506040513d6020811015611f4f57600080fd5b5051600160e060020a03191660e160020a630a85bd010214611f7057600080fd5b505050565b6060806000806000600480549050604051908082528060200260200182016040528015611fac578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110611fcc57fe5b90600052602060002090601002016003015491508290505b600081111561207357816004856001840381518110151561200157fe5b602090810290910101518154811061201557fe5b906000526020600020906010020160030154101561206557836001820381518110151561203e57fe5b90602001906020020151848281518110151561205657fe5b6020908102909101015261206a565b612073565b60001901611fe4565b82848281518110151561208257fe5b6020908102909101015260019290920191611fb4565b60608060008060006004805490506040519080825280602002602001820160405280156120cf578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106120ef57fe5b90600052602060002090601002016006015491508290505b600081111561219657816004856001840381518110151561212457fe5b602090810290910101518154811061213857fe5b906000526020600020906010020160060154101561218857836001820381518110151561216157fe5b90602001906020020151848281518110151561217957fe5b6020908102909101015261218d565b612196565b60001901612107565b8284828151811015156121a557fe5b60209081029091010152600192909201916120d7565b600a546000908190819060a060020a900460ff161515600114156121de57600080fd5b600954600160a060020a031633148061220c57503360009081526007602052604090205460ff161515600114155b151561221757600080fd5b6009548490600160a060020a0316331480612246575060008181526008602052604090205460ff161515600114155b151561225157600080fd5b8461225b81612cd1565b600160a060020a0316331461226f57600080fd5b600480548790811061227d57fe5b906000526020600020906010020194506122a5600186600f01546156bb90919063ffffffff16565b6003540234146122b457600080fd5b600f8501546122ca90600163ffffffff6156bb16565b600f8601556122e034600263ffffffff6156c816565b93506122f334600263ffffffff6156c816565b925034612306858563ffffffff6156bb16565b1461231057600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561234a573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015612387573d6000803e3d6000fd5b5060405186907f28ee3b4dbd85723acb16aff9d7ddaa9455c445a2d47e58e5a30d1372555056e990600090a2505050505050565b600a5460a060020a900460ff1681565b6060806000806000600480549050604051908082528060200260200182016040528015612402578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061242257fe5b90600052602060002090601002016008015491508290505b60008111156124c957816004856001840381518110151561245757fe5b602090810290910101518154811061246b57fe5b90600052602060002090601002016008015410156124bb57836001820381518110151561249457fe5b9060200190602002015184828151811015156124ac57fe5b602090810290910101526124c0565b6124c9565b6000190161243a565b8284828151811015156124d857fe5b602090810290910101526001929092019161240a565b600a54600090819060a060020a900460ff1615156001141561250f57600080fd5b600954600160a060020a031633148061253d57503360009081526007602052604090205460ff161515600114155b151561254857600080fd5b6125518a615699565b15156001141561256057600080fd5b600154341461256e57600080fd5b879150612581828863ffffffff6156bb16565b9150612593828763ffffffff6156bb16565b91506125a5828663ffffffff6156bb16565b91506125b7828563ffffffff6156bb16565b91506125c9828463ffffffff6156bb16565b9150600582146125d857600080fd5b60408051610200810182528c8152600160a060020a038c166020808301919091529181018b9052426060820152600060808201819052600160a0830181905260c0830181905260e083018190526101008301819052610120830181905261014083018c905261016083018b905261018083018a90526101a083018990526101c083018890526101e0830187905260048054808301808355919093528351805161278f9693959294929360109093027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01926126b79284929101906159f7565b50602082810151600183018054600160a060020a031916600160a060020a03909216919091179055604083015180516126f692600285019201906159f7565b50606082015160038201556080820151600482015560a0820151600582015560c0820151600682015560e0820151600782015561010082015160088201556101208201516009820155610140820151600a820155610160820151600b820155610180820151600c8201556101a0820151600d8201556101c0820151600e8201556101e090910151600f909101559063ffffffff6156dd16565b6000818152600b602090815260408083208054600160a060020a031916339081179091558352600c8252822080546001818101808455928552929093209092018390559192506127e49163ffffffff6156dd16565b6000828152600d602090815260408083209390935533825260069052205460ff161515600114612869576005805460018181019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0018054600160a060020a031916339081179091556000908152600660205260409020805460ff191690911790555b3461288b600261287f838263ffffffff6156c816565b9063ffffffff6156fd16565b1461289557600080fd5b600954600160a060020a03166108fc6128b534600263ffffffff6156c816565b6040518115909202916000818181858888f193505050501580156128dd573d6000803e3d6000fd5b50600160a060020a038a166108fc6128fc34600263ffffffff6156c816565b6040518115909202916000818181858888f19350505050158015612924573d6000803e3d6000fd5b5060408051828152905133917f3bb5ebaa518c4d975caed7769b9ddf3c2dc502f03628daaf6ed93c46376a9d57919081900360200190a2604051819033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050505050505050505050565b600a546000908190819060a060020a900460ff161515600114156129ba57600080fd5b600954600160a060020a03163314806129e857503360009081526007602052604090205460ff161515600114155b15156129f357600080fd5b6009548490600160a060020a0316331480612a22575060008181526008602052604090205460ff161515600114155b1515612a2d57600080fd5b84612a3781612cd1565b600160a060020a03163314612a4b57600080fd5b6004805487908110612a5957fe5b9060005260206000209060100201945084600601546003540234141515612a7f57600080fd5b6006850154612a9590600163ffffffff6156bb16565b6006860155612aab34600263ffffffff6156c816565b9350612abe34600263ffffffff6156c816565b925034612ad1858563ffffffff6156bb16565b14612adb57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015612b15573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015612b52573d6000803e3d6000fd5b5060405186907f266ebb0c12a6c8922fd1f55e5d30ce25e605f0c9ce1846d022b5989f8ac3e99f90600090a2505050505050565b6060806000806000600480549050604051908082528060200260200182016040528015612bbd578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110612bdd57fe5b9060005260206000209060100201600a015491508290505b6000811115612c84578160048560018403815181101515612c1257fe5b6020908102909101015181548110612c2657fe5b9060005260206000209060100201600a01541015612c76578360018203815181101515612c4f57fe5b906020019060200201518482815181101515612c6757fe5b60209081029091010152612c7b565b612c84565b60001901612bf5565b828482815181101515612c9357fe5b6020908102909101015260019290920191612bc5565b6005805482908110612cb757fe5b600091825260209091200154600160a060020a0316905081565b6000818152600b6020526040812054600160a060020a0316612cf281615699565b151560011415610ec957600080fd5b600b60205260009081526040902054600160a060020a031681565b60076020526000908152604090205460ff1681565b600954600160a060020a031681565b600080600080600080612d51615970565b6004805489908110612d5f57fe5b600091825260209182902060408051601093909302909101805460026001821615610100026000190190911604601f81018590049094028301610220908101909252610200830184815292939092849290918491840182828015612e045780601f10612dd957610100808354040283529160200191612e04565b820191906000526020600020905b815481529060010190602001808311612de757829003601f168201915b5050509183525050600182810154600160a060020a0316602080840191909152600280850180546040805161010096831615969096026000190190911692909204601f81018490048402850184018352808552919094019391830182828015612eae5780601f10612e8357610100808354040283529160200191612eae565b820191906000526020600020905b815481529060010190602001808311612e9157829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f820154815250509050806101400151816101600151826101800151836101a00151846101c00151856101e001519650965096509650965096505091939550919395565b600954600160a060020a03163314612f8c57600080fd5b60018190556040805182815290517fc7f819d723891694b311ee508b284bd6f009f851f32f6d79ba4da222b5a5129c9181900360200190a150565b600954600160a060020a03163314612fde57600080fd5b60028190556040805182815290517fa0f6ecf36b6ac796a4a605ce1f0e4c3e9c1cdaab03dbd01719b1e56db0c58c4e9181900360200190a150565b600061302482615699565b15156001141561303357600080fd5b50600160a060020a03166000908152600c602052604090205490565b600954600160a060020a0316331461306657600080fd5b600081815260086020908152604091829020805460ff19169055815183815291517f4fdf7fd7aa97a5cfdc4c58ce5865199ff261625e3e683ce3cf14e78cc18b05089281900390910190a150565b600954600160a060020a031633146130cb57600080fd5b600160a060020a038116600081815260076020908152604091829020805460ff19169055815192835290517fde46e08696375206ec1a7e2b6abb03889d1bb91d94e2e18326878ada05c49d429281900390910190a150565b606080600080600060048054905060405190808252806020026020018201604052801561315a578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061317a57fe5b9060005260206000209060100201600c015491508290505b60008111156132215781600485600184038151811015156131af57fe5b60209081029091010151815481106131c357fe5b9060005260206000209060100201600c015410156132135783600182038151811015156131ec57fe5b90602001906020020151848281518110151561320457fe5b60209081029091010152613218565b613221565b60001901613192565b82848281518110151561323057fe5b6020908102909101015260019290920191613162565b600a546000908190819060a060020a900460ff1615156001141561326957600080fd5b600954600160a060020a031633148061329757503360009081526007602052604090205460ff161515600114155b15156132a257600080fd5b6009548490600160a060020a03163314806132d1575060008181526008602052604090205460ff161515600114155b15156132dc57600080fd5b846132e681612cd1565b600160a060020a031633146132fa57600080fd5b600480548790811061330857fe5b906000526020600020906010020194508460080154600354023414151561332e57600080fd5b600885015461334490600163ffffffff6156bb16565b600886015561335a34600263ffffffff6156c816565b935061336d34600263ffffffff6156c816565b925034613380858563ffffffff6156bb16565b1461338a57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f193505050501580156133c4573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015613401573d6000803e3d6000fd5b5060405186907fe2ab17eec57971877a65df5d2519c9f9337ad996fb19c1eed2bdaa06430fbd0390600090a2505050505050565b60408051808201909152600581527f4641495259000000000000000000000000000000000000000000000000000000602082015290565b60608060008060006004805490506040519080825280602002602001820160405280156134a3578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106134c357fe5b9060005260206000209060100201600b015491508290505b600081111561356a5781600485600184038151811015156134f857fe5b602090810290910101518154811061350c57fe5b9060005260206000209060100201600b0154101561355c57836001820381518110151561353557fe5b90602001906020020151848281518110151561354d57fe5b60209081029091010152613561565b61356a565b600019016134db565b82848281518110151561357957fe5b60209081029091010152600192909201916134ab565b600a5460a060020a900460ff161515600114156135ab57600080fd5b600954600160a060020a03163314806135d957503360009081526007602052604090205460ff161515600114155b15156135e457600080fd5b600160a060020a0382163314156135fa57600080fd5b61360382615699565b15156001141561361257600080fd5b6001811515141561365057336000908152600f60209081526040808320600160a060020a03861684529091529020805460ff1916600117905561367c565b336000908152600f60209081526040808320600160a060020a03861684529091529020805460ff191690555b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b60408051808201909152600b81527f4574686572204661697279000000000000000000000000000000000000000000602082015281565b600954600160a060020a0316331461371057600080fd5b600a8054600160a060020a038316600160a060020a0319909116811790915560408051918252517fcdcfc26641bf2eab45b914c10142d75e9a87fef645948316289d19b372af0f6c9181900360200190a150565b600c6020528160005260406000208181548110151561377f57fe5b90600052602060002001600091509150505481565b6060600060606000806137a5615970565b60048054889081106137b357fe5b600091825260209182902060408051601093909302909101805460026001821615610100026000190190911604601f810185900490940283016102209081019092526102008301848152929390928492909184918401828280156138585780601f1061382d57610100808354040283529160200191613858565b820191906000526020600020905b81548152906001019060200180831161383b57829003601f168201915b5050509183525050600182810154600160a060020a0316602080840191909152600280850180546040805161010096831615969096026000190190911692909204601f810184900484028501840183528085529190940193918301828280156139025780601f106138d757610100808354040283529160200191613902565b820191906000526020600020905b8154815290600101906020018083116138e557829003601f168201915b5050505050815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815260200160098201548152602001600a8201548152602001600b8201548152602001600c8201548152602001600d8201548152602001600e8201548152602001600f82015481525050905080600001518160200151826040015183606001518460800151849450829250955095509550955095505091939590929450565b600a546000908190819060a060020a900460ff161515600114156139e557600080fd5b600954600160a060020a0316331480613a1357503360009081526007602052604090205460ff161515600114155b1515613a1e57600080fd5b6009548490600160a060020a0316331480613a4d575060008181526008602052604090205460ff161515600114155b1515613a5857600080fd5b84613a6281612cd1565b600160a060020a03163314613a7657600080fd5b6004805487908110613a8457fe5b9060005260206000209060100201945084600701546003540234141515613aaa57600080fd5b6007850154613ac090600163ffffffff6156bb16565b6007860155613ad634600263ffffffff6156c816565b9350613ae934600263ffffffff6156c816565b925034613afc858563ffffffff6156bb16565b14613b0657600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015613b40573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015613b7d573d6000803e3d6000fd5b5060405186907fa69b4ad0ab3d1c368d9690baf1f0dd4d3fca07aebf83c1553ecefce92d309c6790600090a2505050505050565b6000805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015613c375780601f10613c0c57610100808354040283529160200191613c37565b820191906000526020600020905b815481529060010190602001808311613c1a57829003601f168201915b505050505081565b60055490565b600a5460a060020a900460ff16151560011415613c6157600080fd5b613c6c858585611863565b613c75846156ef565b151560011415613d4e5760405160e160020a630a85bd010281523360048201818152600160a060020a03888116602485015260448401879052608060648501908152608485018690529088169363150b7a0293928a92899289928992909160a40184848082843782019150509650505050505050602060405180830381600087803b158015613d0357600080fd5b505af1158015613d17573d6000803e3d6000fd5b505050506040513d6020811015613d2d57600080fd5b5051600160e060020a03191660e160020a630a85bd010214613d4e57600080fd5b5050505050565b600a546000908190819060a060020a900460ff16151560011415613d7857600080fd5b600954600160a060020a0316331480613da657503360009081526007602052604090205460ff161515600114155b1515613db157600080fd5b6009548490600160a060020a0316331480613de0575060008181526008602052604090205460ff161515600114155b1515613deb57600080fd5b84613df581612cd1565b600160a060020a03163314613e0957600080fd5b6004805487908110613e1757fe5b90600052602060002090601002019450613e3f600186600d01546156bb90919063ffffffff16565b600354023414613e4e57600080fd5b600d850154613e6490600163ffffffff6156bb16565b600d860155613e7a34600263ffffffff6156c816565b9350613e8d34600263ffffffff6156c816565b925034613ea0858563ffffffff6156bb16565b14613eaa57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015613ee4573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015613f21573d6000803e3d6000fd5b5060405186907f0ddc102415a9432e24d58997c8d6e49ed008254a4740bc68f91af5f5bb61b7e990600090a2505050505050565b6060806000806000600480549050604051908082528060200260200182016040528015613f8c578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110613fac57fe5b90600052602060002090601002016005015491508290505b6000811115614053578160048560018403815181101515613fe157fe5b6020908102909101015181548110613ff557fe5b906000526020600020906010020160050154101561404557836001820381518110151561401e57fe5b90602001906020020151848281518110151561403657fe5b6020908102909101015261404a565b614053565b60001901613fc4565b82848281518110151561406257fe5b6020908102909101015260019290920191613f94565b60045490565b600954600160a060020a0316331461409557600080fd5b600081815260086020908152604091829020805460ff19166001179055815183815291517f22601a1d2f47cbea52a8368355409c1292e7d987a53b53dc592dc8865d59b74a9281900390910190a150565b606080600080600060048054905060405190808252806020026020018201604052801561411d578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061413d57fe5b90600052602060002090601002016004015491508290505b60008111156141e457816004856001840381518110151561417257fe5b602090810290910101518154811061418657fe5b90600052602060002090601002016004015410156141d65783600182038151811015156141af57fe5b9060200190602002015184828151811015156141c757fe5b602090810290910101526141db565b6141e4565b60001901614155565b8284828151811015156141f357fe5b6020908102909101015260019290920191614125565b6060806000806000600480549050604051908082528060200260200182016040528015614240578160200160208202803883390190505b509350600092505b600454831015611e7557600480548490811061426057fe5b9060005260206000209060100201600f015491508290505b600081111561430757816004856001840381518110151561429557fe5b60209081029091010151815481106142a957fe5b9060005260206000209060100201600f015410156142f95783600182038151811015156142d257fe5b9060200190602002015184828151811015156142ea57fe5b602090810290910101526142fe565b614307565b60001901614278565b82848281518110151561431657fe5b6020908102909101015260019290920191614248565b6000805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152606093610ec993919290918301828280156143bb5780601f10614390576101008083540402835291602001916143bb565b820191906000526020600020905b81548152906001019060200180831161439e57829003601f168201915b50505050506143c984615726565b61582c565b600a546000908190819060a060020a900460ff161515600114156143f157600080fd5b600954600160a060020a031633148061441f57503360009081526007602052604090205460ff161515600114155b151561442a57600080fd5b6009548490600160a060020a0316331480614459575060008181526008602052604090205460ff161515600114155b151561446457600080fd5b8461446e81612cd1565b600160a060020a0316331461448257600080fd5b600480548790811061449057fe5b906000526020600020906010020194506144b8600186600e01546156bb90919063ffffffff16565b6003540234146144c757600080fd5b600e8501546144dd90600163ffffffff6156bb16565b600e8601556144f334600263ffffffff6156c816565b935061450634600263ffffffff6156c816565b925034614519858563ffffffff6156bb16565b1461452357600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561455d573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f1935050505015801561459a573d6000803e3d6000fd5b5060405186907fa81139c94b432da5654d3ef267dda30c8b9986ce9be98b48ae657e9e131315a990600090a2505050505050565b600a546000908190819060a060020a900460ff161515600114156145f157600080fd5b600954600160a060020a031633148061461f57503360009081526007602052604090205460ff161515600114155b151561462a57600080fd5b6009548490600160a060020a0316331480614659575060008181526008602052604090205460ff161515600114155b151561466457600080fd5b8461466e81612cd1565b600160a060020a0316331461468257600080fd5b600480548790811061469057fe5b906000526020600020906010020194506146b8600186600c01546156bb90919063ffffffff16565b6003540234146146c757600080fd5b600c8501546146dd90600163ffffffff6156bb16565b600c8601556146f334600263ffffffff6156c816565b935061470634600263ffffffff6156c816565b925034614719858563ffffffff6156bb16565b1461472357600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f1935050505015801561475d573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f1935050505015801561479a573d6000803e3d6000fd5b5060405186907fbb4a37ace80eb674c8d15b44877207404c8512694694a5bd85c7e3c25ce78acc90600090a2505050505050565b600954600160a060020a031633146147e557600080fd5b600a5460a060020a900460ff16151560011461480057600080fd5b600a805474ff0000000000000000000000000000000000000000191690556040517f0945a79720f403a98318a4f8fef6d479fd6770066e494ef9464ed372ad51d34290600090a1565b60025481565b6060806000806000600480549050604051908082528060200260200182016040528015614886578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106148a657fe5b9060005260206000209060100201600e015491508290505b600081111561494d5781600485600184038151811015156148db57fe5b60209081029091010151815481106148ef57fe5b9060005260206000209060100201600e0154101561493f57836001820381518110151561491857fe5b90602001906020020151848281518110151561493057fe5b60209081029091010152614944565b61494d565b600019016148be565b82848281518110151561495c57fe5b602090810290910101526001929092019161488e565b600954600160a060020a0316331461498957600080fd5b60038190556040805182815290517f5a1093c2d1e466101b19c30a33e1f82ca0442805aab8a0ce80e34689ea32a4da9181900360200190a150565b600160a060020a038083166000908152600f602090815260408083209385168352929052205460ff16151560011492915050565b600a5460a060020a900460ff16151560011415614a1457600080fd5b600954600160a060020a0316331480614a4257503360009081526007602052604090205460ff161515600114155b1515614a4d57600080fd5b6009548290600160a060020a0316331480614a7c575060008181526008602052604090205460ff161515600114155b1515614a8757600080fd5b82614a9181612cd1565b600160a060020a03163314614aa557600080fd5b82600485815481101515614ab557fe5b90600052602060002090601002016002019080519060200190614ad99291906159f7565b50837f24b7066d3a2edc32d25fff82a6169d835529a1adac01bc8b32f9bbece43f8b79846040518080602001828103825283818151815260200191508051906020019080838360005b83811015614b3a578181015183820152602001614b22565b50505050905090810190601f168015614b675780820380516001836020036101000a031916815260200191505b509250505060405180910390a250505050565b600954600090600160a060020a03163314614b9457600080fd5b5060098054600160a060020a03838116600160a060020a0319831681179093556040805191909216808252602082019390935281517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c929181900390910190a15050565b6060806000806000600480549050604051908082528060200260200182016040528015614c2f578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110614c4f57fe5b9060005260206000209060100201600d015491508290505b6000811115614cf6578160048560018403815181101515614c8457fe5b6020908102909101015181548110614c9857fe5b9060005260206000209060100201600d01541015614ce8578360018203815181101515614cc157fe5b906020019060200201518482815181101515614cd957fe5b60209081029091010152614ced565b614cf6565b60001901614c67565b828482815181101515614d0557fe5b6020908102909101015260019290920191614c37565b6060806000806000600480549050604051908082528060200260200182016040528015614d52578160200160208202803883390190505b509350600092505b600454831015611e75576004805484908110614d7257fe5b90600052602060002090601002016009015491508290505b6000811115614e19578160048560018403815181101515614da757fe5b6020908102909101015181548110614dbb57fe5b9060005260206000209060100201600901541015614e0b578360018203815181101515614de457fe5b906020019060200201518482815181101515614dfc57fe5b60209081029091010152614e10565b614e19565b60001901614d8a565b828482815181101515614e2857fe5b6020908102909101015260019290920191614d5a565b600a546000908190819060a060020a900460ff16151560011415614e6157600080fd5b600954600160a060020a0316331480614e8f57503360009081526007602052604090205460ff161515600114155b1515614e9a57600080fd5b6009548490600160a060020a0316331480614ec9575060008181526008602052604090205460ff161515600114155b1515614ed457600080fd5b84614ede81612cd1565b600160a060020a03163314614ef257600080fd5b6004805487908110614f0057fe5b9060005260206000209060100201945084600901546003540234141515614f2657600080fd5b6009850154614f3c90600163ffffffff6156bb16565b6009860155614f5234600263ffffffff6156c816565b9350614f6534600263ffffffff6156c816565b925034614f78858563ffffffff6156bb16565b14614f8257600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015614fbc573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015614ff9573d6000803e3d6000fd5b5060405186907ff136d08c266783dd2b521458dc72ee3890fefc8b6e89bb26191ecfc85ad59da990600090a2505050505050565b60408051808201909152600581527f4641495259000000000000000000000000000000000000000000000000000000602082015281565b606080600080600060048054905060405190808252806020026020018201604052801561509b578160200160208202803883390190505b509350600092505b600454831015611e755760048054849081106150bb57fe5b90600052602060002090601002016007015491508290505b60008111156151625781600485600184038151811015156150f057fe5b602090810290910101518154811061510457fe5b906000526020600020906010020160070154101561515457836001820381518110151561512d57fe5b90602001906020020151848281518110151561514557fe5b60209081029091010152615159565b615162565b600019016150d3565b82848281518110151561517157fe5b60209081029091010152600192909201916150a3565b600a546000908190819060a060020a900460ff161515600114156151aa57600080fd5b600954600160a060020a03163314806151d857503360009081526007602052604090205460ff161515600114155b15156151e357600080fd5b6009548490600160a060020a0316331480615212575060008181526008602052604090205460ff161515600114155b151561521d57600080fd5b8461522781612cd1565b600160a060020a0316331461523b57600080fd5b600480548790811061524957fe5b906000526020600020906010020194508460050154600354023414151561526f57600080fd5b600585015461528590600163ffffffff6156bb16565b600586015561529b34600263ffffffff6156c816565b93506152ae34600263ffffffff6156c816565b9250346152c1858563ffffffff6156bb16565b146152cb57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015615305573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015615342573d6000803e3d6000fd5b5060405186907f6894cff5292dafd789179621895e5f786a13c66f528543929bd14c93cb07b86c90600090a2505050505050565b600080600080846040518082805190602001908083835b602083106153ac5780518252601f19909201916020918201910161538d565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020925060009150600090505b6004548110156154915760048054849190839081106153ff57fe5b9060005260206000209060100201600001604051808280546001816001161561010002031660029004801561546b5780601f1061544957610100808354040283529182019161546b565b820191906000526020600020905b815481529060010190602001808311615457575b50509150506040518091039020600019161415615489576001820191505b6001016153e4565b509392505050565b600a546000908190819060a060020a900460ff161515600114156154bc57600080fd5b600954600160a060020a03163314806154ea57503360009081526007602052604090205460ff161515600114155b15156154f557600080fd5b6009548490600160a060020a0316331480615524575060008181526008602052604090205460ff161515600114155b151561552f57600080fd5b8461553981612cd1565b600160a060020a0316331461554d57600080fd5b600480548790811061555b57fe5b90600052602060002090601002019450615583600186600b01546156bb90919063ffffffff16565b60035402341461559257600080fd5b600b8501546155a890600163ffffffff6156bb16565b600b8601556155be34600263ffffffff6156c816565b93506155d134600263ffffffff6156c816565b9250346155e4858563ffffffff6156bb16565b146155ee57600080fd5b600954604051600160a060020a039091169085156108fc029086906000818181858888f19350505050158015615628573d6000803e3d6000fd5b506001850154604051600160a060020a039091169084156108fc029085906000818181858888f19350505050158015615665573d6000803e3d6000fd5b5060405186907f6040f20967d5c7935690014787ff47da23a95665b19602573f55013ca3341cc890600090a2505050505050565b6000600160a060020a0382161580610ec9575050600160a060020a0316301490565b81810182811015610ec957fe5b600081838115156156d557fe5b049392505050565b6000828211156156e957fe5b50900390565b6000903b63ffffffff161190565b600082151561570e57506000610ec9565b5081810281838281151561571e57fe5b0414610ec957fe5b6060600080828185151561576f5760408051808201909152600181527f300000000000000000000000000000000000000000000000000000000000000060208201529450611d4c565b8593505b831561578b5760019290920191600a84049350615773565b826040519080825280601f01601f1916602001820160405280156157b9578160200160208202803883390190505b5091505060001982015b851561582357600a860660300160f860020a0282828151811015156157e457fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86049550600019016157c3565b50949350505050565b60608060608060008087945086935083518551016040519080825280601f01601f19166020018201604052801561586d578160200160208202803883390190505b509250600091508190505b84518110156158ec57848181518110151561588f57fe5b90602001015160f860020a900460f860020a0283838151811015156158b057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060019182019101615878565b5060005b835181101561596457838181518110151561590757fe5b90602001015160f860020a900460f860020a02838381518110151561592857fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600191820191016158f0565b50909695505050505050565b61020060405190810160405280606081526020016000600160a060020a0316815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615a3857805160ff1916838001178555615a65565b82800160010185558215615a65579182015b82811115615a65578251825591602001919060010190615a4a565b50615a71929150615a95565b5090565b815481835581811115611f7057600083815260209020611f709181019083015b610f8691905b80821115615a715760008155600101615a9b5600a165627a7a723058203cee229dbe0a934f04e79b306f1edca4e8f537851e29777f87c83103d931af260029

Deployed Bytecode Sourcemap

50644:491:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50816:316;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;50816:316:0;-1:-1:-1;;;;;;50816:316:0;;;;;;;;;;;;;;;;;;;;;;;8398:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8398:116:0;;;;;;6742:68;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6742:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6742:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10023:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10023:148:0;-1:-1:-1;;;;;10023:148:0;;;;;23133:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23133:111:0;;;;;;;;;-1:-1:-1;;;;;23133:111:0;;;;;;;;;;;;;;2855:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2855:44:0;;;;;;;;;;;;;;;;;;;;22080:406;;-1:-1:-1;;;;;22080:406:0;;;;;;;41277:465;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41277:465:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30558:963;;;;;;24431:818;;;;;;5406:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5406:50:0;;;;;9550:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9550:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9550:204:0;;-1:-1:-1;9550:204:0;;-1:-1:-1;;;;;;;9550:204:0;5554:29;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5554:29:0;;;;21004:1007;;-1:-1:-1;;;;;21004:1007:0;;;;;;;;;;;;3062:54;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3062:54:0;;;;4587:438;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4587:438:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4587:438:0;;-1:-1:-1;4587:438:0;;-1:-1:-1;;;;;;;4587:438:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;4587:438:0;;;;;;;;;;;;;;;;;40195:490;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40195:490:0;;;;20638:321;;-1:-1:-1;;;;;20638:321:0;;;;;;;;;;;;42521:478;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42521:478:0;;;;44330:528;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44330:528:0;;;;35838:966;;;;;;5798:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5798:33:0;;;;45609:533;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45609:533:0;;;;37136:2683;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37136:2683:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37136:2683:0;;;;;;;;;;;-1:-1:-1;37136:2683:0;;-1:-1:-1;37136:2683:0;;;;-1:-1:-1;37136:2683:0;-1:-1:-1;37136:2683:0;;;;;;;;;;-1:-1:-1;37136:2683:0;;-1:-1:-1;;37136:2683:0;;;-1:-1:-1;;;37136:2683:0;;;;;;;;;;-1:-1:-1;37136:2683:0;;;;;-1:-1:-1;37136:2683:0;;;;;;;;;;26349:962;;;;;;46907:518;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46907:518:0;;;;5056:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5056:24:0;;;;;19661:182;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19661:182:0;;;;;18404:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18404:50:0;;;;;5316:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5316:49:0;-1:-1:-1;;;;;5316:49:0;;;;;5492:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5492:22:0;;;;41838:510;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41838:510:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8728:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8728:181:0;;;;;8964:193;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8964:193:0;;;;;19400:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19400:189:0;-1:-1:-1;;;;;19400:189:0;;;;;10614:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10614:160:0;;;;;10414:155;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10414:155:0;-1:-1:-1;;;;;10414:155:0;;;;;48177:518;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48177:518:0;;;;28444:967;;;;;;6860:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6860:72:0;;;;47538:523;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47538:523:0;;;;22573:474;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22573:474:0;-1:-1:-1;;;;;22573:474:0;;;;;;;;;2649:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2649:43:0;;;;9806:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9806:169:0;-1:-1:-1;;;;;9806:169:0;;;;;18503:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18503:53:0;-1:-1:-1;;;;;18503:53:0;;;;;;;40826:355;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40826:355:0;;;;;;;;;;;;;-1:-1:-1;;;;;40826:355:0;-1:-1:-1;;;;;40826:355:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40826:355:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40826:355:0;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40826:355:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27394:967;;;;;;2739:80;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2739:80:0;;;;5087:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5087:87:0;;;;20186:335;;-1:-1:-1;;;;;20186:335:0;;;;;;;;;;;;;;;;;;;;;;;;;;33722:971;;;;;;43713:508;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43713:508:0;;;;4004:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4004:86:0;;;;10216:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10216:150:0;;;;;43110:498;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43110:498:0;;;;50086:518;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50086:518:0;;;;7034:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7034:159:0;;;;;34780:968;;;;;;32666:966;;;;;;8555:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8555:118:0;;;;2935:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2935:46:0;;;;49447:523;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49447:523:0;;;;9257:241;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9257:241:0;;;;;23335:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23335:164:0;-1:-1:-1;;;;;23335:164:0;;;;;;;;;;39866:238;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39866:238:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39866:238:0;;-1:-1:-1;39866:238:0;;-1:-1:-1;;;;;;;39866:238:0;8167:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8167:180:0;-1:-1:-1;;;;;8167:180:0;;;;;48811:523;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48811:523:0;;;;46251:543;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46251:543:0;;;;29494:977;;;;;;2696:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2696:39:0;;;;44967:533;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44967:533:0;;;;25328:938;;;;;;4164:346;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4164:346:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4164:346:0;;-1:-1:-1;4164:346:0;;-1:-1:-1;;;;;;;4164:346:0;31608:968;;;;;;50816:316;50886:4;-1:-1:-1;;;;;;50922:46:0;;50937:31;50922:46;;:93;;-1:-1:-1;50990:25:0;-1:-1:-1;;;;;;50990:25:0;;;50922:93;:148;;;-1:-1:-1;51045:25:0;-1:-1:-1;;;;;;51045:25:0;;;50922:148;:205;;;-1:-1:-1;51102:25:0;-1:-1:-1;;;;;;51102:25:0;;;50922:205;50897:230;50816:316;-1:-1:-1;;50816:316:0:o;8398:116::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;5918:13;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;8465:13;:20;;-1:-1:-1;;8465:20:0;-1:-1:-1;;;8465:20:0;;;8495:14;;;;8465:20;;8495:14;8398:116::o;6742:68::-;6801:4;;;;;;;;;;;;;;;;;6742:68;;:::o;10023:148::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;-1:-1:-1;;;;;10091:32:0;;;;;;:17;:32;;;;;;;;;:39;;-1:-1:-1;;10091:39:0;10126:4;10091:39;;;10140:26;;;;;;;;;;;;;;;;;10023:148;:::o;23133:111::-;23192:7;23213:26;;;:17;:26;;;;;;-1:-1:-1;;;;;23213:26:0;;23133:111::o;2855:44::-;;;;:::o;22080:406::-;5918:13;;22243:14;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;22186;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;22208:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;22260:16;22268:7;22260;:16::i;:::-;22243:33;-1:-1:-1;;;;;;22320:18:0;;;;;;;;22312:27;;;;;;22352:29;22372:8;22352:19;:29::i;:::-;:37;;22385:4;22352:37;;22344:46;;;;;;22399:26;;;;:17;:26;;;;;;:37;;-1:-1:-1;;;;;;22399:37:0;-1:-1:-1;;;;;22399:37:0;;;;;;;;;22446:35;;22399:26;;22446:35;;;;;;;6482:1;6270;22080:406;;;:::o;41277:465::-;41356:23;41384:27;41416:28;41449;41482:30;41523:18;;:::i;:::-;41544:7;:16;;41552:7;;41544:16;;;;;;;;;;;;;;;41523:37;;;41544:16;;;;;;;;41523:37;;;;;;;;;-1:-1:-1;;41523:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41544:16;;41523:37;;;;41544:16;;41523:37;;41544:16;41523:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41523:37:0;;;-1:-1:-1;;41523:37:0;;;;;-1:-1:-1;;;;;41523:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41523:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41582:5;:21;;;41609:5;:25;;;41640:5;:26;;;41672:5;:26;;;41704:5;:28;;;41569:168;;;;;;;;;;41277:465;;;;;;;;:::o;30558:963::-;5918:13;;30719:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;30664;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;30686:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;30741:7;:16;;30749:7;;30741:16;;;;;;;;;;;;;;;;30719:38;;30911:30;30939:1;30911:5;:23;;;:27;;:30;;;;:::i;:::-;30882:26;;:59;30869:9;:72;30861:81;;;;;;31039:23;;;;:30;;31067:1;31039:30;:27;:30;:::i;:::-;31013:23;;;:56;31109:16;:9;31123:1;31109:16;:13;:16;:::i;:::-;31084:41;-1:-1:-1;31162:16:0;:9;31176:1;31162:16;:13;:16;:::i;:::-;31136:42;-1:-1:-1;31246:9:0;31207:35;:14;31136:42;31207:35;:18;:35;:::i;:::-;:48;31199:57;;;;;;31318:7;;:32;;-1:-1:-1;;;;;31318:7:0;;;;:32;;;;;31335:14;;31318:7;:32;:7;:32;31335:14;31318:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;31428:14:0;;;;:40;;-1:-1:-1;;;;;31428:14:0;;;;:40;;;;;31452:15;;31428:14;:40;:14;:40;31452:15;31428:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;31482:34:0;;31508:7;;31482:34;;;;;6482:1;6270;30558:963;;;;:::o;24431:818::-;5918:13;;24718:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;24524;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;24546:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;24650:18;;24637:9;:31;24629:40;;;;;;24740:7;:16;;24748:7;;24740:16;;;;;;;;;;;;;;;;24718:38;;24783:26;24807:1;24783:5;:19;;;:23;;:26;;;;:::i;:::-;24761:19;;;:48;24849:16;:9;24863:1;24849:16;:13;:16;:::i;:::-;24824:41;-1:-1:-1;24902:16:0;:9;24916:1;24902:16;:13;:16;:::i;:::-;24876:42;-1:-1:-1;24986:9:0;24947:35;:14;24876:42;24947:35;:18;:35;:::i;:::-;:48;24939:57;;;;;;25058:7;;:32;;-1:-1:-1;;;;;25058:7:0;;;;:32;;;;;25075:14;;25058:7;:32;:7;:32;25075:14;25058:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;25168:14:0;;;;:40;;-1:-1:-1;;;;;25168:14:0;;;;:40;;;;;25192:15;;25168:14;:40;:14;:40;25192:15;25168:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;25222:22:0;;25236:7;;25222:22;;;;;6482:1;6270;24431:818;;;;:::o;5406:50::-;;;;;;;;;;;;;;;:::o;9550:204::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;9642:46;;;;:20;;:46;;;;;:::i;:::-;;9698:51;9725:23;9698:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;9698:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9550:204;:::o;5554:29::-;;;-1:-1:-1;;;;;5554:29:0;;:::o;21004:1007::-;5918:13;;21481;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;21123;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;21147:7;19173:16;19181:7;19173;:16::i;:::-;-1:-1:-1;;;;;19159:30:0;:10;-1:-1:-1;;;;;19159:30:0;;:72;;;;19211:20;19223:7;19211:11;:20::i;:::-;-1:-1:-1;;;;;19197:34:0;:10;-1:-1:-1;;;;;19197:34:0;;19159:72;:134;;;;19239:46;19256:16;19264:7;19256;:16::i;:::-;19274:10;19239:16;:46::i;:::-;:54;;19289:4;19239:54;19159:134;:170;;;-1:-1:-1;19315:14:0;;-1:-1:-1;;;;;19315:14:0;19301:10;:28;19159:170;19146:188;;;;;;;;21211:23;21231:2;21211:19;:23::i;:::-;:31;;21238:4;21211:31;;21203:40;;;;;;21268:16;21276:7;21268;:16::i;:::-;-1:-1:-1;;;;;21260:24:0;;;;;;21252:33;;;;;;21304:16;21312:7;21304;:16::i;:::-;-1:-1:-1;;;;;21298:22:0;;;;;;;21290:31;;;;;;21364:26;;;;:17;:26;;;;;;21357:33;;-1:-1:-1;;;;;;21357:33:0;;;21400:26;21382:7;;21364:26;-1:-1:-1;;;;;21400:26:0;;;;;21364;;21400;21497:31;;;;:22;:31;;;;;;;-1:-1:-1;21553:22:0;21573:1;21553:15;21563:4;21553:9;:15::i;:::-;:19;:22;:19;:22;:::i;:::-;-1:-1:-1;;;;;21606:22:0;;;;;;:16;:22;;;;;:33;;21533:42;;-1:-1:-1;21606:22:0;21533:42;;21606:33;;;;;;;;;;;;;;21584:55;;21676:11;21644:16;:22;21661:4;-1:-1:-1;;;;;21644:22:0;-1:-1:-1;;;;;21644:22:0;;;;;;;;;;;;21667:5;21644:29;;;;;;;;;;;;;;;;;;;;;:43;;;;-1:-1:-1;;;;;21703:22:0;;;;:16;:22;;;;;;:33;;21726:9;;21703:33;;;;;;;;;;;;;;;;;21696:40;;;-1:-1:-1;;;;;21741:22:0;;;;:16;:22;;;;;:34;;-1:-1:-1;;21741:34:0;;;;;;:::i;:::-;-1:-1:-1;21784:35:0;;;;:22;:35;;;;;;;;:43;;;21856:24;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;21856:29:0;-1:-1:-1;;;;;21856:29:0;;;;;;;;21924:20;;:16;:20;;;;27:10:-1;;-1:-1;23:18;;;45:23;;;21924:34:0;;;;;;;;;;;;;:41;;23:18:-1;21924:38:0;:41::i;:::-;21890:31;;;;:22;:31;;;;;;:75;;;;21979:27;;21913:7;;-1:-1:-1;;;;;21979:27:0;;;;;;;;;;;6482:1;6270;21004:1007;;;;;;:::o;3062:54::-;;;;:::o;4587:438::-;4661:9;4677:12;4732:25;4818:9;4845;4708:13;4692:31;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4692:31:0;;;;;;;;;;;;;;;;4677:46;;4774:38;4798:13;4774:23;:38::i;:::-;4760:53;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;4760:53:0;;4732:81;;4830:1;4818:13;;4857:1;4845:13;;4840:157;4864:7;:14;4860:18;;4840:157;;;4914:7;:10;;4944:4;;4914:7;4922:1;;4914:10;;;;;;;;;;;;;;;;:24;;4898:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;4894:98;;;4971:1;4957:8;4966:1;4957:11;;;;;;;;;;;;;;;;;;:15;4984:1;4979:6;;;;;4894:98;4885:1;4880:6;4840:157;;;5012:8;5005:15;;4587:438;;;;;;;;:::o;40195:490::-;40252:9;40268:26;40340:9;40394:18;40452:9;40311:7;:14;;;;40297:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;40297:29:0;;40268:58;;40352:1;40340:13;;40335:321;40359:7;:14;40355:18;;40335:321;;;40415:21;40425:7;40433:1;40425:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40425:10:0;40415:9;:21::i;:::-;40394:42;;40464:1;40452:13;;40447:177;40471:1;40467;:5;40447:177;;;40532:10;40493:36;40503:7;40511:9;40525:1;40521;:5;40511:16;;;;;;;;;;;;;;;;;;;40503:25;;;;;;;40493:36;:49;40489:129;;;40567:9;40581:1;40577;:5;40567:16;;;;;;;;;;;;;;;;;;40552:9;40562:1;40552:12;;;;;;;;;;;;;;;;;;:31;40489:129;;;40605:5;;40489:129;-1:-1:-1;;40474:6:0;40447:177;;;40649:1;40634:9;40644:1;40634:12;;;;;;;;;;;;;;;;;;:16;40380:1;40375:6;;;;;40335:321;;;-1:-1:-1;40671:9:0;;40195:490;-1:-1:-1;;;40195:490:0:o;20638:321::-;5918:13;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;20748:31;20761:4;20767:2;20771:7;20748:12;:31::i;:::-;20788:24;20809:2;20788:20;:24::i;:::-;:32;;20816:4;20788:32;20784:171;;;20863:71;;;-1:-1:-1;;;;;20863:71:0;;20904:10;20863:71;;;;-1:-1:-1;;;;;20863:71:0;;;;;;;;;;;;;;;;;;-1:-1:-1;20863:71:0;;;;;;;;:40;;;;;;:71;;;;;;;;;;;;;;;;;;:40;:71;;;5:2:-1;;;;30:1;27;20:12;5:2;20863:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20863:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20863:71:0;-1:-1:-1;;;;;;20863:85:0;-1:-1:-1;;;;;20863:85:0;20855:94;;;;;;20638:321;;;:::o;42521:478::-;42576:9;42592:25;42663:9;42717:17;42773:9;42634:7;:14;;;;42620:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;42620:29:0;;42592:57;;42675:1;42663:13;;42658:313;42682:7;:14;42678:18;;42658:313;;;42737:7;:10;;42745:1;;42737:10;;;;;;;;;;;;;;;;:20;;;42717:40;;42785:1;42773:13;;42768:172;42792:1;42788;:5;42768:172;;;42851:9;42814:7;42822:8;42835:1;42831;:5;42822:15;;;;;;;;;;;;;;;;;;;42814:24;;;;;;;;;;;;;;;;;;:34;;;:46;42810:124;;;42884:8;42897:1;42893;:5;42884:15;;;;;;;;;;;;;;;;;;42870:8;42879:1;42870:11;;;;;;;;;;;;;;;;;;:29;42810:124;;;42921:5;;42810:124;-1:-1:-1;;42795:6:0;42768:172;;;42964:1;42950:8;42959:1;42950:11;;;;;;;;;;;;;;;;;;:15;42703:1;42698:6;;;;;42658:313;;44330:528;44395:9;44411:25;44482:9;44536:27;44612:9;44453:7;:14;;;;44439:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;44439:29:0;;44411:57;;44494:1;44482:13;;44477:353;44501:7;:14;44497:18;;44477:353;;;44566:7;:10;;44574:1;;44566:10;;;;;;;;;;;;;;;;:30;;;44536:60;;44624:1;44612:13;;44607:192;44631:1;44627;:5;44607:192;;;44700:19;44653:7;44661:8;44674:1;44670;:5;44661:15;;;;;;;;;;;;;;;;;;;44653:24;;;;;;;;;;;;;;;;;;:44;;;:66;44649:144;;;44743:8;44756:1;44752;:5;44743:15;;;;;;;;;;;;;;;;;;44729:8;44738:1;44729:11;;;;;;;;;;;;;;;;;;:29;44649:144;;;44780:5;;44649:144;-1:-1:-1;;44634:6:0;44607:192;;;44823:1;44809:8;44818:1;44809:11;;;;;;;;;;;;;;;;;;:15;44522:1;44517:6;;;;;44477:353;;35838:966;5918:13;;35999:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;35944;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;35966:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;36021:7;:16;;36029:7;;36021:16;;;;;;;;;;;;;;;;35999:38;;36191:30;36219:1;36191:5;:23;;;:27;;:30;;;;:::i;:::-;36162:26;;:59;36149:9;:72;36141:81;;;;;;36322:23;;;;:30;;36350:1;36322:30;:27;:30;:::i;:::-;36296:23;;;:56;36392:16;:9;36406:1;36392:16;:13;:16;:::i;:::-;36367:41;-1:-1:-1;36445:16:0;:9;36459:1;36445:16;:13;:16;:::i;:::-;36419:42;-1:-1:-1;36529:9:0;36490:35;:14;36419:42;36490:35;:18;:35;:::i;:::-;:48;36482:57;;;;;;36601:7;;:32;;-1:-1:-1;;;;;36601:7:0;;;;:32;;;;;36618:14;;36601:7;:32;:7;:32;36618:14;36601:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;36711:14:0;;;;:40;;-1:-1:-1;;;;;36711:14:0;;;;:40;;;;;36735:15;;36711:14;:40;:14;:40;36735:15;36711:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;36765:34:0;;36791:7;;36765:34;;;;;6482:1;6270;35838:966;;;;:::o;5798:33::-;;;-1:-1:-1;;;5798:33:0;;;;;:::o;45609:533::-;45675:9;45691:25;45762:9;45816:28;45894:9;45733:7;:14;;;;45719:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;45719:29:0;;45691:57;;45774:1;45762:13;;45757:357;45781:7;:14;45777:18;;45757:357;;;45847:7;:10;;45855:1;;45847:10;;;;;;;;;;;;;;;;:31;;;45816:62;;45906:1;45894:13;;45889:194;45913:1;45909;:5;45889:194;;;45983:20;45935:7;45943:8;45956:1;45952;:5;45943:15;;;;;;;;;;;;;;;;;;;45935:24;;;;;;;;;;;;;;;;;;:45;;;:68;45931:146;;;46027:8;46040:1;46036;:5;46027:15;;;;;;;;;;;;;;;;;;46013:8;46022:1;46013:11;;;;;;;;;;;;;;;;;;:29;45931:146;;;46064:5;;45931:146;-1:-1:-1;;45916:6:0;45889:194;;;46107:1;46093:8;46102:1;46093:11;;;;;;;;;;;;;;;;;;:15;45802:1;45797:6;;;;;45757:357;;37136:2683;5918:13;;37902:26;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;37692:29;37712:8;37692:19;:29::i;:::-;:37;;37725:4;37692:37;;37684:46;;;;;;37810:16;;37797:9;:29;37789:38;;;;;;37931:17;;-1:-1:-1;37974:42:0;37931:17;37997:18;37974:42;:22;:42;:::i;:::-;37953:63;-1:-1:-1;38042:41:0;37953:63;38065:17;38042:41;:22;:41;:::i;:::-;38021:62;-1:-1:-1;38109:42:0;38021:62;38132:18;38109:42;:22;:42;:::i;:::-;38088:63;-1:-1:-1;38177:42:0;38088:63;38200:18;38177:42;:22;:42;:::i;:::-;38156:63;-1:-1:-1;38245:41:0;38156:63;38268:17;38245:41;:22;:41;:::i;:::-;38224:62;-1:-1:-1;38321:1:0;38299:23;;38291:32;;;;;;38393:705;;;;;;;;;;;-1:-1:-1;;;;;38393:705:0;;;;;;;;;;;;;;;;38499:3;38393:705;;;;-1:-1:-1;38393:705:0;;;;;;39104:1;38393:705;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38380:7;27:10:-1;;23:18;;;45:23;;;38380:719:0;;;;;;;;:726;;39104:1;;23:18:-1;;38393:705:0;;38380:719;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38380:719:0;;;;;;;;;;-1:-1:-1;;;;;;38380:719:0;-1:-1:-1;;;;;38380:719:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;38380:719:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:723;:726;:723;:726;:::i;:::-;39155:24;;;;:15;:24;;;;;;;;:37;;-1:-1:-1;;;;;;39155:37:0;39182:10;39155:37;;;;;;39231:28;;:16;:28;;;;27:10:-1;;39155:37:0;23:18:-1;;;45:23;;;39231:42:0;;;;;;;;;;;;;38362:744;;-1:-1:-1;39231:49:0;;;:46;:49;:::i;:::-;39197:31;;;;:22;:31;;;;;;;;:83;;;;39341:10;39323:29;;:17;:29;;;;;;:37;;:29;:37;39319:121;;39368:7;27:10:-1;;39:1;23:18;;;45:23;;;39368:24:0;;;;-1:-1:-1;;;;;;39368:24:0;39381:10;39368:24;;;;;;-1:-1:-1;39398:29:0;;;:17;39368:24;39398:29;;;;:36;;-1:-1:-1;;39398:36:0;;;;;;39319:121;39483:9;39456:23;39477:1;39456:16;39483:9;39477:1;39456:16;:13;:16;:::i;:::-;:20;:23;:20;:23;:::i;:::-;:36;39448:45;;;;;;39555:7;;-1:-1:-1;;;;;39555:7:0;:34;39572:16;:9;39586:1;39572:16;:13;:16;:::i;:::-;39555:34;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;;;39667:17:0;;:35;39685:16;:9;39699:1;39685:16;:13;:16;:::i;:::-;39667:35;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;39739:31:0;;;;;;;;39750:10;;39739:31;;;;;;;;;;39780:34;;39806:7;;39794:10;;39789:3;;39780:34;;39789:3;;39780:34;37136:2683;;;;;;;;;;;:::o;26349:962::-;5918:13;;26512:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;26457;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;26479:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;26534:7;:16;;26542:7;;26534:16;;;;;;;;;;;;;;;;26512:38;;26704:5;:25;;;26675:26;;:54;26662:9;:67;26654:76;;;;;;;;26825:25;;;;:32;;26855:1;26825:32;:29;:32;:::i;:::-;26797:25;;;:60;26897:16;:9;26911:1;26897:16;:13;:16;:::i;:::-;26872:41;-1:-1:-1;26950:16:0;:9;26964:1;26950:16;:13;:16;:::i;:::-;26924:42;-1:-1:-1;27034:9:0;26995:35;:14;26924:42;26995:35;:18;:35;:::i;:::-;:48;26987:57;;;;;;27106:7;;:32;;-1:-1:-1;;;;;27106:7:0;;;;:32;;;;;27123:14;;27106:7;:32;:7;:32;27123:14;27106:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;27216:14:0;;;;:40;;-1:-1:-1;;;;;27216:14:0;;;;:40;;;;;27240:15;;27216:14;:40;:14;:40;27240:15;27216:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;27270:36:0;;27298:7;;27270:36;;;;;6482:1;6270;26349:962;;;;:::o;46907:518::-;46970:9;46986:25;47057:9;47111:25;47183:9;47028:7;:14;;;;47014:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;47014:29:0;;46986:57;;47069:1;47057:13;;47052:345;47076:7;:14;47072:18;;47052:345;;;47139:7;:10;;47147:1;;47139:10;;;;;;;;;;;;;;;;:28;;;47111:56;;47195:1;47183:13;;47178:188;47202:1;47198;:5;47178:188;;;47269:17;47224:7;47232:8;47245:1;47241;:5;47232:15;;;;;;;;;;;;;;;;;;;47224:24;;;;;;;;;;;;;;;;;;:42;;;:62;47220:140;;;47310:8;47323:1;47319;:5;47310:15;;;;;;;;;;;;;;;;;;47296:8;47305:1;47296:11;;;;;;;;;;;;;;;;;;:29;47220:140;;;47347:5;;47220:140;-1:-1:-1;;47205:6:0;47178:188;;;47390:1;47376:8;47385:1;47376:11;;;;;;;;;;;;;;;;;;:15;47097:1;47092:6;;;;;47052:345;;5056:24;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5056:24:0;;-1:-1:-1;5056:24:0;:::o;19661:182::-;19716:7;19747:24;;;:15;:24;;;;;;-1:-1:-1;;;;;19747:24:0;19784:27;19747:24;19784:19;:27::i;:::-;:35;;19815:4;19784:35;;19776:44;;;;;18404:50;;;;;;;;;;;;-1:-1:-1;;;;;18404:50:0;;:::o;5316:49::-;;;;;;;;;;;;;;;:::o;5492:22::-;;;-1:-1:-1;;;;;5492:22:0;;:::o;41838:510::-;41919:25;41949:26;41980:25;42010:26;42041;42072:25;42108:18;;:::i;:::-;42129:7;:16;;42137:7;;42129:16;;;;;;;;;;;;;;;42108:37;;;42129:16;;;;;;;;42108:37;;;;;;;;;-1:-1:-1;;42108:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42129:16;;42108:37;;;;42129:16;;42108:37;;42129:16;42108:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42108:37:0;;;-1:-1:-1;;42108:37:0;;;;;-1:-1:-1;;;;;42108:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42108:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42167:5;:23;;;42196:5;:24;;;42226:5;:23;;;42255:5;:24;;;42285:5;:24;;;42315:5;:23;;;42154:189;;;;;;;;;;;;41838:510;;;;;;;;:::o;8728:181::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;8813:16;:38;;;8861:43;;;;;;;;;;;;;;;;;8728:181;:::o;8964:193::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;9053:18;:42;;;9105:47;;;;;;;;;;;;;;;;;8964:193;:::o;19400:189::-;19456:7;19505:27;19525:6;19505:19;:27::i;:::-;:35;;19536:4;19505:35;;19497:44;;;;;;-1:-1:-1;;;;;;19553:24:0;;;;;:16;:24;;;;;:31;;19400:189::o;10614:160::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;10693:36;;;;:18;:36;;;;;;;;;10686:43;;-1:-1:-1;;10686:43:0;;;10739:30;;;;;;;;;;;;;;;;;10614:160;:::o;10414:155::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;-1:-1:-1;;;;;10492:33:0;;;;;;:17;:33;;;;;;;;;10485:40;;-1:-1:-1;;10485:40:0;;;10535:29;;;;;;;;;;;;;;;;;10414:155;:::o;48177:518::-;48240:9;48256:25;48327:9;48381:25;48453:9;48298:7;:14;;;;48284:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;48284:29:0;;48256:57;;48339:1;48327:13;;48322:345;48346:7;:14;48342:18;;48322:345;;;48409:7;:10;;48417:1;;48409:10;;;;;;;;;;;;;;;;:28;;;48381:56;;48465:1;48453:13;;48448:188;48472:1;48468;:5;48448:188;;;48539:17;48494:7;48502:8;48515:1;48511;:5;48502:15;;;;;;;;;;;;;;;;;;;48494:24;;;;;;;;;;;;;;;;;;:42;;;:62;48490:140;;;48580:8;48593:1;48589;:5;48580:15;;;;;;;;;;;;;;;;;;48566:8;48575:1;48566:11;;;;;;;;;;;;;;;;;;:29;48490:140;;;48617:5;;48490:140;-1:-1:-1;;48475:6:0;48448:188;;;48660:1;48646:8;48655:1;48646:11;;;;;;;;;;;;;;;;;;:15;48367:1;48362:6;;;;;48322:345;;28444:967;5918:13;;28608:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;28553;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;28575:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;28630:7;:16;;28638:7;;28630:16;;;;;;;;;;;;;;;;28608:38;;28800:5;:26;;;28771;;:55;28758:9;:68;28750:77;;;;;;;;28923:26;;;;:33;;28954:1;28923:33;:30;:33;:::i;:::-;28894:26;;;:62;28996:16;:9;29010:1;28996:16;:13;:16;:::i;:::-;28971:41;-1:-1:-1;29049:16:0;:9;29063:1;29049:16;:13;:16;:::i;:::-;29023:42;-1:-1:-1;29133:9:0;29094:35;:14;29023:42;29094:35;:18;:35;:::i;:::-;:48;29086:57;;;;;;29205:7;;:32;;-1:-1:-1;;;;;29205:7:0;;;;:32;;;;;29222:14;;29205:7;:32;:7;:32;29222:14;29205:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;29315:14:0;;;;:40;;-1:-1:-1;;;;;29315:14:0;;;;:40;;;;;29339:15;;29315:14;:40;:14;:40;29339:15;29315:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;29369:37:0;;29398:7;;29369:37;;;;;6482:1;6270;28444:967;;;;:::o;6860:72::-;6921:6;;;;;;;;;;;;;;;;;6860:72;:::o;47538:523::-;47602:9;47618:25;47689:9;47743:26;47817:9;47660:7;:14;;;;47646:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;47646:29:0;;47618:57;;47701:1;47689:13;;47684:349;47708:7;:14;47704:18;;47684:349;;;47772:7;:10;;47780:1;;47772:10;;;;;;;;;;;;;;;;:29;;;47743:58;;47829:1;47817:13;;47812:190;47836:1;47832;:5;47812:190;;;47904:18;47858:7;47866:8;47879:1;47875;:5;47866:15;;;;;;;;;;;;;;;;;;;47858:24;;;;;;;;;;;;;;;;;;:43;;;:64;47854:142;;;47946:8;47959:1;47955;:5;47946:15;;;;;;;;;;;;;;;;;;47932:8;47941:1;47932:11;;;;;;;;;;;;;;;;;;:29;47854:142;;;47983:5;;47854:142;-1:-1:-1;;47839:6:0;47812:190;;;48026:1;48012:8;48021:1;48012:11;;;;;;;;;;;;;;;;;;:15;47729:1;47724:6;;;;;47684:349;;22573:474;5918:13;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;-1:-1:-1;;;;;22718:22:0;;22730:10;22718:22;;22710:31;;;;;;22754:29;22774:8;22754:19;:29::i;:::-;:37;;22787:4;22754:37;;22746:46;;;;;;22819:4;22805:18;;;;22801:180;;;22866:10;22831:46;;;;:34;:46;;;;;;;;-1:-1:-1;;;;;22831:56:0;;;;;;;;;:63;;-1:-1:-1;;22831:63:0;22890:4;22831:63;;;22801:180;;;22954:10;22919:46;;;;:34;:46;;;;;;;;-1:-1:-1;;;;;22919:56:0;;;;;;;;;22912:63;;-1:-1:-1;;22912:63:0;;;22801:180;22994:48;;;;;;;;;;-1:-1:-1;;;;;22994:48:0;;;23009:10;;22994:48;;;;;;;;;22573:474;;:::o;2649:43::-;;;;;;;;;;;;;;;;;;;:::o;9806:169::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;9887:14;:34;;-1:-1:-1;;;;;9887:34:0;;-1:-1:-1;;;;;;9887:34:0;;;;;;;;9931:39;;;;;;;;;;;;;;;;9806:169;:::o;18503:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40826:355::-;40895:20;40920:16;40941:11;40957:17;40979:21;41011:18;;:::i;:::-;41032:7;:16;;41040:7;;41032:16;;;;;;;;;;;;;;;41011:37;;;41032:16;;;;;;;;41011:37;;;;;;;;;-1:-1:-1;;41011:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41032:16;;41011:37;;;;41032:16;;41011:37;;41032:16;41011:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;41011:37:0;;;-1:-1:-1;;41011:37:0;;;;;-1:-1:-1;;;;;41011:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41011:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41070:5;:19;;;41095:5;:14;;;41115:5;:10;;;41131:5;:15;;;41152:5;:19;;;41057:119;;;;;;;;;;;;;;;;40826:355;;;;;;;;:::o;27394:967::-;5918:13;;27558:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;27503;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;27525:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;27580:7;:16;;27588:7;;27580:16;;;;;;;;;;;;;;;;27558:38;;27750:5;:26;;;27721;;:55;27708:9;:68;27700:77;;;;;;;;27873:26;;;;:33;;27904:1;27873:33;:30;:33;:::i;:::-;27844:26;;;:62;27946:16;:9;27960:1;27946:16;:13;:16;:::i;:::-;27921:41;-1:-1:-1;27999:16:0;:9;28013:1;27999:16;:13;:16;:::i;:::-;27973:42;-1:-1:-1;28083:9:0;28044:35;:14;27973:42;28044:35;:18;:35;:::i;:::-;:48;28036:57;;;;;;28155:7;;:32;;-1:-1:-1;;;;;28155:7:0;;;;:32;;;;;28172:14;;28155:7;:32;:7;:32;28172:14;28155:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;28265:14:0;;;;:40;;-1:-1:-1;;;;;28265:14:0;;;;:40;;;;;28289:15;;28265:14;:40;:14;:40;28289:15;28265:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;28319:37:0;;28348:7;;28319:37;;;;;6482:1;6270;27394:967;;;;:::o;2739:80::-;;;;;;;;;;;;;;;-1:-1:-1;;2739:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5087:87::-;5155:7;:14;5087:87;:::o;20186:335::-;5918:13;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;20308:31;20321:4;20327:2;20331:7;20308:12;:31::i;:::-;20348:24;20369:2;20348:20;:24::i;:::-;:32;;20376:4;20348:32;20344:173;;;20423:73;;-1:-1:-1;;;;;20423:73:0;;20464:10;20423:73;;;;;;-1:-1:-1;;;;;20423:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;;;;;20464:10;20476:4;;20482:7;;20491:4;;;;20423:73;;;;20491:4;;;;20423:73;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20423:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20423:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20423:73:0;-1:-1:-1;;;;;;20423:87:0;-1:-1:-1;;;;;20423:87:0;20415:96;;;;;;20186:335;;;;;:::o;33722:971::-;5918:13;;33884:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;33829;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;33851:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;33906:7;:16;;33914:7;;33906:16;;;;;;;;;;;;;;;;33884:38;;34076:31;34105:1;34076:5;:24;;;:28;;:31;;;;:::i;:::-;34047:26;;:60;34034:9;:73;34026:82;;;;;;34209:24;;;;:31;;34238:1;34209:31;:28;:31;:::i;:::-;34182:24;;;:58;34280:16;:9;34294:1;34280:16;:13;:16;:::i;:::-;34255:41;-1:-1:-1;34333:16:0;:9;34347:1;34333:16;:13;:16;:::i;:::-;34307:42;-1:-1:-1;34417:9:0;34378:35;:14;34307:42;34378:35;:18;:35;:::i;:::-;:48;34370:57;;;;;;34489:7;;:32;;-1:-1:-1;;;;;34489:7:0;;;;:32;;;;;34506:14;;34489:7;:32;:7;:32;34506:14;34489:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;34599:14:0;;;;:40;;-1:-1:-1;;;;;34599:14:0;;;;:40;;;;;34623:15;;34599:14;:40;:14;:40;34623:15;34599:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;34653:35:0;;34680:7;;34653:35;;;;;6482:1;6270;33722:971;;;;:::o;43713:508::-;43774:9;43790:25;43861:9;43915:23;43983:9;43832:7;:14;;;;43818:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;43818:29:0;;43790:57;;43873:1;43861:13;;43856:337;43880:7;:14;43876:18;;43856:337;;;43941:7;:10;;43949:1;;43941:10;;;;;;;;;;;;;;;;:26;;;43915:52;;43995:1;43983:13;;43978:184;44002:1;43998;:5;43978:184;;;44067:15;44024:7;44032:8;44045:1;44041;:5;44032:15;;;;;;;;;;;;;;;;;;;44024:24;;;;;;;;;;;;;;;;;;:40;;;:58;44020:136;;;44106:8;44119:1;44115;:5;44106:15;;;;;;;;;;;;;;;;;;44092:8;44101:1;44092:11;;;;;;;;;;;;;;;;;;:29;44020:136;;;44143:5;;44020:136;-1:-1:-1;;44005:6:0;43978:184;;;44186:1;44172:8;44181:1;44172:11;;;;;;;;;;;;;;;;;;:15;43901:1;43896:6;;;;;43856:337;;4004:86;4071:7;:14;4004:86;:::o;10216:150::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;10284:34;;;;:18;:34;;;;;;;;;:41;;-1:-1:-1;;10284:41:0;10321:4;10284:41;;;10335:26;;;;;;;;;;;;;;;;;10216:150;:::o;43110:498::-;43169:9;43185:25;43256:9;43310:21;43374:9;43227:7;:14;;;;43213:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;43213:29:0;;43185:57;;43268:1;43256:13;;43251:329;43275:7;:14;43271:18;;43251:329;;;43334:7;:10;;43342:1;;43334:10;;;;;;;;;;;;;;;;:24;;;43310:48;;43386:1;43374:13;;43369:180;43393:1;43389;:5;43369:180;;;43456:13;43415:7;43423:8;43436:1;43432;:5;43423:15;;;;;;;;;;;;;;;;;;;43415:24;;;;;;;;;;;;;;;;;;:38;;;:54;43411:132;;;43493:8;43506:1;43502;:5;43493:15;;;;;;;;;;;;;;;;;;43479:8;43488:1;43479:11;;;;;;;;;;;;;;;;;;:29;43411:132;;;43530:5;;43411:132;-1:-1:-1;;43396:6:0;43369:180;;;43573:1;43559:8;43568:1;43559:11;;;;;;;;;;;;;;;;;;:15;43296:1;43291:6;;;;;43251:329;;50086:518;50149:9;50165:25;50236:9;50290:25;50362:9;50207:7;:14;;;;50193:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;50193:29:0;;50165:57;;50248:1;50236:13;;50231:345;50255:7;:14;50251:18;;50231:345;;;50318:7;:10;;50326:1;;50318:10;;;;;;;;;;;;;;;;:28;;;50290:56;;50374:1;50362:13;;50357:188;50381:1;50377;:5;50357:188;;;50448:17;50403:7;50411:8;50424:1;50420;:5;50411:15;;;;;;;;;;;;;;;;;;;50403:24;;;;;;;;;;;;;;;;;;:42;;;:62;50399:140;;;50489:8;50502:1;50498;:5;50489:15;;;;;;;;;;;;;;;;;;50475:8;50484:1;50475:11;;;;;;;;;;;;;;;;;;:29;50399:140;;;50526:5;;50399:140;-1:-1:-1;;50384:6:0;50357:188;;;50569:1;50555:8;50564:1;50555:11;;;;;;;;;;;;;;;;;;:15;50276:1;50271:6;;;;;50231:345;;7034:159;7130:20;7112:76;;;;;;;;;;;;;-1:-1:-1;;7112:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;7092:6;;7112:76;;;;7130:20;;7112:76;;7130:20;7112:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7152:35;7179:7;7152:26;:35::i;:::-;7112:17;:76::i;34780:968::-;5918:13;;34942:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;34887;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;34909:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;34964:7;:16;;34972:7;;34964:16;;;;;;;;;;;;;;;;34942:38;;35134:31;35163:1;35134:5;:24;;;:28;;:31;;;;:::i;:::-;35105:26;;:60;35092:9;:73;35084:82;;;;;;35264:24;;;;:31;;35293:1;35264:31;:28;:31;:::i;:::-;35237:24;;;:58;35335:16;:9;35349:1;35335:16;:13;:16;:::i;:::-;35310:41;-1:-1:-1;35388:16:0;:9;35402:1;35388:16;:13;:16;:::i;:::-;35362:42;-1:-1:-1;35472:9:0;35433:35;:14;35362:42;35433:35;:18;:35;:::i;:::-;:48;35425:57;;;;;;35544:7;;:32;;-1:-1:-1;;;;;35544:7:0;;;;:32;;;;;35561:14;;35544:7;:32;:7;:32;35561:14;35544:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;35654:14:0;;;;:40;;-1:-1:-1;;;;;35654:14:0;;;;:40;;;;;35678:15;;35654:14;:40;:14;:40;35678:15;35654:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;35708:35:0;;35735:7;;35708:35;;;;;6482:1;6270;34780:968;;;;:::o;32666:966::-;5918:13;;32827:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;32772;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;32794:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;32849:7;:16;;32857:7;;32849:16;;;;;;;;;;;;;;;;32827:38;;33019:30;33047:1;33019:5;:23;;;:27;;:30;;;;:::i;:::-;32990:26;;:59;32977:9;:72;32969:81;;;;;;33150:23;;;;:30;;33178:1;33150:30;:27;:30;:::i;:::-;33124:23;;;:56;33220:16;:9;33234:1;33220:16;:13;:16;:::i;:::-;33195:41;-1:-1:-1;33273:16:0;:9;33287:1;33273:16;:13;:16;:::i;:::-;33247:42;-1:-1:-1;33357:9:0;33318:35;:14;33247:42;33318:35;:18;:35;:::i;:::-;:48;33310:57;;;;;;33429:7;;:32;;-1:-1:-1;;;;;33429:7:0;;;;:32;;;;;33446:14;;33429:7;:32;:7;:32;33446:14;33429:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;33539:14:0;;;;:40;;-1:-1:-1;;;;;33539:14:0;;;;:40;;;;;33563:15;;33539:14;:40;:14;:40;33563:15;33539:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;33593:34:0;;33619:7;;33593:34;;;;;6482:1;6270;32666:966;;;;:::o;8555:118::-;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;6046:13;;-1:-1:-1;;;6046:13:0;;;;:21;;6063:4;6046:21;6038:30;;;;;;8622:13;:21;;-1:-1:-1;;8622:21:0;;;8653:15;;;;8638:5;;8653:15;8555:118::o;2935:46::-;;;;:::o;49447:523::-;49511:9;49527:25;49598:9;49652:26;49726:9;49569:7;:14;;;;49555:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;49555:29:0;;49527:57;;49610:1;49598:13;;49593:349;49617:7;:14;49613:18;;49593:349;;;49681:7;:10;;49689:1;;49681:10;;;;;;;;;;;;;;;;:29;;;49652:58;;49738:1;49726:13;;49721:190;49745:1;49741;:5;49721:190;;;49813:18;49767:7;49775:8;49788:1;49784;:5;49775:15;;;;;;;;;;;;;;;;;;;49767:24;;;;;;;;;;;;;;;;;;:43;;;:64;49763:142;;;49855:8;49868:1;49864;:5;49855:15;;;;;;;;;;;;;;;;;;49841:8;49850:1;49841:11;;;;;;;;;;;;;;;;;;:29;49763:142;;;49892:5;;49763:142;-1:-1:-1;;49748:6:0;49721:190;;;49935:1;49921:8;49930:1;49921:11;;;;;;;;;;;;;;;;;;:15;49638:1;49633:6;;;;;49593:349;;9257:241;8107:7;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;9362:26;:58;;;9430:63;;;;;;;;;;;;;;;;;9257:241;:::o;23335:164::-;-1:-1:-1;;;;;23434:42:0;;;23416:4;23434:42;;;:34;:42;;;;;;;;:52;;;;;;;;;;;;:60;;:52;:60;23335:164;;;;:::o;39866:238::-;5918:13;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;39978;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;40000:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;40045:7;40021;40029;40021:16;;;;;;;;;;;;;;;;;;;;:21;;:31;;;;;;;;;;;;:::i;:::-;;40082:7;40066:33;40091:7;40066:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40066:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6482:1;6270;39866:238;;:::o;8167:180::-;8107:7;;8238:18;;-1:-1:-1;;;;;8107:7:0;8093:10;:21;8085:30;;;;;;-1:-1:-1;8259:7:0;;;-1:-1:-1;;;;;8271:20:0;;;-1:-1:-1;;;;;;8271:20:0;;;;;;;8301:41;;;8259:7;;;;8301:41;;;;;;;;;;;;;;;;;;;;;;;8167:180;;:::o;48811:523::-;48875:9;48891:25;48962:9;49016:26;49090:9;48933:7;:14;;;;48919:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;48919:29:0;;48891:57;;48974:1;48962:13;;48957:349;48981:7;:14;48977:18;;48957:349;;;49045:7;:10;;49053:1;;49045:10;;;;;;;;;;;;;;;;:29;;;49016:58;;49102:1;49090:13;;49085:190;49109:1;49105;:5;49085:190;;;49177:18;49131:7;49139:8;49152:1;49148;:5;49139:15;;;;;;;;;;;;;;;;;;;49131:24;;;;;;;;;;;;;;;;;;:43;;;:64;49127:142;;;49219:8;49232:1;49228;:5;49219:15;;;;;;;;;;;;;;;;;;49205:8;49214:1;49205:11;;;;;;;;;;;;;;;;;;:29;49127:142;;;49256:5;;49127:142;-1:-1:-1;;49112:6:0;49085:190;;;49299:1;49285:8;49294:1;49285:11;;;;;;;;;;;;;;;;;;:15;49002:1;48997:6;;;;;48957:349;;46251:543;46319:9;46335:25;46406:9;46460:30;46542:9;46377:7;:14;;;;46363:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;46363:29:0;;46335:57;;46418:1;46406:13;;46401:365;46425:7;:14;46421:18;;46401:365;;;46493:7;:10;;46501:1;;46493:10;;;;;;;;;;;;;;;;:33;;;46460:66;;46554:1;46542:13;;46537:198;46561:1;46557;:5;46537:198;;;46633:22;46583:7;46591:8;46604:1;46600;:5;46591:15;;;;;;;;;;;;;;;;;;;46583:24;;;;;;;;;;;;;;;;;;:47;;;:72;46579:150;;;46679:8;46692:1;46688;:5;46679:15;;;;;;;;;;;;;;;;;;46665:8;46674:1;46665:11;;;;;;;;;;;;;;;;;;:29;46579:150;;;46716:5;;46579:150;-1:-1:-1;;46564:6:0;46537:198;;;46759:1;46745:8;46754:1;46745:11;;;;;;;;;;;;;;;;;;:15;46446:1;46441:6;;;;;46401:365;;29494:977;5918:13;;29660:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;29605;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;29627:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;29682:7;:16;;29690:7;;29682:16;;;;;;;;;;;;;;;;29660:38;;29852:5;:28;;;29823:26;;:57;29810:9;:70;29802:79;;;;;;;;29979:28;;;;:35;;30012:1;29979:35;:32;:35;:::i;:::-;29948:28;;;:66;30054:16;:9;30068:1;30054:16;:13;:16;:::i;:::-;30029:41;-1:-1:-1;30107:16:0;:9;30121:1;30107:16;:13;:16;:::i;:::-;30081:42;-1:-1:-1;30191:9:0;30152:35;:14;30081:42;30152:35;:18;:35;:::i;:::-;:48;30144:57;;;;;;30263:7;;:32;;-1:-1:-1;;;;;30263:7:0;;;;:32;;;;;30280:14;;30263:7;:32;:7;:32;30280:14;30263:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;30373:14:0;;;;:40;;-1:-1:-1;;;;;30373:14:0;;;;:40;;;;;30397:15;;30373:14;:40;:14;:40;30397:15;30373:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;30427:39:0;;30458:7;;30427:39;;;;;6482:1;6270;29494:977;;;;:::o;2696:39::-;;;;;;;;;;;;;;;;;;;:::o;44967:533::-;45033:9;45049:25;45120:9;45174:28;45252:9;45091:7;:14;;;;45077:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;45077:29:0;;45049:57;;45132:1;45120:13;;45115:357;45139:7;:14;45135:18;;45115:357;;;45205:7;:10;;45213:1;;45205:10;;;;;;;;;;;;;;;;:31;;;45174:62;;45264:1;45252:13;;45247:194;45271:1;45267;:5;45247:194;;;45341:20;45293:7;45301:8;45314:1;45310;:5;45301:15;;;;;;;;;;;;;;;;;;;45293:24;;;;;;;;;;;;;;;;;;:45;;;:68;45289:146;;;45385:8;45398:1;45394;:5;45385:15;;;;;;;;;;;;;;;;;;45371:8;45380:1;45371:11;;;;;;;;;;;;;;;;;;:29;45289:146;;;45422:5;;45289:146;-1:-1:-1;;45274:6:0;45247:194;;;45465:1;45451:8;45460:1;45451:11;;;;;;;;;;;;;;;;;;:15;45160:1;45155:6;;;;;45115:357;;25328:938;5918:13;;25487:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;25432;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;25454:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;25509:7;:16;;25517:7;;25509:16;;;;;;;;;;;;;;;;25487:38;;25679:5;:21;;;25650:26;;:50;25637:9;:63;25629:72;;;;;;;;25788:21;;;;:28;;25814:1;25788:28;:25;:28;:::i;:::-;25764:21;;;:52;25856:16;:9;25870:1;25856:16;:13;:16;:::i;:::-;25831:41;-1:-1:-1;25909:16:0;:9;25923:1;25909:16;:13;:16;:::i;:::-;25883:42;-1:-1:-1;25993:9:0;25954:35;:14;25883:42;25954:35;:18;:35;:::i;:::-;:48;25946:57;;;;;;26065:7;;:32;;-1:-1:-1;;;;;26065:7:0;;;;:32;;;;;26082:14;;26065:7;:32;:7;:32;26082:14;26065:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;26175:14:0;;;;:40;;-1:-1:-1;;;;;26175:14:0;;;;:40;;;;;26199:15;;26175:14;:40;:14;:40;26199:15;26175:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;26229:32:0;;26253:7;;26229:32;;;;;6482:1;6270;25328:938;;;;:::o;4164:346::-;4240:7;4254:12;4309:18;4341:9;4285:13;4269:31;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4269:31:0;;;;;;;;;;;;;;;;4254:46;;4330:1;4309:22;;4353:1;4341:13;;4336:144;4360:7;:14;4356:18;;4336:144;;;4410:7;:10;;4440:4;;4410:7;4418:1;;4410:10;;;;;;;;;;;;;;;;:24;;4394:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;4390:85;;;4467:1;4453:15;;;;4390:85;4381:1;4376:6;4336:144;;;-1:-1:-1;4495:10:0;4164:346;-1:-1:-1;;;4164:346:0:o;31608:968::-;5918:13;;31770:19;;;;;;-1:-1:-1;;;5918:13:0;;;;:21;;5935:4;5918:21;;5910:30;;;;;;6216:7;;-1:-1:-1;;;;;6216:7:0;6202:10;:21;;:62;;-1:-1:-1;6245:10:0;6227:29;;;;:17;:29;;;;;;;;:37;;:29;:37;;6202:62;6194:71;;;;;;;;6430:7;;31715;;-1:-1:-1;;;;;6430:7:0;6416:10;:21;;:60;;-1:-1:-1;6441:27:0;;;;:18;:27;;;;;;;;:35;;:27;:35;;6416:60;6408:69;;;;;;;;31737:7;19041:16;19049:7;19041;:16::i;:::-;-1:-1:-1;;;;;19027:30:0;:10;:30;19019:39;;;;;;31792:7;:16;;31800:7;;31792:16;;;;;;;;;;;;;;;;31770:38;;31962:31;31991:1;31962:5;:24;;;:28;;:31;;;;:::i;:::-;31933:26;;:60;31920:9;:73;31912:82;;;;;;32092:24;;;;:31;;32121:1;32092:31;:28;:31;:::i;:::-;32065:24;;;:58;32163:16;:9;32177:1;32163:16;:13;:16;:::i;:::-;32138:41;-1:-1:-1;32216:16:0;:9;32230:1;32216:16;:13;:16;:::i;:::-;32190:42;-1:-1:-1;32300:9:0;32261:35;:14;32190:42;32261:35;:18;:35;:::i;:::-;:48;32253:57;;;;;;32372:7;;:32;;-1:-1:-1;;;;;32372:7:0;;;;:32;;;;;32389:14;;32372:7;:32;:7;:32;32389:14;32372:7;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;32482:14:0;;;;:40;;-1:-1:-1;;;;;32482:14:0;;;;:40;;;;;32506:15;;32482:14;:40;:14;:40;32506:15;32482:14;:40;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;32536:35:0;;32563:7;;32536:35;;;;;6482:1;6270;31608:968;;;;:::o;6546:146::-;6614:4;-1:-1:-1;;;;;6636:20:0;;;;:51;;-1:-1:-1;;;;;;;6664:23:0;6682:4;6664:23;;6546:146::o;17744:120::-;17822:5;;;17839:6;;;;17832:14;;;18152:91;18210:9;18237:1;18233;:5;;;;;;;;;18152:91;-1:-1:-1;;;18152:91:0:o;17870:110::-;17928:9;17951:6;;;;17944:14;;;;-1:-1:-1;17970:5:0;;;17870:110::o;19914:155::-;19980:4;20026:17;;20056:8;;;;19914:155::o;17986:160::-;18044:9;18064:6;;18060:32;;;-1:-1:-1;18085:1:0;18078:8;;18060:32;-1:-1:-1;18100:5:0;;;18104:1;18100;:5;18117;;;;;;;;:10;18110:18;;;1982:530;2041:10;2130:9;;2041:10;2130:9;2068:6;;2064:46;;;2088:10;;;;;;;;;;;;;;;;;;-1:-1:-1;2088:10:0;;2064:46;2142:1;2130:13;;2179:74;2186:6;;2179:74;;2218:1;2208:11;;;;;2239:2;2234:7;;;;2179:74;;;2303:6;2293:17;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;2293:17:0;-1:-1:-1;2273:37:0;-1:-1:-1;;;;2333:10:0;;2354:111;2361:6;;2354:111;;2407:2;2403:1;:6;2398:2;:11;-1:-1:-1;;;2393:17:0;2383:4;2388:1;2383:7;;;;;;;;;;;;;;:27;;;;;;;;;;-1:-1:-1;2430:2:0;2425:7;;;-1:-1:-1;;;2447:6:0;2354:111;;;-1:-1:-1;2499:4:0;1982:530;-1:-1:-1;;;;1982:530:0:o;1498:432::-;1557:8;1576:15;1607;1638;1705:9;1723;1600:1;1576:26;;1631:1;1607:26;;1685:2;:9;1673:2;:9;:21;1662:33;;;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;1662:33:0;-1:-1:-1;1638:58:0;-1:-1:-1;1717:1:0;;-1:-1:-1;1717:1:0;;-1:-1:-1;1745:72:0;1761:2;:9;1757:1;:13;1745:72;;;1794:2;1797:1;1794:5;;;;;;;;;;;;;;;-1:-1:-1;;;1794:5:0;;-1:-1:-1;;;1794:5:0;1786:2;1789:1;1786:5;;;;;;;;;;;;;;:13;;;;;;;;;;-1:-1:-1;1810:1:0;1805:6;;;;1772;1745:72;;;-1:-1:-1;1834:1:0;1825:72;1841:2;:9;1837:1;:13;1825:72;;;1874:2;1877:1;1874:5;;;;;;;;;;;;;;;-1:-1:-1;;;1874:5:0;;-1:-1:-1;;;1874:5:0;1866:2;1869:1;1866:5;;;;;;;;;;;;;;:13;;;;;;;;;;-1:-1:-1;1890:1:0;1885:6;;;;1852;1825:72;;;-1:-1:-1;1919:2:0;;1498:432;-1:-1:-1;;;;;;1498:432:0:o;50644:491::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50644:491:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50644:491:0;;;-1:-1:-1;50644:491:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://3cee229dbe0a934f04e79b306f1edca4e8f537851e29777f87c83103d931af26

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.