ERC-1155
Overview
Max Total Supply
7,700 PEPEMON
Holders
2,066
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PepemonFactory
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-30 */ // File: contracts/PepemonFactory.sol pragma solidity >=0.5.0 <0.6.0; contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } contract MinterRole is Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(_msgSender()); } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole is Context { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () internal { _addWhitelistAdmin(_msgSender()); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(_msgSender()), "WhitelistAdminRole: caller does not have the WhitelistAdmin role"); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(_msgSender()); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } } /** * @title ERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface IERC165 { /** * @notice Query if a contract implements an interface * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas * @param _interfaceId The interface identifier, as specified in ERC-165 */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); } /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath#mul: OVERFLOW"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath#div: DIVISION_BY_ZERO"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath#sub: UNDERFLOW"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath#add: OVERFLOW"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath#mod: DIVISION_BY_ZERO"); return a % b; } } /** * @dev ERC-1155 interface for accepting safe transfers. */ interface IERC1155TokenReceiver { /** * @notice Handle the receipt of a single ERC1155 token type * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated * This function MAY throw to revert and reject the transfer * Return of other amount than the magic value MUST result in the transaction being reverted * Note: The token contract address is always the message sender * @param _operator The address which called the `safeTransferFrom` function * @param _from The address which previously owned the token * @param _id The id of the token being transferred * @param _amount The amount of tokens being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` */ function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _amount, bytes calldata _data) external returns(bytes4); /** * @notice Handle the receipt of multiple ERC1155 token types * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated * This function MAY throw to revert and reject the transfer * Return of other amount than the magic value WILL result in the transaction being reverted * Note: The token contract address is always the message sender * @param _operator The address which called the `safeBatchTransferFrom` function * @param _from The address which previously owned the token * @param _ids An array containing ids of each token being transferred * @param _amounts An array containing amounts of each token being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` */ function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external returns(bytes4); /** * @notice Indicates whether a contract implements the `ERC1155TokenReceiver` functions and so can accept ERC1155 token types. * @param interfaceID The ERC-165 interface ID that is queried for support.s * @dev This function MUST return true if it implements the ERC1155TokenReceiver interface and ERC-165 interface. * This function MUST NOT consume more than 5,000 gas. * @return Wheter ERC-165 or ERC1155TokenReceiver interfaces are supported. */ function supportsInterface(bytes4 interfaceID) external view returns (bool); } interface IERC1155 { // Events /** * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning * Operator MUST be msg.sender * When minting/creating tokens, the `_from` field MUST be set to `0x0` * When burning/destroying tokens, the `_to` field MUST be set to `0x0` * The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID * To broadcast the existence of a token ID with no initial balance, the contract SHOULD emit the TransferSingle event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0 */ event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount); /** * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning * Operator MUST be msg.sender * When minting/creating tokens, the `_from` field MUST be set to `0x0` * When burning/destroying tokens, the `_to` field MUST be set to `0x0` * The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID * To broadcast the existence of multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0 */ event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts); /** * @dev MUST emit when an approval is updated */ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /** * @dev MUST emit when the URI is updated for a token ID * URIs are defined in RFC 3986 * The URI MUST point a JSON file that conforms to the "ERC-1155 Metadata JSON Schema" */ event URI(string _amount, uint256 indexed _id); /** * @notice Transfers amount of an _id from the _from address to the _to address specified * @dev MUST emit TransferSingle event on success * Caller must be approved to manage the _from account's tokens (see isApprovedForAll) * MUST throw if `_to` is the zero address * MUST throw if balance of sender for token `_id` is lower than the `_amount` sent * MUST throw on any other error * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155Received` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount * @param _data Additional data with no specified format, sent in call to `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) external; /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @dev MUST emit TransferBatch event on success * Caller must be approved to manage the _from account's tokens (see isApprovedForAll) * MUST throw if `_to` is the zero address * MUST throw if length of `_ids` is not the same as length of `_amounts` * MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_amounts` sent * MUST throw on any other error * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * Transfers and events MUST occur in the array order they were submitted (_ids[0] before _ids[1], etc) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type * @param _data Additional data with no specified format, sent in call to `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external; /** * @notice Get the balance of an account's Tokens * @param _owner The address of the token holder * @param _id ID of the Token * @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) external view returns (uint256); /** * @notice Get the balance of multiple account/token pairs * @param _owners The addresses of the token holders * @param _ids ID of the Tokens * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /** * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens * @dev MUST emit the ApprovalForAll event on success * @param _operator Address to add to the set of authorized operators * @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external; /** * @notice Queries the approval status of an operator for a given owner * @param _owner The owner of the Tokens * @param _operator Address of authorized operator * @return True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator); } /** * Copyright 2018 ZeroEx Intl. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * Utility library of inline functions on addresses */ library Address { /** * 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 account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // 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 { codehash := extcodehash(account) } return (codehash != 0x0 && codehash != accountHash); } } /** * @dev Implementation of Multi-Token Standard contract */ contract ERC1155 is IERC165 { using SafeMath for uint256; using Address for address; /***********************************| | Variables and Events | |__________________________________*/ // onReceive function signatures bytes4 constant internal ERC1155_RECEIVED_VALUE = 0xf23a6e61; bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81; // Objects balances mapping (address => mapping(uint256 => uint256)) internal balances; // Operator Functions mapping (address => mapping(address => bool)) internal operators; // Events event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount); event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts); event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); event URI(string _uri, uint256 indexed _id); /***********************************| | Public Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount * @param _data Additional data with no specified format, sent in call to `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data) public { require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeTransferFrom: INVALID_OPERATOR"); require(_to != address(0),"ERC1155#safeTransferFrom: INVALID_RECIPIENT"); // require(_amount >= balances[_from][_id]) is not necessary since checked with safemath operations _safeTransferFrom(_from, _to, _id, _amount); _callonERC1155Received(_from, _to, _id, _amount, _data); } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type * @param _data Additional data with no specified format, sent in call to `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) public { // Requirements require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeBatchTransferFrom: INVALID_OPERATOR"); require(_to != address(0), "ERC1155#safeBatchTransferFrom: INVALID_RECIPIENT"); _safeBatchTransferFrom(_from, _to, _ids, _amounts); _callonERC1155BatchReceived(_from, _to, _ids, _amounts, _data); } /***********************************| | Internal Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount */ function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount) internal { // Update balances balances[_from][_id] = balances[_from][_id].sub(_amount); // Subtract amount balances[_to][_id] = balances[_to][_id].add(_amount); // Add amount // Emit event emit TransferSingle(msg.sender, _from, _to, _id, _amount); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...) */ function _callonERC1155Received(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data) internal { // Check if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received(msg.sender, _from, _id, _amount, _data); require(retval == ERC1155_RECEIVED_VALUE, "ERC1155#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE"); } } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type */ function _safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts) internal { require(_ids.length == _amounts.length, "ERC1155#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH"); // Number of transfer to execute uint256 nTransfer = _ids.length; // Executing all transfers for (uint256 i = 0; i < nTransfer; i++) { // Update storage balance of previous bin balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]); balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]); } // Emit event emit TransferBatch(msg.sender, _from, _to, _ids, _amounts); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...) */ function _callonERC1155BatchReceived(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) internal { // Pass data if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived(msg.sender, _from, _ids, _amounts, _data); require(retval == ERC1155_BATCH_RECEIVED_VALUE, "ERC1155#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE"); } } /***********************************| | Operator Functions | |__________________________________*/ /** * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens * @param _operator Address to add to the set of authorized operators * @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external { // Update operator status operators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @notice Queries the approval status of an operator for a given owner * @param _owner The owner of the Tokens * @param _operator Address of authorized operator * @return True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) public view returns (bool isOperator) { return operators[_owner][_operator]; } /***********************************| | Balance Functions | |__________________________________*/ /** * @notice Get the balance of an account's Tokens * @param _owner The address of the token holder * @param _id ID of the Token * @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) public view returns (uint256) { return balances[_owner][_id]; } /** * @notice Get the balance of multiple account/token pairs * @param _owners The addresses of the token holders * @param _ids ID of the Tokens * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] memory _owners, uint256[] memory _ids) public view returns (uint256[] memory) { require(_owners.length == _ids.length, "ERC1155#balanceOfBatch: INVALID_ARRAY_LENGTH"); // Variables uint256[] memory batchBalances = new uint256[](_owners.length); // Iterate over each owner and token ID for (uint256 i = 0; i < _owners.length; i++) { batchBalances[i] = balances[_owners[i]][_ids[i]]; } return batchBalances; } /***********************************| | ERC165 Functions | |__________________________________*/ /** * INTERFACE_SIGNATURE_ERC165 = bytes4(keccak256("supportsInterface(bytes4)")); */ bytes4 constant private INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7; /** * INTERFACE_SIGNATURE_ERC1155 = * bytes4(keccak256("safeTransferFrom(address,address,uint256,uint256,bytes)")) ^ * bytes4(keccak256("safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)")) ^ * bytes4(keccak256("balanceOf(address,uint256)")) ^ * bytes4(keccak256("balanceOfBatch(address[],uint256[])")) ^ * bytes4(keccak256("setApprovalForAll(address,bool)")) ^ * bytes4(keccak256("isApprovedForAll(address,address)")); */ bytes4 constant private INTERFACE_SIGNATURE_ERC1155 = 0xd9b67a26; /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` and */ function supportsInterface(bytes4 _interfaceID) external view returns (bool) { if (_interfaceID == INTERFACE_SIGNATURE_ERC165 || _interfaceID == INTERFACE_SIGNATURE_ERC1155) { return true; } return false; } } /** * @notice Contract that handles metadata related methods. * @dev Methods assume a deterministic generation of URI based on token IDs. * Methods also assume that URI uses hex representation of token IDs. */ contract ERC1155Metadata { // URI's default URI prefix string internal baseMetadataURI; event URI(string _uri, uint256 indexed _id); /***********************************| | Metadata Public Function s | |__________________________________*/ /** * @notice A distinct Uniform Resource Identifier (URI) for a given token. * @dev URIs are defined in RFC 3986. * URIs are assumed to be deterministically generated based on token ID * Token IDs are assumed to be represented in their hex format in URIs * @return URI string */ function uri(uint256 _id) public view returns (string memory) { return string(abi.encodePacked(baseMetadataURI, _uint2str(_id), ".json")); } /***********************************| | Metadata Internal Functions | |__________________________________*/ /** * @notice Will emit default URI log event for corresponding token _id * @param _tokenIDs Array of IDs of tokens to log default URI */ function _logURIs(uint256[] memory _tokenIDs) internal { string memory baseURL = baseMetadataURI; string memory tokenURI; for (uint256 i = 0; i < _tokenIDs.length; i++) { tokenURI = string(abi.encodePacked(baseURL, _uint2str(_tokenIDs[i]), ".json")); emit URI(tokenURI, _tokenIDs[i]); } } /** * @notice Will emit a specific URI log event for corresponding token * @param _tokenIDs IDs of the token corresponding to the _uris logged * @param _URIs The URIs of the specified _tokenIDs */ function _logURIs(uint256[] memory _tokenIDs, string[] memory _URIs) internal { require(_tokenIDs.length == _URIs.length, "ERC1155Metadata#_logURIs: INVALID_ARRAYS_LENGTH"); for (uint256 i = 0; i < _tokenIDs.length; i++) { emit URI(_URIs[i], _tokenIDs[i]); } } /** * @notice Will update the base URL of token's URI * @param _newBaseMetadataURI New base URL of token's URI */ function _setBaseMetadataURI(string memory _newBaseMetadataURI) internal { baseMetadataURI = _newBaseMetadataURI; } /***********************************| | Utility Internal Functions | |__________________________________*/ /** * @notice Convert uint256 to string * @param _i Unsigned integer to convert to string */ function _uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 ii = _i; uint256 len; // Get number of bytes while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len - 1; // Get each individual ASCII while (ii != 0) { bstr[k--] = byte(uint8(48 + ii % 10)); ii /= 10; } // Convert to string return string(bstr); } } /** * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume * a parent contract to be executed as they are `internal` functions */ contract ERC1155MintBurn is ERC1155 { /****************************************| | Minting Functions | |_______________________________________*/ /** * @notice Mint _amount of tokens of a given id * @param _to The address to mint tokens to * @param _id Token id to mint * @param _amount The amount to be minted * @param _data Data to pass if receiver is contract */ function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal { // Add _amount balances[_to][_id] = balances[_to][_id].add(_amount); // Emit event emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount); // Calling onReceive method if recipient is contract _callonERC1155Received(address(0x0), _to, _id, _amount, _data); } /** * @notice Mint tokens for each ids in _ids * @param _to The address to mint tokens to * @param _ids Array of ids to mint * @param _amounts Array of amount of tokens to mint per id * @param _data Data to pass if receiver is contract */ function _batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) internal { require(_ids.length == _amounts.length, "ERC1155MintBurn#batchMint: INVALID_ARRAYS_LENGTH"); // Number of mints to execute uint256 nMint = _ids.length; // Executing all minting for (uint256 i = 0; i < nMint; i++) { // Update storage balance balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]); } // Emit batch mint event emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts); // Calling onReceive method if recipient is contract _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, _data); } /****************************************| | Burning Functions | |_______________________________________*/ /** * @notice Burn _amount of tokens of a given token id * @param _from The address to burn tokens from * @param _id Token id to burn * @param _amount The amount to be burned */ function _burn(address _from, uint256 _id, uint256 _amount) internal { //Substract _amount balances[_from][_id] = balances[_from][_id].sub(_amount); // Emit event emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount); } /** * @notice Burn tokens of given token id for each (_ids[i], _amounts[i]) pair * @param _from The address to burn tokens from * @param _ids Array of token ids to burn * @param _amounts Array of the amount to be burned */ function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal { require(_ids.length == _amounts.length, "ERC1155MintBurn#batchBurn: INVALID_ARRAYS_LENGTH"); // Number of mints to execute uint256 nBurn = _ids.length; // Executing all minting for (uint256 i = 0; i < nBurn; i++) { // Update storage balance balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]); } // Emit batch mint event emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts); } } library Strings { // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol function strConcat( string memory _a, string memory _b, string memory _c, string memory _d, string memory _e ) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory _bd = bytes(_d); bytes memory _be = bytes(_e); string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length); bytes memory babcde = bytes(abcde); uint256 k = 0; for (uint256 i = 0; i < _ba.length; i++) babcde[k++] = _ba[i]; for (uint256 i = 0; i < _bb.length; i++) babcde[k++] = _bb[i]; for (uint256 i = 0; i < _bc.length; i++) babcde[k++] = _bc[i]; for (uint256 i = 0; i < _bd.length; i++) babcde[k++] = _bd[i]; for (uint256 i = 0; i < _be.length; i++) babcde[k++] = _be[i]; return string(babcde); } function strConcat( string memory _a, string memory _b, string memory _c, string memory _d ) internal pure returns (string memory) { return strConcat(_a, _b, _c, _d, ""); } function strConcat( string memory _a, string memory _b, string memory _c ) internal pure returns (string memory) { return strConcat(_a, _b, _c, "", ""); } function strConcat(string memory _a, string memory _b) internal pure returns (string memory) { return strConcat(_a, _b, "", "", ""); } function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len - 1; while (_i != 0) { bstr[k--] = bytes1(uint8(48 + (_i % 10))); _i /= 10; } return string(bstr); } } contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } /** * @title ERC1155Tradable * ERC1155Tradable - ERC1155 contract that whitelists an operator address, * has create and mint functionality, and supports useful standards from OpenZeppelin, like _exists(), name(), symbol(), and totalSupply() */ contract ERC1155Tradable is ERC1155, ERC1155MintBurn, ERC1155Metadata, Ownable, MinterRole, WhitelistAdminRole { using Strings for string; address proxyRegistryAddress; uint256 private _currentTokenID = 0; mapping(uint256 => address) public creators; mapping(uint256 => uint256) public tokenSupply; mapping(uint256 => uint256) public tokenMaxSupply; // Contract name string public name; // Contract symbol string public symbol; constructor( string memory _name, string memory _symbol, address _proxyRegistryAddress ) public { name = _name; symbol = _symbol; proxyRegistryAddress = _proxyRegistryAddress; } function removeWhitelistAdmin(address account) public onlyOwner { _removeWhitelistAdmin(account); } function removeMinter(address account) public onlyOwner { _removeMinter(account); } function uri(uint256 _id) public view returns (string memory) { require(_exists(_id), "ERC721Tradable#uri: NONEXISTENT_TOKEN"); return Strings.strConcat(baseMetadataURI, Strings.uint2str(_id)); } /** * @dev Returns the total quantity for a token ID * @param _id uint256 ID of the token to query * @return amount of token in existence */ function totalSupply(uint256 _id) public view returns (uint256) { return tokenSupply[_id]; } /** * @dev Returns the max quantity for a token ID * @param _id uint256 ID of the token to query * @return amount of token in existence */ function maxSupply(uint256 _id) public view returns (uint256) { return tokenMaxSupply[_id]; } /** * @dev Will update the base URL of token's URI * @param _newBaseMetadataURI New base URL of token's URI */ function setBaseMetadataURI(string memory _newBaseMetadataURI) public onlyWhitelistAdmin { _setBaseMetadataURI(_newBaseMetadataURI); } /** * @dev Creates a new token type and assigns _initialSupply to an address * @param _maxSupply max supply allowed * @param _initialSupply Optional amount to supply the first owner * @param _uri Optional URI for this token type * @param _data Optional data to pass if receiver is contract * @return The newly created token ID */ function create( uint256 _maxSupply, uint256 _initialSupply, string calldata _uri, bytes calldata _data ) external onlyWhitelistAdmin returns (uint256 tokenId) { require(_initialSupply <= _maxSupply, "Initial supply cannot be more than max supply"); uint256 _id = _getNextTokenID(); _incrementTokenTypeId(); creators[_id] = msg.sender; if (bytes(_uri).length > 0) { emit URI(_uri, _id); } if (_initialSupply != 0) _mint(msg.sender, _id, _initialSupply, _data); tokenSupply[_id] = _initialSupply; tokenMaxSupply[_id] = _maxSupply; return _id; } /** * @dev Mints some amount of tokens to an address * @param _to Address of the future owner of the token * @param _id Token ID to mint * @param _quantity Amount of tokens to mint * @param _data Data to pass if receiver is contract */ function mint( address _to, uint256 _id, uint256 _quantity, bytes memory _data ) public onlyMinter { uint256 tokenId = _id; uint256 newSupply = tokenSupply[tokenId].add(_quantity); require(newSupply <= tokenMaxSupply[tokenId], "Max supply reached"); _mint(_to, _id, _quantity, _data); tokenSupply[_id] = tokenSupply[_id].add(_quantity); } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-free listings - The Beano of NFTs */ function isApprovedForAll(address _owner, address _operator) public view returns (bool isOperator) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(_owner)) == _operator) { return true; } return ERC1155.isApprovedForAll(_owner, _operator); } /** * @dev Returns whether the specified token exists by checking to see if it has a creator * @param _id uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 _id) internal view returns (bool) { return creators[_id] != address(0); } /** * @dev calculates the next token ID based on value of _currentTokenID * @return uint256 for the next token ID */ function _getNextTokenID() private view returns (uint256) { return _currentTokenID.add(1); } /** * @dev increments the value of _currentTokenID */ function _incrementTokenTypeId() private { _currentTokenID++; } } /** * @title Pepemon Factory * PEPEMON - gotta farm em all */ contract PepemonFactory is ERC1155Tradable { string private _contractURI; constructor(address _proxyRegistryAddress) public ERC1155Tradable("PepemonFactory", "PEPEMON", _proxyRegistryAddress) { _setBaseMetadataURI("https://pepemon.finance/api/cards/"); _contractURI = "https://pepemon.finance/api/pepemon-erc1155"; } function setBaseMetadataURI(string memory newURI) public onlyWhitelistAdmin { _setBaseMetadataURI(newURI); } function setContractURI(string memory newURI) public onlyWhitelistAdmin { _contractURI = newURI; } function contractURI() public view returns (string memory) { return _contractURI; } /** * @dev Ends minting of token * @param _id Token ID for which minting will end */ function endMinting(uint256 _id) external onlyWhitelistAdmin { tokenMaxSupply[_id] = tokenSupply[_id]; } function burn(address _account, uint256 _id, uint256 _amount) public onlyMinter { require(balanceOf(_account, _id) >= _amount, "Cannot burn more than addres has"); _burn(_account, _id, _amount); } /** * Mint NFT and send those to the list of given addresses */ function airdrop(uint256 _id, address[] memory _addresses) public onlyMinter { require(tokenMaxSupply[_id] - tokenSupply[_id] >= _addresses.length, "Cant mint above max supply"); for (uint256 i = 0; i < _addresses.length; i++) { mint(_addresses[i], _id, 1, ""); } } } /* Constructor Argument To Add During Deployment OpenSea Registry Address 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1 0xa5409ec958c83c3f309868babaca7c86dcb077c1 */
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_uri","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"airdrop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"create","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"endMinting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setContractURI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260006007553480156200001657600080fd5b5060405162004cb038038062004cb0833981810160405260208110156200003c57600080fd5b81019080805190602001909291905050506040518060400160405280600e81526020017f506570656d6f6e466163746f72790000000000000000000000000000000000008152506040518060400160405280600781526020017f504550454d4f4e00000000000000000000000000000000000000000000000000815250826000620000cc6200028460201b60201c565b905080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506200018b6200017f6200028460201b60201c565b6200028c60201b60201c565b620001ab6200019f6200028460201b60201c565b620002ed60201b60201c565b82600b9080519060200190620001c39291906200052e565b5081600c9080519060200190620001dc9291906200052e565b5080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506200024b60405180606001604052806022815260200162004c8e602291396200034e60201b60201c565b6040518060600160405280602b815260200162004c41602b9139600d90805190602001906200027c9291906200052e565b5050620005dd565b600033905090565b620002a78160046200036a60201b620041e61790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b620003088160056200036a60201b620041e61790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b8060029080519060200190620003669291906200052e565b5050565b6200037c82826200044e60201b60201c565b15620003f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620004d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602281526020018062004c6c6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200057157805160ff1916838001178555620005a2565b82800160010185558215620005a2579182015b82811115620005a157825182559160200191906001019062000584565b5b509050620005b19190620005b5565b5090565b620005da91905b80821115620005d6576000816000905550600101620005bc565b5090565b90565b61465480620005ed6000396000f3fe608060405234801561001057600080fd5b506004361061020f5760003560e01c80638f32d59b11610125578063bb5f747b116100ad578063e8a3d4851161007c578063e8a3d485146110af578063e985e9c514611132578063f242432a146111ae578063f2fde38b146112bd578063f5298aca146113015761020f565b8063bb5f747b14610ee1578063bd85b03914610f3d578063bdf7a8e614610f7f578063cd53d08e146110415761020f565b8063983b2d56116100f4578063983b2d5614610cf15780639865027514610d35578063a22cb46514610d3f578063aa271e1a14610d8f578063b09ddf7b14610deb5761020f565b80638f32d59b14610b63578063938e3d7b14610b8557806394dd286914610c4057806395d89b4114610c6e5761020f565b80634c5a628c116101a8578063731133e911610177578063731133e9146108e95780637362d9c8146109d85780637e518ec814610a1c578063869f759414610ad75780638da5cb5b14610b195761020f565b80634c5a628c146106f05780634e1273f4146106fa5780636897e9741461089b578063715018a6146108df5761020f565b80630e89341c116101e45780630e89341c146103a05780632693ebf2146104475780632eb2c2d6146104895780633092afd5146106ac5761020f565b80624221f014610214578062fdd58e1461025657806301ffc9a7146102b857806306fdde031461031d575b600080fd5b6102406004803603602081101561022a57600080fd5b8101908080359060200190929190505050611359565b6040518082815260200191505060405180910390f35b6102a26004803603604081101561026c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611371565b6040518082815260200191505060405180910390f35b610303600480360360208110156102ce57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506113cb565b604051808215151515815260200191505060405180910390f35b61032561147c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036557808201518184015260208101905061034a565b50505050905090810190601f1680156103925780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103cc600480360360208110156103b657600080fd5b810190808035906020019092919050505061151a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561040c5780820151818401526020810190506103f1565b50505050905090810190601f1680156104395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104736004803603602081101561045d57600080fd5b810190808035906020019092919050505061162d565b6040518082815260200191505060405180910390f35b6106aa600480360360a081101561049f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156104fc57600080fd5b82018360208201111561050e57600080fd5b8035906020019184602083028401116401000000008311171561053057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561059057600080fd5b8201836020820111156105a257600080fd5b803590602001918460208302840111640100000000831117156105c457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561062457600080fd5b82018360208201111561063657600080fd5b8035906020019184600183028401116401000000008311171561065857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611645565b005b6106ee600480360360208110156106c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611780565b005b6106f8611806565b005b6108446004803603604081101561071057600080fd5b810190808035906020019064010000000081111561072d57600080fd5b82018360208201111561073f57600080fd5b8035906020019184602083028401116401000000008311171561076157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107c157600080fd5b8201836020820111156107d357600080fd5b803590602001918460208302840111640100000000831117156107f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611818565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561088757808201518184015260208101905061086c565b505050509050019250505060405180910390f35b6108dd600480360360208110156108b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061195e565b005b6108e76119e4565b005b6109d6600480360360808110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561095057600080fd5b82018360208201111561096257600080fd5b8035906020019184600183028401116401000000008311171561098457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b1f565b005b610a1a600480360360208110156109ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c8d565b005b610ad560048036036020811015610a3257600080fd5b8101908080359060200190640100000000811115610a4f57600080fd5b820183602082011115610a6157600080fd5b80359060200191846001830284011164010000000083111715610a8357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cfe565b005b610b0360048036036020811015610aed57600080fd5b8101908080359060200190929190505050611d6f565b6040518082815260200191505060405180910390f35b610b21611d8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b6b611db6565b604051808215151515815260200191505060405180910390f35b610c3e60048036036020811015610b9b57600080fd5b8101908080359060200190640100000000811115610bb857600080fd5b820183602082011115610bca57600080fd5b80359060200191846001830284011164010000000083111715610bec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611e15565b005b610c6c60048036036020811015610c5657600080fd5b8101908080359060200190929190505050611e94565b005b610c76611f27565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cb6578082015181840152602081019050610c9b565b50505050905090810190601f168015610ce35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610d3360048036036020811015610d0757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc5565b005b610d3d612036565b005b610d8d60048036036040811015610d5557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612048565b005b610dd160048036036020811015610da557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612149565b604051808215151515815260200191505060405180910390f35b610ecb60048036036080811015610e0157600080fd5b81019080803590602001909291908035906020019092919080359060200190640100000000811115610e3257600080fd5b820183602082011115610e4457600080fd5b80359060200191846001830284011164010000000083111715610e6657600080fd5b909192939192939080359060200190640100000000811115610e8757600080fd5b820183602082011115610e9957600080fd5b80359060200191846001830284011164010000000083111715610ebb57600080fd5b9091929391929390505050612166565b6040518082815260200191505060405180910390f35b610f2360048036036020811015610ef757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612394565b604051808215151515815260200191505060405180910390f35b610f6960048036036020811015610f5357600080fd5b81019080803590602001909291905050506123b1565b6040518082815260200191505060405180910390f35b61103f60048036036040811015610f9557600080fd5b810190808035906020019092919080359060200190640100000000811115610fbc57600080fd5b820183602082011115610fce57600080fd5b80359060200191846020830284011164010000000083111715610ff057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506123ce565b005b61106d6004803603602081101561105757600080fd5b8101908080359060200190929190505050612522565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110b7612555565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110f75780820151818401526020810190506110dc565b50505050905090810190601f1680156111245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6111946004803603604081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125f7565b604051808215151515815260200191505060405180910390f35b6112bb600480360360a08110156111c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561123557600080fd5b82018360208201111561124757600080fd5b8035906020019184600183028401116401000000008311171561126957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612728565b005b6112ff600480360360208110156112d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612863565b005b6113576004803603606081101561131757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506128e9565b005b600a6020528060005260406000206000915090505481565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611464575063d9b67a2660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156114725760019050611477565b600090505b919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115125780601f106114e757610100808354040283529160200191611512565b820191906000526020600020905b8154815290600101906020018083116114f557829003601f168201915b505050505081565b6060611525826129dd565b61157a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806144986025913960400191505060405180910390fd5b61162660028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116135780601f106115e857610100808354040283529160200191611613565b820191906000526020600020905b8154815290600101906020018083116115f657829003601f168201915b505050505061162184612a49565b612b76565b9050919050565b60096020528060005260406000206000915090505481565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611685575061168485336125f7565b5b6116da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614578602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144686030913960400191505060405180910390fd5b61176c85858585612bba565b6117798585858585612f1f565b5050505050565b611788611db6565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611803816131da565b50565b611816611811613234565b61323c565b565b60608151835114611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061454c602c913960400191505060405180910390fd5b606083516040519080825280602002602001820160405280156118a65781602001602082028038833980820191505090505b50905060008090505b8451811015611953576000808683815181106118c757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085838151811061191757fe5b602002602001015181526020019081526020016000205482828151811061193a57fe5b60200260200101818152505080806001019150506118af565b508091505092915050565b611966611db6565b6119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6119e18161323c565b50565b6119ec611db6565b611a5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b2f611b2a613234565b612149565b611b84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b60008390506000611bb184600960008581526020019081526020016000205461329690919063ffffffff16565b9050600a600083815260200190815260200160002054811115611c3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4d617820737570706c792072656163686564000000000000000000000000000081525060200191505060405180910390fd5b611c488686868661331e565b611c6e84600960008881526020019081526020016000205461329690919063ffffffff16565b6009600087815260200190815260200160002081905550505050505050565b611c9d611c98613234565b612394565b611cf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b611cfb8161346c565b50565b611d0e611d09613234565b612394565b611d63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b611d6c816134c6565b50565b6000600a6000838152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611df9613234565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b611e25611e20613234565b612394565b611e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b80600d9080519060200190611e909291906142c1565b5050565b611ea4611e9f613234565b612394565b611ef9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b6009600082815260200190815260200160002054600a60008381526020019081526020016000208190555050565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fbd5780601f10611f9257610100808354040283529160200191611fbd565b820191906000526020600020905b815481529060010190602001808311611fa057829003601f168201915b505050505081565b611fd5611fd0613234565b612149565b61202a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b612033816134e0565b50565b612046612041613234565b6131da565b565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b600061215f82600461353a90919063ffffffff16565b9050919050565b6000612178612173613234565b612394565b6121cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b86861115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806144bd602d913960400191505060405180910390fd5b6000612230613618565b905061223a613635565b336008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008686905011156122fd57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b878760405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a25b600087146123565761235533828987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061331e565b5b86600960008381526020019081526020016000208190555087600a600083815260200190815260200160002081905550809150509695505050505050565b60006123aa82600561353a90919063ffffffff16565b9050919050565b600060096000838152602001908152602001600020549050919050565b6123de6123d9613234565b612149565b612433576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b80516009600084815260200190815260200160002054600a6000858152602001908152602001600020540310156124d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e74206d696e742061626f7665206d617820737570706c7900000000000081525060200191505060405180910390fd5b60008090505b815181101561251d576125108282815181106124f057fe5b602002602001015184600160405180602001604052806000815250611b1f565b80806001019150506124d8565b505050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125ed5780601f106125c2576101008083540402835291602001916125ed565b820191906000526020600020905b8154815290600101906020018083116125d057829003601f168201915b5050505050905090565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126b357600080fd5b505afa1580156126c7573d6000803e3d6000fd5b505050506040513d60208110156126dd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415612714576001915050612722565b61271e8484613649565b9150505b92915050565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612768575061276785336125f7565b5b6127bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806143b8602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614367602b913960400191505060405180910390fd5b61284f858585856136dd565b61285c85858585856138d1565b5050505050565b61286b611db6565b6128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6128e681613b0a565b50565b6128f96128f4613234565b612149565b61294e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b806129598484611371565b10156129cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74206275726e206d6f7265207468616e206164647265732068617381525060200191505060405180910390fd5b6129d8838383613c50565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415612a91576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b71565b600082905060005b60008214612abb578080600101915050600a8281612ab357fe5b049150612a99565b6060816040519080825280601f01601f191660200182016040528015612af05781602001600182028038833980820191505090505b50905060006001830390505b60008614612b6957600a8681612b0e57fe5b0660300160f81b82828060019003935081518110612b2857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681612b6157fe5b049550612afc565b819450505050505b919050565b6060612bb28383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250613d8f565b905092915050565b8051825114612c14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806143e26035913960400191505060405180910390fd5b60008251905060008090505b81811015612e1157612cb0838281518110612c3757fe5b60200260200101516000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878581518110612c8b57fe5b602002602001015181526020019081526020016000205461405590919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868481518110612cfc57fe5b6020026020010151815260200190815260200160002081905550612d9e838281518110612d2557fe5b60200260200101516000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878581518110612d7957fe5b602002602001015181526020019081526020016000205461329690919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868481518110612dea57fe5b60200260200101518152602001908152602001600020819055508080600101915050612c20565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612ec1578082015181840152602081019050612ea6565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612f03578082015181840152602081019050612ee8565b5050505090500194505050505060405180910390a45050505050565b612f3e8473ffffffffffffffffffffffffffffffffffffffff166140de565b156131d35760008473ffffffffffffffffffffffffffffffffffffffff1663bc197c8133888787876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613024578082015181840152602081019050613009565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561306657808201518184015260208101905061304b565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156130a557808201518184015260208101905061308a565b50505050905090810190601f1680156130d25780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b1580156130f757600080fd5b505af115801561310b573d6000803e3d6000fd5b505050506040513d602081101561312157600080fd5b8101908080519060200190929190505050905063bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f8152602001806145a7603f913960400191505060405180910390fd5b505b5050505050565b6131ee81600461412990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600033905090565b61325081600561412990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b600080828401905083811015613314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d617468236164643a204f564552464c4f570000000000000000000081525060200191505060405180910390fd5b8091505092915050565b613380826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000205461329690919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a46134666000858585856138d1565b50505050565b6134808160056141e690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b80600290805190602001906134dc9291906142c1565b5050565b6134f48160046141e690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144ea6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000613630600160075461329690919063ffffffff16565b905090565b600760008154809291906001019190505550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61373f816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461405590919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055506137f4816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461329690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6138f08473ffffffffffffffffffffffffffffffffffffffff166140de565b15613b035760008473ffffffffffffffffffffffffffffffffffffffff1663f23a6e6133888787876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139d75780820151818401526020810190506139bc565b50505050905090810190601f168015613a045780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015613a2757600080fd5b505af1158015613a3b573d6000803e3d6000fd5b505050506040513d6020811015613a5157600080fd5b8101908080519060200190929190505050905063f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806145e6603a913960400191505060405180910390fd5b505b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143926026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b613cb2816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461405590919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a4505050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f191660200182016040528015613deb5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8851811015613e6c57888181518110613e1357fe5b602001015160f81c60f81b838380600101945081518110613e3057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613dfe565b5060008090505b8751811015613ee157878181518110613e8857fe5b602001015160f81c60f81b838380600101945081518110613ea557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613e73565b5060008090505b8651811015613f5657868181518110613efd57fe5b602001015160f81c60f81b838380600101945081518110613f1a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613ee8565b5060008090505b8551811015613fcb57858181518110613f7257fe5b602001015160f81c60f81b838380600101945081518110613f8f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613f5d565b5060008090505b845181101561404057848181518110613fe757fe5b602001015160f81c60f81b83838060010194508151811061400457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613fd2565b50819850505050505050505095945050505050565b6000828211156140cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f536166654d617468237375623a20554e444552464c4f5700000000000000000081525060200191505060405180910390fd5b600082840390508091505092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156141205750808214155b92505050919050565b614133828261353a565b614188576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144476021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6141f0828261353a565b15614263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061430257805160ff1916838001178555614330565b82800160010185558215614330579182015b8281111561432f578251825591602001919060010190614314565b5b50905061433d9190614341565b5090565b61436391905b8082111561435f576000816000905550600101614347565b5090565b9056fe4552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e4754484d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544552433732315472616461626c65237572693a204e4f4e4558495354454e545f544f4b454e496e697469616c20737570706c792063616e6e6f74206265206d6f7265207468616e206d617820737570706c79526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c65455243313135352362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474545524331313535235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745a265627a7a72315820d916d0ba05c298c27abb30d088b2fcf5c64f63e9a28de789f812b456dd4b97b264736f6c6343000511003268747470733a2f2f706570656d6f6e2e66696e616e63652f6170692f706570656d6f6e2d65726331313535526f6c65733a206163636f756e7420697320746865207a65726f206164647265737368747470733a2f2f706570656d6f6e2e66696e616e63652f6170692f63617264732f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061020f5760003560e01c80638f32d59b11610125578063bb5f747b116100ad578063e8a3d4851161007c578063e8a3d485146110af578063e985e9c514611132578063f242432a146111ae578063f2fde38b146112bd578063f5298aca146113015761020f565b8063bb5f747b14610ee1578063bd85b03914610f3d578063bdf7a8e614610f7f578063cd53d08e146110415761020f565b8063983b2d56116100f4578063983b2d5614610cf15780639865027514610d35578063a22cb46514610d3f578063aa271e1a14610d8f578063b09ddf7b14610deb5761020f565b80638f32d59b14610b63578063938e3d7b14610b8557806394dd286914610c4057806395d89b4114610c6e5761020f565b80634c5a628c116101a8578063731133e911610177578063731133e9146108e95780637362d9c8146109d85780637e518ec814610a1c578063869f759414610ad75780638da5cb5b14610b195761020f565b80634c5a628c146106f05780634e1273f4146106fa5780636897e9741461089b578063715018a6146108df5761020f565b80630e89341c116101e45780630e89341c146103a05780632693ebf2146104475780632eb2c2d6146104895780633092afd5146106ac5761020f565b80624221f014610214578062fdd58e1461025657806301ffc9a7146102b857806306fdde031461031d575b600080fd5b6102406004803603602081101561022a57600080fd5b8101908080359060200190929190505050611359565b6040518082815260200191505060405180910390f35b6102a26004803603604081101561026c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611371565b6040518082815260200191505060405180910390f35b610303600480360360208110156102ce57600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506113cb565b604051808215151515815260200191505060405180910390f35b61032561147c565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561036557808201518184015260208101905061034a565b50505050905090810190601f1680156103925780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103cc600480360360208110156103b657600080fd5b810190808035906020019092919050505061151a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561040c5780820151818401526020810190506103f1565b50505050905090810190601f1680156104395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104736004803603602081101561045d57600080fd5b810190808035906020019092919050505061162d565b6040518082815260200191505060405180910390f35b6106aa600480360360a081101561049f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156104fc57600080fd5b82018360208201111561050e57600080fd5b8035906020019184602083028401116401000000008311171561053057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561059057600080fd5b8201836020820111156105a257600080fd5b803590602001918460208302840111640100000000831117156105c457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192908035906020019064010000000081111561062457600080fd5b82018360208201111561063657600080fd5b8035906020019184600183028401116401000000008311171561065857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611645565b005b6106ee600480360360208110156106c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611780565b005b6106f8611806565b005b6108446004803603604081101561071057600080fd5b810190808035906020019064010000000081111561072d57600080fd5b82018360208201111561073f57600080fd5b8035906020019184602083028401116401000000008311171561076157600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290803590602001906401000000008111156107c157600080fd5b8201836020820111156107d357600080fd5b803590602001918460208302840111640100000000831117156107f557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050611818565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561088757808201518184015260208101905061086c565b505050509050019250505060405180910390f35b6108dd600480360360208110156108b157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061195e565b005b6108e76119e4565b005b6109d6600480360360808110156108ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561095057600080fd5b82018360208201111561096257600080fd5b8035906020019184600183028401116401000000008311171561098457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611b1f565b005b610a1a600480360360208110156109ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c8d565b005b610ad560048036036020811015610a3257600080fd5b8101908080359060200190640100000000811115610a4f57600080fd5b820183602082011115610a6157600080fd5b80359060200191846001830284011164010000000083111715610a8357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611cfe565b005b610b0360048036036020811015610aed57600080fd5b8101908080359060200190929190505050611d6f565b6040518082815260200191505060405180910390f35b610b21611d8c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b6b611db6565b604051808215151515815260200191505060405180910390f35b610c3e60048036036020811015610b9b57600080fd5b8101908080359060200190640100000000811115610bb857600080fd5b820183602082011115610bca57600080fd5b80359060200191846001830284011164010000000083111715610bec57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611e15565b005b610c6c60048036036020811015610c5657600080fd5b8101908080359060200190929190505050611e94565b005b610c76611f27565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cb6578082015181840152602081019050610c9b565b50505050905090810190601f168015610ce35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610d3360048036036020811015610d0757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fc5565b005b610d3d612036565b005b610d8d60048036036040811015610d5557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050612048565b005b610dd160048036036020811015610da557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612149565b604051808215151515815260200191505060405180910390f35b610ecb60048036036080811015610e0157600080fd5b81019080803590602001909291908035906020019092919080359060200190640100000000811115610e3257600080fd5b820183602082011115610e4457600080fd5b80359060200191846001830284011164010000000083111715610e6657600080fd5b909192939192939080359060200190640100000000811115610e8757600080fd5b820183602082011115610e9957600080fd5b80359060200191846001830284011164010000000083111715610ebb57600080fd5b9091929391929390505050612166565b6040518082815260200191505060405180910390f35b610f2360048036036020811015610ef757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612394565b604051808215151515815260200191505060405180910390f35b610f6960048036036020811015610f5357600080fd5b81019080803590602001909291905050506123b1565b6040518082815260200191505060405180910390f35b61103f60048036036040811015610f9557600080fd5b810190808035906020019092919080359060200190640100000000811115610fbc57600080fd5b820183602082011115610fce57600080fd5b80359060200191846020830284011164010000000083111715610ff057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506123ce565b005b61106d6004803603602081101561105757600080fd5b8101908080359060200190929190505050612522565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6110b7612555565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156110f75780820151818401526020810190506110dc565b50505050905090810190601f1680156111245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6111946004803603604081101561114857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125f7565b604051808215151515815260200191505060405180910390f35b6112bb600480360360a08110156111c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019064010000000081111561123557600080fd5b82018360208201111561124757600080fd5b8035906020019184600183028401116401000000008311171561126957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612728565b005b6112ff600480360360208110156112d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612863565b005b6113576004803603606081101561131757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506128e9565b005b600a6020528060005260406000206000915090505481565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611464575063d9b67a2660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b156114725760019050611477565b600090505b919050565b600b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156115125780601f106114e757610100808354040283529160200191611512565b820191906000526020600020905b8154815290600101906020018083116114f557829003601f168201915b505050505081565b6060611525826129dd565b61157a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806144986025913960400191505060405180910390fd5b61162660028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116135780601f106115e857610100808354040283529160200191611613565b820191906000526020600020905b8154815290600101906020018083116115f657829003601f168201915b505050505061162184612a49565b612b76565b9050919050565b60096020528060005260406000206000915090505481565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611685575061168485336125f7565b5b6116da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614578602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611760576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144686030913960400191505060405180910390fd5b61176c85858585612bba565b6117798585858585612f1f565b5050505050565b611788611db6565b6117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611803816131da565b50565b611816611811613234565b61323c565b565b60608151835114611874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061454c602c913960400191505060405180910390fd5b606083516040519080825280602002602001820160405280156118a65781602001602082028038833980820191505090505b50905060008090505b8451811015611953576000808683815181106118c757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085838151811061191757fe5b602002602001015181526020019081526020016000205482828151811061193a57fe5b60200260200101818152505080806001019150506118af565b508091505092915050565b611966611db6565b6119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6119e18161323c565b50565b6119ec611db6565b611a5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611b2f611b2a613234565b612149565b611b84576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b60008390506000611bb184600960008581526020019081526020016000205461329690919063ffffffff16565b9050600a600083815260200190815260200160002054811115611c3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4d617820737570706c792072656163686564000000000000000000000000000081525060200191505060405180910390fd5b611c488686868661331e565b611c6e84600960008881526020019081526020016000205461329690919063ffffffff16565b6009600087815260200190815260200160002081905550505050505050565b611c9d611c98613234565b612394565b611cf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b611cfb8161346c565b50565b611d0e611d09613234565b612394565b611d63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b611d6c816134c6565b50565b6000600a6000838152602001908152602001600020549050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611df9613234565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b611e25611e20613234565b612394565b611e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b80600d9080519060200190611e909291906142c1565b5050565b611ea4611e9f613234565b612394565b611ef9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b6009600082815260200190815260200160002054600a60008381526020019081526020016000208190555050565b600c8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611fbd5780601f10611f9257610100808354040283529160200191611fbd565b820191906000526020600020905b815481529060010190602001808311611fa057829003601f168201915b505050505081565b611fd5611fd0613234565b612149565b61202a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b612033816134e0565b50565b612046612041613234565b6131da565b565b80600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b600061215f82600461353a90919063ffffffff16565b9050919050565b6000612178612173613234565b612394565b6121cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604081526020018061450c6040913960400191505060405180910390fd5b86861115612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806144bd602d913960400191505060405180910390fd5b6000612230613618565b905061223a613635565b336008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008686905011156122fd57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b878760405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a25b600087146123565761235533828987878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061331e565b5b86600960008381526020019081526020016000208190555087600a600083815260200190815260200160002081905550809150509695505050505050565b60006123aa82600561353a90919063ffffffff16565b9050919050565b600060096000838152602001908152602001600020549050919050565b6123de6123d9613234565b612149565b612433576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b80516009600084815260200190815260200160002054600a6000858152602001908152602001600020540310156124d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f43616e74206d696e742061626f7665206d617820737570706c7900000000000081525060200191505060405180910390fd5b60008090505b815181101561251d576125108282815181106124f057fe5b602002602001015184600160405180602001604052806000815250611b1f565b80806001019150506124d8565b505050565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600d8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156125ed5780601f106125c2576101008083540402835291602001916125ed565b820191906000526020600020905b8154815290600101906020018083116125d057829003601f168201915b5050505050905090565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156126b357600080fd5b505afa1580156126c7573d6000803e3d6000fd5b505050506040513d60208110156126dd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415612714576001915050612722565b61271e8484613649565b9150505b92915050565b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612768575061276785336125f7565b5b6127bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806143b8602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612843576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614367602b913960400191505060405180910390fd5b61284f858585856136dd565b61285c85858585856138d1565b5050505050565b61286b611db6565b6128dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6128e681613b0a565b50565b6128f96128f4613234565b612149565b61294e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806144176030913960400191505060405180910390fd5b806129598484611371565b10156129cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f43616e6e6f74206275726e206d6f7265207468616e206164647265732068617381525060200191505060405180910390fd5b6129d8838383613c50565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166008600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b60606000821415612a91576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b71565b600082905060005b60008214612abb578080600101915050600a8281612ab357fe5b049150612a99565b6060816040519080825280601f01601f191660200182016040528015612af05781602001600182028038833980820191505090505b50905060006001830390505b60008614612b6957600a8681612b0e57fe5b0660300160f81b82828060019003935081518110612b2857fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681612b6157fe5b049550612afc565b819450505050505b919050565b6060612bb28383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250613d8f565b905092915050565b8051825114612c14576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806143e26035913960400191505060405180910390fd5b60008251905060008090505b81811015612e1157612cb0838281518110612c3757fe5b60200260200101516000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878581518110612c8b57fe5b602002602001015181526020019081526020016000205461405590919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868481518110612cfc57fe5b6020026020010151815260200190815260200160002081905550612d9e838281518110612d2557fe5b60200260200101516000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000878581518110612d7957fe5b602002602001015181526020019081526020016000205461329690919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000868481518110612dea57fe5b60200260200101518152602001908152602001600020819055508080600101915050612c20565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612ec1578082015181840152602081019050612ea6565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612f03578082015181840152602081019050612ee8565b5050505090500194505050505060405180910390a45050505050565b612f3e8473ffffffffffffffffffffffffffffffffffffffff166140de565b156131d35760008473ffffffffffffffffffffffffffffffffffffffff1663bc197c8133888787876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613024578082015181840152602081019050613009565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561306657808201518184015260208101905061304b565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156130a557808201518184015260208101905061308a565b50505050905090810190601f1680156130d25780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b1580156130f757600080fd5b505af115801561310b573d6000803e3d6000fd5b505050506040513d602081101561312157600080fd5b8101908080519060200190929190505050905063bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603f8152602001806145a7603f913960400191505060405180910390fd5b505b5050505050565b6131ee81600461412990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600033905090565b61325081600561412990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b600080828401905083811015613314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f536166654d617468236164643a204f564552464c4f570000000000000000000081525060200191505060405180910390fd5b8091505092915050565b613380826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008681526020019081526020016000205461329690919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a46134666000858585856138d1565b50505050565b6134808160056141e690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b80600290805190602001906134dc9291906142c1565b5050565b6134f48160046141e690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806144ea6022913960400191505060405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000613630600160075461329690919063ffffffff16565b905090565b600760008154809291906001019190505550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61373f816000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461405590919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055506137f4816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461329690919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a450505050565b6138f08473ffffffffffffffffffffffffffffffffffffffff166140de565b15613b035760008473ffffffffffffffffffffffffffffffffffffffff1663f23a6e6133888787876040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156139d75780820151818401526020810190506139bc565b50505050905090810190601f168015613a045780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015613a2757600080fd5b505af1158015613a3b573d6000803e3d6000fd5b505050506040513d6020811015613a5157600080fd5b8101908080519060200190929190505050905063f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613b01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a8152602001806145e6603a913960400191505060405180910390fd5b505b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613b90576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806143926026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b613cb2816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008581526020019081526020016000205461405590919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051808381526020018281526020019250505060405180910390a4505050565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f191660200182016040528015613deb5781602001600182028038833980820191505090505b5090506060819050600080905060008090505b8851811015613e6c57888181518110613e1357fe5b602001015160f81c60f81b838380600101945081518110613e3057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613dfe565b5060008090505b8751811015613ee157878181518110613e8857fe5b602001015160f81c60f81b838380600101945081518110613ea557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613e73565b5060008090505b8651811015613f5657868181518110613efd57fe5b602001015160f81c60f81b838380600101945081518110613f1a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613ee8565b5060008090505b8551811015613fcb57858181518110613f7257fe5b602001015160f81c60f81b838380600101945081518110613f8f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613f5d565b5060008090505b845181101561404057848181518110613fe757fe5b602001015160f81c60f81b83838060010194508151811061400457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508080600101915050613fd2565b50819850505050505050505095945050505050565b6000828211156140cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f536166654d617468237375623a20554e444552464c4f5700000000000000000081525060200191505060405180910390fd5b600082840390508091505092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b82141580156141205750808214155b92505050919050565b614133828261353a565b614188576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806144476021913960400191505060405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6141f0828261353a565b15614263576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650081525060200191505060405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061430257805160ff1916838001178555614330565b82800160010185558215614330579182015b8281111561432f578251825591602001919060010190614314565b5b50905061433d9190614341565b5090565b61436391905b8082111561435f576000816000905550600101614347565b5090565b9056fe4552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e4754484d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865204d696e74657220726f6c65526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544552433732315472616461626c65237572693a204e4f4e4558495354454e545f544f4b454e496e697469616c20737570706c792063616e6e6f74206265206d6f7265207468616e206d617820737570706c79526f6c65733a206163636f756e7420697320746865207a65726f206164647265737357686974656c69737441646d696e526f6c653a2063616c6c657220646f6573206e6f742068617665207468652057686974656c69737441646d696e20726f6c65455243313135352362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474545524331313535235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745a265627a7a72315820d916d0ba05c298c27abb30d088b2fcf5c64f63e9a28de789f812b456dd4b97b264736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Deployed Bytecode Sourcemap
44983:1567:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44983:1567:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40055:49;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40055:49:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27703:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27703:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29784:264;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;29784:264:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;40133:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;40133:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40686:218;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40686:218:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;40686:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40002:46;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40002:46:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;22592:535;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;22592:535:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22592:535:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22592:535:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;22592:535:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;22592:535:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22592:535:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22592:535:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;22592:535:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;22592:535:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;22592:535:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;22592:535:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;22592:535:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;22592:535:0;;;;;;;;;;;;;;;:::i;:::-;;40581:97;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40581:97:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;5996:95;;;:::i;:::-;;28140:538;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28140:538:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;28140:538:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28140:538:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28140:538:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;28140:538:0;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;28140:538:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;28140:538:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;28140:538:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;28140:538:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;28140:538:0;;;;;;;;;;;;;;;;;40460:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40460:113:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;2367:140;;;:::i;:::-;;43155:429;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;43155:429:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;43155:429:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43155:429:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;43155:429:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;43155:429:0;;;;;;;;;;;;;;;:::i;:::-;;5872:116;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5872:116:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;45342:122;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45342:122:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;45342:122:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45342:122:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45342:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;45342:122:0;;;;;;;;;;;;;;;:::i;:::-;;41364:107;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41364:107:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1556:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1922:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45472:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45472:112:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;45472:112:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45472:112:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45472:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;45472:112:0;;;;;;;;;;;;;;;:::i;:::-;;45805:118;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45805:118:0;;;;;;;;;;;;;;;;;:::i;:::-;;40182:20;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;40182:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4653:92;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4653:92:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;4753:79;;;:::i;:::-;;26651:243;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26651:243:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4536:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4536:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42146:696;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42146:696:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;42146:696:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42146:696:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42146:696:0;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;42146:696:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;42146:696:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;42146:696:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5739:125;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5739:125:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41082:106;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41082:106:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46237:310;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46237:310:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;46237:310:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46237:310:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;46237:310:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;46237:310:0;;;;;;;;;;;;;;;:::i;:::-;;39952:43;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39952:43:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;45592:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;45592:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43735:414;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43735:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;21612:569;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;21612:569:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;21612:569:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;21612:569:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;21612:569:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;21612:569:0;;;;;;;;;;;;;;;:::i;:::-;;2662:109;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2662:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;45931:219;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45931:219:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40055:49;;;;;;;;;;;;;;;;;:::o;27703:135::-;27777:7;27809:8;:16;27818:6;27809:16;;;;;;;;;;;;;;;:21;27826:3;27809:21;;;;;;;;;;;;27802:28;;27703:135;;;;:::o;29784:264::-;29855:4;28975:10;29892:26;;29876:42;;;:12;:42;;;;:102;;;;29539:10;29951:27;;29935:43;;;:12;:43;;;;29876:102;29872:146;;;30002:4;29995:11;;;;29872:146;30035:5;30028:12;;29784:264;;;;:::o;40133:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40686:218::-;40733:13;40767:12;40775:3;40767:7;:12::i;:::-;40759:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40839:57;40857:15;40839:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40874:21;40891:3;40874:16;:21::i;:::-;40839:17;:57::i;:::-;40832:64;;40686:218;;;:::o;40002:46::-;;;;;;;;;;;;;;;;;:::o;22592:535::-;22797:5;22783:19;;:10;:19;;;22782:60;;;;22807:35;22824:5;22831:10;22807:16;:35::i;:::-;22782:60;22774:120;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22928:1;22913:17;;:3;:17;;;;22905:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22996:50;23019:5;23026:3;23031:4;23037:8;22996:22;:50::i;:::-;23057:62;23085:5;23092:3;23097:4;23103:8;23113:5;23057:27;:62::i;:::-;22592:535;;;;;:::o;40581:97::-;1768:9;:7;:9::i;:::-;1760:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40648:22;40662:7;40648:13;:22::i;:::-;40581:97;:::o;5996:95::-;6048:35;6070:12;:10;:12::i;:::-;6048:21;:35::i;:::-;5996:95::o;28140:538::-;28239:16;28299:4;:11;28281:7;:14;:29;28273:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28394:30;28441:7;:14;28427:29;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;28427:29:0;;;;28394:62;;28523:9;28535:1;28523:13;;28518:120;28542:7;:14;28538:1;:18;28518:120;;;28597:8;:20;28606:7;28614:1;28606:10;;;;;;;;;;;;;;28597:20;;;;;;;;;;;;;;;:29;28618:4;28623:1;28618:7;;;;;;;;;;;;;;28597:29;;;;;;;;;;;;28578:13;28592:1;28578:16;;;;;;;;;;;;;:48;;;;;28558:3;;;;;;;28518:120;;;;28657:13;28650:20;;;28140:538;;;;:::o;40460:113::-;1768:9;:7;:9::i;:::-;1760:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40535:30;40557:7;40535:21;:30::i;:::-;40460:113;:::o;2367:140::-;1768:9;:7;:9::i;:::-;1760:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2466:1;2429:40;;2450:6;;;;;;;;;;;2429:40;;;;;;;;;;;;2497:1;2480:6;;:19;;;;;;;;;;;;;;;;;;2367:140::o;43155:429::-;4433:22;4442:12;:10;:12::i;:::-;4433:8;:22::i;:::-;4425:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43306:15;43324:3;43306:21;;43338:17;43358:35;43383:9;43358:11;:20;43370:7;43358:20;;;;;;;;;;;;:24;;:35;;;;:::i;:::-;43338:55;;43425:14;:23;43440:7;43425:23;;;;;;;;;;;;43412:9;:36;;43404:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43482:33;43488:3;43493;43498:9;43509:5;43482;:33::i;:::-;43545:31;43566:9;43545:11;:16;43557:3;43545:16;;;;;;;;;;;;:20;;:31;;;;:::i;:::-;43526:11;:16;43538:3;43526:16;;;;;;;;;;;:50;;;;4519:1;;43155:429;;;;:::o;5872:116::-;5612:30;5629:12;:10;:12::i;:::-;5612:16;:30::i;:::-;5604:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5953:27;5972:7;5953:18;:27::i;:::-;5872:116;:::o;45342:122::-;5612:30;5629:12;:10;:12::i;:::-;5612:16;:30::i;:::-;5604:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45429:27;45449:6;45429:19;:27::i;:::-;45342:122;:::o;41364:107::-;41417:7;41444:14;:19;41459:3;41444:19;;;;;;;;;;;;41437:26;;41364:107;;;:::o;1556:79::-;1594:7;1621:6;;;;;;;;;;;1614:13;;1556:79;:::o;1922:94::-;1962:4;2002:6;;;;;;;;;;;1986:22;;:12;:10;:12::i;:::-;:22;;;1979:29;;1922:94;:::o;45472:112::-;5612:30;5629:12;:10;:12::i;:::-;5612:16;:30::i;:::-;5604:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45570:6;45555:12;:21;;;;;;;;;;;;:::i;:::-;;45472:112;:::o;45805:118::-;5612:30;5629:12;:10;:12::i;:::-;5612:16;:30::i;:::-;5604:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45899:11;:16;45911:3;45899:16;;;;;;;;;;;;45877:14;:19;45892:3;45877:19;;;;;;;;;;;:38;;;;45805:118;:::o;40182:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4653:92::-;4433:22;4442:12;:10;:12::i;:::-;4433:8;:22::i;:::-;4425:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4718:19;4729:7;4718:10;:19::i;:::-;4653:92;:::o;4753:79::-;4797:27;4811:12;:10;:12::i;:::-;4797:13;:27::i;:::-;4753:79::o;26651:243::-;26813:9;26778;:21;26788:10;26778:21;;;;;;;;;;;;;;;:32;26800:9;26778:32;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;26865:9;26838:48;;26853:10;26838:48;;;26876:9;26838:48;;;;;;;;;;;;;;;;;;;;;;26651:243;;:::o;4536:109::-;4592:4;4616:21;4629:7;4616:8;:12;;:21;;;;:::i;:::-;4609:28;;4536:109;;;:::o;42146:696::-;42330:15;5612:30;5629:12;:10;:12::i;:::-;5612:16;:30::i;:::-;5604:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42384:10;42366:14;:28;;42358:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42455:11;42469:17;:15;:17::i;:::-;42455:31;;42497:23;:21;:23::i;:::-;42547:10;42531:8;:13;42540:3;42531:13;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;42595:1;42580:4;;42574:18;;:22;42570:74;;;42628:3;42618:14;42622:4;;42618:14;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;42618:14:0;;;;;;;;;;;;;;42570:74;42678:1;42660:14;:19;42656:70;;42681:45;42687:10;42699:3;42704:14;42720:5;;42681:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;42681:45:0;;;;;;:5;:45::i;:::-;42656:70;42756:14;42737:11;:16;42749:3;42737:16;;;;;;;;;;;:33;;;;42803:10;42781:14;:19;42796:3;42781:19;;;;;;;;;;;:32;;;;42831:3;42824:10;;;42146:696;;;;;;;;:::o;5739:125::-;5803:4;5827:29;5848:7;5827:16;:20;;:29;;;;:::i;:::-;5820:36;;5739:125;;;:::o;41082:106::-;41137:7;41164:11;:16;41176:3;41164:16;;;;;;;;;;;;41157:23;;41082:106;;;:::o;46237:310::-;4433:22;4442:12;:10;:12::i;:::-;4433:8;:22::i;:::-;4425:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46375:10;:17;46355:11;:16;46367:3;46355:16;;;;;;;;;;;;46333:14;:19;46348:3;46333:19;;;;;;;;;;;;:38;:59;;46325:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46439:9;46451:1;46439:13;;46434:106;46458:10;:17;46454:1;:21;46434:106;;;46497:31;46502:10;46513:1;46502:13;;;;;;;;;;;;;;46517:3;46522:1;46497:31;;;;;;;;;;;;:4;:31::i;:::-;46477:3;;;;;;;46434:106;;;;46237:310;;:::o;39952:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;45592:97::-;45636:13;45669:12;45662:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45592:97;:::o;43735:414::-;43817:15;43908:27;43952:20;;;;;;;;;;;43908:65;;44030:9;43988:51;;43996:13;:21;;;44018:6;43996:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43996:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43996:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43996:29:0;;;;;;;;;;;;;;;;43988:51;;;43984:95;;;44063:4;44056:11;;;;;43984:95;44098:43;44123:6;44131:9;44098:24;:43::i;:::-;44091:50;;;43735:414;;;;;:::o;21612:569::-;21767:5;21753:19;;:10;:19;;;21752:60;;;;21777:35;21794:5;21801:10;21777:16;:35::i;:::-;21752:60;21744:115;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21893:1;21878:17;;:3;:17;;;;21870:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22064:43;22082:5;22089:3;22094;22099:7;22064:17;:43::i;:::-;22118:55;22141:5;22148:3;22153;22158:7;22167:5;22118:22;:55::i;:::-;21612:569;;;;;:::o;2662:109::-;1768:9;:7;:9::i;:::-;1760:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2735:28;2754:8;2735:18;:28::i;:::-;2662:109;:::o;45931:219::-;4433:22;4442:12;:10;:12::i;:::-;4433:8;:22::i;:::-;4425:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46058:7;46030:24;46040:8;46050:3;46030:9;:24::i;:::-;:35;;46022:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46113:29;46119:8;46129:3;46134:7;46113:5;:29::i;:::-;45931:219;;;:::o;44385:112::-;44438:4;44487:1;44462:27;;:8;:13;44471:3;44462:13;;;;;;;;;;;;;;;;;;;;;:27;;;;44455:34;;44385:112;;;:::o;38834:498::-;38887:27;38937:1;38931:2;:7;38927:50;;;38955:10;;;;;;;;;;;;;;;;;;;;;38927:50;38987:9;38999:2;38987:14;;39012:11;39034:69;39046:1;39041;:6;39034:69;;39064:5;;;;;;;39089:2;39084:7;;;;;;;;;39034:69;;;39113:17;39143:3;39133:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;39133:14:0;;;;39113:34;;39158:9;39176:1;39170:3;:7;39158:19;;39188:107;39201:1;39195:2;:7;39188:107;;39255:2;39250;:7;;;;;;39244:2;:14;39231:29;;39219:4;39224:3;;;;;;;39219:9;;;;;;;;;;;:41;;;;;;;;;;;39281:2;39275:8;;;;;;;;;39188:107;;;39319:4;39305:19;;;;;;38834:498;;;;:::o;38678:148::-;38756:13;38789:29;38799:2;38803;38789:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;38782:36;;38678:148;;;;:::o;24853:741::-;25016:8;:15;25001:4;:11;:30;24993:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25144:17;25164:4;:11;25144:31;;25229:9;25241:1;25229:13;;25224:269;25248:9;25244:1;:13;25224:269;;;25361:41;25390:8;25399:1;25390:11;;;;;;;;;;;;;;25361:8;:15;25370:5;25361:15;;;;;;;;;;;;;;;:24;25377:4;25382:1;25377:7;;;;;;;;;;;;;;25361:24;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;25334:8;:15;25343:5;25334:15;;;;;;;;;;;;;;;:24;25350:4;25355:1;25350:7;;;;;;;;;;;;;;25334:24;;;;;;;;;;;:68;;;;25442:39;25469:8;25478:1;25469:11;;;;;;;;;;;;;;25442:8;:13;25451:3;25442:13;;;;;;;;;;;;;;;:22;25456:4;25461:1;25456:7;;;;;;;;;;;;;;25442:22;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;25417:8;:13;25426:3;25417:13;;;;;;;;;;;;;;;:22;25431:4;25436:1;25431:7;;;;;;;;;;;;;;25417:22;;;;;;;;;;;:64;;;;25259:3;;;;;;;25224:269;;;;25566:3;25533:53;;25559:5;25533:53;;25547:10;25533:53;;;25571:4;25577:8;25533:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25533:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25533:53:0;;;;;;;;;;;;;;;;;;;24853:741;;;;;:::o;25720:504::-;25936:16;:3;:14;;;:16::i;:::-;25932:285;;;25969:13;26007:3;25985:49;;;26035:10;26047:5;26054:4;26060:8;26070:5;25985:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25985:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25985:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;25985:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25985:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25985:91:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25985:91:0;;;;;;;;;;;;;;;;25969:107;;20465:10;26109:28;;26099:38;;;:6;:38;;;;26091:114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25932:285;;25720:504;;;;;:::o;4970:130::-;5030:24;5046:7;5030:8;:15;;:24;;;;:::i;:::-;5084:7;5070:22;;;;;;;;;;;;4970:130;:::o;347:98::-;392:15;427:10;420:17;;347:98;:::o;6253:154::-;6321:32;6345:7;6321:16;:23;;:32;;;;:::i;:::-;6391:7;6369:30;;;;;;;;;;;;6253:154;:::o;8455:176::-;8513:7;8533:9;8549:1;8545;:5;8533:17;;8574:1;8569;:6;;8561:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8622:1;8615:8;;;8455:176;;;;:::o;34067:429::-;34220:31;34243:7;34220:8;:13;34229:3;34220:13;;;;;;;;;;;;;;;:18;34234:3;34220:18;;;;;;;;;;;;:22;;:31;;;;:::i;:::-;34199:8;:13;34208:3;34199:13;;;;;;;;;;;;;;;:18;34213:3;34199:18;;;;;;;;;;;:52;;;;34333:3;34292:59;;34327:3;34292:59;;34307:10;34292:59;;;34338:3;34343:7;34292:59;;;;;;;;;;;;;;;;;;;;;;;;34426:62;34457:3;34463;34468;34473:7;34482:5;34426:22;:62::i;:::-;34067:429;;;;:::o;6099:146::-;6164:29;6185:7;6164:16;:20;;:29;;;;:::i;:::-;6229:7;6209:28;;;;;;;;;;;;6099:146;:::o;32402:129::-;32504:19;32486:15;:37;;;;;;;;;;;;:::i;:::-;;32402:129;:::o;4840:122::-;4897:21;4910:7;4897:8;:12;;:21;;;;:::i;:::-;4946:7;4934:20;;;;;;;;;;;;4840:122;:::o;3896:203::-;3968:4;4012:1;3993:21;;:7;:21;;;;3985:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4071:4;:11;;:20;4083:7;4071:20;;;;;;;;;;;;;;;;;;;;;;;;;4064:27;;3896:203;;;;:::o;44645:106::-;44694:7;44721:22;44741:1;44721:15;;:19;;:22;;;;:::i;:::-;44714:29;;44645:106;:::o;44830:77::-;44882:15;;:17;;;;;;;;;;;;;44830:77::o;27167:163::-;27254:15;27294:9;:17;27304:6;27294:17;;;;;;;;;;;;;;;:28;27312:9;27294:28;;;;;;;;;;;;;;;;;;;;;;;;;27287:35;;27167:163;;;;:::o;23553:400::-;23719:33;23744:7;23719:8;:15;23728:5;23719:15;;;;;;;;;;;;;;;:20;23735:3;23719:20;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;23696:8;:15;23705:5;23696:15;;;;;;;;;;;;;;;:20;23712:3;23696:20;;;;;;;;;;;:56;;;;23803:31;23826:7;23803:8;:13;23812:3;23803:13;;;;;;;;;;;;;;;:18;23817:3;23803:18;;;;;;;;;;;;:22;;:31;;;;:::i;:::-;23782:8;:13;23791:3;23782:13;;;;;;;;;;;;;;;:18;23796:3;23782:18;;;;;;;;;;;:52;;;;23927:3;23893:52;;23920:5;23893:52;;23908:10;23893:52;;;23932:3;23937:7;23893:52;;;;;;;;;;;;;;;;;;;;;;;;23553:400;;;;:::o;24074:457::-;24261:16;:3;:14;;;:16::i;:::-;24257:267;;;24294:13;24332:3;24310:44;;;24355:10;24367:5;24374:3;24379:7;24388:5;24310:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;24310:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24310:84:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24310:84:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24310:84:0;;;;;;;;;;;;;;;;24294:100;;20392:10;24427:22;;24417:32;;;:6;:32;;;;24409:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24257:267;;24074:457;;;;;:::o;2877:229::-;2971:1;2951:22;;:8;:22;;;;2943:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3061:8;3032:38;;3053:6;;;;;;;;;;;3032:38;;;;;;;;;;;;3090:8;3081:6;;:17;;;;;;;;;;;;;;;;;;2877:229;:::o;35956:285::-;36098:33;36123:7;36098:8;:15;36107:5;36098:15;;;;;;;;;;;;;;;:20;36114:3;36098:20;;;;;;;;;;;;:24;;:33;;;;:::i;:::-;36075:8;:15;36084:5;36075:15;;;;;;;;;;;;;;;:20;36091:3;36075:20;;;;;;;;;;;:56;;;;36214:3;36172:61;;36199:5;36172:61;;36187:10;36172:61;;;36220:3;36225:7;36172:61;;;;;;;;;;;;;;;;;;;;;;;;35956:285;;;:::o;37257:970::-;37441:13;37467:16;37492:2;37467:28;;37506:16;37531:2;37506:28;;37545:16;37570:2;37545:28;;37584:16;37609:2;37584:28;;37623:16;37648:2;37623:28;;37662:19;37747:3;:10;37734:3;:10;37721:3;:10;37708:3;:10;37695:3;:10;:23;:36;:49;:62;37684:74;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;37684:74:0;;;;37662:96;;37769:19;37797:5;37769:34;;37814:9;37826:1;37814:13;;37843:9;37855:1;37843:13;;37838:61;37862:3;:10;37858:1;:14;37838:61;;;37893:3;37897:1;37893:6;;;;;;;;;;;;;;;;37879;37886:3;;;;;;37879:11;;;;;;;;;;;:20;;;;;;;;;;;37874:3;;;;;;;37838:61;;;;37915:9;37927:1;37915:13;;37910:61;37934:3;:10;37930:1;:14;37910:61;;;37965:3;37969:1;37965:6;;;;;;;;;;;;;;;;37951;37958:3;;;;;;37951:11;;;;;;;;;;;:20;;;;;;;;;;;37946:3;;;;;;;37910:61;;;;37987:9;37999:1;37987:13;;37982:61;38006:3;:10;38002:1;:14;37982:61;;;38037:3;38041:1;38037:6;;;;;;;;;;;;;;;;38023;38030:3;;;;;;38023:11;;;;;;;;;;;:20;;;;;;;;;;;38018:3;;;;;;;37982:61;;;;38059:9;38071:1;38059:13;;38054:61;38078:3;:10;38074:1;:14;38054:61;;;38109:3;38113:1;38109:6;;;;;;;;;;;;;;;;38095;38102:3;;;;;;38095:11;;;;;;;;;;;:20;;;;;;;;;;;38090:3;;;;;;;38054:61;;;;38131:9;38143:1;38131:13;;38126:61;38150:3;:10;38146:1;:14;38126:61;;;38181:3;38185:1;38181:6;;;;;;;;;;;;;;;;38167;38174:3;;;;;;38167:11;;;;;;;;;;;:20;;;;;;;;;;;38162:3;;;;;;;38126:61;;;;38212:6;38198:21;;;;;;;;;;37257:970;;;;;;;:::o;8190:177::-;8248:7;8281:1;8276;:6;;8268:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8321:9;8337:1;8333;:5;8321:17;;8358:1;8351:8;;;8190:177;;;;:::o;19278:715::-;19338:4;19355:16;19382:19;19404:66;19382:88;;;;19914:7;19902:20;19890:32;;19954:3;19942:15;;:8;:15;;:42;;;;;19973:11;19961:8;:23;;19942:42;19934:51;;;;19278:715;;;:::o;3618:183::-;3698:18;3702:4;3708:7;3698:3;:18::i;:::-;3690:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3788:5;3765:4;:11;;:20;3777:7;3765:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;3618:183;;:::o;3360:178::-;3438:18;3442:4;3448:7;3438:3;:18::i;:::-;3437:19;3429:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3526:4;3503;:11;;:20;3515:7;3503:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;3360:178;;:::o;44983:1567::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://d916d0ba05c298c27abb30d088b2fcf5c64f63e9a28de789f812b456dd4b97b2
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.