Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
EstateRegistry
Compiler Version
v0.4.24+commit.e67f0147
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-07-17 */ pragma solidity ^0.4.24; // File: openzeppelin-zos/contracts/introspection/ERC165.sol /** * @title ERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ 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. */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); } // File: openzeppelin-zos/contracts/token/ERC721/ERC721Basic.sol /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Basic is ERC165 { event Transfer( address indexed _from, address indexed _to, uint256 indexed _tokenId ); event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); function balanceOf(address _owner) public view returns (uint256 _balance); function ownerOf(uint256 _tokenId) public view returns (address _owner); function exists(uint256 _tokenId) public view returns (bool _exists); function approve(address _to, uint256 _tokenId) public; function getApproved(uint256 _tokenId) public view returns (address _operator); function setApprovalForAll(address _operator, bool _approved) public; function isApprovedForAll(address _owner, address _operator) public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom(address _from, address _to, uint256 _tokenId) public; function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public; } // File: openzeppelin-zos/contracts/token/ERC721/ERC721.sol /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Enumerable is ERC721Basic { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256 _tokenId); function tokenByIndex(uint256 _index) public view returns (uint256); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Metadata is ERC721Basic { function name() external view returns (string _name); function symbol() external view returns (string _symbol); function tokenURI(uint256 _tokenId) public view returns (string); } /** * @title ERC-721 Non-Fungible Token Standard, full implementation interface * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata { } // File: openzeppelin-zos/contracts/token/ERC721/ERC721Receiver.sol /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract ERC721Receiver { /** * @dev Magic value to be returned upon successful reception of an NFT * Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`, * which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` */ bytes4 internal constant ERC721_RECEIVED = 0x150b7a02; /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. 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 transfered * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) public returns(bytes4); } // File: openzeppelin-zos/contracts/math/SafeMath.sol /** * @title SafeMath * @dev Math operations with safety checks that throw on error */ library SafeMath { /** * @dev Multiplies two numbers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Adds two numbers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } } // File: openzeppelin-zos/contracts/AddressUtils.sol /** * Utility library of inline functions on addresses */ library AddressUtils { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param addr address to check * @return whether the target address is a contract */ function isContract(address addr) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. assembly { size := extcodesize(addr) } // solium-disable-line security/no-inline-assembly return size > 0; } } // File: openzeppelin-zos/contracts/introspection/ERC165Support.sol /** * @title ERC165Support * @dev Implements ERC165 returning true for ERC165 interface identifier */ contract ERC165Support is ERC165 { bytes4 internal constant InterfaceId_ERC165 = 0x01ffc9a7; /** * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ function supportsInterface(bytes4 _interfaceId) external view returns (bool) { return _supportsInterface(_interfaceId); } function _supportsInterface(bytes4 _interfaceId) internal view returns (bool) { return _interfaceId == InterfaceId_ERC165; } } // File: openzeppelin-zos/contracts/token/ERC721/ERC721BasicToken.sol /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721BasicToken is ERC165Support, ERC721Basic { bytes4 private constant InterfaceId_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ bytes4 private constant InterfaceId_ERC721Exists = 0x4f558e79; /* * 0x4f558e79 === * bytes4(keccak256('exists(uint256)')) */ using SafeMath for uint256; using AddressUtils for address; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector` bytes4 private constant ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) internal tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) internal tokenApprovals; // Mapping from owner to number of owned token mapping (address => uint256) internal ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) internal operatorApprovals; /** * @dev Guarantees msg.sender is owner of the given token * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender */ modifier onlyOwnerOf(uint256 _tokenId) { require(ownerOf(_tokenId) == msg.sender); _; } /** * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator * @param _tokenId uint256 ID of the token to validate */ modifier canTransfer(uint256 _tokenId) { require(isApprovedOrOwner(msg.sender, _tokenId)); _; } function _supportsInterface(bytes4 _interfaceId) internal view returns (bool) { return super._supportsInterface(_interfaceId) || _interfaceId == InterfaceId_ERC721 || _interfaceId == InterfaceId_ERC721Exists; } /** * @dev Gets the balance of the specified address * @param _owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address _owner) public view returns (uint256) { require(_owner != address(0)); return ownedTokensCount[_owner]; } /** * @dev Gets the owner of the specified token ID * @param _tokenId uint256 ID of the token to query the owner of * @return owner address currently marked as the owner of the given token ID */ function ownerOf(uint256 _tokenId) public view returns (address) { address owner = tokenOwner[_tokenId]; require(owner != address(0)); return owner; } /** * @dev Returns whether the specified token exists * @param _tokenId uint256 ID of the token to query the existence of * @return whether the token exists */ function exists(uint256 _tokenId) public view returns (bool) { address owner = tokenOwner[_tokenId]; return owner != address(0); } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param _to address to be approved for the given token ID * @param _tokenId uint256 ID of the token to be approved */ function approve(address _to, uint256 _tokenId) public { address owner = ownerOf(_tokenId); require(_to != owner); require(msg.sender == owner || isApprovedForAll(owner, msg.sender)); tokenApprovals[_tokenId] = _to; emit Approval(owner, _to, _tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * @param _tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 _tokenId) public view returns (address) { return tokenApprovals[_tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf * @param _to operator address to set the approval * @param _approved representing the status of the approval to be set */ function setApprovalForAll(address _to, bool _approved) public { require(_to != msg.sender); operatorApprovals[msg.sender][_to] = _approved; emit ApprovalForAll(msg.sender, _to, _approved); } /** * @dev Tells whether an operator is approved by a given owner * @param _owner owner address which you want to query the approval of * @param _operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll( address _owner, address _operator ) public view returns (bool) { return operatorApprovals[_owner][_operator]; } /** * @dev Transfers the ownership of a given token ID to another address * Usage of this method is discouraged, use `safeTransferFrom` whenever possible * Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ function transferFrom( address _from, address _to, uint256 _tokenId ) public canTransfer(_tokenId) { require(_from != address(0)); require(_to != address(0)); clearApproval(_from, _tokenId); removeTokenFrom(_from, _tokenId); addTokenTo(_to, _tokenId); emit Transfer(_from, _to, _tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) public canTransfer(_tokenId) { // solium-disable-next-line arg-overflow safeTransferFrom(_from, _to, _tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg sender to be the owner, approved, or operator * @param _from current owner of the token * @param _to address to receive the ownership of the given token ID * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes _data ) public canTransfer(_tokenId) { transferFrom(_from, _to, _tokenId); // solium-disable-next-line arg-overflow require(checkAndCallSafeTransfer(_from, _to, _tokenId, _data)); } /** * @dev Returns whether the given spender can transfer a given token ID * @param _spender address of the spender to query * @param _tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function isApprovedOrOwner( address _spender, uint256 _tokenId ) internal view returns (bool) { address owner = ownerOf(_tokenId); // Disable solium check because of // https://github.com/duaraghav8/Solium/issues/175 // solium-disable-next-line operator-whitespace return ( _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender) ); } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param _to The address that will own the minted token * @param _tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { require(_to != address(0)); addTokenTo(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param _tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address _owner, uint256 _tokenId) internal { clearApproval(_owner, _tokenId); removeTokenFrom(_owner, _tokenId); emit Transfer(_owner, address(0), _tokenId); } /** * @dev Internal function to clear current approval of a given token ID * Reverts if the given address is not indeed the owner of the token * @param _owner owner of the token * @param _tokenId uint256 ID of the token to be transferred */ function clearApproval(address _owner, uint256 _tokenId) internal { require(ownerOf(_tokenId) == _owner); if (tokenApprovals[_tokenId] != address(0)) { tokenApprovals[_tokenId] = address(0); } } /** * @dev Internal function to add a token ID to the list of a given address * @param _to address representing the new owner of the given token ID * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address */ function addTokenTo(address _to, uint256 _tokenId) internal { require(tokenOwner[_tokenId] == address(0)); tokenOwner[_tokenId] = _to; ownedTokensCount[_to] = ownedTokensCount[_to].add(1); } /** * @dev Internal function to remove a token ID from the list of a given address * @param _from address representing the previous owner of the given token ID * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function removeTokenFrom(address _from, uint256 _tokenId) internal { require(ownerOf(_tokenId) == _from); ownedTokensCount[_from] = ownedTokensCount[_from].sub(1); tokenOwner[_tokenId] = address(0); } /** * @dev Internal function to invoke `onERC721Received` on a target address * The call is not executed if the target address is not a contract * @param _from address representing the previous owner of the given token ID * @param _to target address that will receive the tokens * @param _tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return whether the call correctly returned the expected magic value */ function checkAndCallSafeTransfer( address _from, address _to, uint256 _tokenId, bytes _data ) internal returns (bool) { if (!_to.isContract()) { return true; } bytes4 retval = ERC721Receiver(_to).onERC721Received( msg.sender, _from, _tokenId, _data); return (retval == ERC721_RECEIVED); } } // File: zos-lib/contracts/migrations/Migratable.sol /** * @title Migratable * Helper contract to support intialization and migration schemes between * different implementations of a contract in the context of upgradeability. * To use it, replace the constructor with a function that has the * `isInitializer` modifier starting with `"0"` as `migrationId`. * When you want to apply some migration code during an upgrade, increase * the `migrationId`. Or, if the migration code must be applied only after * another migration has been already applied, use the `isMigration` modifier. * This helper supports multiple inheritance. * WARNING: It is the developer's responsibility to ensure that migrations are * applied in a correct order, or that they are run at all. * See `Initializable` for a simpler version. */ contract Migratable { /** * @dev Emitted when the contract applies a migration. * @param contractName Name of the Contract. * @param migrationId Identifier of the migration applied. */ event Migrated(string contractName, string migrationId); /** * @dev Mapping of the already applied migrations. * (contractName => (migrationId => bool)) */ mapping (string => mapping (string => bool)) internal migrated; /** * @dev Internal migration id used to specify that a contract has already been initialized. */ string constant private INITIALIZED_ID = "initialized"; /** * @dev Modifier to use in the initialization function of a contract. * @param contractName Name of the contract. * @param migrationId Identifier of the migration. */ modifier isInitializer(string contractName, string migrationId) { validateMigrationIsPending(contractName, INITIALIZED_ID); validateMigrationIsPending(contractName, migrationId); _; emit Migrated(contractName, migrationId); migrated[contractName][migrationId] = true; migrated[contractName][INITIALIZED_ID] = true; } /** * @dev Modifier to use in the migration of a contract. * @param contractName Name of the contract. * @param requiredMigrationId Identifier of the previous migration, required * to apply new one. * @param newMigrationId Identifier of the new migration to be applied. */ modifier isMigration(string contractName, string requiredMigrationId, string newMigrationId) { require(isMigrated(contractName, requiredMigrationId), "Prerequisite migration ID has not been run yet"); validateMigrationIsPending(contractName, newMigrationId); _; emit Migrated(contractName, newMigrationId); migrated[contractName][newMigrationId] = true; } /** * @dev Returns true if the contract migration was applied. * @param contractName Name of the contract. * @param migrationId Identifier of the migration. * @return true if the contract migration was applied, false otherwise. */ function isMigrated(string contractName, string migrationId) public view returns(bool) { return migrated[contractName][migrationId]; } /** * @dev Initializer that marks the contract as initialized. * It is important to run this if you had deployed a previous version of a Migratable contract. * For more information see https://github.com/zeppelinos/zos-lib/issues/158. */ function initialize() isInitializer("Migratable", "1.2.1") public { } /** * @dev Reverts if the requested migration was already executed. * @param contractName Name of the contract. * @param migrationId Identifier of the migration. */ function validateMigrationIsPending(string contractName, string migrationId) private view { require(!isMigrated(contractName, migrationId), "Requested target migration ID has already been run"); } } // File: openzeppelin-zos/contracts/token/ERC721/ERC721Token.sol /** * @title Full ERC721 Token * This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Token is Migratable, ERC165Support, ERC721BasicToken, ERC721 { bytes4 private constant InterfaceId_ERC721Enumerable = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ bytes4 private constant InterfaceId_ERC721Metadata = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ // Token name string internal name_; // Token symbol string internal symbol_; // Mapping from owner to list of owned token IDs mapping(address => uint256[]) internal ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) internal ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] internal allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) internal allTokensIndex; // Optional mapping for token URIs mapping(uint256 => string) internal tokenURIs; /** * @dev Constructor function */ function initialize(string _name, string _symbol) public isInitializer("ERC721Token", "1.9.0") { name_ = _name; symbol_ = _symbol; } function _supportsInterface(bytes4 _interfaceId) internal view returns (bool) { return super._supportsInterface(_interfaceId) || _interfaceId == InterfaceId_ERC721Enumerable || _interfaceId == InterfaceId_ERC721Metadata; } /** * @dev Gets the token name * @return string representing the token name */ function name() external view returns (string) { return name_; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external view returns (string) { return symbol_; } /** * @dev Returns an URI for a given token ID * Throws if the token ID does not exist. May return an empty string. * @param _tokenId uint256 ID of the token to query */ function tokenURI(uint256 _tokenId) public view returns (string) { require(exists(_tokenId)); return tokenURIs[_tokenId]; } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner * @param _owner address owning the tokens list to be accessed * @param _index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) public view returns (uint256) { require(_index < balanceOf(_owner)); return ownedTokens[_owner][_index]; } /** * @dev Gets the total amount of tokens stored by the contract * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens * @param _index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 _index) public view returns (uint256) { require(_index < totalSupply()); return allTokens[_index]; } /** * @dev Internal function to set the token URI for a given token * Reverts if the token ID does not exist * @param _tokenId uint256 ID of the token to set its URI * @param _uri string URI to assign */ function _setTokenURI(uint256 _tokenId, string _uri) internal { require(exists(_tokenId)); tokenURIs[_tokenId] = _uri; } /** * @dev Internal function to add a token ID to the list of a given address * @param _to address representing the new owner of the given token ID * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address */ function addTokenTo(address _to, uint256 _tokenId) internal { super.addTokenTo(_to, _tokenId); uint256 length = ownedTokens[_to].length; ownedTokens[_to].push(_tokenId); ownedTokensIndex[_tokenId] = length; } /** * @dev Internal function to remove a token ID from the list of a given address * @param _from address representing the previous owner of the given token ID * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function removeTokenFrom(address _from, uint256 _tokenId) internal { super.removeTokenFrom(_from, _tokenId); uint256 tokenIndex = ownedTokensIndex[_tokenId]; uint256 lastTokenIndex = ownedTokens[_from].length.sub(1); uint256 lastToken = ownedTokens[_from][lastTokenIndex]; ownedTokens[_from][tokenIndex] = lastToken; ownedTokens[_from][lastTokenIndex] = 0; // Note that this will handle single-element arrays. In that case, both tokenIndex and lastTokenIndex are going to // be zero. Then we can make sure that we will remove _tokenId from the ownedTokens list since we are first swapping // the lastToken to the first position, and then dropping the element placed in the last position of the list ownedTokens[_from].length--; ownedTokensIndex[_tokenId] = 0; ownedTokensIndex[lastToken] = tokenIndex; } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param _to address the beneficiary that will own the minted token * @param _tokenId uint256 ID of the token to be minted by the msg.sender */ function _mint(address _to, uint256 _tokenId) internal { super._mint(_to, _tokenId); allTokensIndex[_tokenId] = allTokens.length; allTokens.push(_tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param _owner owner of the token to burn * @param _tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address _owner, uint256 _tokenId) internal { super._burn(_owner, _tokenId); // Clear metadata (if any) if (bytes(tokenURIs[_tokenId]).length != 0) { delete tokenURIs[_tokenId]; } // Reorg all tokens array uint256 tokenIndex = allTokensIndex[_tokenId]; uint256 lastTokenIndex = allTokens.length.sub(1); uint256 lastToken = allTokens[lastTokenIndex]; allTokens[tokenIndex] = lastToken; allTokens[lastTokenIndex] = 0; allTokens.length--; allTokensIndex[_tokenId] = 0; allTokensIndex[lastToken] = tokenIndex; } } // File: openzeppelin-zos/contracts/ownership/Ownable.sol /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable is Migratable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ function initialize(address _sender) public isInitializer("Ownable", "1.9.0") { owner = _sender; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(msg.sender == owner); _; } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0)); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } // File: contracts/estate/IEstateRegistry.sol contract IEstateRegistry { function mint(address to, string metadata) external returns (uint256); function ownerOf(uint256 _tokenId) public view returns (address _owner); // from ERC721 // Events event CreateEstate( address indexed _owner, uint256 indexed _estateId, string _data ); event AddLand( uint256 indexed _estateId, uint256 indexed _landId ); event RemoveLand( uint256 indexed _estateId, uint256 indexed _landId, address indexed _destinatary ); event Update( uint256 indexed _assetId, address indexed _holder, address indexed _operator, string _data ); event UpdateOperator( uint256 indexed _estateId, address indexed _operator ); event UpdateManager( address indexed _owner, address indexed _operator, address indexed _caller, bool _approved ); event SetLANDRegistry( address indexed _registry ); event SetEstateLandBalanceToken( address indexed _previousEstateLandBalance, address indexed _newEstateLandBalance ); } // File: contracts/minimeToken/IMinimeToken.sol interface IMiniMeToken { //////////////// // Generate and destroy tokens //////////////// /// @notice Generates `_amount` tokens that are assigned to `_owner` /// @param _owner The address that will be assigned the new tokens /// @param _amount The quantity of tokens generated /// @return True if the tokens are generated correctly function generateTokens(address _owner, uint _amount) external returns (bool); /// @notice Burns `_amount` tokens from `_owner` /// @param _owner The address that will lose the tokens /// @param _amount The quantity of tokens to burn /// @return True if the tokens are burned correctly function destroyTokens(address _owner, uint _amount) external returns (bool); /// @param _owner The address that's balance is being requested /// @return The balance of `_owner` at the current block function balanceOf(address _owner) external view returns (uint256 balance); event Transfer(address indexed _from, address indexed _to, uint256 _amount); } // File: contracts/estate/EstateStorage.sol contract LANDRegistry { function decodeTokenId(uint value) external pure returns (int, int); function updateLandData(int x, int y, string data) external; function setUpdateOperator(uint256 assetId, address operator) external; function setManyUpdateOperator(uint256[] landIds, address operator) external; function ping() public; function ownerOf(uint256 tokenId) public returns (address); function safeTransferFrom(address, address, uint256) public; function updateOperator(uint256 landId) public returns (address); } contract EstateStorage { bytes4 internal constant InterfaceId_GetMetadata = bytes4(keccak256("getMetadata(uint256)")); bytes4 internal constant InterfaceId_VerifyFingerprint = bytes4( keccak256("verifyFingerprint(uint256,bytes)") ); LANDRegistry public registry; // From Estate to list of owned LAND ids (LANDs) mapping(uint256 => uint256[]) public estateLandIds; // From LAND id (LAND) to its owner Estate id mapping(uint256 => uint256) public landIdEstate; // From Estate id to mapping of LAND id to index on the array above (estateLandIds) mapping(uint256 => mapping(uint256 => uint256)) public estateLandIndex; // Metadata of the Estate mapping(uint256 => string) internal estateData; // Operator of the Estate mapping (uint256 => address) public updateOperator; // From account to mapping of operator to bool whether is allowed to update content or not mapping(address => mapping(address => bool)) public updateManager; // Land balance minime token IMiniMeToken public estateLandBalance; // Registered balance accounts mapping(address => bool) public registeredBalance; } // File: contracts/estate/EstateRegistry.sol /** * @title ERC721 registry of every minted Estate and their owned LANDs * @dev Usings we are inheriting and depending on: * From ERC721Token: * - using SafeMath for uint256; * - using AddressUtils for address; */ // solium-disable-next-line max-len contract EstateRegistry is Migratable, IEstateRegistry, ERC721Token, ERC721Receiver, Ownable, EstateStorage { modifier canTransfer(uint256 estateId) { require(isApprovedOrOwner(msg.sender, estateId), "Only owner or operator can transfer"); _; } modifier onlyRegistry() { require(msg.sender == address(registry), "Only the registry can make this operation"); _; } modifier onlyUpdateAuthorized(uint256 estateId) { require(_isUpdateAuthorized(msg.sender, estateId), "Unauthorized user"); _; } modifier onlyLandUpdateAuthorized(uint256 estateId, uint256 landId) { require(_isLandUpdateAuthorized(msg.sender, estateId, landId), "unauthorized user"); _; } modifier canSetUpdateOperator(uint256 estateId) { address owner = ownerOf(estateId); require( isApprovedOrOwner(msg.sender, estateId) || updateManager[owner][msg.sender], "unauthorized user" ); _; } /** * @dev Mint a new Estate with some metadata * @param to The address that will own the minted token * @param metadata Set an initial metadata * @return An uint256 representing the new token id */ function mint(address to, string metadata) external onlyRegistry returns (uint256) { return _mintEstate(to, metadata); } /** * @notice Transfer a LAND owned by an Estate to a new owner * @param estateId Current owner of the token * @param landId LAND to be transfered * @param destinatary New owner */ function transferLand( uint256 estateId, uint256 landId, address destinatary ) external canTransfer(estateId) { return _transferLand(estateId, landId, destinatary); } /** * @notice Transfer many tokens owned by an Estate to a new owner * @param estateId Current owner of the token * @param landIds LANDs to be transfered * @param destinatary New owner */ function transferManyLands( uint256 estateId, uint256[] landIds, address destinatary ) external canTransfer(estateId) { uint length = landIds.length; for (uint i = 0; i < length; i++) { _transferLand(estateId, landIds[i], destinatary); } } /** * @notice Get the Estate id for a given LAND id * @dev This information also lives on estateLandIds, * but it being a mapping you need to know the Estate id beforehand. * @param landId LAND to search * @return The corresponding Estate id */ function getLandEstateId(uint256 landId) external view returns (uint256) { return landIdEstate[landId]; } function setLANDRegistry(address _registry) external onlyOwner { require(_registry.isContract(), "The LAND registry address should be a contract"); require(_registry != 0, "The LAND registry address should be valid"); registry = LANDRegistry(_registry); emit SetLANDRegistry(registry); } function ping() external { registry.ping(); } /** * @notice Return the amount of tokens for a given Estate * @param estateId Estate id to search * @return Tokens length */ function getEstateSize(uint256 estateId) external view returns (uint256) { return estateLandIds[estateId].length; } /** * @notice Return the amount of LANDs inside the Estates for a given address * @param _owner of the estates * @return the amount of LANDs */ function getLANDsSize(address _owner) public view returns (uint256) { // Avoid balanceOf to not compute an unnecesary require uint256 landsSize; uint256 balance = ownedTokensCount[_owner]; for (uint256 i; i < balance; i++) { uint256 estateId = ownedTokens[_owner][i]; landsSize += estateLandIds[estateId].length; } return landsSize; } /** * @notice Update the metadata of an Estate * @dev Reverts if the Estate does not exist or the user is not authorized * @param estateId Estate id to update * @param metadata string metadata */ function updateMetadata( uint256 estateId, string metadata ) external onlyUpdateAuthorized(estateId) { _updateMetadata(estateId, metadata); emit Update( estateId, ownerOf(estateId), msg.sender, metadata ); } function getMetadata(uint256 estateId) external view returns (string) { return estateData[estateId]; } function isUpdateAuthorized(address operator, uint256 estateId) external view returns (bool) { return _isUpdateAuthorized(operator, estateId); } /** * @dev Set an updateManager for an account * @param _owner - address of the account to set the updateManager * @param _operator - address of the account to be set as the updateManager * @param _approved - bool whether the address will be approved or not */ function setUpdateManager(address _owner, address _operator, bool _approved) external { require(_operator != msg.sender, "The operator should be different from owner"); require( _owner == msg.sender || operatorApprovals[_owner][msg.sender], "Unauthorized user" ); updateManager[_owner][_operator] = _approved; emit UpdateManager( _owner, _operator, msg.sender, _approved ); } /** * @notice Set Estate updateOperator * @param estateId - Estate id * @param operator - address of the account to be set as the updateOperator */ function setUpdateOperator( uint256 estateId, address operator ) public canSetUpdateOperator(estateId) { updateOperator[estateId] = operator; emit UpdateOperator(estateId, operator); } /** * @notice Set Estates updateOperator * @param _estateIds - Estate ids * @param _operator - address of the account to be set as the updateOperator */ function setManyUpdateOperator( uint256[] _estateIds, address _operator ) public { for (uint i = 0; i < _estateIds.length; i++) { setUpdateOperator(_estateIds[i], _operator); } } /** * @notice Set LAND updateOperator * @param estateId - Estate id * @param landId - LAND to set the updateOperator * @param operator - address of the account to be set as the updateOperator */ function setLandUpdateOperator( uint256 estateId, uint256 landId, address operator ) public canSetUpdateOperator(estateId) { require(landIdEstate[landId] == estateId, "The LAND is not part of the Estate"); registry.setUpdateOperator(landId, operator); } /** * @notice Set many LAND updateOperator * @param _estateId - Estate id * @param _landIds - LANDs to set the updateOperator * @param _operator - address of the account to be set as the updateOperator */ function setManyLandUpdateOperator( uint256 _estateId, uint256[] _landIds, address _operator ) public canSetUpdateOperator(_estateId) { for (uint i = 0; i < _landIds.length; i++) { require(landIdEstate[_landIds[i]] == _estateId, "The LAND is not part of the Estate"); } registry.setManyUpdateOperator(_landIds, _operator); } function initialize( string _name, string _symbol, address _registry ) public isInitializer("EstateRegistry", "0.0.2") { require(_registry != 0, "The registry should be a valid address"); ERC721Token.initialize(_name, _symbol); Ownable.initialize(msg.sender); registry = LANDRegistry(_registry); } /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safetransfer`. 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)"))` */ function onERC721Received( address _operator, address _from, uint256 _tokenId, bytes _data ) public onlyRegistry returns (bytes4) { uint256 estateId = _bytesToUint(_data); _pushLandId(estateId, _tokenId); return ERC721_RECEIVED; } /** * @dev Creates a checksum of the contents of the Estate * @param estateId the estateId to be verified */ function getFingerprint(uint256 estateId) public view returns (bytes32 result) { result = keccak256(abi.encodePacked("estateId", estateId)); uint256 length = estateLandIds[estateId].length; for (uint i = 0; i < length; i++) { result ^= keccak256(abi.encodePacked(estateLandIds[estateId][i])); } return result; } /** * @dev Verifies a checksum of the contents of the Estate * @param estateId the estateid to be verified * @param fingerprint the user provided identification of the Estate contents */ function verifyFingerprint(uint256 estateId, bytes fingerprint) public view returns (bool) { return getFingerprint(estateId) == _bytesToBytes32(fingerprint); } /** * @dev Safely transfers the ownership of multiple Estate IDs to another address * @dev Delegates to safeTransferFrom for each transfer * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param estateIds uint256 array of IDs to be transferred */ function safeTransferManyFrom(address from, address to, uint256[] estateIds) public { safeTransferManyFrom( from, to, estateIds, "" ); } /** * @dev Safely transfers the ownership of multiple Estate IDs to another address * @dev Delegates to safeTransferFrom for each transfer * @dev Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param estateIds uint256 array of IDs to be transferred * @param data bytes data to send along with a safe transfer check */ function safeTransferManyFrom( address from, address to, uint256[] estateIds, bytes data ) public { for (uint i = 0; i < estateIds.length; i++) { safeTransferFrom( from, to, estateIds[i], data ); } } /** * @dev update LAND data owned by an Estate * @param estateId Estate * @param landId LAND to be updated * @param data string metadata */ function updateLandData(uint256 estateId, uint256 landId, string data) public { _updateLandData(estateId, landId, data); } /** * @dev update LANDs data owned by an Estate * @param estateId Estate id * @param landIds LANDs to be updated * @param data string metadata */ function updateManyLandData(uint256 estateId, uint256[] landIds, string data) public { uint length = landIds.length; for (uint i = 0; i < length; i++) { _updateLandData(estateId, landIds[i], data); } } function transferFrom(address _from, address _to, uint256 _tokenId) public { updateOperator[_tokenId] = address(0); _updateEstateLandBalance(_from, _to, estateLandIds[_tokenId].length); super.transferFrom(_from, _to, _tokenId); } // check the supported interfaces via ERC165 function _supportsInterface(bytes4 _interfaceId) internal view returns (bool) { // solium-disable-next-line operator-whitespace return super._supportsInterface(_interfaceId) || _interfaceId == InterfaceId_GetMetadata || _interfaceId == InterfaceId_VerifyFingerprint; } /** * @dev Internal function to mint a new Estate with some metadata * @param to The address that will own the minted token * @param metadata Set an initial metadata * @return An uint256 representing the new token id */ function _mintEstate(address to, string metadata) internal returns (uint256) { require(to != address(0), "You can not mint to an empty address"); uint256 estateId = _getNewEstateId(); _mint(to, estateId); _updateMetadata(estateId, metadata); emit CreateEstate(to, estateId, metadata); return estateId; } /** * @dev Internal function to update an Estate metadata * @dev Does not require the Estate to exist, for a public interface use `updateMetadata` * @param estateId Estate id to update * @param metadata string metadata */ function _updateMetadata(uint256 estateId, string metadata) internal { estateData[estateId] = metadata; } /** * @notice Return a new unique id * @dev It uses totalSupply to determine the next id * @return uint256 Representing the new Estate id */ function _getNewEstateId() internal view returns (uint256) { return totalSupply().add(1); } /** * @dev Appends a new LAND id to an Estate updating all related storage * @param estateId Estate where the LAND should go * @param landId Transfered LAND */ function _pushLandId(uint256 estateId, uint256 landId) internal { require(exists(estateId), "The Estate id should exist"); require(landIdEstate[landId] == 0, "The LAND is already owned by an Estate"); require(registry.ownerOf(landId) == address(this), "The EstateRegistry cannot manage the LAND"); estateLandIds[estateId].push(landId); landIdEstate[landId] = estateId; estateLandIndex[estateId][landId] = estateLandIds[estateId].length; address owner = ownerOf(estateId); _updateEstateLandBalance(address(registry), owner, 1); emit AddLand(estateId, landId); } /** * @dev Removes a LAND from an Estate and transfers it to a new owner * @param estateId Current owner of the LAND * @param landId LAND to be transfered * @param destinatary New owner */ function _transferLand( uint256 estateId, uint256 landId, address destinatary ) internal { require(destinatary != address(0), "You can not transfer LAND to an empty address"); uint256[] storage landIds = estateLandIds[estateId]; mapping(uint256 => uint256) landIndex = estateLandIndex[estateId]; /** * Using 1-based indexing to be able to make this check */ require(landIndex[landId] != 0, "The LAND is not part of the Estate"); uint lastIndexInArray = landIds.length.sub(1); /** * Get the landIndex of this token in the landIds list */ uint indexInArray = landIndex[landId].sub(1); /** * Get the landId at the end of the landIds list */ uint tempTokenId = landIds[lastIndexInArray]; /** * Store the last token in the position previously occupied by landId */ landIndex[tempTokenId] = indexInArray.add(1); landIds[indexInArray] = tempTokenId; /** * Delete the landIds[last element] */ delete landIds[lastIndexInArray]; landIds.length = lastIndexInArray; /** * Drop this landId from both the landIndex and landId list */ landIndex[landId] = 0; /** * Drop this landId Estate */ landIdEstate[landId] = 0; address owner = ownerOf(estateId); _updateEstateLandBalance(owner, address(registry), 1); registry.safeTransferFrom(this, destinatary, landId); emit RemoveLand(estateId, landId, destinatary); } function _isUpdateAuthorized(address operator, uint256 estateId) internal view returns (bool) { address owner = ownerOf(estateId); return isApprovedOrOwner(operator, estateId) || updateOperator[estateId] == operator || updateManager[owner][operator]; } function _isLandUpdateAuthorized( address operator, uint256 estateId, uint256 landId ) internal returns (bool) { return _isUpdateAuthorized(operator, estateId) || registry.updateOperator(landId) == operator; } function _bytesToUint(bytes b) internal pure returns (uint256) { return uint256(_bytesToBytes32(b)); } function _bytesToBytes32(bytes b) internal pure returns (bytes32) { bytes32 out; for (uint i = 0; i < b.length; i++) { out |= bytes32(b[i] & 0xFF) >> i.mul(8); } return out; } function _updateLandData( uint256 estateId, uint256 landId, string data ) internal onlyLandUpdateAuthorized(estateId, landId) { require(landIdEstate[landId] == estateId, "The LAND is not part of the Estate"); int x; int y; (x, y) = registry.decodeTokenId(landId); registry.updateLandData(x, y, data); } /** * @dev Set a new estate land balance minime token * @param _newEstateLandBalance address of the new estate land balance token */ function _setEstateLandBalanceToken(address _newEstateLandBalance) internal { require(_newEstateLandBalance != address(0), "New estateLandBalance should not be zero address"); emit SetEstateLandBalanceToken(estateLandBalance, _newEstateLandBalance); estateLandBalance = IMiniMeToken(_newEstateLandBalance); } /** * @dev Register an account balance * @notice Register land Balance */ function registerBalance() external { require(!registeredBalance[msg.sender], "Register Balance::The user is already registered"); // Get balance of the sender uint256 currentBalance = estateLandBalance.balanceOf(msg.sender); if (currentBalance > 0) { require( estateLandBalance.destroyTokens(msg.sender, currentBalance), "Register Balance::Could not destroy tokens" ); } // Set balance as registered registeredBalance[msg.sender] = true; // Get LAND balance uint256 newBalance = getLANDsSize(msg.sender); // Generate Tokens require( estateLandBalance.generateTokens(msg.sender, newBalance), "Register Balance::Could not generate tokens" ); } /** * @dev Unregister an account balance * @notice Unregister land Balance */ function unregisterBalance() external { require(registeredBalance[msg.sender], "Unregister Balance::The user not registered"); // Set balance as unregistered registeredBalance[msg.sender] = false; // Get balance uint256 currentBalance = estateLandBalance.balanceOf(msg.sender); // Destroy Tokens require( estateLandBalance.destroyTokens(msg.sender, currentBalance), "Unregister Balance::Could not destroy tokens" ); } /** * @dev Update account balances * @param _from account * @param _to account * @param _amount to update */ function _updateEstateLandBalance(address _from, address _to, uint256 _amount) internal { if (registeredBalance[_from]) { estateLandBalance.destroyTokens(_from, _amount); } if (registeredBalance[_to]) { estateLandBalance.generateTokens(_to, _amount); } } /** * @dev Set a estate land balance minime token hardcoded because of the * contraint of the proxy for using an owner * Mainnet: 0x8568f23f343694650370fe5e254b55bfb704a6c7 */ function setEstateLandBalanceToken() external { require(estateLandBalance == address(0), "estateLandBalance was set"); _setEstateLandBalanceToken(address(0x8568f23f343694650370fe5e254b55bfb704a6c7)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"_interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_registry","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"updateManager","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"landIdEstate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"},{"name":"_from","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"estateId","type":"uint256"}],"name":"getFingerprint","outputs":[{"name":"result","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unregisterBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"estateId","type":"uint256"},{"name":"landId","type":"uint256"},{"name":"operator","type":"address"}],"name":"setLandUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"estateId","type":"uint256"},{"name":"landId","type":"uint256"},{"name":"data","type":"string"}],"name":"updateLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"estateLandBalance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"estateLandIds","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_estateId","type":"uint256"},{"name":"_landIds","type":"uint256[]"},{"name":"_operator","type":"address"}],"name":"setManyLandUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"estateId","type":"uint256"},{"name":"landIds","type":"uint256[]"},{"name":"destinatary","type":"address"}],"name":"transferManyLands","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"estateId","type":"uint256"},{"name":"landIds","type":"uint256[]"},{"name":"data","type":"string"}],"name":"updateManyLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setEstateLandBalanceToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_registry","type":"address"}],"name":"setLANDRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"estateId","type":"uint256"},{"name":"metadata","type":"string"}],"name":"updateMetadata","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"ping","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registeredBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"estateId","type":"uint256"}],"name":"isUpdateAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_estateIds","type":"uint256[]"},{"name":"_operator","type":"address"}],"name":"setManyUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"estateIds","type":"uint256[]"}],"name":"safeTransferManyFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"estateId","type":"uint256"},{"name":"fingerprint","type":"bytes"}],"name":"verifyFingerprint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"updateOperator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"estateLandIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"estateId","type":"uint256"},{"name":"landId","type":"uint256"},{"name":"destinatary","type":"address"}],"name":"transferLand","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"estateId","type":"uint256"}],"name":"getMetadata","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"estateId","type":"uint256"},{"name":"operator","type":"address"}],"name":"setUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"landId","type":"uint256"}],"name":"getLandEstateId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"contractName","type":"string"},{"name":"migrationId","type":"string"}],"name":"isMigrated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"registerBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"metadata","type":"string"}],"name":"mint","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getLANDsSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"estateIds","type":"uint256[]"},{"name":"data","type":"bytes"}],"name":"safeTransferManyFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setUpdateManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"estateId","type":"uint256"}],"name":"getEstateSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_estateId","type":"uint256"},{"indexed":false,"name":"_data","type":"string"}],"name":"CreateEstate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_estateId","type":"uint256"},{"indexed":true,"name":"_landId","type":"uint256"}],"name":"AddLand","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_estateId","type":"uint256"},{"indexed":true,"name":"_landId","type":"uint256"},{"indexed":true,"name":"_destinatary","type":"address"}],"name":"RemoveLand","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_assetId","type":"uint256"},{"indexed":true,"name":"_holder","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_data","type":"string"}],"name":"Update","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_estateId","type":"uint256"},{"indexed":true,"name":"_operator","type":"address"}],"name":"UpdateOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":true,"name":"_caller","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"UpdateManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_registry","type":"address"}],"name":"SetLANDRegistry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_previousEstateLandBalance","type":"address"},{"indexed":true,"name":"_newEstateLandBalance","type":"address"}],"name":"SetEstateLandBalanceToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"contractName","type":"string"},{"indexed":false,"name":"migrationId","type":"string"}],"name":"Migrated","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b506151bc806100206000396000f3006080604052600436106102b35763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a781146102b857806306fdde03146102ee578063077f224a1461037857806307ecec3e1461041c578063081812fc14610443578063095ea7b3146104775780630a354fce1461049b578063150b7a02146104c5578063159a64751461055157806318160ddd146105695780631c07cac51461057e5780631d11016a1461059357806323b872dd146105ba57806328b34ef6146105e45780632f745c5914610644578063394c405c146106685780633970bfd31461067d5780633dcbeb001461069857806340807049146106fd578063426a0af31461072d57806342842e0e146107c557806349fea106146107ef5780634cd88b76146108045780634f558e791461089b5780634f6ccce7146108b3578063535a920c146108cb57806353c8388e146108ec5780635c36b186146109105780636087de1b146109255780636352211e1461094657806365937ab91461095e57806370a082311461098257806372554ff5146109a357806373b913fa14610a035780637b10399914610a6e5780638129fc1c14610a835780638da5cb5b14610a985780638f9f4b6314610aad57806395d89b4114610b0b5780639d40b85014610b205780639f813b1b14610b38578063a22cb46514610b53578063a506e5dc14610b79578063a574cea414610ba0578063b0b02c6014610bb8578063b88d4fde14610bdc578063bb96913214610c4b578063c0bac1a814610c63578063c2cf1cdc14610cfa578063c4d66de814610d0f578063c87b56dd14610d30578063d0def52114610d48578063d5b78dd814610d75578063d93eeb5c14610d96578063e985e9c514610e3f578063ef1db76214610e66578063f2fde38b14610e92578063f4a4344814610eb3575b600080fd5b3480156102c457600080fd5b506102da600160e060020a031960043516610ecb565b604080519115158252519081900360200190f35b3480156102fa57600080fd5b50610303610edc565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033d578181015183820152602001610325565b50505050905090810190601f16801561036a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038457600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261041a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050509235600160a060020a03169350610f7392505050565b005b34801561042857600080fd5b506102da600160a060020a036004358116906024351661137a565b34801561044f57600080fd5b5061045b60043561139a565b60408051600160a060020a039092168252519081900360200190f35b34801561048357600080fd5b5061041a600160a060020a03600435166024356113b5565b3480156104a757600080fd5b506104b360043561145e565b60408051918252519081900360200190f35b3480156104d157600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261053494600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506114709650505050505050565b60408051600160e060020a03199092168252519081900360200190f35b34801561055d57600080fd5b506104b360043561153f565b34801561057557600080fd5b506104b36116b9565b34801561058a57600080fd5b5061041a6116bf565b34801561059f57600080fd5b5061041a600435602435600160a060020a0360443516611911565b3480156105c657600080fd5b5061041a600160a060020a0360043581169060243516604435611a89565b3480156105f057600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261041a948235946024803595369594606494920191908190840183828082843750949750611acd9650505050505050565b34801561065057600080fd5b506104b3600160a060020a0360043516602435611ad8565b34801561067457600080fd5b5061045b611b25565b34801561068957600080fd5b506104b3600435602435611b34565b3480156106a457600080fd5b5060408051602060046024803582810135848102808701860190975280865261041a9684359636966044959194909101929182918501908490808284375094975050509235600160a060020a03169350611b6492505050565b34801561070957600080fd5b5061041a600480359060248035908101910135600160a060020a0360443516611d50565b34801561073957600080fd5b5060408051602060046024803582810135848102808701860190975280865261041a9684359636966044959194909101929182918501908490808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611df29650505050505050565b3480156107d157600080fd5b5061041a600160a060020a0360043581169060243516604435611e30565b3480156107fb57600080fd5b5061041a611eb0565b34801561081057600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261041a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611f309650505050505050565b3480156108a757600080fd5b506102da6004356122a7565b3480156108bf57600080fd5b506104b36004356122c4565b3480156108d757600080fd5b5061041a600160a060020a03600435166122f9565b3480156108f857600080fd5b5061041a600480359060248035908101910135612474565b34801561091c57600080fd5b5061041a612579565b34801561093157600080fd5b506102da600160a060020a03600435166125f9565b34801561095257600080fd5b5061045b60043561260e565b34801561096a57600080fd5b506102da600160a060020a0360043516602435612632565b34801561098e57600080fd5b506104b3600160a060020a0360043516612645565b3480156109af57600080fd5b506040805160206004803580820135838102808601850190965280855261041a9536959394602494938501929182918501908490808284375094975050509235600160a060020a0316935061267892505050565b348015610a0f57600080fd5b50604080516020600460443581810135838102808601850190965280855261041a958335600160a060020a0390811696602480359092169636969560649592949301928291850190849080828437509497506126ad9650505050505050565b348015610a7a57600080fd5b5061045b6126c9565b348015610a8f57600080fd5b5061041a6126d8565b348015610aa457600080fd5b5061045b612a25565b348015610ab957600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526102da958335953695604494919390910191908190840183828082843750949750612a349650505050505050565b348015610b1757600080fd5b50610303612a50565b348015610b2c57600080fd5b5061045b600435612ab1565b348015610b4457600080fd5b506104b3600435602435612acc565b348015610b5f57600080fd5b5061041a600160a060020a03600435166024351515612ae9565b348015610b8557600080fd5b5061041a600435602435600160a060020a0360443516612b6d565b348015610bac57600080fd5b50610303600435612bd6565b348015610bc457600080fd5b5061041a600435600160a060020a0360243516612c77565b348015610be857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261041a94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750612d5c9650505050505050565b348015610c5757600080fd5b506104b3600435612ddc565b348015610c6f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102da94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612dee9650505050505050565b348015610d0657600080fd5b5061041a612eb5565b348015610d1b57600080fd5b5061041a600160a060020a0360043516613236565b348015610d3c57600080fd5b506103036004356135a2565b348015610d5457600080fd5b506104b360048035600160a060020a03169060248035908101910135613620565b348015610d8157600080fd5b506104b3600160a060020a03600435166136ed565b348015610da257600080fd5b50604080516020600460443581810135838102808601850190965280855261041a958335600160a060020a03908116966024803590921696369695606495929493019282918501908490808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061376f9650505050505050565b348015610e4b57600080fd5b506102da600160a060020a03600435811690602435166137a6565b348015610e7257600080fd5b5061041a600160a060020a036004358116906024351660443515156137d4565b348015610e9e57600080fd5b5061041a600160a060020a036004351661395c565b348015610ebf57600080fd5b506104b36004356139e4565b6000610ed6826139f6565b92915050565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f685780601f10610f3d57610100808354040283529160200191610f68565b820191906000526020600020905b815481529060010190602001808311610f4b57829003601f168201915b505050505090505b90565b6040805190810160405280600e81526020017f45737461746552656769737472790000000000000000000000000000000000008152506040805190810160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525061100c826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b6110168282613a97565b600160a060020a038316151561109c576040805160e560020a62461bcd02815260206004820152602660248201527f5468652072656769737472792073686f756c6420626520612076616c6964206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6110a68585611f30565b6110af33613236565b600d8054600160a060020a031916600160a060020a0385161790556040805181815283519181019190915282516000805160206151318339815191529184918491908190602080830191606084019187019080838360005b8381101561111f578181015183820152602001611107565b50505050905090810190601f16801561114c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561117f578181015183820152602001611167565b50505050905090810190601f1680156111ac5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b602083106111ef5780518252601f1990920191602091820191016111d0565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b6020831061124b5780518252601f19909201916020918201910161122c565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b602083106112bd5780518252601f19909201916020918201910161129e565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106113365780518252601f199092019160209182019101611317565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff19169315159390931790925550505050505050565b601360209081526000928352604080842090915290825290205460ff1681565b600090815260026020526040902054600160a060020a031690565b60006113c08261260e565b9050600160a060020a0383811690821614156113db57600080fd5b33600160a060020a03821614806113f757506113f781336137a6565b151561140257600080fd5b6000828152600260205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600f6020526000908152604090205481565b600d546000908190600160a060020a031633146114fd576040805160e560020a62461bcd02815260206004820152602960248201527f4f6e6c79207468652072656769737472792063616e206d616b6520746869732060448201527f6f7065726174696f6e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61150683613b1c565b90506115128185613b27565b7f150b7a020000000000000000000000000000000000000000000000000000000091505b50949350505050565b60008060008360405160200180807f65737461746549640000000000000000000000000000000000000000000000008152506008018281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106115bb5780518252601f19909201916020918201910161159c565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008a8152600e909252928120549297509195509093505050505b818110156116b2576000848152600e6020526040902080548290811061162057fe5b9060005260206000200154604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106116795780518252601f19909201916020918201910161165a565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095909518945050506001016115fe565b5050919050565b60095490565b3360009081526015602052604081205460ff16151561174e576040805160e560020a62461bcd02815260206004820152602b60248201527f556e72656769737465722042616c616e63653a3a5468652075736572206e6f7460448201527f2072656769737465726564000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601560209081526040808320805460ff1916905560145481517f70a0823100000000000000000000000000000000000000000000000000000000815260048101959095529051600160a060020a03909116936370a082319360248083019493928390030190829087803b1580156117ca57600080fd5b505af11580156117de573d6000803e3d6000fd5b505050506040513d60208110156117f457600080fd5b5051601454604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163d3ce77fe916044808201926020929091908290030181600087803b15801561186657600080fd5b505af115801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b5051151561190e576040805160e560020a62461bcd02815260206004820152602c60248201527f556e72656769737465722042616c616e63653a3a436f756c64206e6f7420646560448201527f7374726f7920746f6b656e730000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b82600061191d8261260e565b90506119293383613dc3565b806119575750600160a060020a038116600090815260136020908152604080832033845290915290205460ff165b151561199b576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b6000848152600f602052604090205485146119fc576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b600d54604080517fb0b02c6000000000000000000000000000000000000000000000000000000000815260048101879052600160a060020a0386811660248301529151919092169163b0b02c6091604480830192600092919082900301818387803b158015611a6a57600080fd5b505af1158015611a7e573d6000803e3d6000fd5b505050505050505050565b60008181526012602090815260408083208054600160a060020a0319169055600e909152902054611abd9084908490613e1a565b611ac8838383613f91565b505050565b611ac883838361407e565b6000611ae383612645565b8210611aee57600080fd5b600160a060020a0383166000908152600760205260409020805483908110611b1257fe5b9060005260206000200154905092915050565b601454600160a060020a031681565b600e60205281600052604060002081815481101515611b4f57fe5b90600052602060002001600091509150505481565b6000836000611b728261260e565b9050611b7e3383613dc3565b80611bac5750600160a060020a038116600090815260136020908152604080832033845290915290205460ff165b1515611bf0576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b600092505b8451831015611c885785600f60008786815181101515611c1157fe5b90602001906020020151815260200190815260200160002054141515611c7d576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b600190920191611bf5565b600d54604080517f72554ff5000000000000000000000000000000000000000000000000000000008152600160a060020a038781166024830152600482019283528851604483015288519316926372554ff592899289928291606401906020808701910280838360005b83811015611d0a578181015183820152602001611cf2565b505050509050019350505050600060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505050505050505050565b60008085611d5e3382613dc3565b1515611db1576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b849250600091505b82821015611de957611dde87878785818110611dd157fe5b90506020020135866142cb565b600190910190611db9565b50505050505050565b815160005b81811015611e2957611e21858583815181101515611e1157fe5b906020019060200201518561407e565b600101611df7565b5050505050565b80611e3b3382613dc3565b1515611e8e576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b611eaa8484846020604051908101604052806000815250612d5c565b50505050565b601454600160a060020a031615611f11576040805160e560020a62461bcd02815260206004820152601960248201527f6573746174654c616e6442616c616e6365207761732073657400000000000000604482015290519081900360640190fd5b611f2e738568f23f343694650370fe5e254b55bfb704a6c7614594565b565b6040805190810160405280600b81526020017f455243373231546f6b656e0000000000000000000000000000000000000000008152506040805190810160405280600581526020017f312e392e30000000000000000000000000000000000000000000000000000000815250611fc9826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b611fd38282613a97565b8351611fe6906005906020870190615038565b508251611ffa906006906020860190615038565b506000805160206151318339815191528282604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561204d578181015183820152602001612035565b50505050905090810190601f16801561207a5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156120ad578181015183820152602001612095565b50505050905090810190601f1680156120da5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b6020831061211d5780518252601f1990920191602091820191016120fe565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106121795780518252601f19909201916020918201910161215a565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b602083106121eb5780518252601f1990920191602091820191016121cc565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106122645780518252601f199092019160209182019101612245565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff191693151593909317909255505050505050565b600090815260016020526040902054600160a060020a0316151590565b60006122ce6116b9565b82106122d957600080fd5b60098054839081106122e757fe5b90600052602060002001549050919050565b600c54600160a060020a0316331461231057600080fd5b61232281600160a060020a0316614676565b151561239e576040805160e560020a62461bcd02815260206004820152602e60248201527f546865204c414e4420726567697374727920616464726573732073686f756c6460448201527f206265206120636f6e7472616374000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381161515612424576040805160e560020a62461bcd02815260206004820152602960248201527f546865204c414e4420726567697374727920616464726573732073686f756c6460448201527f2062652076616c69640000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600d8054600160a060020a031916600160a060020a0383811691909117918290556040519116907f2e88792af6f2248ed486ffffc86edf9bc197596990f7b406d5f867a1dd930ba590600090a250565b8261247f338261467e565b15156124d5576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b61250f8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437506146f2945050505050565b336125198561260e565b600160a060020a0316857f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e51041486866040518080602001828103825284848281815260200192508082843760405192018290039550909350505050a450505050565b600d60009054906101000a9004600160a060020a0316600160a060020a0316635c36b1866040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1580156125e557600080fd5b505af1158015611eaa573d6000803e3d6000fd5b60156020526000908152604090205460ff1681565b600081815260016020526040812054600160a060020a0316801515610ed657600080fd5b600061263e838361467e565b9392505050565b6000600160a060020a038216151561265c57600080fd5b50600160a060020a031660009081526003602052604090205490565b60005b8251811015611ac8576126a5838281518110151561269557fe5b9060200190602002015183612c77565b60010161267b565b611ac8838383602060405190810160405280600081525061376f565b600d54600160a060020a031681565b6040805190810160405280600a81526020017f4d696772617461626c65000000000000000000000000000000000000000000008152506040805190810160405280600581526020017f312e322e31000000000000000000000000000000000000000000000000000000815250612771826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b61277b8282613a97565b6000805160206151318339815191528282604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156127cd5781810151838201526020016127b5565b50505050905090810190601f1680156127fa5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561282d578181015183820152602001612815565b50505050905090810190601f16801561285a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b6020831061289d5780518252601f19909201916020918201910161287e565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106128f95780518252601f1990920191602091820191016128da565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b6020831061296b5780518252601f19909201916020918201910161294c565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106129e45780518252601f1990920191602091820191016129c5565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff19169315159390931790925550505050565b600c54600160a060020a031681565b6000612a3f82614711565b612a488461153f565b149392505050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f685780601f10610f3d57610100808354040283529160200191610f68565b601260205260009081526040902054600160a060020a031681565b601060209081526000928352604080842090915290825290205481565b600160a060020a038216331415612aff57600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b82612b783382613dc3565b1515612bcb576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b611eaa8484846142cb565b60008181526011602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015612c6b5780601f10612c4057610100808354040283529160200191612c6b565b820191906000526020600020905b815481529060010190602001808311612c4e57829003601f168201915b50505050509050919050565b816000612c838261260e565b9050612c8f3383613dc3565b80612cbd5750600160a060020a038116600090815260136020908152604080832033845290915290205460ff165b1515612d01576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b6000848152601260205260408082208054600160a060020a031916600160a060020a0387169081179091559051909186917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a350505050565b81612d673382613dc3565b1515612dba576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b612dc5858585611a89565b612dd1858585856147a9565b1515611e2957600080fd5b6000908152600f602052604090205490565b600080836040518082805190602001908083835b60208310612e215780518252601f199092019160209182019101612e02565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b60208310612e7d5780518252601f199092019160209182019101612e5e565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff1695945050505050565b33600090815260156020526040812054819060ff1615612f45576040805160e560020a62461bcd02815260206004820152603060248201527f52656769737465722042616c616e63653a3a546865207573657220697320616c60448201527f7265616479207265676973746572656400000000000000000000000000000000606482015290519081900360840190fd5b601454604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b158015612fab57600080fd5b505af1158015612fbf573d6000803e3d6000fd5b505050506040513d6020811015612fd557600080fd5b5051915060008211156130f757601454604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163d3ce77fe916044808201926020929091908290030181600087803b15801561304f57600080fd5b505af1158015613063573d6000803e3d6000fd5b505050506040513d602081101561307957600080fd5b505115156130f7576040805160e560020a62461bcd02815260206004820152602a60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f74206465737460448201527f726f7920746f6b656e7300000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601560205260409020805460ff1916600117905561311a906136ed565b601454604080517f827f32c0000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163827f32c0916044808201926020929091908290030181600087803b15801561318a57600080fd5b505af115801561319e573d6000803e3d6000fd5b505050506040513d60208110156131b457600080fd5b50511515613232576040805160e560020a62461bcd02815260206004820152602b60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f742067656e6560448201527f7261746520746f6b656e73000000000000000000000000000000000000000000606482015290519081900360840190fd5b5050565b6040805190810160405280600781526020017f4f776e61626c65000000000000000000000000000000000000000000000000008152506040805190810160405280600581526020017f312e392e300000000000000000000000000000000000000000000000000000008152506132cf826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b6132d98282613a97565b600c8054600160a060020a031916600160a060020a0385161790556040805181815283519181019190915282516000805160206151318339815191529184918491908190602080830191606084019187019080838360005b83811015613349578181015183820152602001613331565b50505050905090810190601f1680156133765780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156133a9578181015183820152602001613391565b50505050905090810190601f1680156133d65780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b602083106134195780518252601f1990920191602091820191016133fa565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106134755780518252601f199092019160209182019101613456565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b602083106134e75780518252601f1990920191602091820191016134c8565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106135605780518252601f199092019160209182019101613541565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff1916931515939093179092555050505050565b60606135ad826122a7565b15156135b857600080fd5b6000828152600b602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015612c6b5780601f10612c4057610100808354040283529160200191612c6b565b600d54600090600160a060020a031633146136ab576040805160e560020a62461bcd02815260206004820152602960248201527f4f6e6c79207468652072656769737472792063616e206d616b6520746869732060448201527f6f7065726174696f6e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6136e58484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750614911945050505050565b949350505050565b600160a060020a038116600090815260036020526040812054819081805b8282101561376557600160a060020a038616600090815260076020526040902080548390811061373757fe5b6000918252602080832090910154808352600e9091526040909120549490940193600190920191905061370b565b5091949350505050565b60005b8251811015611e295761379e8585858481518110151561378e57fe5b9060200190602002015185612d5c565b600101613772565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600160a060020a03821633141561385b576040805160e560020a62461bcd02815260206004820152602b60248201527f546865206f70657261746f722073686f756c6420626520646966666572656e7460448201527f2066726f6d206f776e6572000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0383163314806138955750600160a060020a038316600090815260046020908152604080832033845290915290205460ff165b15156138eb576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03838116600081815260136020908152604080832094871680845294825291829020805460ff191686151590811790915582519081529151339493927fd79fbfe1644c022b9150727d871532bfcc3e27ffee86fc596a062770ac97b04292908290030190a4505050565b600c54600160a060020a0316331461397357600080fd5b600160a060020a038116151561398857600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c8054600160a060020a031916600160a060020a0392909216919091179055565b6000908152600e602052604090205490565b6000613a0182614a62565b80613a495750604080517f6765744d657461646174612875696e743235362900000000000000000000000081529051908190036014019020600160e060020a03198381169116145b80610ed65750604080517f76657269667946696e6765727072696e742875696e743235362c62797465732981529051908190036020019020600160e060020a03198381169116149050919050565b613aa18282612dee565b15613232576040805160e560020a62461bcd02815260206004820152603260248201527f52657175657374656420746172676574206d6967726174696f6e20494420686160448201527f7320616c7265616479206265656e2072756e0000000000000000000000000000606482015290519081900360840190fd5b6000610ed682614711565b6000613b32836122a7565b1515613b88576040805160e560020a62461bcd02815260206004820152601a60248201527f546865204573746174652069642073686f756c64206578697374000000000000604482015290519081900360640190fd5b6000828152600f602052604090205415613c12576040805160e560020a62461bcd02815260206004820152602660248201527f546865204c414e4420697320616c7265616479206f776e656420627920616e2060448201527f4573746174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600d54604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905290513092600160a060020a031691636352211e9160248083019260209291908290030181600087803b158015613c7857600080fd5b505af1158015613c8c573d6000803e3d6000fd5b505050506040513d6020811015613ca257600080fd5b5051600160a060020a031614613d28576040805160e560020a62461bcd02815260206004820152602960248201527f5468652045737461746552656769737472792063616e6e6f74206d616e61676560448201527f20746865204c414e440000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000838152600e60209081526040808320805460018101825581855283852001869055858452600f8352818420879055868452546010835281842086855290925290912055613d768361260e565b600d54909150613d9190600160a060020a0316826001613e1a565b604051829084907fff0e52667d53255667dc777a00af81038a4646367b0d73d8ee8540ca5b0c9a2e90600090a3505050565b600080613dcf8361260e565b905080600160a060020a031684600160a060020a03161480613e0a575083600160a060020a0316613dff8461139a565b600160a060020a0316145b806136e557506136e581856137a6565b600160a060020a03831660009081526015602052604090205460ff1615613ed757601454604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018590529151919092169163d3ce77fe9160448083019260209291908290030181600087803b158015613eaa57600080fd5b505af1158015613ebe573d6000803e3d6000fd5b505050506040513d6020811015613ed457600080fd5b50505b600160a060020a03821660009081526015602052604090205460ff1615611ac857601454604080517f827f32c0000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163827f32c09160448083019260209291908290030181600087803b158015613f6757600080fd5b505af1158015613f7b573d6000803e3d6000fd5b505050506040513d6020811015611e2957600080fd5b80613f9c3382613dc3565b1515613fef576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b600160a060020a038416151561400457600080fd5b600160a060020a038316151561401957600080fd5b6140238483614ad7565b61402d8483614b39565b6140378383614c72565b8183600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600080848461408e338383614cbb565b15156140d2576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b6000868152600f60205260409020548714614133576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b600d54604080517f7efd9112000000000000000000000000000000000000000000000000000000008152600481018990528151600160a060020a0390931692637efd9112926024808401939192918290030181600087803b15801561419757600080fd5b505af11580156141ab573d6000803e3d6000fd5b505050506040513d60408110156141c157600080fd5b508051602091820151600d546040517fd4dd159400000000000000000000000000000000000000000000000000000000815260048101848152602482018490526060604483019081528b5160648401528b51959a50939850600160a060020a039092169463d4dd1594948a948a948d949093919260849091019185019080838360005b8381101561425c578181015183820152602001614244565b50505050905090810190601f1680156142895780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156142aa57600080fd5b505af11580156142be573d6000803e3d6000fd5b5050505050505050505050565b60008080808080600160a060020a0387161515614358576040805160e560020a62461bcd02815260206004820152602d60248201527f596f752063616e206e6f74207472616e73666572204c414e4420746f20616e2060448201527f656d707479206164647265737300000000000000000000000000000000000000606482015290519081900360840190fd5b6000898152600e60209081526040808320601083528184208c855292839052922054919750955015156143d1576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b85546143e490600163ffffffff614d7316565b60008981526020879052604090205490945061440790600163ffffffff614d7316565b9250858481548110151561441757fe5b600091825260209091200154915061443683600163ffffffff614d8516565b6000838152602087905260409020558554829087908590811061445557fe5b600091825260209091200155855486908590811061446f57fe5b60009182526020822001558361448587826150b6565b50600088815260208681526040808320839055600f9091528120556144a98961260e565b600d549091506144c5908290600160a060020a03166001613e1a565b600d54604080517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038a81166024830152604482018c9052915191909216916342842e0e91606480830192600092919082900301818387803b15801561453957600080fd5b505af115801561454d573d6000803e3d6000fd5b5050505086600160a060020a0316888a7f7932eb5ab0d4d4d172776074ee15d13d708465ff5476902ed15a4965434fcab160405160405180910390a4505050505050505050565b600160a060020a038116151561461a576040805160e560020a62461bcd02815260206004820152603060248201527f4e6577206573746174654c616e6442616c616e63652073686f756c64206e6f7460448201527f206265207a65726f206164647265737300000000000000000000000000000000606482015290519081900360840190fd5b601454604051600160a060020a038084169216907fcc7ee4598f9db90f9f001c379aeda20a75bb7f42582ea7bac105b79d43c6377590600090a360148054600160a060020a031916600160a060020a0392909216919091179055565b6000903b1190565b60008061468a8361260e565b90506146968484613dc3565b806146ba5750600083815260126020526040902054600160a060020a038581169116145b806136e55750600160a060020a0380821660009081526013602090815260408083209388168352929052205460ff1691505092915050565b60008281526011602090815260409091208251611ac892840190615038565b600080805b83518110156147a25761473081600863ffffffff614d9216565b848281518110151561473e57fe5b60209101015160029190910a7f0100000000000000000000000000000000000000000000000000000000000000918290049091027fff0000000000000000000000000000000000000000000000000000000000000016049190911790600101614716565b5092915050565b6000806147be85600160a060020a0316614676565b15156147cd5760019150611536565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015614860578181015183820152602001614848565b50505050905090810190601f16801561488d5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156148af57600080fd5b505af11580156148c3573d6000803e3d6000fd5b505050506040513d60208110156148d957600080fd5b5051600160e060020a0319167f150b7a0200000000000000000000000000000000000000000000000000000000149695505050505050565b600080600160a060020a0384161515614999576040805160e560020a62461bcd028152602060048201526024808201527f596f752063616e206e6f74206d696e7420746f20616e20656d7074792061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6149a1614dbb565b90506149ad8482614ddb565b6149b781846146f2565b8084600160a060020a03167fd66691e9db811aef0bc0900328bd314b23f1f2285d5cb6d4baa4d959b3645a3c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015614a21578181015183820152602001614a09565b50505050905090810190601f168015614a4e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a39392505050565b6000614a6d82614e2a565b80614aa15750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610ed6575050600160e060020a0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b81600160a060020a0316614aea8261260e565b600160a060020a031614614afd57600080fd5b600081815260026020526040902054600160a060020a0316156132325760009081526002602052604090208054600160a060020a031916905550565b6000806000614b488585614e9f565b600084815260086020908152604080832054600160a060020a0389168452600790925290912054909350614b8390600163ffffffff614d7316565b600160a060020a038616600090815260076020526040902080549193509083908110614bab57fe5b90600052602060002001549050806007600087600160a060020a0316600160a060020a0316815260200190815260200160002084815481101515614beb57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260408120805484908110614c1d57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490614c549060001983016150b6565b50600093845260086020526040808520859055908452909220555050565b6000614c7e8383614f28565b50600160a060020a039091166000908152600760209081526040808320805460018101825590845282842081018590559383526008909152902055565b6000614cc7848461467e565b806136e55750600d54604080517f9d40b850000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03808816931691639d40b8509160248083019260209291908290030181600087803b158015614d3557600080fd5b505af1158015614d49573d6000803e3d6000fd5b505050506040513d6020811015614d5f57600080fd5b5051600160a060020a031614949350505050565b600082821115614d7f57fe5b50900390565b81810182811015610ed657fe5b6000821515614da357506000610ed6565b50818102818382811515614db357fe5b0414610ed657fe5b6000614dd66001614dca6116b9565b9063ffffffff614d8516565b905090565b614de58282614fab565b600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af015550565b6000614e3582615006565b80614e695750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b80610ed6575050600160e060020a0319167f4f558e79000000000000000000000000000000000000000000000000000000001490565b81600160a060020a0316614eb28261260e565b600160a060020a031614614ec557600080fd5b600160a060020a038216600090815260036020526040902054614eef90600163ffffffff614d7316565b600160a060020a039092166000908152600360209081526040808320949094559181526001909152208054600160a060020a0319169055565b600081815260016020526040902054600160a060020a031615614f4a57600080fd5b60008181526001602081815260408084208054600160a060020a031916600160a060020a0388169081179091558452600390915290912054614f8b91614d85565b600160a060020a0390921660009081526003602052604090209190915550565b600160a060020a0382161515614fc057600080fd5b614fca8282614c72565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600160e060020a031981167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061507957805160ff19168380011785556150a6565b828001600101855582156150a6579182015b828111156150a657825182559160200191906001019061508b565b506150b29291506150d6565b5090565b815481835581811115611ac857600083815260209020611ac89181019083015b610f7091905b808211156150b257600081556001016150dc5600756e617574686f72697a65642075736572000000000000000000000000000000546865204c414e44206973206e6f742070617274206f66207468652045737461dd117a11c22118c9dee4b5a67ce578bc44529dce21ee0ccc439588fbb9fb4ea3696e697469616c697a65640000000000000000000000000000000000000000004f6e6c79206f776e6572206f72206f70657261746f722063616e207472616e73a165627a7a72305820e71bed1c7f596b388d9d177117d711e66971f8ea582a78b4c21b7f58f826e0250029
Deployed Bytecode
0x6080604052600436106102b35763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301ffc9a781146102b857806306fdde03146102ee578063077f224a1461037857806307ecec3e1461041c578063081812fc14610443578063095ea7b3146104775780630a354fce1461049b578063150b7a02146104c5578063159a64751461055157806318160ddd146105695780631c07cac51461057e5780631d11016a1461059357806323b872dd146105ba57806328b34ef6146105e45780632f745c5914610644578063394c405c146106685780633970bfd31461067d5780633dcbeb001461069857806340807049146106fd578063426a0af31461072d57806342842e0e146107c557806349fea106146107ef5780634cd88b76146108045780634f558e791461089b5780634f6ccce7146108b3578063535a920c146108cb57806353c8388e146108ec5780635c36b186146109105780636087de1b146109255780636352211e1461094657806365937ab91461095e57806370a082311461098257806372554ff5146109a357806373b913fa14610a035780637b10399914610a6e5780638129fc1c14610a835780638da5cb5b14610a985780638f9f4b6314610aad57806395d89b4114610b0b5780639d40b85014610b205780639f813b1b14610b38578063a22cb46514610b53578063a506e5dc14610b79578063a574cea414610ba0578063b0b02c6014610bb8578063b88d4fde14610bdc578063bb96913214610c4b578063c0bac1a814610c63578063c2cf1cdc14610cfa578063c4d66de814610d0f578063c87b56dd14610d30578063d0def52114610d48578063d5b78dd814610d75578063d93eeb5c14610d96578063e985e9c514610e3f578063ef1db76214610e66578063f2fde38b14610e92578063f4a4344814610eb3575b600080fd5b3480156102c457600080fd5b506102da600160e060020a031960043516610ecb565b604080519115158252519081900360200190f35b3480156102fa57600080fd5b50610303610edc565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561033d578181015183820152602001610325565b50505050905090810190601f16801561036a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038457600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261041a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975050509235600160a060020a03169350610f7392505050565b005b34801561042857600080fd5b506102da600160a060020a036004358116906024351661137a565b34801561044f57600080fd5b5061045b60043561139a565b60408051600160a060020a039092168252519081900360200190f35b34801561048357600080fd5b5061041a600160a060020a03600435166024356113b5565b3480156104a757600080fd5b506104b360043561145e565b60408051918252519081900360200190f35b3480156104d157600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261053494600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506114709650505050505050565b60408051600160e060020a03199092168252519081900360200190f35b34801561055d57600080fd5b506104b360043561153f565b34801561057557600080fd5b506104b36116b9565b34801561058a57600080fd5b5061041a6116bf565b34801561059f57600080fd5b5061041a600435602435600160a060020a0360443516611911565b3480156105c657600080fd5b5061041a600160a060020a0360043581169060243516604435611a89565b3480156105f057600080fd5b50604080516020600460443581810135601f810184900484028501840190955284845261041a948235946024803595369594606494920191908190840183828082843750949750611acd9650505050505050565b34801561065057600080fd5b506104b3600160a060020a0360043516602435611ad8565b34801561067457600080fd5b5061045b611b25565b34801561068957600080fd5b506104b3600435602435611b34565b3480156106a457600080fd5b5060408051602060046024803582810135848102808701860190975280865261041a9684359636966044959194909101929182918501908490808284375094975050509235600160a060020a03169350611b6492505050565b34801561070957600080fd5b5061041a600480359060248035908101910135600160a060020a0360443516611d50565b34801561073957600080fd5b5060408051602060046024803582810135848102808701860190975280865261041a9684359636966044959194909101929182918501908490808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611df29650505050505050565b3480156107d157600080fd5b5061041a600160a060020a0360043581169060243516604435611e30565b3480156107fb57600080fd5b5061041a611eb0565b34801561081057600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261041a94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750611f309650505050505050565b3480156108a757600080fd5b506102da6004356122a7565b3480156108bf57600080fd5b506104b36004356122c4565b3480156108d757600080fd5b5061041a600160a060020a03600435166122f9565b3480156108f857600080fd5b5061041a600480359060248035908101910135612474565b34801561091c57600080fd5b5061041a612579565b34801561093157600080fd5b506102da600160a060020a03600435166125f9565b34801561095257600080fd5b5061045b60043561260e565b34801561096a57600080fd5b506102da600160a060020a0360043516602435612632565b34801561098e57600080fd5b506104b3600160a060020a0360043516612645565b3480156109af57600080fd5b506040805160206004803580820135838102808601850190965280855261041a9536959394602494938501929182918501908490808284375094975050509235600160a060020a0316935061267892505050565b348015610a0f57600080fd5b50604080516020600460443581810135838102808601850190965280855261041a958335600160a060020a0390811696602480359092169636969560649592949301928291850190849080828437509497506126ad9650505050505050565b348015610a7a57600080fd5b5061045b6126c9565b348015610a8f57600080fd5b5061041a6126d8565b348015610aa457600080fd5b5061045b612a25565b348015610ab957600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526102da958335953695604494919390910191908190840183828082843750949750612a349650505050505050565b348015610b1757600080fd5b50610303612a50565b348015610b2c57600080fd5b5061045b600435612ab1565b348015610b4457600080fd5b506104b3600435602435612acc565b348015610b5f57600080fd5b5061041a600160a060020a03600435166024351515612ae9565b348015610b8557600080fd5b5061041a600435602435600160a060020a0360443516612b6d565b348015610bac57600080fd5b50610303600435612bd6565b348015610bc457600080fd5b5061041a600435600160a060020a0360243516612c77565b348015610be857600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261041a94600160a060020a038135811695602480359092169560443595369560849401918190840183828082843750949750612d5c9650505050505050565b348015610c5757600080fd5b506104b3600435612ddc565b348015610c6f57600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526102da94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612dee9650505050505050565b348015610d0657600080fd5b5061041a612eb5565b348015610d1b57600080fd5b5061041a600160a060020a0360043516613236565b348015610d3c57600080fd5b506103036004356135a2565b348015610d5457600080fd5b506104b360048035600160a060020a03169060248035908101910135613620565b348015610d8157600080fd5b506104b3600160a060020a03600435166136ed565b348015610da257600080fd5b50604080516020600460443581810135838102808601850190965280855261041a958335600160a060020a03908116966024803590921696369695606495929493019282918501908490808284375050604080516020601f89358b018035918201839004830284018301909452808352979a99988101979196509182019450925082915084018382808284375094975061376f9650505050505050565b348015610e4b57600080fd5b506102da600160a060020a03600435811690602435166137a6565b348015610e7257600080fd5b5061041a600160a060020a036004358116906024351660443515156137d4565b348015610e9e57600080fd5b5061041a600160a060020a036004351661395c565b348015610ebf57600080fd5b506104b36004356139e4565b6000610ed6826139f6565b92915050565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f685780601f10610f3d57610100808354040283529160200191610f68565b820191906000526020600020905b815481529060010190602001808311610f4b57829003601f168201915b505050505090505b90565b6040805190810160405280600e81526020017f45737461746552656769737472790000000000000000000000000000000000008152506040805190810160405280600581526020017f302e302e3200000000000000000000000000000000000000000000000000000081525061100c826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b6110168282613a97565b600160a060020a038316151561109c576040805160e560020a62461bcd02815260206004820152602660248201527f5468652072656769737472792073686f756c6420626520612076616c6964206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6110a68585611f30565b6110af33613236565b600d8054600160a060020a031916600160a060020a0385161790556040805181815283519181019190915282516000805160206151318339815191529184918491908190602080830191606084019187019080838360005b8381101561111f578181015183820152602001611107565b50505050905090810190601f16801561114c5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561117f578181015183820152602001611167565b50505050905090810190601f1680156111ac5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b602083106111ef5780518252601f1990920191602091820191016111d0565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b6020831061124b5780518252601f19909201916020918201910161122c565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b602083106112bd5780518252601f19909201916020918201910161129e565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106113365780518252601f199092019160209182019101611317565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff19169315159390931790925550505050505050565b601360209081526000928352604080842090915290825290205460ff1681565b600090815260026020526040902054600160a060020a031690565b60006113c08261260e565b9050600160a060020a0383811690821614156113db57600080fd5b33600160a060020a03821614806113f757506113f781336137a6565b151561140257600080fd5b6000828152600260205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600f6020526000908152604090205481565b600d546000908190600160a060020a031633146114fd576040805160e560020a62461bcd02815260206004820152602960248201527f4f6e6c79207468652072656769737472792063616e206d616b6520746869732060448201527f6f7065726174696f6e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61150683613b1c565b90506115128185613b27565b7f150b7a020000000000000000000000000000000000000000000000000000000091505b50949350505050565b60008060008360405160200180807f65737461746549640000000000000000000000000000000000000000000000008152506008018281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106115bb5780518252601f19909201916020918201910161159c565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008a8152600e909252928120549297509195509093505050505b818110156116b2576000848152600e6020526040902080548290811061162057fe5b9060005260206000200154604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b602083106116795780518252601f19909201916020918201910161165a565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095909518945050506001016115fe565b5050919050565b60095490565b3360009081526015602052604081205460ff16151561174e576040805160e560020a62461bcd02815260206004820152602b60248201527f556e72656769737465722042616c616e63653a3a5468652075736572206e6f7460448201527f2072656769737465726564000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601560209081526040808320805460ff1916905560145481517f70a0823100000000000000000000000000000000000000000000000000000000815260048101959095529051600160a060020a03909116936370a082319360248083019493928390030190829087803b1580156117ca57600080fd5b505af11580156117de573d6000803e3d6000fd5b505050506040513d60208110156117f457600080fd5b5051601454604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163d3ce77fe916044808201926020929091908290030181600087803b15801561186657600080fd5b505af115801561187a573d6000803e3d6000fd5b505050506040513d602081101561189057600080fd5b5051151561190e576040805160e560020a62461bcd02815260206004820152602c60248201527f556e72656769737465722042616c616e63653a3a436f756c64206e6f7420646560448201527f7374726f7920746f6b656e730000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b82600061191d8261260e565b90506119293383613dc3565b806119575750600160a060020a038116600090815260136020908152604080832033845290915290205460ff165b151561199b576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b6000848152600f602052604090205485146119fc576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b600d54604080517fb0b02c6000000000000000000000000000000000000000000000000000000000815260048101879052600160a060020a0386811660248301529151919092169163b0b02c6091604480830192600092919082900301818387803b158015611a6a57600080fd5b505af1158015611a7e573d6000803e3d6000fd5b505050505050505050565b60008181526012602090815260408083208054600160a060020a0319169055600e909152902054611abd9084908490613e1a565b611ac8838383613f91565b505050565b611ac883838361407e565b6000611ae383612645565b8210611aee57600080fd5b600160a060020a0383166000908152600760205260409020805483908110611b1257fe5b9060005260206000200154905092915050565b601454600160a060020a031681565b600e60205281600052604060002081815481101515611b4f57fe5b90600052602060002001600091509150505481565b6000836000611b728261260e565b9050611b7e3383613dc3565b80611bac5750600160a060020a038116600090815260136020908152604080832033845290915290205460ff165b1515611bf0576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b600092505b8451831015611c885785600f60008786815181101515611c1157fe5b90602001906020020151815260200190815260200160002054141515611c7d576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b600190920191611bf5565b600d54604080517f72554ff5000000000000000000000000000000000000000000000000000000008152600160a060020a038781166024830152600482019283528851604483015288519316926372554ff592899289928291606401906020808701910280838360005b83811015611d0a578181015183820152602001611cf2565b505050509050019350505050600060405180830381600087803b158015611d3057600080fd5b505af1158015611d44573d6000803e3d6000fd5b50505050505050505050565b60008085611d5e3382613dc3565b1515611db1576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b849250600091505b82821015611de957611dde87878785818110611dd157fe5b90506020020135866142cb565b600190910190611db9565b50505050505050565b815160005b81811015611e2957611e21858583815181101515611e1157fe5b906020019060200201518561407e565b600101611df7565b5050505050565b80611e3b3382613dc3565b1515611e8e576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b611eaa8484846020604051908101604052806000815250612d5c565b50505050565b601454600160a060020a031615611f11576040805160e560020a62461bcd02815260206004820152601960248201527f6573746174654c616e6442616c616e6365207761732073657400000000000000604482015290519081900360640190fd5b611f2e738568f23f343694650370fe5e254b55bfb704a6c7614594565b565b6040805190810160405280600b81526020017f455243373231546f6b656e0000000000000000000000000000000000000000008152506040805190810160405280600581526020017f312e392e30000000000000000000000000000000000000000000000000000000815250611fc9826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b611fd38282613a97565b8351611fe6906005906020870190615038565b508251611ffa906006906020860190615038565b506000805160206151318339815191528282604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561204d578181015183820152602001612035565b50505050905090810190601f16801561207a5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156120ad578181015183820152602001612095565b50505050905090810190601f1680156120da5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b6020831061211d5780518252601f1990920191602091820191016120fe565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106121795780518252601f19909201916020918201910161215a565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b602083106121eb5780518252601f1990920191602091820191016121cc565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106122645780518252601f199092019160209182019101612245565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff191693151593909317909255505050505050565b600090815260016020526040902054600160a060020a0316151590565b60006122ce6116b9565b82106122d957600080fd5b60098054839081106122e757fe5b90600052602060002001549050919050565b600c54600160a060020a0316331461231057600080fd5b61232281600160a060020a0316614676565b151561239e576040805160e560020a62461bcd02815260206004820152602e60248201527f546865204c414e4420726567697374727920616464726573732073686f756c6460448201527f206265206120636f6e7472616374000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381161515612424576040805160e560020a62461bcd02815260206004820152602960248201527f546865204c414e4420726567697374727920616464726573732073686f756c6460448201527f2062652076616c69640000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600d8054600160a060020a031916600160a060020a0383811691909117918290556040519116907f2e88792af6f2248ed486ffffc86edf9bc197596990f7b406d5f867a1dd930ba590600090a250565b8261247f338261467e565b15156124d5576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b61250f8484848080601f016020809104026020016040519081016040528093929190818152602001838380828437506146f2945050505050565b336125198561260e565b600160a060020a0316857f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e51041486866040518080602001828103825284848281815260200192508082843760405192018290039550909350505050a450505050565b600d60009054906101000a9004600160a060020a0316600160a060020a0316635c36b1866040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b1580156125e557600080fd5b505af1158015611eaa573d6000803e3d6000fd5b60156020526000908152604090205460ff1681565b600081815260016020526040812054600160a060020a0316801515610ed657600080fd5b600061263e838361467e565b9392505050565b6000600160a060020a038216151561265c57600080fd5b50600160a060020a031660009081526003602052604090205490565b60005b8251811015611ac8576126a5838281518110151561269557fe5b9060200190602002015183612c77565b60010161267b565b611ac8838383602060405190810160405280600081525061376f565b600d54600160a060020a031681565b6040805190810160405280600a81526020017f4d696772617461626c65000000000000000000000000000000000000000000008152506040805190810160405280600581526020017f312e322e31000000000000000000000000000000000000000000000000000000815250612771826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b61277b8282613a97565b6000805160206151318339815191528282604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156127cd5781810151838201526020016127b5565b50505050905090810190601f1680156127fa5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561282d578181015183820152602001612815565b50505050905090810190601f16801561285a5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b6020831061289d5780518252601f19909201916020918201910161287e565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106128f95780518252601f1990920191602091820191016128da565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b6020831061296b5780518252601f19909201916020918201910161294c565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106129e45780518252601f1990920191602091820191016129c5565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff19169315159390931790925550505050565b600c54600160a060020a031681565b6000612a3f82614711565b612a488461153f565b149392505050565b60068054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610f685780601f10610f3d57610100808354040283529160200191610f68565b601260205260009081526040902054600160a060020a031681565b601060209081526000928352604080842090915290825290205481565b600160a060020a038216331415612aff57600080fd5b336000818152600460209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b82612b783382613dc3565b1515612bcb576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b611eaa8484846142cb565b60008181526011602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015612c6b5780601f10612c4057610100808354040283529160200191612c6b565b820191906000526020600020905b815481529060010190602001808311612c4e57829003601f168201915b50505050509050919050565b816000612c838261260e565b9050612c8f3383613dc3565b80612cbd5750600160a060020a038116600090815260136020908152604080832033845290915290205460ff165b1515612d01576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b6000848152601260205260408082208054600160a060020a031916600160a060020a0387169081179091559051909186917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a350505050565b81612d673382613dc3565b1515612dba576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b612dc5858585611a89565b612dd1858585856147a9565b1515611e2957600080fd5b6000908152600f602052604090205490565b600080836040518082805190602001908083835b60208310612e215780518252601f199092019160209182019101612e02565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b60208310612e7d5780518252601f199092019160209182019101612e5e565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205460ff1695945050505050565b33600090815260156020526040812054819060ff1615612f45576040805160e560020a62461bcd02815260206004820152603060248201527f52656769737465722042616c616e63653a3a546865207573657220697320616c60448201527f7265616479207265676973746572656400000000000000000000000000000000606482015290519081900360840190fd5b601454604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b158015612fab57600080fd5b505af1158015612fbf573d6000803e3d6000fd5b505050506040513d6020811015612fd557600080fd5b5051915060008211156130f757601454604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163d3ce77fe916044808201926020929091908290030181600087803b15801561304f57600080fd5b505af1158015613063573d6000803e3d6000fd5b505050506040513d602081101561307957600080fd5b505115156130f7576040805160e560020a62461bcd02815260206004820152602a60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f74206465737460448201527f726f7920746f6b656e7300000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601560205260409020805460ff1916600117905561311a906136ed565b601454604080517f827f32c0000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163827f32c0916044808201926020929091908290030181600087803b15801561318a57600080fd5b505af115801561319e573d6000803e3d6000fd5b505050506040513d60208110156131b457600080fd5b50511515613232576040805160e560020a62461bcd02815260206004820152602b60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f742067656e6560448201527f7261746520746f6b656e73000000000000000000000000000000000000000000606482015290519081900360840190fd5b5050565b6040805190810160405280600781526020017f4f776e61626c65000000000000000000000000000000000000000000000000008152506040805190810160405280600581526020017f312e392e300000000000000000000000000000000000000000000000000000008152506132cf826040805190810160405280600b8152602001600080516020615151833981519152815250613a97565b6132d98282613a97565b600c8054600160a060020a031916600160a060020a0385161790556040805181815283519181019190915282516000805160206151318339815191529184918491908190602080830191606084019187019080838360005b83811015613349578181015183820152602001613331565b50505050905090810190601f1680156133765780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156133a9578181015183820152602001613391565b50505050905090810190601f1680156133d65780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a160016000836040518082805190602001908083835b602083106134195780518252601f1990920191602091820191016133fa565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842086519094879450925082918401908083835b602083106134755780518252601f199092019160209182019101613456565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420805460ff19169515159590951790945550508351600192600092869290918291908401908083835b602083106134e75780518252601f1990920191602091820191016134c8565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185208582018252600b80875260008051602061515183398151915293870193845291519095945092508291908083835b602083106135605780518252601f199092019160209182019101613541565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220805460ff1916931515939093179092555050505050565b60606135ad826122a7565b15156135b857600080fd5b6000828152600b602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015612c6b5780601f10612c4057610100808354040283529160200191612c6b565b600d54600090600160a060020a031633146136ab576040805160e560020a62461bcd02815260206004820152602960248201527f4f6e6c79207468652072656769737472792063616e206d616b6520746869732060448201527f6f7065726174696f6e0000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6136e58484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750614911945050505050565b949350505050565b600160a060020a038116600090815260036020526040812054819081805b8282101561376557600160a060020a038616600090815260076020526040902080548390811061373757fe5b6000918252602080832090910154808352600e9091526040909120549490940193600190920191905061370b565b5091949350505050565b60005b8251811015611e295761379e8585858481518110151561378e57fe5b9060200190602002015185612d5c565b600101613772565b600160a060020a03918216600090815260046020908152604080832093909416825291909152205460ff1690565b600160a060020a03821633141561385b576040805160e560020a62461bcd02815260206004820152602b60248201527f546865206f70657261746f722073686f756c6420626520646966666572656e7460448201527f2066726f6d206f776e6572000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0383163314806138955750600160a060020a038316600090815260046020908152604080832033845290915290205460ff165b15156138eb576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03838116600081815260136020908152604080832094871680845294825291829020805460ff191686151590811790915582519081529151339493927fd79fbfe1644c022b9150727d871532bfcc3e27ffee86fc596a062770ac97b04292908290030190a4505050565b600c54600160a060020a0316331461397357600080fd5b600160a060020a038116151561398857600080fd5b600c54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600c8054600160a060020a031916600160a060020a0392909216919091179055565b6000908152600e602052604090205490565b6000613a0182614a62565b80613a495750604080517f6765744d657461646174612875696e743235362900000000000000000000000081529051908190036014019020600160e060020a03198381169116145b80610ed65750604080517f76657269667946696e6765727072696e742875696e743235362c62797465732981529051908190036020019020600160e060020a03198381169116149050919050565b613aa18282612dee565b15613232576040805160e560020a62461bcd02815260206004820152603260248201527f52657175657374656420746172676574206d6967726174696f6e20494420686160448201527f7320616c7265616479206265656e2072756e0000000000000000000000000000606482015290519081900360840190fd5b6000610ed682614711565b6000613b32836122a7565b1515613b88576040805160e560020a62461bcd02815260206004820152601a60248201527f546865204573746174652069642073686f756c64206578697374000000000000604482015290519081900360640190fd5b6000828152600f602052604090205415613c12576040805160e560020a62461bcd02815260206004820152602660248201527f546865204c414e4420697320616c7265616479206f776e656420627920616e2060448201527f4573746174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600d54604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810185905290513092600160a060020a031691636352211e9160248083019260209291908290030181600087803b158015613c7857600080fd5b505af1158015613c8c573d6000803e3d6000fd5b505050506040513d6020811015613ca257600080fd5b5051600160a060020a031614613d28576040805160e560020a62461bcd02815260206004820152602960248201527f5468652045737461746552656769737472792063616e6e6f74206d616e61676560448201527f20746865204c414e440000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000838152600e60209081526040808320805460018101825581855283852001869055858452600f8352818420879055868452546010835281842086855290925290912055613d768361260e565b600d54909150613d9190600160a060020a0316826001613e1a565b604051829084907fff0e52667d53255667dc777a00af81038a4646367b0d73d8ee8540ca5b0c9a2e90600090a3505050565b600080613dcf8361260e565b905080600160a060020a031684600160a060020a03161480613e0a575083600160a060020a0316613dff8461139a565b600160a060020a0316145b806136e557506136e581856137a6565b600160a060020a03831660009081526015602052604090205460ff1615613ed757601454604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152602482018590529151919092169163d3ce77fe9160448083019260209291908290030181600087803b158015613eaa57600080fd5b505af1158015613ebe573d6000803e3d6000fd5b505050506040513d6020811015613ed457600080fd5b50505b600160a060020a03821660009081526015602052604090205460ff1615611ac857601454604080517f827f32c0000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152602482018590529151919092169163827f32c09160448083019260209291908290030181600087803b158015613f6757600080fd5b505af1158015613f7b573d6000803e3d6000fd5b505050506040513d6020811015611e2957600080fd5b80613f9c3382613dc3565b1515613fef576040805160e560020a62461bcd0281526020600482015260236024820152600080516020615171833981519152604482015260e960020a623332b902606482015290519081900360840190fd5b600160a060020a038416151561400457600080fd5b600160a060020a038316151561401957600080fd5b6140238483614ad7565b61402d8483614b39565b6140378383614c72565b8183600160a060020a031685600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b600080848461408e338383614cbb565b15156140d2576040805160e560020a62461bcd02815260206004820152601160248201526000805160206150f1833981519152604482015290519081900360640190fd5b6000868152600f60205260409020548714614133576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b600d54604080517f7efd9112000000000000000000000000000000000000000000000000000000008152600481018990528151600160a060020a0390931692637efd9112926024808401939192918290030181600087803b15801561419757600080fd5b505af11580156141ab573d6000803e3d6000fd5b505050506040513d60408110156141c157600080fd5b508051602091820151600d546040517fd4dd159400000000000000000000000000000000000000000000000000000000815260048101848152602482018490526060604483019081528b5160648401528b51959a50939850600160a060020a039092169463d4dd1594948a948a948d949093919260849091019185019080838360005b8381101561425c578181015183820152602001614244565b50505050905090810190601f1680156142895780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1580156142aa57600080fd5b505af11580156142be573d6000803e3d6000fd5b5050505050505050505050565b60008080808080600160a060020a0387161515614358576040805160e560020a62461bcd02815260206004820152602d60248201527f596f752063616e206e6f74207472616e73666572204c414e4420746f20616e2060448201527f656d707479206164647265737300000000000000000000000000000000000000606482015290519081900360840190fd5b6000898152600e60209081526040808320601083528184208c855292839052922054919750955015156143d1576040805160e560020a62461bcd0281526020600482015260226024820152600080516020615111833981519152604482015260f060020a61746502606482015290519081900360840190fd5b85546143e490600163ffffffff614d7316565b60008981526020879052604090205490945061440790600163ffffffff614d7316565b9250858481548110151561441757fe5b600091825260209091200154915061443683600163ffffffff614d8516565b6000838152602087905260409020558554829087908590811061445557fe5b600091825260209091200155855486908590811061446f57fe5b60009182526020822001558361448587826150b6565b50600088815260208681526040808320839055600f9091528120556144a98961260e565b600d549091506144c5908290600160a060020a03166001613e1a565b600d54604080517f42842e0e000000000000000000000000000000000000000000000000000000008152306004820152600160a060020a038a81166024830152604482018c9052915191909216916342842e0e91606480830192600092919082900301818387803b15801561453957600080fd5b505af115801561454d573d6000803e3d6000fd5b5050505086600160a060020a0316888a7f7932eb5ab0d4d4d172776074ee15d13d708465ff5476902ed15a4965434fcab160405160405180910390a4505050505050505050565b600160a060020a038116151561461a576040805160e560020a62461bcd02815260206004820152603060248201527f4e6577206573746174654c616e6442616c616e63652073686f756c64206e6f7460448201527f206265207a65726f206164647265737300000000000000000000000000000000606482015290519081900360840190fd5b601454604051600160a060020a038084169216907fcc7ee4598f9db90f9f001c379aeda20a75bb7f42582ea7bac105b79d43c6377590600090a360148054600160a060020a031916600160a060020a0392909216919091179055565b6000903b1190565b60008061468a8361260e565b90506146968484613dc3565b806146ba5750600083815260126020526040902054600160a060020a038581169116145b806136e55750600160a060020a0380821660009081526013602090815260408083209388168352929052205460ff1691505092915050565b60008281526011602090815260409091208251611ac892840190615038565b600080805b83518110156147a25761473081600863ffffffff614d9216565b848281518110151561473e57fe5b60209101015160029190910a7f0100000000000000000000000000000000000000000000000000000000000000918290049091027fff0000000000000000000000000000000000000000000000000000000000000016049190911790600101614716565b5092915050565b6000806147be85600160a060020a0316614676565b15156147cd5760019150611536565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081523360048201818152600160a060020a03898116602485015260448401889052608060648501908152875160848601528751918a169463150b7a0294938c938b938b93909160a490910190602085019080838360005b83811015614860578181015183820152602001614848565b50505050905090810190601f16801561488d5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156148af57600080fd5b505af11580156148c3573d6000803e3d6000fd5b505050506040513d60208110156148d957600080fd5b5051600160e060020a0319167f150b7a0200000000000000000000000000000000000000000000000000000000149695505050505050565b600080600160a060020a0384161515614999576040805160e560020a62461bcd028152602060048201526024808201527f596f752063616e206e6f74206d696e7420746f20616e20656d7074792061646460448201527f7265737300000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6149a1614dbb565b90506149ad8482614ddb565b6149b781846146f2565b8084600160a060020a03167fd66691e9db811aef0bc0900328bd314b23f1f2285d5cb6d4baa4d959b3645a3c856040518080602001828103825283818151815260200191508051906020019080838360005b83811015614a21578181015183820152602001614a09565b50505050905090810190601f168015614a4e5780820380516001836020036101000a031916815260200191505b509250505060405180910390a39392505050565b6000614a6d82614e2a565b80614aa15750600160e060020a031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b80610ed6575050600160e060020a0319167f5b5e139f000000000000000000000000000000000000000000000000000000001490565b81600160a060020a0316614aea8261260e565b600160a060020a031614614afd57600080fd5b600081815260026020526040902054600160a060020a0316156132325760009081526002602052604090208054600160a060020a031916905550565b6000806000614b488585614e9f565b600084815260086020908152604080832054600160a060020a0389168452600790925290912054909350614b8390600163ffffffff614d7316565b600160a060020a038616600090815260076020526040902080549193509083908110614bab57fe5b90600052602060002001549050806007600087600160a060020a0316600160a060020a0316815260200190815260200160002084815481101515614beb57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260408120805484908110614c1d57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490614c549060001983016150b6565b50600093845260086020526040808520859055908452909220555050565b6000614c7e8383614f28565b50600160a060020a039091166000908152600760209081526040808320805460018101825590845282842081018590559383526008909152902055565b6000614cc7848461467e565b806136e55750600d54604080517f9d40b850000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03808816931691639d40b8509160248083019260209291908290030181600087803b158015614d3557600080fd5b505af1158015614d49573d6000803e3d6000fd5b505050506040513d6020811015614d5f57600080fd5b5051600160a060020a031614949350505050565b600082821115614d7f57fe5b50900390565b81810182811015610ed657fe5b6000821515614da357506000610ed6565b50818102818382811515614db357fe5b0414610ed657fe5b6000614dd66001614dca6116b9565b9063ffffffff614d8516565b905090565b614de58282614fab565b600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af015550565b6000614e3582615006565b80614e695750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b80610ed6575050600160e060020a0319167f4f558e79000000000000000000000000000000000000000000000000000000001490565b81600160a060020a0316614eb28261260e565b600160a060020a031614614ec557600080fd5b600160a060020a038216600090815260036020526040902054614eef90600163ffffffff614d7316565b600160a060020a039092166000908152600360209081526040808320949094559181526001909152208054600160a060020a0319169055565b600081815260016020526040902054600160a060020a031615614f4a57600080fd5b60008181526001602081815260408084208054600160a060020a031916600160a060020a0388169081179091558452600390915290912054614f8b91614d85565b600160a060020a0390921660009081526003602052604090209190915550565b600160a060020a0382161515614fc057600080fd5b614fca8282614c72565b6040518190600160a060020a038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600160e060020a031981167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061507957805160ff19168380011785556150a6565b828001600101855582156150a6579182015b828111156150a657825182559160200191906001019061508b565b506150b29291506150d6565b5090565b815481835581811115611ac857600083815260209020611ac89181019083015b610f7091905b808211156150b257600081556001016150dc5600756e617574686f72697a65642075736572000000000000000000000000000000546865204c414e44206973206e6f742070617274206f66207468652045737461dd117a11c22118c9dee4b5a67ce578bc44529dce21ee0ccc439588fbb9fb4ea3696e697469616c697a65640000000000000000000000000000000000000000004f6e6c79206f776e6572206f72206f70657261746f722063616e207472616e73a165627a7a72305820e71bed1c7f596b388d9d177117d711e66971f8ea582a78b4c21b7f58f826e0250029
Deployed Bytecode Sourcemap
36610:20012:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7295:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7295:148:0;-1:-1:-1;;;;;;7295:148:0;;;;;;;;;;;;;;;;;;;;;;;25915:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25915:72: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;25915:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43905:353;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43905:353:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;43905:353:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43905:353:0;;;;-1:-1:-1;43905:353:0;-1:-1:-1;43905:353:0;;-1:-1:-1;43905:353:0;;;;;;;;-1:-1:-1;43905:353:0;;-1:-1:-1;;;43905:353:0;;-1:-1:-1;;;;;43905:353:0;;-1:-1:-1;43905:353:0;;-1:-1:-1;;;43905:353:0;;;36052:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36052:65:0;-1:-1:-1;;;;;36052:65:0;;;;;;;;;;12210:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12210:113:0;;;;;;;;;-1:-1:-1;;;;;12210:113:0;;;;;;;;;;;;;;11692:284;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11692:284:0;-1:-1:-1;;;;;11692:284:0;;;;;;;35572:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35572:47:0;;;;;;;;;;;;;;;;;;;;;44996:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44996:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44996:289:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44996:289:0;;-1:-1:-1;44996:289:0;;-1:-1:-1;;;;;;;44996:289:0;;;;;-1:-1:-1;;;;;;44996:289:0;;;;;;;;;;;;;;45415:366;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;45415:366:0;;;;;27228:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27228:89:0;;;;55293:480;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55293:480:0;;;;42989:297;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42989:297:0;;;;;-1:-1:-1;;;;;42989:297:0;;;;;48234:253;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;48234:253:0;-1:-1:-1;;;;;48234:253:0;;;;;;;;;;;;47697:130;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47697:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47697:130:0;;-1:-1:-1;47697:130:0;;-1:-1:-1;;;;;;;47697:130:0;26867:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26867:213:0;-1:-1:-1;;;;;26867:213:0;;;;;;;36156:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36156:37:0;;;;35466:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35466:50:0;;;;;;;43519:380;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;43519:380:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43519:380:0;;-1:-1:-1;;;43519:380:0;;-1:-1:-1;;;;;43519:380:0;;-1:-1:-1;43519:380:0;;-1:-1:-1;;;43519:380:0;38559:295;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38559:295:0;;;;;;;;;;;;;;-1:-1:-1;;;;;38559:295:0;;;;;48002:226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;48002:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48002:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48002:226:0;;;;-1:-1:-1;48002:226:0;-1:-1:-1;48002:226:0;;-1:-1:-1;48002:226:0;;;;;;;;-1:-1:-1;48002:226:0;;-1:-1:-1;48002:226:0;;-1:-1:-1;;;;;;;48002:226:0;14730:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14730:235:0;-1:-1:-1;;;;;14730:235:0;;;;;;;;;;;;56405:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;56405:214:0;;;;25408:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25408:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25408:145:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25408:145:0;;;;-1:-1:-1;25408:145:0;-1:-1:-1;25408:145:0;;-1:-1:-1;25408:145:0;;;;;;;;-1:-1:-1;25408:145:0;;-1:-1:-1;25408:145:0;;-1:-1:-1;;;;;;;25408:145:0;11134:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11134:143:0;;;;;27649;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27649:143:0;;;;;39253:310;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39253:310:0;-1:-1:-1;;;;;39253:310:0;;;;;40671:281;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40671:281:0;;;;;;;;;;;;;;;;39569:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39569:53:0;;;;36234:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36234:49:0;-1:-1:-1;;;;;36234:49:0;;;;;10781:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10781:168:0;;;;;41074:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41074:152:0;-1:-1:-1;;;;;41074:152:0;;;;;;;10416:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10416:145:0;-1:-1:-1;;;;;10416:145:0;;;;;42546:219;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42546:219:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42546:219:0;;-1:-1:-1;;;42546:219:0;;-1:-1:-1;;;;;42546:219:0;;-1:-1:-1;42546:219:0;;-1:-1:-1;;;42546:219:0;46574:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;46574:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46574:177:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46574:177:0;;-1:-1:-1;46574:177:0;;-1:-1:-1;;;;;;;46574:177:0;35379:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35379:28:0;;;;23316:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23316:72:0;;;;31408:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31408:20:0;;;;45993:167;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;45993:167:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45993:167:0;;-1:-1:-1;45993:167:0;;-1:-1:-1;;;;;;;45993:167:0;26091:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26091:76:0;;;;35901:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35901:50:0;;;;;35713:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35713:70:0;;;;;;;12611:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12611:209:0;-1:-1:-1;;;;;12611:209:0;;;;;;;;;38137:205;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38137:205:0;;;;;-1:-1:-1;;;;;38137:205:0;;;;;40958:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40958:110:0;;;;;42145:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42145:223:0;;;-1:-1:-1;;;;;42145:223:0;;;;;15661:314;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15661:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15661:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15661:314:0;;-1:-1:-1;15661:314:0;;-1:-1:-1;;;;;;;15661:314:0;39134:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39134:113:0;;;;;22911:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22911:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22911:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22911:142:0;;;;-1:-1:-1;22911:142:0;-1:-1:-1;22911:142:0;;-1:-1:-1;22911:142:0;;;;;;;;-1:-1:-1;22911:142:0;;-1:-1:-1;22911:142:0;;-1:-1:-1;;;;;;;22911:142:0;54435:759;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54435:759:0;;;;31647:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31647:106:0;-1:-1:-1;;;;;31647:106:0;;;;;26362:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26362:136:0;;;;;37799:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37799:128:0;;;;-1:-1:-1;;;;;37799:128:0;;;;;;;;;;;;;40065:381;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40065:381:0;-1:-1:-1;;;;;40065:381:0;;;;;47235:293;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47235:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47235:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47235:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47235:293:0;;;;-1:-1:-1;47235:293:0;-1:-1:-1;47235:293:0;;-1:-1:-1;47235:293:0;;;;;;;;-1:-1:-1;47235:293:0;;-1:-1:-1;47235:293:0;;-1:-1:-1;;;;;;;47235:293:0;13137:177;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13137:177:0;-1:-1:-1;;;;;13137:177:0;;;;;;;;;;41511:461;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41511:461:0;-1:-1:-1;;;;;41511:461:0;;;;;;;;;;;;;;32075:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32075:178:0;-1:-1:-1;;;;;32075:178:0;;;;;39773:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;39773:123:0;;;;;7295:148;7381:4;7405:32;7424:12;7405:18;:32::i;:::-;7398:39;7295:148;-1:-1:-1;;7295:148:0:o;25915:72::-;25976:5;25969:12;;;;;;;;-1:-1:-1;;25969:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25954:6;;25969:12;;25976:5;;25969:12;;25976:5;25969:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25915:72;;:::o;43905:353::-;21613:349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21684:56;21711:12;21725:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21725:14:0;;;21684:26;:56::i;:::-;21747:53;21774:12;21788:11;21747:26;:53::i;:::-;-1:-1:-1;;;;;44070:14:0;;;;44062:65;;;;;-1:-1:-1;;;;;44062:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44136:38;44159:5;44166:7;44136:22;:38::i;:::-;44181:30;44200:10;44181:18;:30::i;:::-;44218:8;:34;;-1:-1:-1;;;;;;44218:34:0;-1:-1:-1;;;;;44218:34:0;;;;;21820:35;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21820:35:0;;;21843:11;;21820:35;;;;;;;;;;;;;;;;;;-1:-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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21820:35: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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21900:4;21862:8;21871:12;21862:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:22:0;;;;;-1:-1:-1;21862:22:0;;;;;;;;;;:35;;:22;;:35;;-1:-1:-1;21862:22:0;-1:-1:-1;21862:22:0;;:35;;;;:22;:35;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:35:0;;;;;-1:-1:-1;21862:35:0;;;;;;;;;;:42;;-1:-1:-1;;21862:42:0;;;;;;;;;;;-1:-1:-1;;21911:22:0;;-1:-1:-1;;;;21911:22:0;;21862:35;;;;21911:22;;;;;21862:35;21911:22;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:22:0;;;;;-1:-1:-1;21911:22:0;;;;;;;;;;;21934:14;;;;;;;;;-1:-1:-1;;;;;;;;;;;21934:14:0;;;;;;21911:38;;:22;;;-1:-1:-1;21911:38:0;-1:-1:-1;21911:38:0;;21934:14;;21911:38;21934:14;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:38:0;;;;;-1:-1:-1;21911:38:0;;;;;;;;;;:45;;-1:-1:-1;;21911:45:0;;;;;;;;;;;-1:-1:-1;;;;;;;43905:353:0:o;36052:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12210:113::-;12270:7;12293:24;;;:14;:24;;;;;;-1:-1:-1;;;;;12293:24:0;;12210:113::o;11692:284::-;11754:13;11770:17;11778:8;11770:7;:17::i;:::-;11754:33;-1:-1:-1;;;;;;11802:12:0;;;;;;;;11794:21;;;;;;11830:10;-1:-1:-1;;;;;11830:19:0;;;;:58;;;11853:35;11870:5;11877:10;11853:16;:35::i;:::-;11822:67;;;;;;;;11898:24;;;;:14;:24;;;;;;:30;;-1:-1:-1;;;;;;11898:30:0;-1:-1:-1;;;;;11898:30:0;;;;;;;;;11940;;11898:24;;11940:30;;;;;;;11692:284;;;:::o;35572:47::-;;;;;;;;;;;;;:::o;44996:289::-;36937:8;;45156:6;;;;-1:-1:-1;;;;;36937:8:0;36915:10;:31;36907:85;;;;;-1:-1:-1;;;;;36907:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45193:19;45206:5;45193:12;:19::i;:::-;45174:38;;45219:31;45231:8;45241;45219:11;:31::i;:::-;45264:15;;-1:-1:-1;36999:1:0;44996:289;;;;;;;:::o;45415:366::-;45493:14;45586;45645:6;45567:8;45538:38;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45538:38:0;;;45528:49;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;45528:49:0;;;;;;;;;;;;;-1:-1:-1;45603:23:0;;;:13;:23;;;;;;:30;45528:49;;-1:-1:-1;45603:30:0;;-1:-1:-1;;;;;;;45640:116:0;45661:6;45657:1;:10;45640:116;;;45720:23;;;;:13;:23;;;;;:26;;45744:1;;45720:26;;;;;;;;;;;;;;45703:44;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45703:44:0;;;45693:55;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;45693:55:0;;;;;;;;;;45683:65;;;;;-1:-1:-1;;;274:1;45669:3:0;45640:116;;;45415:366;;;;;:::o;27228:89::-;27295:9;:16;27228:89;:::o;55293:480::-;55364:10;55534:22;55346:29;;;:17;:29;;;;;;;;55338:85;;;;;;;-1:-1:-1;;;;;55338:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55486:10;55500:5;55468:29;;;:17;:29;;;;;;;;:37;;-1:-1:-1;;55468:37:0;;;55559:17;;:39;;;;;;;;;;;;;;-1:-1:-1;;;;;55559:17:0;;;;:27;;:39;;;;;55468:29;55559:39;;;;;;;;:17;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;55559:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55559:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55559:39:0;55646:17;;:59;;;;;;55678:10;55646:59;;;;;;;;;;;;55559:39;;-1:-1:-1;;;;;;55646:17:0;;;;:31;;:59;;;;;55559:39;;55646:59;;;;;;;;:17;;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;55646:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55646:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55646:59:0;55630:137;;;;;;;-1:-1:-1;;;;;55630:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55293:480;:::o;42989:297::-;43130:8;37391:13;37407:17;37415:8;37407:7;:17::i;:::-;37391:33;;37447:39;37465:10;37477:8;37447:17;:39::i;:::-;:75;;;-1:-1:-1;;;;;;37490:20:0;;;;;;:13;:20;;;;;;;;37511:10;37490:32;;;;;;;;;;37447:75;37431:126;;;;;;;-1:-1:-1;;;;;37431:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37431:126:0;;;;;;;;;;;;;;;43158:20;;;;:12;:20;;;;;;:32;;43150:79;;;;;-1:-1:-1;;;;;43150:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43150:79:0;;;;-1:-1:-1;;;;;43150:79:0;;;;;;;;;;;;;;;43236:8;;:44;;;;;;;;;;;;-1:-1:-1;;;;;43236:44:0;;;;;;;;;:8;;;;;:26;;:44;;;;;:8;;:44;;;;;;;:8;;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;43236:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43236:44:0;;;;42989:297;;;;;:::o;48234:253::-;48357:1;48322:24;;;:14;:24;;;;;;;;:37;;-1:-1:-1;;;;;;48322:37:0;;;48403:13;:23;;;;;:30;48366:68;;48391:5;;48398:3;;48366:24;:68::i;:::-;48441:40;48460:5;48467:3;48472:8;48441:18;:40::i;:::-;48234:253;;;:::o;47697:130::-;47782:39;47798:8;47808:6;47816:4;47782:15;:39::i;26867:213::-;26979:7;27015:17;27025:6;27015:9;:17::i;:::-;27006:26;;26998:35;;;;;;-1:-1:-1;;;;;27047:19:0;;;;;;:11;:19;;;;;:27;;27067:6;;27047:27;;;;;;;;;;;;;;27040:34;;26867:213;;;;:::o;36156:37::-;;;-1:-1:-1;;;;;36156:37:0;;:::o;35466:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43519:380::-;43696:6;43670:9;37391:13;37407:17;37415:8;37407:7;:17::i;:::-;37391:33;;37447:39;37465:10;37477:8;37447:17;:39::i;:::-;:75;;;-1:-1:-1;;;;;;37490:20:0;;;;;;:13;:20;;;;;;;;37511:10;37490:32;;;;;;;;;;37447:75;37431:126;;;;;;;-1:-1:-1;;;;;37431:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37431:126:0;;;;;;;;;;;;;;;43705:1;43696:10;;43691:145;43712:8;:15;43708:1;:19;43691:145;;;43780:9;43751:12;:25;43764:8;43773:1;43764:11;;;;;;;;;;;;;;;;;;43751:25;;;;;;;;;;;;:38;43743:85;;;;;;;-1:-1:-1;;;;;43743:85:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43743:85:0;;;;-1:-1:-1;;;;;43743:85:0;;;;;;;;;;;;;;;43729:3;;;;;43691:145;;;43842:8;;:51;;;;;;-1:-1:-1;;;;;43842:51:0;;;;;;;;;;;;;;;;;;;;;:8;;;:30;;43873:8;;43883:9;;43842:51;;;;;;;;;;;;;;:8;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;43842:51:0;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43842:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43842:51:0;;;;43519:380;;;;;;:::o;38559:295::-;38715:11;38755:6;38695:8;36777:39;36795:10;36807:8;36777:17;:39::i;:::-;36769:87;;;;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36769:87:0;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;;;;38729:7;;-1:-1:-1;38764:1:0;;-1:-1:-1;38750:99:0;38771:6;38767:1;:10;38750:99;;;38793:48;38807:8;38817:7;;38825:1;38817:10;;;;;;;;;;;;;38829:11;38793:13;:48::i;:::-;38779:3;;;;;38750:99;;;38559:295;;;;;;;:::o;48002:226::-;48108:14;;48094:11;48129:94;48150:6;48146:1;:10;48129:94;;;48172:43;48188:8;48198:7;48206:1;48198:10;;;;;;;;;;;;;;;;;;48210:4;48172:15;:43::i;:::-;48158:3;;48129:94;;;48002:226;;;;;:::o;14730:235::-;14851:8;36777:39;36795:10;36807:8;36777:17;:39::i;:::-;36769:87;;;;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36769:87:0;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;;;;14917:42;14934:5;14941:3;14946:8;14917:42;;;;;;;;;;;;;:16;:42::i;:::-;14730:235;;;;:::o;56405:214::-;56466:17;;-1:-1:-1;;;;;56466:17:0;:31;56458:69;;;;;-1:-1:-1;;;;;56458:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56534:79;56569:42;56534:26;:79::i;:::-;56405:214::o;25408:145::-;21613:349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21684:56;21711:12;21725:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21725:14:0;;;21684:26;:56::i;:::-;21747:53;21774:12;21788:11;21747:26;:53::i;:::-;25510:13;;;;:5;;:13;;;;;:::i;:::-;-1:-1:-1;25530:17:0;;;;:7;;:17;;;;;:::i;:::-;;-1:-1:-1;;;;;;;;;;;21829:12:0;21843:11;21820:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21820:35: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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21900:4;21862:8;21871:12;21862:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:22:0;;;;;-1:-1:-1;21862:22:0;;;;;;;;;;:35;;:22;;:35;;-1:-1:-1;21862:22:0;-1:-1:-1;21862:22:0;;:35;;;;:22;:35;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:35:0;;;;;-1:-1:-1;21862:35:0;;;;;;;;;;:42;;-1:-1:-1;;21862:42:0;;;;;;;;;;;-1:-1:-1;;21911:22:0;;-1:-1:-1;;;;21911:22:0;;21862:35;;;;21911:22;;;;;21862:35;21911:22;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:22:0;;;;;-1:-1:-1;21911:22:0;;;;;;;;;;;21934:14;;;;;;;;;-1:-1:-1;;;;;;;;;;;21934:14:0;;;;;;21911:38;;:22;;;-1:-1:-1;21911:38:0;-1:-1:-1;21911:38:0;;21934:14;;21911:38;21934:14;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:38:0;;;;;-1:-1:-1;21911:38:0;;;;;;;;;;:45;;-1:-1:-1;;21911:45:0;;;;;;;;;;;-1:-1:-1;;;;;;25408:145:0:o;11134:143::-;11189:4;11218:20;;;:10;:20;;;;;;-1:-1:-1;;;;;11218:20:0;11252:19;;;11134:143::o;27649:::-;27708:7;27741:13;:11;:13::i;:::-;27732:22;;27724:31;;;;;;27769:9;:17;;27779:6;;27769:17;;;;;;;;;;;;;;27762:24;;27649:143;;;:::o;39253:310::-;31888:5;;-1:-1:-1;;;;;31888:5:0;31874:10;:19;31866:28;;;;;;39331:22;:9;-1:-1:-1;;;;;39331:20:0;;:22::i;:::-;39323:81;;;;;;;-1:-1:-1;;;;;39323:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39419:14:0;;;;39411:68;;;;;-1:-1:-1;;;;;39411:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39486:8;:34;;-1:-1:-1;;;;;;39486:34:0;-1:-1:-1;;;;;39486:34:0;;;;;;;;;;;39532:25;;39548:8;;;39532:25;;-1:-1:-1;;39532:25:0;39253:310;:::o;40671:281::-;40785:8;37075:41;37095:10;37107:8;37075:19;:41::i;:::-;37067:71;;;;;;;-1:-1:-1;;;;;37067:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40805:35;40821:8;40831;;40805:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40805:15:0;;-1:-1:-1;;;;;40805:35:0:i;:::-;40912:10;40886:17;40894:8;40886:7;:17::i;:::-;-1:-1:-1;;;;;40854:92:0;40869:8;40854:92;40931:8;;40854:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40854:92:0;;-1:-1:-1;;;;40854:92:0;40671:281;;;;:::o;39569:53::-;39601:8;;;;;;;;;-1:-1:-1;;;;;39601:8:0;-1:-1:-1;;;;;39601:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39601:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;36234:49:0;;;;;;;;;;;;;;;:::o;10781:168::-;10837:7;10869:20;;;:10;:20;;;;;;-1:-1:-1;;;;;10869:20:0;10904:19;;;10896:28;;;;;41074:152;41161:4;41181:39;41201:8;41211;41181:19;:39::i;:::-;41174:46;41074:152;-1:-1:-1;;;41074:152:0:o;10416:145::-;10472:7;-1:-1:-1;;;;;10496:20:0;;;;10488:29;;;;;;-1:-1:-1;;;;;;10531:24:0;;;;;:16;:24;;;;;;;10416:145::o;42546:219::-;42660:6;42655:105;42676:10;:17;42672:1;:21;42655:105;;;42709:43;42727:10;42738:1;42727:13;;;;;;;;;;;;;;;;;;42742:9;42709:17;:43::i;:::-;42695:3;;42655:105;;46574:177;46665:80;46694:4;46707:2;46718:9;46665:80;;;;;;;;;;;;;:20;:80::i;35379:28::-;;;-1:-1:-1;;;;;35379:28:0;;:::o;23316:72::-;21613:349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21684:56;21711:12;21725:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21725:14:0;;;21684:26;:56::i;:::-;21747:53;21774:12;21788:11;21747:26;:53::i;:::-;-1:-1:-1;;;;;;;;;;;21829:12:0;21843:11;21820:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21820:35: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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21900:4;21862:8;21871:12;21862:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:22:0;;;;;-1:-1:-1;21862:22:0;;;;;;;;;;:35;;:22;;:35;;-1:-1:-1;21862:22:0;-1:-1:-1;21862:22:0;;:35;;;;:22;:35;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:35:0;;;;;-1:-1:-1;21862:35:0;;;;;;;;;;:42;;-1:-1:-1;;21862:42:0;;;;;;;;;;;-1:-1:-1;;21911:22:0;;-1:-1:-1;;;;21911:22:0;;21862:35;;;;21911:22;;;;;21862:35;21911:22;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:22:0;;;;;-1:-1:-1;21911:22:0;;;;;;;;;;;21934:14;;;;;;;;;-1:-1:-1;;;;;;;;;;;21934:14:0;;;;;;21911:38;;:22;;;-1:-1:-1;21911:38:0;-1:-1:-1;21911:38:0;;21934:14;;21911:38;21934:14;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:38:0;;;;;-1:-1:-1;21911:38:0;;;;;;;;;;:45;;-1:-1:-1;;21911:45:0;;;;;;;;;;;-1:-1:-1;;;;23316:72:0:o;31408:20::-;;;-1:-1:-1;;;;;31408:20:0;;:::o;45993:167::-;46078:4;46126:28;46142:11;46126:15;:28::i;:::-;46098:24;46113:8;46098:14;:24::i;:::-;:56;;45993:167;-1:-1:-1;;;45993:167:0:o;26091:76::-;26154:7;26147:14;;;;;;;;-1:-1:-1;;26147:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26132:6;;26147:14;;26154:7;;26147:14;;26154:7;26147:14;;;;;;;;;;;;;;;;;;;;;;;;35901:50;;;;;;;;;;;;-1:-1:-1;;;;;35901:50:0;;:::o;35713:70::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;12611:209::-;-1:-1:-1;;;;;12689:17:0;;12696:10;12689:17;;12681:26;;;;;;12732:10;12714:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;12714:34:0;;;;;;;;;;;;:46;;-1:-1:-1;;12714:46:0;;;;;;;;;;12772:42;;;;;;;12714:34;;12732:10;12772:42;;;;;;;;;;;12611:209;;:::o;38137:205::-;38265:8;36777:39;36795:10;36807:8;36777:17;:39::i;:::-;36769:87;;;;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36769:87:0;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;;;;38292:44;38306:8;38316:6;38324:11;38292:13;:44::i;40958:110::-;41042:20;;;;:10;:20;;;;;;;;;41035:27;;;;;;-1:-1:-1;;41035:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41020:6;;41035:27;;;41042:20;41035:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40958:110;;;:::o;42145:223::-;42261:8;37391:13;37407:17;37415:8;37407:7;:17::i;:::-;37391:33;;37447:39;37465:10;37477:8;37447:17;:39::i;:::-;:75;;;-1:-1:-1;;;;;;37490:20:0;;;;;;:13;:20;;;;;;;;37511:10;37490:32;;;;;;;;;;37447:75;37431:126;;;;;;;-1:-1:-1;;;;;37431:126:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37431:126:0;;;;;;;;;;;;;;;42281:24;;;;:14;:24;;;;;;:35;;-1:-1:-1;;;;;;42281:35:0;-1:-1:-1;;;;;42281:35:0;;;;;;;;42328:34;;42281:35;;:24;;42328:34;;42281:24;42328:34;42145:223;;;;:::o;15661:314::-;15800:8;36777:39;36795:10;36807:8;36777:17;:39::i;:::-;36769:87;;;;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36769:87:0;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;;;;15820:34;15833:5;15840:3;15845:8;15820:12;:34::i;:::-;15915:53;15940:5;15947:3;15952:8;15962:5;15915:24;:53::i;:::-;15907:62;;;;;;;39134:113;39198:7;39221:20;;;:12;:20;;;;;;;39134:113::o;22911:142::-;22992:4;23012:8;23021:12;23012:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;23012:22:0;;;;;-1:-1:-1;23012:22:0;;;;;;;;;;:35;;:22;;:35;;-1:-1:-1;23012:22:0;-1:-1:-1;23012:22:0;;:35;;;;:22;:35;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;23012:35:0;;;;;-1:-1:-1;23012:35:0;;;;;;;;;;;;;;22911:142;-1:-1:-1;;;;;22911:142:0:o;54435:759::-;54505:10;54612:22;54487:29;;;:17;:29;;;;;;54612:22;;54487:29;;54486:30;54478:91;;;;;-1:-1:-1;;;;;54478:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54637:17;;:39;;;;;;54665:10;54637:39;;;;;;-1:-1:-1;;;;;54637:17:0;;;;:27;;:39;;;;;;;;;;;;;;;:17;;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;54637:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54637:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54637:39:0;;-1:-1:-1;54704:1:0;54687:18;;54683:182;;;54734:17;;:59;;;;;;54766:10;54734:59;;;;;;;;;;;;-1:-1:-1;;;;;54734:17:0;;;;:31;;:59;;;;;;;;;;;;;;;:17;;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;54734:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54734:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54734:59:0;54716:141;;;;;;;-1:-1:-1;;;;;54716:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54925:10;54907:29;;;;:17;:29;;;;;:36;;-1:-1:-1;;54907:36:0;54939:4;54907:36;;;54998:24;;:12;:24::i;:::-;55071:17;;:56;;;;;;55104:10;55071:56;;;;;;;;;;;;54977:45;;-1:-1:-1;;;;;;55071:17:0;;;;:32;;:56;;;;;;;;;;;;;;;:17;;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;55071:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55071:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55071:56:0;55055:133;;;;;;;-1:-1:-1;;;;;55055:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54435:759;;:::o;31647:106::-;21613:349;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21684:56;21711:12;21725:14;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21725:14:0;;;21684:26;:56::i;:::-;21747:53;21774:12;21788:11;21747:26;:53::i;:::-;31732:5;:15;;-1:-1:-1;;;;;;31732:15:0;-1:-1:-1;;;;;31732:15:0;;;;;21820:35;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;21820:35:0;;;21843:11;;21820:35;;;;;;;;;;;;;;;;;;-1:-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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21820:35: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;21820:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21900:4;21862:8;21871:12;21862:22;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:22:0;;;;;-1:-1:-1;21862:22:0;;;;;;;;;;:35;;:22;;:35;;-1:-1:-1;21862:22:0;-1:-1:-1;21862:22:0;;:35;;;;:22;:35;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21862:35:0;;;;;-1:-1:-1;21862:35:0;;;;;;;;;;:42;;-1:-1:-1;;21862:42:0;;;;;;;;;;;-1:-1:-1;;21911:22:0;;-1:-1:-1;;;;21911:22:0;;21862:35;;;;21911:22;;;;;21862:35;21911:22;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:22:0;;;;;-1:-1:-1;21911:22:0;;;;;;;;;;;21934:14;;;;;;;;;-1:-1:-1;;;;;;;;;;;21934:14:0;;;;;;21911:38;;:22;;;-1:-1:-1;21911:38:0;-1:-1:-1;21911:38:0;;21934:14;;21911:38;21934:14;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21911:38:0;;;;;-1:-1:-1;21911:38:0;;;;;;;;;;:45;;-1:-1:-1;;21911:45:0;;;;;;;;;;;-1:-1:-1;;;;;31647:106:0:o;26362:136::-;26419:6;26442:16;26449:8;26442:6;:16::i;:::-;26434:25;;;;;;;;26473:19;;;;:9;:19;;;;;;;;;26466:26;;;;;;-1:-1:-1;;26466:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26473:19;;26466:26;;26473:19;26466:26;;;;;;;;;;;;;;;;;;;;;;;;37799:128;36937:8;;37873:7;;-1:-1:-1;;;;;36937:8:0;36915:10;:31;36907:85;;;;;-1:-1:-1;;;;;36907:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37896:25;37908:2;37912:8;;37896:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37896:11:0;;-1:-1:-1;;;;;37896:25:0:i;:::-;37889:32;37799:128;-1:-1:-1;;;;37799:128:0:o;40065:381::-;-1:-1:-1;;;;;40243:24:0;;40124:7;40243:24;;;:16;:24;;;;;;40124:7;;;;40274:144;40294:7;40290:1;:11;40274:144;;;-1:-1:-1;;;;;40336:19:0;;;;;;:11;:19;;;;;:22;;40356:1;;40336:22;;;;;;;;;;;;;;;;;;40380:23;;;:13;:23;;;;;;;:30;40367:43;;;;;40303:3;;;;;40336:22;-1:-1:-1;40274:144:0;;;-1:-1:-1;40431:9:0;;40065:381;-1:-1:-1;;;;40065:381:0:o;47235:293::-;47376:6;47371:152;47392:9;:16;47388:1;:20;47371:152;;;47424:91;47451:4;47466:2;47479:9;47489:1;47479:12;;;;;;;;;;;;;;;;;;47502:4;47424:16;:91::i;:::-;47410:3;;47371:152;;13137:177;-1:-1:-1;;;;;13272:25:0;;;13249:4;13272:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;13137:177::o;41511:461::-;-1:-1:-1;;;;;41612:23:0;;41625:10;41612:23;;41604:79;;;;;-1:-1:-1;;;;;41604:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41706:20:0;;41716:10;41706:20;;:68;;-1:-1:-1;;;;;;41737:25:0;;;;;;:17;:25;;;;;;;;41763:10;41737:37;;;;;;;;;;41706:68;41690:119;;;;;;;-1:-1:-1;;;;;41690:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;41818:21:0;;;;;;;:13;:21;;;;;;;;:32;;;;;;;;;;;;;:44;;-1:-1:-1;;41818:44:0;;;;;;;;;;41876:90;;;;;;;41931:10;;41818:32;:21;41876:90;;;;;;;;;41511:461;;;:::o;32075:178::-;31888:5;;-1:-1:-1;;;;;31888:5:0;31874:10;:19;31866:28;;;;;;-1:-1:-1;;;;;32152:22:0;;;;32144:31;;;;;;32208:5;;32187:37;;-1:-1:-1;;;;;32187:37:0;;;;32208:5;;32187:37;;32208:5;;32187:37;32231:5;:16;;-1:-1:-1;;;;;;32231:16:0;-1:-1:-1;;;;;32231:16:0;;;;;;;;;;32075:178::o;39773:123::-;39837:7;39860:23;;;:13;:23;;;;;:30;;39773:123::o;48541:295::-;48613:4;48686:38;48711:12;48686:24;:38::i;:::-;:88;;;-1:-1:-1;35213:33:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48735:39:0;;;;;;48686:88;:144;;;-1:-1:-1;35322:45:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;48785:45:0;;;;;;48679:151;;48541:295;;;:::o;23578:204::-;23684:37;23695:12;23709:11;23684:10;:37::i;:::-;23683:38;23675:101;;;;;-1:-1:-1;;;;;23675:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53167:110;53221:7;53252:18;53268:1;53252:15;:18::i;50235:618::-;50715:13;50314:16;50321:8;50314:6;:16::i;:::-;50306:55;;;;;;;-1:-1:-1;;;;;50306:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50376:20;;;;:12;:20;;;;;;:25;50368:76;;;;;-1:-1:-1;;;;;50368:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50459:8;;:24;;;;;;;;;;;;;;50495:4;;-1:-1:-1;;;;;50459:8:0;;:16;;:24;;;;;;;;;;;;;;:8;;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;50459:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50459:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50459:24:0;-1:-1:-1;;;;;50459:41:0;;50451:95;;;;;-1:-1:-1;;;;;50451:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50555:23;;;;:13;:23;;;;;;;;27:10:-1;;39:1;23:18;;45:23;;50555:36:0;;;;;;;;;;50600:20;;;:12;:20;;;;;:31;;;50676:23;;;:30;50640:15;:25;;;;;:33;;;;;;;;;:66;50731:17;50569:8;50731:7;:17::i;:::-;50788:8;;50715:33;;-1:-1:-1;50755:53:0;;-1:-1:-1;;;;;50788:8:0;50715:33;50788:8;50755:24;:53::i;:::-;50822:25;;50840:6;;50830:8;;50822:25;;;;;50235:618;;;:::o;16331:455::-;16447:4;16463:13;16479:17;16487:8;16479:7;:17::i;:::-;16463:33;;16680:5;-1:-1:-1;;;;;16668:17:0;:8;-1:-1:-1;;;;;16668:17:0;;:61;;;;16721:8;-1:-1:-1;;;;;16696:33:0;:21;16708:8;16696:11;:21::i;:::-;-1:-1:-1;;;;;16696:33:0;;16668:61;:105;;;;16740:33;16757:5;16764:8;16740:16;:33::i;55911:293::-;-1:-1:-1;;;;;56010:24:0;;;;;;:17;:24;;;;;;;;56006:94;;;56045:17;;:47;;;;;;-1:-1:-1;;;;;56045:47:0;;;;;;;;;;;;;;;:17;;;;;:31;;:47;;;;;;;;;;;;;;:17;;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;56045:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56045:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;56006:94:0;-1:-1:-1;;;;;56112:22:0;;;;;;:17;:22;;;;;;;;56108:91;;;56145:17;;:46;;;;;;-1:-1:-1;;;;;56145:46:0;;;;;;;;;;;;;;;:17;;;;;:32;;:46;;;;;;;;;;;;;;:17;;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;56145:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56145:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;13742:358:0;13859:8;36777:39;36795:10;36807:8;36777:17;:39::i;:::-;36769:87;;;;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36769:87:0;;;;-1:-1:-1;;;;;36769:87:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;13887:19:0;;;;13879:28;;;;;;-1:-1:-1;;;;;13922:17:0;;;;13914:26;;;;;;13949:30;13963:5;13970:8;13949:13;:30::i;:::-;13986:32;14002:5;14009:8;13986:15;:32::i;:::-;14025:25;14036:3;14041:8;14025:10;:25::i;:::-;14085:8;14080:3;-1:-1:-1;;;;;14064:30:0;14073:5;-1:-1:-1;;;;;14064:30:0;;;;;;;;;;;13742:358;;;;:::o;53498:361::-;53748:5;53760;53634:8;53644:6;37241:53;37265:10;37277:8;37287:6;37241:23;:53::i;:::-;37233:83;;;;;;;-1:-1:-1;;;;;37233:83:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;37233:83:0;;;;;;;;;;;;;;;53670:20;;;;:12;:20;;;;;;:32;;53662:79;;;;;-1:-1:-1;;;;;53662:79:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;53662:79:0;;;;-1:-1:-1;;;;;53662:79:0;;;;;;;;;;;;;;;53781:8;;:30;;;;;;;;;;;;;;-1:-1:-1;;;;;53781:8:0;;;;:22;;:30;;;;;;;;;;;;;:8;;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;53781:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53781:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53781:30:0;;;;;;;53818:8;;53781:30;53818:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53781:30;;-1:-1:-1;53781:30:0;;-1:-1:-1;;;;;;53818:8:0;;;;:23;;53781:30;;;;53848:4;;53818:35;;;;;;;;;;;;;;;:8;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;53818:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53818:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53818:35:0;;;;53498:361;;;;;;;:::o;51071:1554::-;51285:25;;;;;;-1:-1:-1;;;;;51201:25:0;;;;51193:83;;;;;-1:-1:-1;;;;;51193:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51313:23;;;;:13;:23;;;;;;;;51383:15;:25;;;;;51504:17;;;;;;;;;;51313:23;;-1:-1:-1;51383:25:0;-1:-1:-1;51504:22:0;;51496:69;;;;;-1:-1:-1;;;;;51496:69:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;51496:69:0;;;;-1:-1:-1;;;;;51496:69:0;;;;;;;;;;;;;;;51598:14;;:21;;51617:1;51598:21;:18;:21;:::i;:::-;51726:17;;;;;;;;;;;;51574:45;;-1:-1:-1;51726:24:0;;51748:1;51726:24;:21;:24;:::i;:::-;51706:44;;51850:7;51858:16;51850:25;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52002:19:0;:12;52019:1;52002:19;:16;:19;:::i;:::-;51977:22;;;;;;;;;;;:44;52028:21;;51987:11;;52028:7;;52036:12;;52028:21;;;;;;;;;;;;;;;:35;52138:25;;:7;;52146:16;;52138:25;;;;;;;;;;;;;;52131:32;52187:16;52170:33;:7;52187:16;52170:33;:::i;:::-;-1:-1:-1;52315:1:0;52295:17;;;;;;;;;;;:21;;;52375:12;:20;;;;;:24;52424:17;52432:8;52424:7;:17::i;:::-;52488:8;;52408:33;;-1:-1:-1;52448:53:0;;52408:33;;-1:-1:-1;;;;;52488:8:0;;52448:24;:53::i;:::-;52510:8;;:52;;;;;;52536:4;52510:52;;;;-1:-1:-1;;;;;52510:52:0;;;;;;;;;;;;;;;:8;;;;;:25;;:52;;;;;:8;;:52;;;;;;;:8;;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;52510:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52510:52:0;;;;52607:11;-1:-1:-1;;;;;52578:41:0;52599:6;52589:8;52578:41;;;;;;;;;;51071:1554;;;;;;;;;:::o;54013:326::-;-1:-1:-1;;;;;54104:35:0;;;;54096:96;;;;;-1:-1:-1;;;;;54096:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54230:17;;54204:67;;-1:-1:-1;;;;;54204:67:0;;;;54230:17;;54204:67;;54230:17;;54204:67;54278:17;:55;;-1:-1:-1;;;;;;54278:55:0;-1:-1:-1;;;;;54278:55:0;;;;;;;;;;54013:326::o;6335:578::-;6392:4;6815:17;;6899:8;;6335:578::o;52631:281::-;52719:4;52732:13;52748:17;52756:8;52748:7;:17::i;:::-;52732:33;;52781:37;52799:8;52809;52781:17;:37::i;:::-;:84;;;-1:-1:-1;52829:24:0;;;;:14;:24;;;;;;-1:-1:-1;;;;;52829:36:0;;;:24;;:36;52781:84;:125;;;-1:-1:-1;;;;;;52876:20:0;;;;;;;:13;:20;;;;;;;;:30;;;;;;;;;;;;52774:132;;52631:281;;;;;:::o;49672:113::-;49748:20;;;;:10;:20;;;;;;;;:31;;;;;;;;:::i;53283:209::-;53340:7;;;53376:92;53397:1;:8;53393:1;:12;53376:92;;;53452:8;:1;53458;53452:8;:5;:8;:::i;:::-;53436:1;53438;53436:4;;;;;;;;;;;;;;;53428:32;;;;;53436:4;;;;;;;;:11;;53428:32;53421:39;;;;;53407:3;;53376:92;;;-1:-1:-1;53483:3:0;53283:209;-1:-1:-1;;53283:209:0:o;19589:362::-;19735:4;19808:13;19756:16;:3;-1:-1:-1;;;;;19756:14:0;;:16::i;:::-;19755:17;19751:51;;;19790:4;19783:11;;;;19751:51;19824:80;;;;;19869:10;19824:80;;;;;;-1:-1:-1;;;;;19824:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;;;;19869:10;19881:5;;19888:8;;19898:5;;19824:80;;;;;;;;;;;;;;-1:-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;19824:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19824:80:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19824:80:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19824:80:0;-1:-1:-1;;;;;;19919:25:0;19929:15;19919:25;;;-1:-1:-1;;;;;;19589:362:0:o;49085:336::-;49153:7;;-1:-1:-1;;;;;49177:16:0;;;;49169:65;;;;;-1:-1:-1;;;;;49169:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49260:17;:15;:17::i;:::-;49241:36;;49284:19;49290:2;49294:8;49284:5;:19::i;:::-;49310:35;49326:8;49336;49310:15;:35::i;:::-;49374:8;49370:2;-1:-1:-1;;;;;49357:36:0;;49384:8;49357:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;49357:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49407:8;49085:336;-1:-1:-1;;;49085:336:0:o;25559:256::-;25646:4;25669:38;25694:12;25669:24;:38::i;:::-;:94;;;-1:-1:-1;;;;;;;25719:44:0;;25735:28;25719:44;25669:94;:140;;;-1:-1:-1;;;;;;;;25767:42:0;25783:26;25767:42;;25559:256::o;17871:219::-;17973:6;-1:-1:-1;;;;;17952:27:0;:17;17960:8;17952:7;:17::i;:::-;-1:-1:-1;;;;;17952:27:0;;17944:36;;;;;;18027:1;17991:24;;;:14;:24;;;;;;-1:-1:-1;;;;;17991:24:0;:38;17987:98;;18075:1;18040:24;;;:14;:24;;;;;:37;;-1:-1:-1;;;;;;18040:37:0;;;-1:-1:-1;17871:219:0:o;28945:872::-;29066:18;29120:22;29184:17;29019:38;29041:5;29048:8;29019:21;:38::i;:::-;29087:26;;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;29145:18:0;;;;:11;:18;;;;;;:25;29087:26;;-1:-1:-1;29145:32:0;;29175:1;29145:32;:29;:32;:::i;:::-;-1:-1:-1;;;;;29204:18:0;;;;;;:11;:18;;;;;:34;;29120:57;;-1:-1:-1;29204:18:0;29120:57;;29204:34;;;;;;;;;;;;;;29184:54;;29280:9;29247:11;:18;29259:5;-1:-1:-1;;;;;29247:18:0;-1:-1:-1;;;;;29247:18:0;;;;;;;;;;;;29266:10;29247:30;;;;;;;;;;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;29296:18:0;;;;:11;:18;;;;;;:34;;29315:14;;29296:34;;;;;;;;;;;;;;;;;:38;;;;-1:-1:-1;;;;;29700:18:0;;;;:11;:18;;;;;;:27;;;;;-1:-1:-1;;29700:27:0;;;:::i;:::-;-1:-1:-1;29763:1:0;29734:26;;;:16;:26;;;;;;:30;;;29771:27;;;;;;:40;-1:-1:-1;;28945:872:0:o;28428:231::-;28533:14;28495:31;28512:3;28517:8;28495:16;:31::i;:::-;-1:-1:-1;;;;;;28550:16:0;;;;;;;:11;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;28580:31:0;;;;;;;;;;;28618:26;;;:16;:26;;;;;:35;28428:231::o;52918:243::-;53046:4;53069:39;53089:8;53099;53069:19;:39::i;:::-;:86;;;-1:-1:-1;53112:8:0;;:31;;;;;;;;;;;;;;-1:-1:-1;;;;;53112:43:0;;;;:8;;:23;;:31;;;;;;;;;;;;;;:8;;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;53112:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53112:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53112:31:0;-1:-1:-1;;;;;53112:43:0;;;52918:243;-1:-1:-1;;;;52918:243:0:o;5542:113::-;5600:7;5623:6;;;;5616:14;;;;-1:-1:-1;5644:5:0;;;5542:113::o;5722:127::-;5802:5;;;5821:6;;;;5814:14;;;4887:174;4945:9;4967:6;;4963:37;;;-1:-1:-1;4991:1:0;4984:8;;4963:37;-1:-1:-1;5010:5:0;;;5014:1;5010;:5;5029;;;;;;;;:10;5022:18;;;49951:99;50001:7;50024:20;50042:1;50024:13;:11;:13::i;:::-;:17;:20;:17;:20;:::i;:::-;50017:27;;49951:99;:::o;30086:177::-;30148:26;30160:3;30165:8;30148:11;:26::i;:::-;30210:9;:16;;30183:24;;;;:14;:24;;;;;:43;;;39:1:-1;23:18;;45:23;;30233:24:0;;;;;;;-1:-1:-1;30086:177:0:o;9973:244::-;10060:4;10083:38;10108:12;10083:24;:38::i;:::-;:84;;;-1:-1:-1;;;;;;;10133:34:0;;10149:18;10133:34;10083:84;:128;;;-1:-1:-1;;;;;;;;10171:40:0;10187:24;10171:40;;9973:244::o;18854:218::-;18957:5;-1:-1:-1;;;;;18936:26:0;:17;18944:8;18936:7;:17::i;:::-;-1:-1:-1;;;;;18936:26:0;;18928:35;;;;;;-1:-1:-1;;;;;18996:23:0;;;;;;:16;:23;;;;;;:30;;19024:1;18996:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;18970:23:0;;;;;;;:16;:23;;;;;;;;:56;;;;19033:20;;;:10;:20;;;;:33;;-1:-1:-1;;;;;;19033:33:0;;;18854:218::o;18360:208::-;18467:1;18435:20;;;:10;:20;;;;;;-1:-1:-1;;;;;18435:20:0;:34;18427:43;;;;;;18477:20;;;;:10;:20;;;;;;;;:26;;-1:-1:-1;;;;;;18477:26:0;-1:-1:-1;;;;;18477:26:0;;;;;;;;18534:21;;:16;:21;;;;;;;:28;;:25;:28::i;:::-;-1:-1:-1;;;;;18510:21:0;;;;;;;:16;:21;;;;;:52;;;;-1:-1:-1;18360:208:0:o;17043:173::-;-1:-1:-1;;;;;17113:17:0;;;;17105:26;;;;;;17138:25;17149:3;17154:8;17138:10;:25::i;:::-;17175:35;;17201:8;;-1:-1:-1;;;;;17175:35:0;;;17192:1;;17175:35;;17192:1;;17175:35;17043:173;;:::o;7449:151::-;-1:-1:-1;;;;;;7560:34:0;;7576:18;7560:34;7449:151;;;:::o;36610:20012::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36610:20012:0;;;-1:-1:-1;36610:20012:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://e71bed1c7f596b388d9d177117d711e66971f8ea582a78b4c21b7f58f826e025
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.