More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 408 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Distribute Pack | 11000792 | 1645 days ago | IN | 0 ETH | 0.00565075 | ||||
Distribute Pack | 11000792 | 1645 days ago | IN | 0 ETH | 0.0064609 | ||||
Distribute Pack | 11000763 | 1645 days ago | IN | 0 ETH | 0.00646045 | ||||
Distribute Pack | 11000732 | 1645 days ago | IN | 0 ETH | 0.0064609 | ||||
Distribute Pack | 11000610 | 1645 days ago | IN | 0 ETH | 0.00768323 | ||||
Distribute Pack | 11000597 | 1645 days ago | IN | 0 ETH | 0.00785785 | ||||
Distribute Pack | 11000588 | 1645 days ago | IN | 0 ETH | 0.00820709 | ||||
Distribute Pack | 11000581 | 1645 days ago | IN | 0 ETH | 0.00838171 | ||||
Distribute Pack | 11000562 | 1645 days ago | IN | 0 ETH | 0.00873095 | ||||
Distribute Pack | 11000557 | 1645 days ago | IN | 0 ETH | 0.00873095 | ||||
Distribute Pack | 11000533 | 1645 days ago | IN | 0 ETH | 0.00890556 | ||||
Distribute Pack | 11000513 | 1645 days ago | IN | 0 ETH | 0.00890556 | ||||
Distribute Pack | 11000482 | 1645 days ago | IN | 0 ETH | 0.00890556 | ||||
Distribute Pack | 11000477 | 1645 days ago | IN | 0 ETH | 0.00890556 | ||||
Distribute Pack | 11000470 | 1645 days ago | IN | 0 ETH | 0.00763675 | ||||
Distribute Pack | 11000470 | 1645 days ago | IN | 0 ETH | 0.00717854 | ||||
Distribute Pack | 11000470 | 1645 days ago | IN | 0 ETH | 0.00717854 | ||||
Distribute Pack | 11000470 | 1645 days ago | IN | 0 ETH | 0.00717854 | ||||
Distribute Pack | 11000470 | 1645 days ago | IN | 0 ETH | 0.00785785 | ||||
Distribute Pack | 11000304 | 1645 days ago | IN | 0 ETH | 0.00766577 | ||||
Distribute Pack | 11000257 | 1645 days ago | IN | 0 ETH | 0.00663506 | ||||
Distribute Pack | 11000208 | 1645 days ago | IN | 0 ETH | 0.00663552 | ||||
Distribute Pack | 11000183 | 1645 days ago | IN | 0 ETH | 0.00663552 | ||||
Distribute Pack | 11000121 | 1645 days ago | IN | 0 ETH | 0.00663552 | ||||
Distribute Pack | 11000096 | 1645 days ago | IN | 0 ETH | 0.00565119 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 11000792 | 1645 days ago | 0.0044 ETH | ||||
- | 11000792 | 1645 days ago | 0.0044 ETH | ||||
- | 11000763 | 1645 days ago | 0.0044 ETH | ||||
- | 11000732 | 1645 days ago | 0.0044 ETH | ||||
- | 11000610 | 1645 days ago | 0.0044 ETH | ||||
- | 11000597 | 1645 days ago | 0.0044 ETH | ||||
- | 11000588 | 1645 days ago | 0.0044 ETH | ||||
- | 11000581 | 1645 days ago | 0.0044 ETH | ||||
- | 11000562 | 1645 days ago | 0.0044 ETH | ||||
- | 11000557 | 1645 days ago | 0.0044 ETH | ||||
- | 11000533 | 1645 days ago | 0.0044 ETH | ||||
- | 11000513 | 1645 days ago | 0.0044 ETH | ||||
- | 11000482 | 1645 days ago | 0.0044 ETH | ||||
- | 11000477 | 1645 days ago | 0.0044 ETH | ||||
- | 11000470 | 1645 days ago | 0.0044 ETH | ||||
- | 11000470 | 1645 days ago | 0.0044 ETH | ||||
- | 11000470 | 1645 days ago | 0.0044 ETH | ||||
- | 11000470 | 1645 days ago | 0.0044 ETH | ||||
- | 11000470 | 1645 days ago | 0.0044 ETH | ||||
- | 11000304 | 1645 days ago | 0.0044 ETH | ||||
- | 11000257 | 1645 days ago | 0.0044 ETH | ||||
- | 11000208 | 1645 days ago | 0.0044 ETH | ||||
- | 11000183 | 1645 days ago | 0.0044 ETH | ||||
- | 11000121 | 1645 days ago | 0.0044 ETH | ||||
- | 11000096 | 1645 days ago | 0.0044 ETH |
Loading...
Loading
Contract Name:
SimplifiedDistributor
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-17 */ pragma solidity >=0.6.0 <0.7.0; // Abstract contract for the full ERC 20 Token standard // https://github.com/ethereum/EIPs/issues/20 interface ERC20Token { /** * @notice send `_value` token to `_to` from `msg.sender` * @param _to The address of the recipient * @param _value The amount of token to be transferred * @return success Whether the transfer was successful or not */ function transfer(address _to, uint256 _value) external returns (bool success); /** * @notice `msg.sender` approves `_spender` to spend `_value` tokens * @param _spender The address of the account able to transfer the tokens * @param _value The amount of tokens to be approved for transfer * @return success Whether the approval was successful or not */ function approve(address _spender, uint256 _value) external returns (bool success); /** * @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` * @param _from The address of the sender * @param _to The address of the recipient * @param _value The amount of token to be transferred * @return success Whether the transfer was successful or not */ function transferFrom(address _from, address _to, uint256 _value) external returns (bool success); /** * @param _owner The address from which the balance will be retrieved * @return balance The balance */ function balanceOf(address _owner) external view returns (uint256 balance); /** * @param _owner The address of the account owning tokens * @param _spender The address of the account able to transfer the tokens * @return remaining Amount of remaining tokens allowed to spent */ function allowance(address _owner, address _spender) external view returns (uint256 remaining); /** * @notice return total supply of tokens */ function totalSupply() external view returns (uint256 supply); event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } contract ReentrancyGuard { bool internal reentranceLock = false; /** * @dev Use this modifier on functions susceptible to reentrancy attacks */ modifier reentrancyGuard() { require(!reentranceLock, "Reentrant call detected!"); reentranceLock = true; // No no no, you naughty naughty! _; reentranceLock = false; } } pragma experimental ABIEncoderV2; /** * @author Ricardo Guilherme Schmidt (Status Research & Development GmbH) * @notice interface for StickerMarket */ interface StickerMarket { event ClaimedTokens(address indexed _token, address indexed _controller, uint256 _amount); event MarketState(State state); event RegisterFee(uint256 value); event BurnRate(uint256 value); enum State { Invalid, Open, BuyOnly, Controlled, Closed } function state() external view returns(State); function snt() external view returns (address); function stickerPack() external view returns (address); function stickerType() external view returns (address); /** * @dev Mints NFT StickerPack in `_destination` account, and Transfers SNT using user allowance * emit NonfungibleToken.Transfer(`address(0)`, `_destination`, `tokenId`) * @notice buy a pack from market pack owner, including a StickerPack's token in `_destination` account with same metadata of `_packId` * @param _packId id of market pack * @param _destination owner of token being brought * @param _price agreed price * @return tokenId generated StickerPack token */ function buyToken( uint256 _packId, address _destination, uint256 _price ) external returns (uint256 tokenId); /** * @dev emits StickerMarket.Register(`packId`, `_urlHash`, `_price`, `_contenthash`) * @notice Registers to sell a sticker pack * @param _price cost in wei to users minting this pack * @param _donate value between 0-10000 representing percentage of `_price` that is donated to StickerMarket at every buy * @param _category listing category * @param _owner address of the beneficiary of buys * @param _contenthash EIP1577 pack contenthash for listings * @param _fee Fee msg.sender agrees to pay for this registration * @return packId Market position of Sticker Pack data. */ function registerPack( uint256 _price, uint256 _donate, bytes4[] calldata _category, address _owner, bytes calldata _contenthash, uint256 _fee ) external returns(uint256 packId); } /** * @dev ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721 { /** * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any * number of NFTs may be created and assigned without emitting Transfer. At the time of any * transfer, the approved address for that NFT (if any) is reset to none. */ event Transfer( address indexed from, address indexed to, uint256 indexed value ); /** * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero * address indicates there is no approved address. When a Transfer event emits, this also * indicates that the approved address for that NFT (if any) is reset to none. */ event Approval( address indexed _owner, address indexed _approved, uint256 indexed _tokenId ); /** * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage * all NFTs of the owner. */ event ApprovalForAll( address indexed _owner, address indexed _operator, bool _approved ); /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice Throws unless `msg.sender` is the current owner, an authorized operator, or the * approved address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is * the zero address. Throws if `_tokenId` is not a valid NFT. When transfer is complete, this * function checks if `_to` is a smart contract (code size > 0). If so, it calls * `onERC721Received` on `_to` and throws if the return value is not * `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. * @param _data Additional data with no specified format, sent in call to `_to`. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId, bytes calldata _data ) external; /** * @dev Transfers the ownership of an NFT from one address to another address. * @notice This works identically to the other function with an extra data parameter, except this * function just sets data to "" * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function safeTransferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero * address. Throws if `_tokenId` is not a valid NFT. * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else * they mayb be permanently lost. * @param _from The current owner of the NFT. * @param _to The new owner. * @param _tokenId The NFT to transfer. */ function transferFrom( address _from, address _to, uint256 _tokenId ) external; /** * @dev Set or reaffirm the approved address for an NFT. * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is * the current NFT owner, or an authorized operator of the current owner. * @param _approved The new approved NFT controller. * @param _tokenId The NFT to approve. */ function approve( address _approved, uint256 _tokenId ) external; /** * @dev Enables or disables approval for a third party ("operator") to manage all of * `msg.sender`'s assets. It also emits the ApprovalForAll event. * @notice The contract MUST allow multiple operators per owner. * @param _operator Address to add to the set of authorized operators. * @param _approved True if the operators is approved, false to revoke approval. */ function setApprovalForAll( address _operator, bool _approved ) external; /** * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are * considered invalid, and this function throws for queries about the zero address. * @param _owner Address for whom to query the balance. * @return Balance of _owner. */ function balanceOf( address _owner ) external view returns (uint256); /** * @dev Returns the address of the owner of the NFT. NFTs assigned to zero address are considered * invalid, and queries about them do throw. * @param _tokenId The identifier for an NFT. * @return Address of _tokenId owner. */ function ownerOf( uint256 _tokenId ) external view returns (address); /** * @dev Get the approved address for a single NFT. * @notice Throws if `_tokenId` is not a valid NFT. * @param _tokenId The NFT to find the approved address for. * @return Address that _tokenId is approved for. */ function getApproved( uint256 _tokenId ) external view returns (address); /** * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise. * @param _owner The address that owns the NFTs. * @param _operator The address that acts on behalf of the owner. * @return True if approved for all, false otherwise. */ function isApprovedForAll( address _owner, address _operator ) external view returns (bool); } /** * @dev Optional enumeration extension for ERC-721 non-fungible token standard. * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md. */ interface ERC721Enumerable { /** * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an * assigned and queryable owner not equal to the zero address. * @return Total supply of NFTs. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified. * @param _index A counter less than `totalSupply()`. * @return Token id. */ function tokenByIndex( uint256 _index ) external view returns (uint256); /** * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address, * representing invalid NFTs. * @param _owner An address where we are interested in NFTs owned by them. * @param _index A counter less than `balanceOf(_owner)`. * @return Token id. */ function tokenOfOwnerByIndex( address _owner, uint256 _index ) external view returns (uint256); } /** * @author Ricardo Guilherme Schmidt (Status Research & Development GmbH) * @notice interface for StickerType */ /* interface */ abstract contract StickerType is ERC721, ERC721Enumerable { // Interfaces can't inherit /** * @notice controller can generate packs at will * @param _price cost in wei to users minting with _urlHash metadata * @param _donate optional amount of `_price` that is donated to StickerMarket at every buy * @param _category listing category * @param _owner address of the beneficiary of buys * @param _contenthash EIP1577 pack contenthash for listings * @return packId Market position of Sticker Pack data. */ function generatePack( uint256 _price, uint256 _donate, bytes4[] calldata _category, address _owner, bytes calldata _contenthash ) external virtual returns(uint256 packId); /** * @notice removes all market data about a marketed pack, can only be called by market controller * @param _packId position to be deleted * @param _limit limit of categories to cleanup */ function purgePack(uint256 _packId, uint256 _limit) external virtual; /** * @notice changes contenthash of `_packId`, can only be called by controller * @param _packId which market position is being altered * @param _contenthash new contenthash */ function setPackContenthash(uint256 _packId, bytes calldata _contenthash) external virtual; /** * @notice This method can be used by the controller to extract mistakenly * sent tokens to this contract. * @param _token The address of the token contract that you want to recover * set to 0 in case you want to extract ether. */ function claimTokens(address _token) external virtual; /** * @notice changes price of `_packId`, can only be called when market is open * @param _packId pack id changing price settings * @param _price cost in wei to users minting this pack * @param _donate value between 0-10000 representing percentage of `_price` that is donated to StickerMarket at every buy */ function setPackPrice(uint256 _packId, uint256 _price, uint256 _donate) external virtual; /** * @notice add caregory in `_packId`, can only be called when market is open * @param _packId pack adding category * @param _category category to list */ function addPackCategory(uint256 _packId, bytes4 _category) external virtual; /** * @notice remove caregory in `_packId`, can only be called when market is open * @param _packId pack removing category * @param _category category to unlist */ function removePackCategory(uint256 _packId, bytes4 _category) external virtual; /** * @notice Changes if pack is enabled for sell * @param _packId position edit * @param _mintable true to enable sell */ function setPackState(uint256 _packId, bool _mintable) external virtual; /** * @notice read available market ids in a category (might be slow) * @param _category listing category * @return availableIds array of market id registered */ function getAvailablePacks(bytes4 _category) external virtual view returns (uint256[] memory availableIds); /** * @notice count total packs in a category * @param _category listing category * @return size total number of packs in category */ function getCategoryLength(bytes4 _category) external virtual view returns (uint256 size); /** * @notice read a packId in the category list at a specific index * @param _category listing category * @param _index index * @return packId on index */ function getCategoryPack(bytes4 _category, uint256 _index) external virtual view returns (uint256 packId); /** * @notice returns all data from pack in market * @param _packId pack id being queried * @return category list of categories registered to this packType * @return owner authorship holder * @return mintable new pack can be generated (rare tool) * @return timestamp registration timestamp * @return price current price * @return contenthash EIP1577 encoded hash */ function getPackData(uint256 _packId) external virtual view returns ( bytes4[] memory category, address owner, bool mintable, uint256 timestamp, uint256 price, bytes memory contenthash ); /** * @notice returns all data from pack in market * @param _packId pack id being queried * @return category list of categories registered to this packType * @return timestamp registration timestamp * @return contenthash EIP1577 encoded hash */ function getPackSummary(uint256 _packId) external virtual view returns ( bytes4[] memory category, uint256 timestamp, bytes memory contenthash ); /** * @notice returns payment data for migrated contract * @param _packId pack id being queried * @return owner authorship holder * @return mintable new pack can be generated (rare tool) * @return price current price * @return donate informational value between 0-10000 representing percentage of `price` that is donated to StickerMarket at every buy */ function getPaymentData(uint256 _packId) external virtual view returns ( address owner, bool mintable, uint256 price, uint256 donate ); } /** * @title SafeERC20 * @dev Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/SafeERC20.sol * and https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol */ contract SafeTransfer { function _safeTransfer(ERC20Token token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function _safeTransferFrom(ERC20Token token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(ERC20Token token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(_isContract(address(token)), "SafeTransfer: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeTransfer: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeTransfer: ERC20 operation did not succeed"); } } /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function _isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } } /** * @author Ricardo Guilherme Schmidt (Status Research & Development GmbH) * @notice Owner's backdoor withdrawal logic, used for code reuse. */ contract TokenWithdrawer is SafeTransfer { /** * @dev Withdraw all balance of each `_tokens` into `_destination`. * @param _tokens address of ERC20 token, or zero for withdrawing ETH. * @param _destination receiver of token */ function withdrawTokens( address[] memory _tokens, address payable _destination ) internal { uint len = _tokens.length; for(uint i = 0; i < len; i++){ withdrawToken(_tokens[i], _destination); } } /** * @dev Withdraw all balance of `_token` into `_destination`. * @param _token address of ERC20 token, or zero for withdrawing ETH. * @param _destination receiver of token */ function withdrawToken(address _token, address payable _destination) internal { uint256 balance; if (_token == address(0)) { balance = address(this).balance; (bool success, ) = _destination.call.value(balance)(""); require(success, "Transfer failed"); } else { ERC20Token token = ERC20Token(_token); balance = token.balanceOf(address(this)); _safeTransfer(token, _destination, balance); } } } /// @title Starterpack Distributor /// @notice Attempts to deliver 1 and only 1 starterpack containing ETH, ERC20 Tokens and NFT Stickerpacks to an eligible recipient /// @dev The contract assumes Signer has verified an In-App Purchase Receipt contract SimplifiedDistributor is SafeTransfer, ReentrancyGuard, TokenWithdrawer { address payable public owner; // Contract deployer can modify parameters address public signer; // Signer can only distribute Starterpacks // Defines the Starterpack parameters struct Pack { uint256 ethAmount; // The Amount of ETH to transfer to the recipient address[] tokens; // Array of ERC20 Contract Addresses uint256[] tokenAmounts; // Array of ERC20 amounts corresponding to cells in tokens[] } Pack public defaultPack; ERC20Token public sntToken; bool public pause = true; event RequireApproval(address attribution); mapping(address => uint) public pendingAttributionCnt; mapping(address => uint) public attributionCnt; struct Attribution { bool enabled; uint256 ethAmount; // The Amount of ETH to transfer to the referrer address[] tokens; // Array of ERC20 Contract Addresses uint256[] tokenAmounts; // Array of ERC20 amounts corresponding to cells in tokens[] uint limit; } mapping(address => Attribution) defaultAttributionSettings; mapping(address => Attribution) promoAttributionSettings; // Modifiers -------------------------------------------------------------------------------------------- // Functions only Owner can call modifier onlyOwner { require(msg.sender == owner, "Unauthorized"); _; } // Logic ------------------------------------------------------------------------------------------------ /// @notice Check if an address is eligible for a starterpack /// @dev will return false if a transaction of distributePack for _recipient has been successfully executed /// RETURNING TRUE BECAUSE ELIGIBILITY WILL BE HANDLED BY THE BACKEND /// @param _recipient The address to be checked for eligibility function eligible(address _recipient) public view returns (bool){ return true; } /// @notice Get the starter pack configuration /// @return stickerMarket address Stickermarket contract address /// @return ethAmount uint256 ETH amount in wei that will be sent to a recipient /// @return tokens address[] List of tokens that will be sent to a recipient /// @return tokenAmounts uint[] Amount of tokens that will be sent to a recipient /// @return stickerPackIds uint[] List of sticker packs to send to a recipient function getDefaultPack() external view returns(address stickerMarket, uint256 ethAmount, address[] memory tokens, uint[] memory tokenAmounts, uint[] memory stickerPackIds) { ethAmount = defaultPack.ethAmount; tokens = defaultPack.tokens; tokenAmounts = defaultPack.tokenAmounts; } /// @notice Get the promo pack configuration /// @return stickerMarket address Stickermarket contract address /// @return ethAmount uint256 ETH amount in wei that will be sent to a recipient /// @return tokens address[] List of tokens that will be sent to a recipient /// @return tokenAmounts uint[] Amount of tokens that will be sent to a recipient /// @return stickerPackIds uint[] List of sticker packs to send to a recipient /// @return available uint number of promo packs available function getPromoPack() external view returns(address stickerMarket, uint256 ethAmount, address[] memory tokens, uint[] memory tokenAmounts, uint[] memory stickerPackIds, uint256 available) { // Removed the promo pack functionality, so returning default values (to not affect the ABI) } event Distributed(address indexed recipient, address indexed attribution); /// @notice Distributes a starterpack to an eligible address. Either a promo pack or a default will be distributed depending on availability /// @dev Can only be called by signer, assumes signer has validated an IAP receipt, owner can block calling by pausing. /// @param _recipient A payable address that is sent a starterpack after being checked for eligibility /// @param _attribution A payable address who referred the starterpack purchaser function distributePack(address payable _recipient, address payable _attribution) external reentrancyGuard { require(!pause, "Paused"); require(msg.sender == signer, "Unauthorized"); require(_recipient != _attribution, "Recipient should be different from Attribution address"); Pack memory pack = defaultPack; // Transfer Tokens // Iterate over tokens[] and transfer the an amount corresponding to the i cell in tokenAmounts[] for (uint256 i = 0; i < pack.tokens.length; i++) { ERC20Token token = ERC20Token(pack.tokens[i]); uint256 amount = pack.tokenAmounts[i]; require(token.transfer(_recipient, amount), "ERC20 operation did not succeed"); } // Transfer ETH // .transfer bad post Istanbul fork :| (bool success, ) = _recipient.call.value(pack.ethAmount)(""); require(success, "ETH Transfer failed"); emit Distributed(_recipient, _attribution); if (_attribution == address(0)) return; pendingAttributionCnt[_attribution] += 1; } function withdrawAttributions() external { require(!pause, "Paused"); uint pendingAttributions = pendingAttributionCnt[msg.sender]; uint attributionsPaid = attributionCnt[msg.sender]; if (pendingAttributions == 0) return; Attribution memory attr = defaultAttributionSettings[msg.sender]; if (!attr.enabled) { attr = defaultAttributionSettings[address(0)]; } uint totalETHToPay; uint totalSNTToPay; uint attributionsToPay; if((attributionsPaid + pendingAttributions) > attr.limit){ emit RequireApproval(msg.sender); if(attributionsPaid < attr.limit){ attributionsToPay = attr.limit - attributionsPaid; } else { attributionsToPay = 0; } attributionsPaid += attributionsToPay; pendingAttributions -= attributionsToPay; } else { attributionsToPay = pendingAttributions; attributionsPaid += attributionsToPay; pendingAttributions = 0; } totalETHToPay += attributionsToPay * attr.ethAmount; for (uint256 i = 0; i < attr.tokens.length; i++) { if(attr.tokens[i] == address(sntToken)){ totalSNTToPay += attributionsToPay * attr.tokenAmounts[i]; } else { ERC20Token token = ERC20Token(attr.tokens[i]); uint256 amount = attributionsToPay * attr.tokenAmounts[i]; _safeTransfer(token, msg.sender, amount); } } pendingAttributionCnt[msg.sender] = pendingAttributions; attributionCnt[msg.sender] = attributionsPaid; if (totalETHToPay != 0){ (bool success, ) = msg.sender.call.value(totalETHToPay)(""); require(success, "ETH Transfer failed"); } if (totalSNTToPay != 0){ ERC20Token token = ERC20Token(sntToken); _safeTransfer(token, msg.sender, totalSNTToPay); } } /// @notice Get rewards for specific referrer /// @param _account The address to obtain the attribution config /// @param _isPromo Indicates if the configuration for a promo should be returned or not /// @return ethAmount Amount of ETH in wei /// @return tokenLen Number of tokens configured as part of the reward /// @return maxThreshold If isPromo == true: Number of promo bonuses still available for that address else: Max number of attributions to pay before requiring approval /// @return attribCount Number of referrals function getReferralReward(address _account, bool _isPromo) public view returns (uint ethAmount, uint tokenLen, uint maxThreshold, uint attribCount) { require(_isPromo != true); Attribution memory attr = defaultAttributionSettings[_account]; if (!attr.enabled) { attr = defaultAttributionSettings[address(0)]; } ethAmount = attr.ethAmount; maxThreshold = attr.limit; attribCount = attributionCnt[_account]; tokenLen = attr.tokens.length; } /// @notice Get token rewards for specific address /// @param _account The address to obtain the attribution's token config /// @param _isPromo Indicates if the configuration for a promo should be returned or not /// @param _idx Index of token array in the attribution used to obtain the token config /// @return token ERC20 contract address /// @return tokenAmount Amount of token configured in the attribution function getReferralRewardTokens(address _account, bool _isPromo, uint _idx) public view returns (address token, uint tokenAmount) { require(_isPromo != true); Attribution memory attr = defaultAttributionSettings[_account]; if (!attr.enabled) { attr = defaultAttributionSettings[address(0)]; } token = attr.tokens[_idx]; tokenAmount = attr.tokenAmounts[_idx]; } fallback() external payable { // ... } // Admin ------------------------------------------------------------------------------------------------ /// @notice Allows the Owner to allow or prohibit Signer from calling distributePack(). /// @dev setPause must be called before Signer can call distributePack() function setPause(bool _pause) external onlyOwner { pause = _pause; } /// @notice Set a starter pack configuration /// @dev The Owner can change the default starterpack contents /// @param _newPack starter pack configuration function changeStarterPack(Pack memory _newPack) public onlyOwner { require(_newPack.tokens.length == _newPack.tokenAmounts.length, "Mismatch with Tokens & Amounts"); for (uint256 i = 0; i < _newPack.tokens.length; i++) { require(_newPack.tokenAmounts[i] > 0, "Amounts must be non-zero"); } defaultPack = _newPack; } /// @notice Safety function allowing the owner to immediately pause starterpack distribution and withdraw all balances in the the contract function withdraw(address[] calldata _tokens) external onlyOwner { pause = true; withdrawTokens(_tokens, owner); } /// @notice Changes the Signer of the contract /// @param _newSigner The new Signer of the contract function changeSigner(address _newSigner) public onlyOwner { require(_newSigner != address(0), "zero_address not allowed"); signer = _newSigner; } /// @notice Changes the owner of the contract /// @param _newOwner The new owner of the contract function changeOwner(address payable _newOwner) external onlyOwner { require(_newOwner != address(0), "zero_address not allowed"); owner = _newOwner; } /// @notice Set default/custom payout and threshold for referrals /// @param _isPromo indicates if this attribution config is a promo or default config /// @param _ethAmount Payout for referrals /// @param _thresholds Max number of referrals allowed beforee requiring approval /// @param _assignedTo Use a valid address here to set custom settings. To set the default payout and threshold, use address(0); function setPayoutAndThreshold( bool _isPromo, uint256 _ethAmount, address[] calldata _tokens, uint256[] calldata _tokenAmounts, uint256[] calldata _thresholds, address[] calldata _assignedTo ) external onlyOwner { require(_isPromo != true); require(_thresholds.length == _assignedTo.length, "Array length mismatch"); require(_tokens.length == _tokenAmounts.length, "Array length mismatch"); for (uint256 i = 0; i < _thresholds.length; i++) { bool enabled = _assignedTo[i] != address(0); Attribution memory attr = Attribution({ enabled: enabled, ethAmount: _ethAmount, limit: _thresholds[i], tokens: _tokens, tokenAmounts: _tokenAmounts }); defaultAttributionSettings[_assignedTo[i]] = attr; } } /// @notice Remove attribution configuration for addresses /// @param _assignedTo Array of addresses with an attribution configured /// @param _isPromo Indicates if the configuration to delete is the promo or default function removePayoutAndThreshold(address[] calldata _assignedTo, bool _isPromo) external onlyOwner { for (uint256 i = 0; i < _assignedTo.length; i++) { delete defaultAttributionSettings[_assignedTo[i]]; } } /// @notice Set SNT address function setSntToken(address _sntToken) external onlyOwner { sntToken = ERC20Token(_sntToken); } /// @param _signer allows the contract deployer(owner) to define the signer on construction /// @param _sntToken SNT token address constructor(address _signer, address _sntToken) public { require(_signer != address(0), "zero_address not allowed"); owner = msg.sender; signer = _signer; sntToken = ERC20Token(_sntToken); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"address","name":"_sntToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"attribution","type":"address"}],"name":"Distributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"attribution","type":"address"}],"name":"RequireApproval","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"attributionCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newSigner","type":"address"}],"name":"changeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"}],"internalType":"struct SimplifiedDistributor.Pack","name":"_newPack","type":"tuple"}],"name":"changeStarterPack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultPack","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"address payable","name":"_attribution","type":"address"}],"name":"distributePack","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"eligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultPack","outputs":[{"internalType":"address","name":"stickerMarket","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"stickerPackIds","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPromoPack","outputs":[{"internalType":"address","name":"stickerMarket","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"tokenAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"stickerPackIds","type":"uint256[]"},{"internalType":"uint256","name":"available","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isPromo","type":"bool"}],"name":"getReferralReward","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"tokenLen","type":"uint256"},{"internalType":"uint256","name":"maxThreshold","type":"uint256"},{"internalType":"uint256","name":"attribCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_isPromo","type":"bool"},{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"getReferralRewardTokens","outputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingAttributionCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assignedTo","type":"address[]"},{"internalType":"bool","name":"_isPromo","type":"bool"}],"name":"removePayoutAndThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_pause","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPromo","type":"bool"},{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_tokenAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_thresholds","type":"uint256[]"},{"internalType":"address[]","name":"_assignedTo","type":"address[]"}],"name":"setPayoutAndThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sntToken","type":"address"}],"name":"setSntToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sntToken","outputs":[{"internalType":"contract ERC20Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAttributions","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260008060006101000a81548160ff0219169083151502179055506001600560146101000a81548160ff0219169083151502179055503480156200004657600080fd5b506040516200403c3803806200403c83398181016040528101906200006c9190620001c1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620000df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000d69062000244565b60405180910390fd5b33600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050620002c5565b600081519050620001bb81620002ab565b92915050565b60008060408385031215620001d557600080fd5b6000620001e585828601620001aa565b9250506020620001f885828601620001aa565b9150509250929050565b60006200021160188362000266565b91507f7a65726f5f61646472657373206e6f7420616c6c6f77656400000000000000006000830152602082019050919050565b600060208201905081810360008301526200025f8162000202565b9050919050565b600082825260208201905092915050565b600062000284826200028b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002b68162000277565b8114620002c257600080fd5b50565b613d6780620002d56000396000f3fe6080604052600436106101395760003560e01c8063abf43977116100ab578063bedb86fb1161006f578063bedb86fb1461042a578063d00223e714610453578063d738988114610482578063db904862146104ab578063dfa3802f146104db578063ea23cd3e146104f25761013a565b8063abf4397714610348578063b9265adb14610386578063b9e21004146103af578063bcbf25f7146103d8578063bd5dec98146104015761013a565b80637236dc63116100fd5780637236dc6314610223578063797ef3bf146102635780638456cb59146102a05780638da5cb5b146102cb578063a6f9dae1146102f6578063aad2b7231461031f5761013a565b80630713b1391461013c578063238ac933146101795780634ea9d070146101a45780635ac5cf1b146101cd57806360837f29146101f85761013a565b5b005b34801561014857600080fd5b50610163600480360381019061015e9190612da0565b61052f565b6040516101709190613882565b60405180910390f35b34801561018557600080fd5b5061018e61053a565b60405161019b9190613701565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c691906130a4565b610560565b005b3480156101d957600080fd5b506101e2610701565b6040516101ef9190613a78565b60405180910390f35b34801561020457600080fd5b5061020d61070d565b60405161021a919061389d565b60405180910390f35b34801561022f57600080fd5b5061024a60048036038101906102459190612e2e565b610733565b60405161025a9493929190613a93565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612da0565b610a81565b6040516102979190613a78565b60405180910390f35b3480156102ac57600080fd5b506102b5610a99565b6040516102c29190613882565b60405180910390f35b3480156102d757600080fd5b506102e0610aac565b6040516102ed9190613737565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612dc9565b610ad2565b005b34801561032b57600080fd5b5061034660048036038101906103419190612da0565b610c16565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612e6a565b610d5a565b60405161037d92919061377b565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612fa8565b611080565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190612da0565b6113c8565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190612df2565b61149c565b005b34801561040d57600080fd5b5061042860048036038101906104239190612eb9565b611a33565b005b34801561043657600080fd5b50610451600480360381019061044c9190612f56565b611b4f565b005b34801561045f57600080fd5b50610468611bfc565b6040516104799594939291906137a4565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190612efe565b611cf4565b005b3480156104b757600080fd5b506104c0611e4b565b6040516104d29695949392919061380c565b60405180910390f35b3480156104e757600080fd5b506104f0611e5d565b005b3480156104fe57600080fd5b5061051960048036038101906105149190612da0565b612522565b6040516105269190613a78565b60405180910390f35b600060019050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e790613958565b60405180910390fd5b8060400151518160200151511461063c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063390613a38565b60405180910390fd5b60005b8160200151518110156106b35760008260400151828151811061065e57fe5b6020026020010151116106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d906139d8565b60405180910390fd5b808060010191505061063f565b508060026000820151816000015560208201518160010190805190602001906106dd929190612935565b5060408201518160020190805190602001906106fa9291906129bf565b5090505050565b60028060000154905081565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060011515851515141561074b57600080fd5b610753612a0c565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561084757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116107fd575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561089f57602002820191906000526020600020905b81548152602001906001019080831161088b575b5050505050815260200160048201548152505090508060000151610a1f57600860008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1615151515815260200160018201548152602001600282018054806020026020016040519081016040528092919081815260200182805480156109b157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610967575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610a0957602002820191906000526020600020905b8154815260200190600101908083116109f5575b5050505050815260200160048201548152505090505b8060200151945080608001519250600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915080604001515193505092959194509250565b60076020528060005260406000206000915090505481565b600560149054906101000a900460ff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613998565b60405180910390fd5b80600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90613958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613998565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600115158415151415610d6f57600080fd5b610d77612a0c565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610e6b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e21575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610ec357602002820191906000526020600020905b815481526020019060010190808311610eaf575b505050505081526020016004820154815250509050806000015161104357600860008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610fd557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f8b575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561102d57602002820191906000526020600020905b815481526020019060010190808311611019575b5050505050815260200160048201548152505090505b8060400151848151811061105357fe5b602002602001015192508060600151848151811061106d57fe5b6020026020010151915050935093915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110790613958565b60405180910390fd5b600115158a1515141561112257600080fd5b81819050848490501461116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613938565b60405180910390fd5b8585905088889050146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613938565b60405180910390fd5b60005b848490508110156113bb5760008073ffffffffffffffffffffffffffffffffffffffff168484848181106111e557fe5b90506020020160208101906111fa9190612da0565b73ffffffffffffffffffffffffffffffffffffffff161415905061121c612a0c565b6040518060a0016040528083151581526020018d81526020018c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505081526020018a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505081526020018888868181106112cf57fe5b90506020020135815250905080600860008787878181106112ec57fe5b90506020020160208101906113019190612da0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002019080519060200190611381929190612935565b50606082015181600301908051906020019061139e9291906129bf565b5060808201518160040155905050505080806001019150506111b5565b5050505050505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613958565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900460ff16156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613918565b60405180910390fd5b60016000806101000a81548160ff021916908315150217905550600560149054906101000a900460ff1615611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b906138d8565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613958565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613a58565b60405180910390fd5b61165b612a3d565b600260405180606001604052908160008201548152602001600182018054806020026020016040519081016040528092919081815260200182805480156116f757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116ad575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561174f57602002820191906000526020600020905b81548152602001906001019080831161173b575b505050505081525050905060005b81602001515181101561187d5760008260200151828151811061177c57fe5b6020026020010151905060008360400151838151811061179857fe5b602002602001015190508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87836040518363ffffffff1660e01b81526004016117dd929190613752565b602060405180830381600087803b1580156117f757600080fd5b505af115801561180b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182f9190612f7f565b61186e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186590613a18565b60405180910390fd5b5050808060010191505061175d565b5060008373ffffffffffffffffffffffffffffffffffffffff1682600001516040516118a8906136ec565b60006040518083038185875af1925050503d80600081146118e5576040519150601f19603f3d011682016040523d82523d6000602084013e6118ea565b606091505b505090508061192e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611925906139f8565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f308e2c5753972417b271d7ca4dc8f5d75b5ae15f18eb667e195dd174ac6d359360405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119c4575050611a15565b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555050505b60008060006101000a81548160ff0219169083151502179055505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613958565b60405180910390fd5b6001600560146101000a81548160ff021916908315150217905550611b4b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661253a565b5050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690613958565b60405180910390fd5b80600560146101000a81548160ff02191690831515021790555050565b600080606080606060026000015493506002600101805480602002602001604051908101604052809291908181526020018280548015611c9157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c47575b5050505050925060028001805480602002602001604051908101604052809291908181526020018280548015611ce657602002820191906000526020600020905b815481526020019060010190808311611cd2575b505050505091509091929394565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b90613958565b60405180910390fd5b60005b83839050811015611e455760086000858584818110611da257fe5b9050602002016020810190611db79190612da0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556001820160009055600282016000611e1e9190612a5e565b600382016000611e2e9190612a7f565b600482016000905550508080600101915050611d87565b50505050565b60008060608060606000909192939495565b600560149054906101000a900460ff1615611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea4906138d8565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000821415611f45575050612520565b611f4d612a0c565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561204157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611ff7575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561209957602002820191906000526020600020905b815481526020019060010190808311612085575b505050505081526020016004820154815250509050806000015161221957600860008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1615151515815260200160018201548152602001600282018054806020026020016040519081016040528092919081815260200182805480156121ab57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612161575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561220357602002820191906000526020600020905b8154815260200190600101908083116121ef575b5050505050815260200160048201548152505090505b600080600083608001518686011115612291577f5fab9b9ad2c936c0199fccac8da5ecb5100de9323d6a34a6489bdd3715e0b5483360405161225b919061371c565b60405180910390a1836080015185101561227d57848460800151039050612282565b600090505b8085019450808603955061229e565b8590508085019450600095505b836020015181028301925060005b84604001515181101561239e57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560400151828151811061230257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612349578460600151818151811061233657fe5b6020026020010151820283019250612391565b60008560400151828151811061235b57fe5b6020026020010151905060008660600151838151811061237757fe5b60200260200101518402905061238e82338361257b565b50505b80806001019150506122ac565b5085600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600083146124dd5760003373ffffffffffffffffffffffffffffffffffffffff1684604051612455906136ec565b60006040518083038185875af1925050503d8060008114612492576040519150601f19603f3d011682016040523d82523d6000602084013e612497565b606091505b50509050806124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d2906139f8565b60405180910390fd5b505b60008214612519576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061251781338561257b565b505b5050505050505b565b60066020528060005260406000206000915090505481565b60008251905060005b818110156125755761256884828151811061255a57fe5b602002602001015184612601565b8080600101915050612543565b50505050565b6125fc8363a9059cbb60e01b848460405160240161259a92919061377b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061278e565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ec5747905060008273ffffffffffffffffffffffffffffffffffffffff1682604051612660906136ec565b60006040518083038185875af1925050503d806000811461269d576040519150601f19603f3d011682016040523d82523d6000602084013e6126a2565b606091505b50509050806126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd90613978565b60405180910390fd5b50612789565b60008390508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161272a9190613701565b60206040518083038186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277a91906130e5565b915061278781848461257b565b505b505050565b612797826128ea565b6127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cd906138f8565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516127ff91906136d5565b6000604051808303816000865af19150503d806000811461283c576040519150601f19603f3d011682016040523d82523d6000602084013e612841565b606091505b509150915081612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d906138b8565b60405180910390fd5b6000815111156128e457808060200190518101906128a49190612f7f565b6128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da906139b8565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561292c57506000801b8214155b92505050919050565b8280548282559060005260206000209081019282156129ae579160200282015b828111156129ad5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612955565b5b5090506129bb9190612aa0565b5090565b8280548282559060005260206000209081019282156129fb579160200282015b828111156129fa5782518255916020019190600101906129df565b5b509050612a089190612adb565b5090565b6040518060a00160405280600015158152602001600081526020016060815260200160608152602001600081525090565b60405180606001604052806000815260200160608152602001606081525090565b5080546000825590600052602060002090810190612a7c9190612adb565b50565b5080546000825590600052602060002090810190612a9d9190612adb565b50565b5b80821115612ad757600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101612aa1565b5090565b5b80821115612af4576000816000905550600101612adc565b5090565b600081359050612b0781613cd5565b92915050565b600081359050612b1c81613cec565b92915050565b60008083601f840112612b3457600080fd5b8235905067ffffffffffffffff811115612b4d57600080fd5b602083019150836020820283011115612b6557600080fd5b9250929050565b600082601f830112612b7d57600080fd5b8135612b90612b8b82613b05565b613ad8565b91508181835260208401935060208101905083856020840282011115612bb557600080fd5b60005b83811015612be55781612bcb8882612af8565b845260208401935060208301925050600181019050612bb8565b5050505092915050565b60008083601f840112612c0157600080fd5b8235905067ffffffffffffffff811115612c1a57600080fd5b602083019150836020820283011115612c3257600080fd5b9250929050565b600082601f830112612c4a57600080fd5b8135612c5d612c5882613b2d565b613ad8565b91508181835260208401935060208101905083856020840282011115612c8257600080fd5b60005b83811015612cb25781612c988882612d76565b845260208401935060208301925050600181019050612c85565b5050505092915050565b600081359050612ccb81613d03565b92915050565b600081519050612ce081613d03565b92915050565b600060608284031215612cf857600080fd5b612d026060613ad8565b90506000612d1284828501612d76565b600083015250602082013567ffffffffffffffff811115612d3257600080fd5b612d3e84828501612b6c565b602083015250604082013567ffffffffffffffff811115612d5e57600080fd5b612d6a84828501612c39565b60408301525092915050565b600081359050612d8581613d1a565b92915050565b600081519050612d9a81613d1a565b92915050565b600060208284031215612db257600080fd5b6000612dc084828501612af8565b91505092915050565b600060208284031215612ddb57600080fd5b6000612de984828501612b0d565b91505092915050565b60008060408385031215612e0557600080fd5b6000612e1385828601612b0d565b9250506020612e2485828601612b0d565b9150509250929050565b60008060408385031215612e4157600080fd5b6000612e4f85828601612af8565b9250506020612e6085828601612cbc565b9150509250929050565b600080600060608486031215612e7f57600080fd5b6000612e8d86828701612af8565b9350506020612e9e86828701612cbc565b9250506040612eaf86828701612d76565b9150509250925092565b60008060208385031215612ecc57600080fd5b600083013567ffffffffffffffff811115612ee657600080fd5b612ef285828601612b22565b92509250509250929050565b600080600060408486031215612f1357600080fd5b600084013567ffffffffffffffff811115612f2d57600080fd5b612f3986828701612b22565b93509350506020612f4c86828701612cbc565b9150509250925092565b600060208284031215612f6857600080fd5b6000612f7684828501612cbc565b91505092915050565b600060208284031215612f9157600080fd5b6000612f9f84828501612cd1565b91505092915050565b60008060008060008060008060008060c08b8d031215612fc757600080fd5b6000612fd58d828e01612cbc565b9a50506020612fe68d828e01612d76565b99505060408b013567ffffffffffffffff81111561300357600080fd5b61300f8d828e01612b22565b985098505060608b013567ffffffffffffffff81111561302e57600080fd5b61303a8d828e01612bef565b965096505060808b013567ffffffffffffffff81111561305957600080fd5b6130658d828e01612bef565b945094505060a08b013567ffffffffffffffff81111561308457600080fd5b6130908d828e01612b22565b92509250509295989b9194979a5092959850565b6000602082840312156130b657600080fd5b600082013567ffffffffffffffff8111156130d057600080fd5b6130dc84828501612ce6565b91505092915050565b6000602082840312156130f757600080fd5b600061310584828501612d8b565b91505092915050565b600061311a838361315c565b60208301905092915050565b600061313283836136b7565b60208301905092915050565b61314781613c48565b82525050565b61315681613c00565b82525050565b61316581613bee565b82525050565b61317481613bee565b82525050565b600061318582613b75565b61318f8185613bb0565b935061319a83613b55565b8060005b838110156131cb5781516131b2888261310e565b97506131bd83613b96565b92505060018101905061319e565b5085935050505092915050565b60006131e382613b80565b6131ed8185613bc1565b93506131f883613b65565b8060005b838110156132295781516132108882613126565b975061321b83613ba3565b9250506001810190506131fc565b5085935050505092915050565b61323f81613c12565b82525050565b600061325082613b8b565b61325a8185613bd2565b935061326a818560208601613ca2565b80840191505092915050565b61327f81613c5a565b82525050565b6000613292602383613bdd565b91507f536166655472616e736665723a206c6f772d6c6576656c2063616c6c2066616960008301527f6c656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132f8600683613bdd565b91507f50617573656400000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613338602283613bdd565b91507f536166655472616e736665723a2063616c6c20746f206e6f6e2d636f6e74726160008301527f63740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061339e601883613bdd565b91507f5265656e7472616e742063616c6c2064657465637465642100000000000000006000830152602082019050919050565b60006133de601583613bdd565b91507f4172726179206c656e677468206d69736d6174636800000000000000000000006000830152602082019050919050565b600061341e600c83613bdd565b91507f556e617574686f72697a656400000000000000000000000000000000000000006000830152602082019050919050565b600061345e600f83613bdd565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b600061349e601883613bdd565b91507f7a65726f5f61646472657373206e6f7420616c6c6f77656400000000000000006000830152602082019050919050565b60006134de602d83613bdd565b91507f536166655472616e736665723a204552433230206f7065726174696f6e20646960008301527f64206e6f742073756363656564000000000000000000000000000000000000006020830152604082019050919050565b6000613544601883613bdd565b91507f416d6f756e7473206d757374206265206e6f6e2d7a65726f00000000000000006000830152602082019050919050565b6000613584601383613bdd565b91507f455448205472616e73666572206661696c6564000000000000000000000000006000830152602082019050919050565b60006135c4601f83613bdd565b91507f4552433230206f7065726174696f6e20646964206e6f742073756363656564006000830152602082019050919050565b6000613604601e83613bdd565b91507f4d69736d61746368207769746820546f6b656e73202620416d6f756e747300006000830152602082019050919050565b6000613644600083613bd2565b9150600082019050919050565b600061365e603683613bdd565b91507f526563697069656e742073686f756c6420626520646966666572656e7420667260008301527f6f6d204174747269627574696f6e2061646472657373000000000000000000006020830152604082019050919050565b6136c081613c3e565b82525050565b6136cf81613c3e565b82525050565b60006136e18284613245565b915081905092915050565b60006136f782613637565b9150819050919050565b6000602082019050613716600083018461316b565b92915050565b6000602082019050613731600083018461313e565b92915050565b600060208201905061374c600083018461314d565b92915050565b6000604082019050613767600083018561313e565b61377460208301846136c6565b9392505050565b6000604082019050613790600083018561316b565b61379d60208301846136c6565b9392505050565b600060a0820190506137b9600083018861316b565b6137c660208301876136c6565b81810360408301526137d8818661317a565b905081810360608301526137ec81856131d8565b9050818103608083015261380081846131d8565b90509695505050505050565b600060c082019050613821600083018961316b565b61382e60208301886136c6565b8181036040830152613840818761317a565b9050818103606083015261385481866131d8565b9050818103608083015261386881856131d8565b905061387760a08301846136c6565b979650505050505050565b60006020820190506138976000830184613236565b92915050565b60006020820190506138b26000830184613276565b92915050565b600060208201905081810360008301526138d181613285565b9050919050565b600060208201905081810360008301526138f1816132eb565b9050919050565b600060208201905081810360008301526139118161332b565b9050919050565b6000602082019050818103600083015261393181613391565b9050919050565b60006020820190508181036000830152613951816133d1565b9050919050565b6000602082019050818103600083015261397181613411565b9050919050565b6000602082019050818103600083015261399181613451565b9050919050565b600060208201905081810360008301526139b181613491565b9050919050565b600060208201905081810360008301526139d1816134d1565b9050919050565b600060208201905081810360008301526139f181613537565b9050919050565b60006020820190508181036000830152613a1181613577565b9050919050565b60006020820190508181036000830152613a31816135b7565b9050919050565b60006020820190508181036000830152613a51816135f7565b9050919050565b60006020820190508181036000830152613a7181613651565b9050919050565b6000602082019050613a8d60008301846136c6565b92915050565b6000608082019050613aa860008301876136c6565b613ab560208301866136c6565b613ac260408301856136c6565b613acf60608301846136c6565b95945050505050565b6000604051905081810181811067ffffffffffffffff82111715613afb57600080fd5b8060405250919050565b600067ffffffffffffffff821115613b1c57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613b4457600080fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613bf982613c1e565b9050919050565b6000613c0b82613c1e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613c5382613c7e565b9050919050565b6000613c6582613c6c565b9050919050565b6000613c7782613c1e565b9050919050565b6000613c8982613c90565b9050919050565b6000613c9b82613c1e565b9050919050565b60005b83811015613cc0578082015181840152602081019050613ca5565b83811115613ccf576000848401525b50505050565b613cde81613bee565b8114613ce957600080fd5b50565b613cf581613c00565b8114613d0057600080fd5b50565b613d0c81613c12565b8114613d1757600080fd5b50565b613d2381613c3e565b8114613d2e57600080fd5b5056fea264697066735822122024adca062b7dce5bc4b48fa52b94f67e6f6dda1be6b39e4c8bb44dc29292fb2564736f6c634300060c0033000000000000000000000000f234ec8b27f4157f9594bb10a6d2c3d7a35082d2000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e
Deployed Bytecode
0x6080604052600436106101395760003560e01c8063abf43977116100ab578063bedb86fb1161006f578063bedb86fb1461042a578063d00223e714610453578063d738988114610482578063db904862146104ab578063dfa3802f146104db578063ea23cd3e146104f25761013a565b8063abf4397714610348578063b9265adb14610386578063b9e21004146103af578063bcbf25f7146103d8578063bd5dec98146104015761013a565b80637236dc63116100fd5780637236dc6314610223578063797ef3bf146102635780638456cb59146102a05780638da5cb5b146102cb578063a6f9dae1146102f6578063aad2b7231461031f5761013a565b80630713b1391461013c578063238ac933146101795780634ea9d070146101a45780635ac5cf1b146101cd57806360837f29146101f85761013a565b5b005b34801561014857600080fd5b50610163600480360381019061015e9190612da0565b61052f565b6040516101709190613882565b60405180910390f35b34801561018557600080fd5b5061018e61053a565b60405161019b9190613701565b60405180910390f35b3480156101b057600080fd5b506101cb60048036038101906101c691906130a4565b610560565b005b3480156101d957600080fd5b506101e2610701565b6040516101ef9190613a78565b60405180910390f35b34801561020457600080fd5b5061020d61070d565b60405161021a919061389d565b60405180910390f35b34801561022f57600080fd5b5061024a60048036038101906102459190612e2e565b610733565b60405161025a9493929190613a93565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612da0565b610a81565b6040516102979190613a78565b60405180910390f35b3480156102ac57600080fd5b506102b5610a99565b6040516102c29190613882565b60405180910390f35b3480156102d757600080fd5b506102e0610aac565b6040516102ed9190613737565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612dc9565b610ad2565b005b34801561032b57600080fd5b5061034660048036038101906103419190612da0565b610c16565b005b34801561035457600080fd5b5061036f600480360381019061036a9190612e6a565b610d5a565b60405161037d92919061377b565b60405180910390f35b34801561039257600080fd5b506103ad60048036038101906103a89190612fa8565b611080565b005b3480156103bb57600080fd5b506103d660048036038101906103d19190612da0565b6113c8565b005b3480156103e457600080fd5b506103ff60048036038101906103fa9190612df2565b61149c565b005b34801561040d57600080fd5b5061042860048036038101906104239190612eb9565b611a33565b005b34801561043657600080fd5b50610451600480360381019061044c9190612f56565b611b4f565b005b34801561045f57600080fd5b50610468611bfc565b6040516104799594939291906137a4565b60405180910390f35b34801561048e57600080fd5b506104a960048036038101906104a49190612efe565b611cf4565b005b3480156104b757600080fd5b506104c0611e4b565b6040516104d29695949392919061380c565b60405180910390f35b3480156104e757600080fd5b506104f0611e5d565b005b3480156104fe57600080fd5b5061051960048036038101906105149190612da0565b612522565b6040516105269190613a78565b60405180910390f35b600060019050919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146105f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e790613958565b60405180910390fd5b8060400151518160200151511461063c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063390613a38565b60405180910390fd5b60005b8160200151518110156106b35760008260400151828151811061065e57fe5b6020026020010151116106a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161069d906139d8565b60405180910390fd5b808060010191505061063f565b508060026000820151816000015560208201518160010190805190602001906106dd929190612935565b5060408201518160020190805190602001906106fa9291906129bf565b5090505050565b60028060000154905081565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060011515851515141561074b57600080fd5b610753612a0c565b600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561084757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116107fd575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561089f57602002820191906000526020600020905b81548152602001906001019080831161088b575b5050505050815260200160048201548152505090508060000151610a1f57600860008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1615151515815260200160018201548152602001600282018054806020026020016040519081016040528092919081815260200182805480156109b157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610967575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610a0957602002820191906000526020600020905b8154815260200190600101908083116109f5575b5050505050815260200160048201548152505090505b8060200151945080608001519250600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915080604001515193505092959194509250565b60076020528060005260406000206000915090505481565b600560149054906101000a900460ff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc990613998565b60405180910390fd5b80600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90613958565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90613998565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600115158415151415610d6f57600080fd5b610d77612a0c565b600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610e6b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610e21575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610ec357602002820191906000526020600020905b815481526020019060010190808311610eaf575b505050505081526020016004820154815250509050806000015161104357600860008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff161515151581526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015610fd557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610f8b575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561102d57602002820191906000526020600020905b815481526020019060010190808311611019575b5050505050815260200160048201548152505090505b8060400151848151811061105357fe5b602002602001015192508060600151848151811061106d57fe5b6020026020010151915050935093915050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110790613958565b60405180910390fd5b600115158a1515141561112257600080fd5b81819050848490501461116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613938565b60405180910390fd5b8585905088889050146111b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a990613938565b60405180910390fd5b60005b848490508110156113bb5760008073ffffffffffffffffffffffffffffffffffffffff168484848181106111e557fe5b90506020020160208101906111fa9190612da0565b73ffffffffffffffffffffffffffffffffffffffff161415905061121c612a0c565b6040518060a0016040528083151581526020018d81526020018c8c80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505081526020018a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505081526020018888868181106112cf57fe5b90506020020135815250905080600860008787878181106112ec57fe5b90506020020160208101906113019190612da0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff021916908315150217905550602082015181600101556040820151816002019080519060200190611381929190612935565b50606082015181600301908051906020019061139e9291906129bf565b5060808201518160040155905050505080806001019150506111b5565b5050505050505050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144f90613958565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900460ff16156114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190613918565b60405180910390fd5b60016000806101000a81548160ff021916908315150217905550600560149054906101000a900460ff1615611554576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154b906138d8565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115db90613958565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a90613a58565b60405180910390fd5b61165b612a3d565b600260405180606001604052908160008201548152602001600182018054806020026020016040519081016040528092919081815260200182805480156116f757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116116ad575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561174f57602002820191906000526020600020905b81548152602001906001019080831161173b575b505050505081525050905060005b81602001515181101561187d5760008260200151828151811061177c57fe5b6020026020010151905060008360400151838151811061179857fe5b602002602001015190508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87836040518363ffffffff1660e01b81526004016117dd929190613752565b602060405180830381600087803b1580156117f757600080fd5b505af115801561180b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182f9190612f7f565b61186e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186590613a18565b60405180910390fd5b5050808060010191505061175d565b5060008373ffffffffffffffffffffffffffffffffffffffff1682600001516040516118a8906136ec565b60006040518083038185875af1925050503d80600081146118e5576040519150601f19603f3d011682016040523d82523d6000602084013e6118ea565b606091505b505090508061192e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611925906139f8565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f308e2c5753972417b271d7ca4dc8f5d75b5ae15f18eb667e195dd174ac6d359360405160405180910390a3600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156119c4575050611a15565b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555050505b60008060006101000a81548160ff0219169083151502179055505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aba90613958565b60405180910390fd5b6001600560146101000a81548160ff021916908315150217905550611b4b828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661253a565b5050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690613958565b60405180910390fd5b80600560146101000a81548160ff02191690831515021790555050565b600080606080606060026000015493506002600101805480602002602001604051908101604052809291908181526020018280548015611c9157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c47575b5050505050925060028001805480602002602001604051908101604052809291908181526020018280548015611ce657602002820191906000526020600020905b815481526020019060010190808311611cd2575b505050505091509091929394565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7b90613958565b60405180910390fd5b60005b83839050811015611e455760086000858584818110611da257fe5b9050602002016020810190611db79190612da0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600080820160006101000a81549060ff02191690556001820160009055600282016000611e1e9190612a5e565b600382016000611e2e9190612a7f565b600482016000905550508080600101915050611d87565b50505050565b60008060608060606000909192939495565b600560149054906101000a900460ff1615611ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea4906138d8565b60405180910390fd5b6000600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000821415611f45575050612520565b611f4d612a0c565b600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff16151515158152602001600182015481526020016002820180548060200260200160405190810160405280929190818152602001828054801561204157602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611ff7575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561209957602002820191906000526020600020905b815481526020019060010190808311612085575b505050505081526020016004820154815250509050806000015161221957600860008073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060a00160405290816000820160009054906101000a900460ff1615151515815260200160018201548152602001600282018054806020026020016040519081016040528092919081815260200182805480156121ab57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311612161575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561220357602002820191906000526020600020905b8154815260200190600101908083116121ef575b5050505050815260200160048201548152505090505b600080600083608001518686011115612291577f5fab9b9ad2c936c0199fccac8da5ecb5100de9323d6a34a6489bdd3715e0b5483360405161225b919061371c565b60405180910390a1836080015185101561227d57848460800151039050612282565b600090505b8085019450808603955061229e565b8590508085019450600095505b836020015181028301925060005b84604001515181101561239e57600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168560400151828151811061230257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612349578460600151818151811061233657fe5b6020026020010151820283019250612391565b60008560400151828151811061235b57fe5b6020026020010151905060008660600151838151811061237757fe5b60200260200101518402905061238e82338361257b565b50505b80806001019150506122ac565b5085600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600083146124dd5760003373ffffffffffffffffffffffffffffffffffffffff1684604051612455906136ec565b60006040518083038185875af1925050503d8060008114612492576040519150601f19603f3d011682016040523d82523d6000602084013e612497565b606091505b50509050806124db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d2906139f8565b60405180910390fd5b505b60008214612519576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061251781338561257b565b505b5050505050505b565b60066020528060005260406000206000915090505481565b60008251905060005b818110156125755761256884828151811061255a57fe5b602002602001015184612601565b8080600101915050612543565b50505050565b6125fc8363a9059cbb60e01b848460405160240161259a92919061377b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061278e565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126ec5747905060008273ffffffffffffffffffffffffffffffffffffffff1682604051612660906136ec565b60006040518083038185875af1925050503d806000811461269d576040519150601f19603f3d011682016040523d82523d6000602084013e6126a2565b606091505b50509050806126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd90613978565b60405180910390fd5b50612789565b60008390508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161272a9190613701565b60206040518083038186803b15801561274257600080fd5b505afa158015612756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277a91906130e5565b915061278781848461257b565b505b505050565b612797826128ea565b6127d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cd906138f8565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516127ff91906136d5565b6000604051808303816000865af19150503d806000811461283c576040519150601f19603f3d011682016040523d82523d6000602084013e612841565b606091505b509150915081612886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287d906138b8565b60405180910390fd5b6000815111156128e457808060200190518101906128a49190612f7f565b6128e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128da906139b8565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f915080821415801561292c57506000801b8214155b92505050919050565b8280548282559060005260206000209081019282156129ae579160200282015b828111156129ad5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612955565b5b5090506129bb9190612aa0565b5090565b8280548282559060005260206000209081019282156129fb579160200282015b828111156129fa5782518255916020019190600101906129df565b5b509050612a089190612adb565b5090565b6040518060a00160405280600015158152602001600081526020016060815260200160608152602001600081525090565b60405180606001604052806000815260200160608152602001606081525090565b5080546000825590600052602060002090810190612a7c9190612adb565b50565b5080546000825590600052602060002090810190612a9d9190612adb565b50565b5b80821115612ad757600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101612aa1565b5090565b5b80821115612af4576000816000905550600101612adc565b5090565b600081359050612b0781613cd5565b92915050565b600081359050612b1c81613cec565b92915050565b60008083601f840112612b3457600080fd5b8235905067ffffffffffffffff811115612b4d57600080fd5b602083019150836020820283011115612b6557600080fd5b9250929050565b600082601f830112612b7d57600080fd5b8135612b90612b8b82613b05565b613ad8565b91508181835260208401935060208101905083856020840282011115612bb557600080fd5b60005b83811015612be55781612bcb8882612af8565b845260208401935060208301925050600181019050612bb8565b5050505092915050565b60008083601f840112612c0157600080fd5b8235905067ffffffffffffffff811115612c1a57600080fd5b602083019150836020820283011115612c3257600080fd5b9250929050565b600082601f830112612c4a57600080fd5b8135612c5d612c5882613b2d565b613ad8565b91508181835260208401935060208101905083856020840282011115612c8257600080fd5b60005b83811015612cb25781612c988882612d76565b845260208401935060208301925050600181019050612c85565b5050505092915050565b600081359050612ccb81613d03565b92915050565b600081519050612ce081613d03565b92915050565b600060608284031215612cf857600080fd5b612d026060613ad8565b90506000612d1284828501612d76565b600083015250602082013567ffffffffffffffff811115612d3257600080fd5b612d3e84828501612b6c565b602083015250604082013567ffffffffffffffff811115612d5e57600080fd5b612d6a84828501612c39565b60408301525092915050565b600081359050612d8581613d1a565b92915050565b600081519050612d9a81613d1a565b92915050565b600060208284031215612db257600080fd5b6000612dc084828501612af8565b91505092915050565b600060208284031215612ddb57600080fd5b6000612de984828501612b0d565b91505092915050565b60008060408385031215612e0557600080fd5b6000612e1385828601612b0d565b9250506020612e2485828601612b0d565b9150509250929050565b60008060408385031215612e4157600080fd5b6000612e4f85828601612af8565b9250506020612e6085828601612cbc565b9150509250929050565b600080600060608486031215612e7f57600080fd5b6000612e8d86828701612af8565b9350506020612e9e86828701612cbc565b9250506040612eaf86828701612d76565b9150509250925092565b60008060208385031215612ecc57600080fd5b600083013567ffffffffffffffff811115612ee657600080fd5b612ef285828601612b22565b92509250509250929050565b600080600060408486031215612f1357600080fd5b600084013567ffffffffffffffff811115612f2d57600080fd5b612f3986828701612b22565b93509350506020612f4c86828701612cbc565b9150509250925092565b600060208284031215612f6857600080fd5b6000612f7684828501612cbc565b91505092915050565b600060208284031215612f9157600080fd5b6000612f9f84828501612cd1565b91505092915050565b60008060008060008060008060008060c08b8d031215612fc757600080fd5b6000612fd58d828e01612cbc565b9a50506020612fe68d828e01612d76565b99505060408b013567ffffffffffffffff81111561300357600080fd5b61300f8d828e01612b22565b985098505060608b013567ffffffffffffffff81111561302e57600080fd5b61303a8d828e01612bef565b965096505060808b013567ffffffffffffffff81111561305957600080fd5b6130658d828e01612bef565b945094505060a08b013567ffffffffffffffff81111561308457600080fd5b6130908d828e01612b22565b92509250509295989b9194979a5092959850565b6000602082840312156130b657600080fd5b600082013567ffffffffffffffff8111156130d057600080fd5b6130dc84828501612ce6565b91505092915050565b6000602082840312156130f757600080fd5b600061310584828501612d8b565b91505092915050565b600061311a838361315c565b60208301905092915050565b600061313283836136b7565b60208301905092915050565b61314781613c48565b82525050565b61315681613c00565b82525050565b61316581613bee565b82525050565b61317481613bee565b82525050565b600061318582613b75565b61318f8185613bb0565b935061319a83613b55565b8060005b838110156131cb5781516131b2888261310e565b97506131bd83613b96565b92505060018101905061319e565b5085935050505092915050565b60006131e382613b80565b6131ed8185613bc1565b93506131f883613b65565b8060005b838110156132295781516132108882613126565b975061321b83613ba3565b9250506001810190506131fc565b5085935050505092915050565b61323f81613c12565b82525050565b600061325082613b8b565b61325a8185613bd2565b935061326a818560208601613ca2565b80840191505092915050565b61327f81613c5a565b82525050565b6000613292602383613bdd565b91507f536166655472616e736665723a206c6f772d6c6576656c2063616c6c2066616960008301527f6c656400000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006132f8600683613bdd565b91507f50617573656400000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613338602283613bdd565b91507f536166655472616e736665723a2063616c6c20746f206e6f6e2d636f6e74726160008301527f63740000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061339e601883613bdd565b91507f5265656e7472616e742063616c6c2064657465637465642100000000000000006000830152602082019050919050565b60006133de601583613bdd565b91507f4172726179206c656e677468206d69736d6174636800000000000000000000006000830152602082019050919050565b600061341e600c83613bdd565b91507f556e617574686f72697a656400000000000000000000000000000000000000006000830152602082019050919050565b600061345e600f83613bdd565b91507f5472616e73666572206661696c656400000000000000000000000000000000006000830152602082019050919050565b600061349e601883613bdd565b91507f7a65726f5f61646472657373206e6f7420616c6c6f77656400000000000000006000830152602082019050919050565b60006134de602d83613bdd565b91507f536166655472616e736665723a204552433230206f7065726174696f6e20646960008301527f64206e6f742073756363656564000000000000000000000000000000000000006020830152604082019050919050565b6000613544601883613bdd565b91507f416d6f756e7473206d757374206265206e6f6e2d7a65726f00000000000000006000830152602082019050919050565b6000613584601383613bdd565b91507f455448205472616e73666572206661696c6564000000000000000000000000006000830152602082019050919050565b60006135c4601f83613bdd565b91507f4552433230206f7065726174696f6e20646964206e6f742073756363656564006000830152602082019050919050565b6000613604601e83613bdd565b91507f4d69736d61746368207769746820546f6b656e73202620416d6f756e747300006000830152602082019050919050565b6000613644600083613bd2565b9150600082019050919050565b600061365e603683613bdd565b91507f526563697069656e742073686f756c6420626520646966666572656e7420667260008301527f6f6d204174747269627574696f6e2061646472657373000000000000000000006020830152604082019050919050565b6136c081613c3e565b82525050565b6136cf81613c3e565b82525050565b60006136e18284613245565b915081905092915050565b60006136f782613637565b9150819050919050565b6000602082019050613716600083018461316b565b92915050565b6000602082019050613731600083018461313e565b92915050565b600060208201905061374c600083018461314d565b92915050565b6000604082019050613767600083018561313e565b61377460208301846136c6565b9392505050565b6000604082019050613790600083018561316b565b61379d60208301846136c6565b9392505050565b600060a0820190506137b9600083018861316b565b6137c660208301876136c6565b81810360408301526137d8818661317a565b905081810360608301526137ec81856131d8565b9050818103608083015261380081846131d8565b90509695505050505050565b600060c082019050613821600083018961316b565b61382e60208301886136c6565b8181036040830152613840818761317a565b9050818103606083015261385481866131d8565b9050818103608083015261386881856131d8565b905061387760a08301846136c6565b979650505050505050565b60006020820190506138976000830184613236565b92915050565b60006020820190506138b26000830184613276565b92915050565b600060208201905081810360008301526138d181613285565b9050919050565b600060208201905081810360008301526138f1816132eb565b9050919050565b600060208201905081810360008301526139118161332b565b9050919050565b6000602082019050818103600083015261393181613391565b9050919050565b60006020820190508181036000830152613951816133d1565b9050919050565b6000602082019050818103600083015261397181613411565b9050919050565b6000602082019050818103600083015261399181613451565b9050919050565b600060208201905081810360008301526139b181613491565b9050919050565b600060208201905081810360008301526139d1816134d1565b9050919050565b600060208201905081810360008301526139f181613537565b9050919050565b60006020820190508181036000830152613a1181613577565b9050919050565b60006020820190508181036000830152613a31816135b7565b9050919050565b60006020820190508181036000830152613a51816135f7565b9050919050565b60006020820190508181036000830152613a7181613651565b9050919050565b6000602082019050613a8d60008301846136c6565b92915050565b6000608082019050613aa860008301876136c6565b613ab560208301866136c6565b613ac260408301856136c6565b613acf60608301846136c6565b95945050505050565b6000604051905081810181811067ffffffffffffffff82111715613afb57600080fd5b8060405250919050565b600067ffffffffffffffff821115613b1c57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff821115613b4457600080fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000613bf982613c1e565b9050919050565b6000613c0b82613c1e565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613c5382613c7e565b9050919050565b6000613c6582613c6c565b9050919050565b6000613c7782613c1e565b9050919050565b6000613c8982613c90565b9050919050565b6000613c9b82613c1e565b9050919050565b60005b83811015613cc0578082015181840152602081019050613ca5565b83811115613ccf576000848401525b50505050565b613cde81613bee565b8114613ce957600080fd5b50565b613cf581613c00565b8114613d0057600080fd5b50565b613d0c81613c12565b8114613d1757600080fd5b50565b613d2381613c3e565b8114613d2e57600080fd5b5056fea264697066735822122024adca062b7dce5bc4b48fa52b94f67e6f6dda1be6b39e4c8bb44dc29292fb2564736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f234ec8b27f4157f9594bb10a6d2c3d7a35082d2000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e
-----Decoded View---------------
Arg [0] : _signer (address): 0xf234ec8B27F4157f9594BB10a6D2C3d7a35082D2
Arg [1] : _sntToken (address): 0x744d70FDBE2Ba4CF95131626614a1763DF805B9E
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f234ec8b27f4157f9594bb10a6d2c3d7a35082d2
Arg [1] : 000000000000000000000000744d70fdbe2ba4cf95131626614a1763df805b9e
Deployed Bytecode Sourcemap
23308:13792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25276:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23475:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33416:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23855:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23887:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31365:539;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;24074:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23922:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23396:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34481:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34197:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32354:443;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;35098:981;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36607:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27539:1130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33942:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33155:83;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25839:313;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;36323:243;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26683:300;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;28677:2113;;;;;;;;;;;;;:::i;:::-;;24014:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25276:94;25335:4;25358;25351:11;;25276:94;;;:::o;23475:21::-;;;;;;;;;;;;;:::o;33416:374::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;33527:8:::1;:21;;;:28;33501:8;:15;;;:22;:54;33493:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;33608:9;33603:145;33627:8;:15;;;:22;33623:1;:26;33603:145;;;33706:1;33679:8;:21;;;33701:1;33679:24;;;;;;;;;;;;;;:28;33671:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33651:3;;;;;;;33603:145;;;;33774:8;33760:11;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;33416:374:::0;:::o;23855:23::-;;;;;;;;;:::o;23887:26::-;;;;;;;;;;;;;:::o;31365:539::-;31446:14;31462:13;31477:17;31496:16;31545:4;31533:16;;:8;:16;;;;31525:25;;;;;;31561:23;;:::i;:::-;31587:26;:36;31614:8;31587:36;;;;;;;;;;;;;;;31561:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31639:4;:12;;;31634:91;;31675:26;:38;31710:1;31675:38;;;;;;;;;;;;;;;31668:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31634:91;31757:4;:14;;;31745:26;;31797:4;:10;;;31782:25;;31832:14;:24;31847:8;31832:24;;;;;;;;;;;;;;;;31818:38;;31878:4;:11;;;:18;31867:29;;31365:539;;;;;;;;:::o;24074:46::-;;;;;;;;;;;;;;;;;:::o;23922:24::-;;;;;;;;;;;;;:::o;23396:28::-;;;;;;;;;;;;;:::o;34481:174::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;34588:1:::1;34567:23;;:9;:23;;;;34559:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;34638:9;34630:5;;:17;;;;;;;;;;;;;;;;;;34481:174:::0;:::o;34197:169::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;34297:1:::1;34275:24;;:10;:24;;;;34267:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34348:10;34339:6;;:19;;;;;;;;;;;;;;;;;;34197:169:::0;:::o;32354:443::-;32452:13;32467:16;32516:4;32504:16;;:8;:16;;;;32496:25;;;;;;32532:23;;:::i;:::-;32558:26;:36;32585:8;32558:36;;;;;;;;;;;;;;;32532:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32610:4;:12;;;32605:91;;32646:26;:38;32681:1;32646:38;;;;;;;;;;;;;;;32639:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32605:91;32724:4;:11;;;32736:4;32724:17;;;;;;;;;;;;;;32716:25;;32766:4;:17;;;32784:4;32766:23;;;;;;;;;;;;;;32752:37;;32354:443;;;;;;;:::o;35098:981::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;35401:4:::1;35389:16;;:8;:16;;;;35381:25;;;::::0;::::1;;35449:11;;:18;;35427:11;;:18;;:40;35419:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;35530:13;;:20;;35512:7;;:14;;:38;35504:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;35602:9;35597:475;35621:11;;:18;;35617:1;:22;35597:475;;;35661:12;35702:1:::0;35676:28:::1;;:11;;35688:1;35676:14;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;;;;35661:43;;35733:23;;:::i;:::-;35759:223;;;;;;;;35799:7;35759:223;;;;;;35836:10;35759:223;;;;35913:7;;35759:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35953:13;;35759:223;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35872:11;;35884:1;35872:14;;;;;;;;;;;;;35759:223;;::::0;35733:249:::1;;36056:4;36011:26;:42;36038:11;;36050:1;36038:14;;;;;;;;;;;;;;;;;;;;:::i;:::-;36011:42;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35597:475;;35641:3;;;;;;;35597:475;;;;35098:981:::0;;;;;;;;;;:::o;36607:110::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;36699:9:::1;36677:8;;:32;;;;;;;;;;;;;;;;;;36607:110:::0;:::o;27539:1130::-;2431:14;;;;;;;;;;2430:15;2422:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;2502:4;2485:14;;:21;;;;;;;;;;;;;;;;;;27666:5:::1;;;;;;;;;;;27665:6;27657:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;27715:6;;;;;;;;;;;27701:20;;:10;:20;;;27693:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;27771:12;27757:26;;:10;:26;;;;27749:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;27855:16;;:::i;:::-;27874:11;27855:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;28038:9;28033:266;28057:4;:11;;;:18;28053:1;:22;28033:266;;;28097:16;28127:4;:11;;;28139:1;28127:14;;;;;;;;;;;;;;28097:45;;28157:14;28174:4;:17;;;28192:1;28174:20;;;;;;;;;;;;;;28157:37;;28217:5;:14;;;28232:10;28244:6;28217:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28209:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;28033:266;;28077:3;;;;;;;28033:266;;;;28385:12;28403:10;:15;;28425:4;:14;;;28403:41;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28384:60;;;28463:7;28455:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;28536:12;28512:37;;28524:10;28512:37;;;;;;;;;;;;28590:1;28566:26;;:12;:26;;;28562:39;;;28594:7;;;;28562:39;28660:1;28621:21;:35;28643:12;28621:35;;;;;;;;;;;;;;;;:40;;;;;;;;;;;2551:1;;;2580:5:::0;2563:14;;:22;;;;;;;;;;;;;;;;;;27539:1130;;:::o;33942:137::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;34026:4:::1;34018:5;;:12;;;;;;;;;;;;;;;;;;34041:30;34056:7;;34041:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34065:5;;;;;;;;;;;34041:14;:30::i;:::-;33942:137:::0;;:::o;33155:83::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;33224:6:::1;33216:5;;:14;;;;;;;;;;;;;;;;;;33155:83:::0;:::o;25839:313::-;25887:21;25910:17;25929:23;25954:26;25982:28;26035:11;:21;;;26023:33;;26076:11;:18;;26067:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26120:11;:24;;26105:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25839:313;;;;;:::o;36323:243::-;24784:5;;;;;;;;;;;24770:19;;:10;:19;;;24762:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;36439:9:::1;36434:125;36458:11;;:18;;36454:1;:22;36434:125;;;36505:26;:42;36532:11;;36544:1;36532:14;;;;;;;;;;;;;;;;;;;;:::i;:::-;36505:42;;;;;;;;;;;;;;;;36498:49:::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;36478:3;;;;;;;36434:125;;;;36323:243:::0;;;:::o;26683:300::-;26729:21;26752:17;26771:23;26796:26;26824:28;26854:17;26683:300;;;;;;:::o;28677:2113::-;28738:5;;;;;;;;;;;28737:6;28729:25;;;;;;;;;;;;:::i;:::-;;;;;;;;;28775:24;28802:21;:33;28824:10;28802:33;;;;;;;;;;;;;;;;28775:60;;28846:21;28870:14;:26;28885:10;28870:26;;;;;;;;;;;;;;;;28846:50;;28936:1;28913:19;:24;28909:37;;;28939:7;;;;28909:37;28958:23;;:::i;:::-;28984:26;:38;29011:10;28984:38;;;;;;;;;;;;;;;28958:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29038:4;:12;;;29033:90;;29073:26;:38;29108:1;29073:38;;;;;;;;;;;;;;;29066:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29033:90;29135:18;29164;29193:22;29272:4;:10;;;29249:19;29230:16;:38;29229:53;29226:578;;;29303:27;29319:10;29303:27;;;;;;:::i;:::-;;;;;;;;29367:4;:10;;;29348:16;:29;29345:179;;;29430:16;29417:4;:10;;;:29;29397:49;;29345:179;;;29507:1;29487:21;;29345:179;29558:17;29538:37;;;;29613:17;29590:40;;;;29226:578;;;29683:19;29663:39;;29737:17;29717:37;;;;29791:1;29769:23;;29226:578;29853:4;:14;;;29833:17;:34;29816:51;;;;29885:9;29880:427;29904:4;:11;;;:18;29900:1;:22;29880:427;;;29973:8;;;;;;;;;;;29947:35;;:4;:11;;;29959:1;29947:14;;;;;;;;;;;;;;:35;;;29944:352;;;30039:4;:17;;;30057:1;30039:20;;;;;;;;;;;;;;30019:17;:40;30002:57;;;;29944:352;;;30100:16;30130:4;:11;;;30142:1;30130:14;;;;;;;;;;;;;;30100:45;;30164:14;30201:4;:17;;;30219:1;30201:20;;;;;;;;;;;;;;30181:17;:40;30164:57;;30240:40;30254:5;30261:10;30273:6;30240:13;:40::i;:::-;29944:352;;;29924:3;;;;;;;29880:427;;;;30355:19;30319:21;:33;30341:10;30319:33;;;;;;;;;;;;;;;:55;;;;30414:16;30385:14;:26;30400:10;30385:26;;;;;;;;;;;;;;;:45;;;;30464:1;30447:13;:18;30443:177;;30496:12;30514:10;:15;;30536:13;30514:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30495:59;;;30577:7;30569:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;30443:177;;30653:1;30636:13;:18;30632:151;;30670:16;30700:8;;;;;;;;;;;30670:39;;30724:47;30738:5;30745:10;30757:13;30724;:47::i;:::-;30632:151;;28677:2113;;;;;;;:::o;24014:53::-;;;;;;;;;;;;;;;;;:::o;22038:277::-;22177:8;22188:7;:14;22177:25;;22217:6;22213:95;22233:3;22229:1;:7;22213:95;;;22257:39;22271:7;22279:1;22271:10;;;;;;;;;;;;;;22283:12;22257:13;:39::i;:::-;22238:3;;;;;;;22213:95;;;;22038:277;;;:::o;18467:182::-;18555:86;18575:5;18605:23;;;18630:2;18634:5;18582:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18555:19;:86::i;:::-;18467:182;;;:::o;22529:523::-;22632:15;22680:1;22662:20;;:6;:20;;;22658:387;;;22709:21;22699:31;;22746:12;22764;:17;;22788:7;22764:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22745:55;;;22823:7;22815:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;22658:387;;;;22883:16;22913:6;22883:37;;22945:5;:15;;;22969:4;22945:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22935:40;;22990:43;23004:5;23011:12;23025:7;22990:13;:43::i;:::-;22658:387;;22529:523;;;:::o;19262:1128::-;19871:27;19891:5;19871:11;:27::i;:::-;19863:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20011:12;20025:23;20060:5;20052:19;;20072:4;20052:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20010:67;;;;20096:7;20088:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;20180:1;20160:10;:17;:21;20156:227;;;20302:10;20291:30;;;;;;;;;;;;:::i;:::-;20283:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;20156:227;19262:1128;;;;:::o;20985:620::-;21046:4;21308:16;21335:19;21357:66;21335:88;;;;21526:7;21514:20;21502:32;;21566:11;21554:8;:23;;:42;;;;;21593:3;21581:15;;:8;:15;;21554:42;21546:51;;;;20985:620;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:146::-;;230:6;217:20;208:29;;242:41;277:5;242:41;:::i;:::-;202:86;;;;:::o;313:352::-;;;443:3;436:4;428:6;424:17;420:27;410:2;;461:1;458;451:12;410:2;494:6;481:20;471:30;;521:18;513:6;510:30;507:2;;;553:1;550;543:12;507:2;587:4;579:6;575:17;563:29;;638:3;630:4;622:6;618:17;608:8;604:32;601:41;598:2;;;655:1;652;645:12;598:2;403:262;;;;;:::o;691:707::-;;808:3;801:4;793:6;789:17;785:27;775:2;;826:1;823;816:12;775:2;863:6;850:20;885:80;900:64;957:6;900:64;:::i;:::-;885:80;:::i;:::-;876:89;;982:5;1007:6;1000:5;993:21;1037:4;1029:6;1025:17;1015:27;;1059:4;1054:3;1050:14;1043:21;;1112:6;1159:3;1151:4;1143:6;1139:17;1134:3;1130:27;1127:36;1124:2;;;1176:1;1173;1166:12;1124:2;1201:1;1186:206;1211:6;1208:1;1205:13;1186:206;;;1269:3;1291:37;1324:3;1312:10;1291:37;:::i;:::-;1286:3;1279:50;1352:4;1347:3;1343:14;1336:21;;1380:4;1375:3;1371:14;1364:21;;1243:149;1233:1;1230;1226:9;1221:14;;1186:206;;;1190:14;768:630;;;;;;;:::o;1424:352::-;;;1554:3;1547:4;1539:6;1535:17;1531:27;1521:2;;1572:1;1569;1562:12;1521:2;1605:6;1592:20;1582:30;;1632:18;1624:6;1621:30;1618:2;;;1664:1;1661;1654:12;1618:2;1698:4;1690:6;1686:17;1674:29;;1749:3;1741:4;1733:6;1729:17;1719:8;1715:32;1712:41;1709:2;;;1766:1;1763;1756:12;1709:2;1514:262;;;;;:::o;1802:707::-;;1919:3;1912:4;1904:6;1900:17;1896:27;1886:2;;1937:1;1934;1927:12;1886:2;1974:6;1961:20;1996:80;2011:64;2068:6;2011:64;:::i;:::-;1996:80;:::i;:::-;1987:89;;2093:5;2118:6;2111:5;2104:21;2148:4;2140:6;2136:17;2126:27;;2170:4;2165:3;2161:14;2154:21;;2223:6;2270:3;2262:4;2254:6;2250:17;2245:3;2241:27;2238:36;2235:2;;;2287:1;2284;2277:12;2235:2;2312:1;2297:206;2322:6;2319:1;2316:13;2297:206;;;2380:3;2402:37;2435:3;2423:10;2402:37;:::i;:::-;2397:3;2390:50;2463:4;2458:3;2454:14;2447:21;;2491:4;2486:3;2482:14;2475:21;;2354:149;2344:1;2341;2337:9;2332:14;;2297:206;;;2301:14;1879:630;;;;;;;:::o;2517:124::-;;2594:6;2581:20;2572:29;;2606:30;2630:5;2606:30;:::i;:::-;2566:75;;;;:::o;2648:128::-;;2729:6;2723:13;2714:22;;2741:30;2765:5;2741:30;:::i;:::-;2708:68;;;;:::o;2823:844::-;;2933:4;2921:9;2916:3;2912:19;2908:30;2905:2;;;2951:1;2948;2941:12;2905:2;2969:20;2984:4;2969:20;:::i;:::-;2960:29;;3044:1;3076:49;3121:3;3112:6;3101:9;3097:22;3076:49;:::i;:::-;3069:4;3062:5;3058:16;3051:75;2999:138;3217:2;3206:9;3202:18;3189:32;3241:18;3233:6;3230:30;3227:2;;;3273:1;3270;3263:12;3227:2;3308:74;3378:3;3369:6;3358:9;3354:22;3308:74;:::i;:::-;3301:4;3294:5;3290:16;3283:100;3147:247;3480:2;3469:9;3465:18;3452:32;3504:18;3496:6;3493:30;3490:2;;;3536:1;3533;3526:12;3490:2;3571:74;3641:3;3632:6;3621:9;3617:22;3571:74;:::i;:::-;3564:4;3557:5;3553:16;3546:100;3404:253;2899:768;;;;:::o;3674:130::-;;3754:6;3741:20;3732:29;;3766:33;3793:5;3766:33;:::i;:::-;3726:78;;;;:::o;3811:134::-;;3895:6;3889:13;3880:22;;3907:33;3934:5;3907:33;:::i;:::-;3874:71;;;;:::o;3952:241::-;;4056:2;4044:9;4035:7;4031:23;4027:32;4024:2;;;4072:1;4069;4062:12;4024:2;4107:1;4124:53;4169:7;4160:6;4149:9;4145:22;4124:53;:::i;:::-;4114:63;;4086:97;4018:175;;;;:::o;4200:257::-;;4312:2;4300:9;4291:7;4287:23;4283:32;4280:2;;;4328:1;4325;4318:12;4280:2;4363:1;4380:61;4433:7;4424:6;4413:9;4409:22;4380:61;:::i;:::-;4370:71;;4342:105;4274:183;;;;:::o;4464:398::-;;;4601:2;4589:9;4580:7;4576:23;4572:32;4569:2;;;4617:1;4614;4607:12;4569:2;4652:1;4669:61;4722:7;4713:6;4702:9;4698:22;4669:61;:::i;:::-;4659:71;;4631:105;4767:2;4785:61;4838:7;4829:6;4818:9;4814:22;4785:61;:::i;:::-;4775:71;;4746:106;4563:299;;;;;:::o;4869:360::-;;;4987:2;4975:9;4966:7;4962:23;4958:32;4955:2;;;5003:1;5000;4993:12;4955:2;5038:1;5055:53;5100:7;5091:6;5080:9;5076:22;5055:53;:::i;:::-;5045:63;;5017:97;5145:2;5163:50;5205:7;5196:6;5185:9;5181:22;5163:50;:::i;:::-;5153:60;;5124:95;4949:280;;;;;:::o;5236:485::-;;;;5371:2;5359:9;5350:7;5346:23;5342:32;5339:2;;;5387:1;5384;5377:12;5339:2;5422:1;5439:53;5484:7;5475:6;5464:9;5460:22;5439:53;:::i;:::-;5429:63;;5401:97;5529:2;5547:50;5589:7;5580:6;5569:9;5565:22;5547:50;:::i;:::-;5537:60;;5508:95;5634:2;5652:53;5697:7;5688:6;5677:9;5673:22;5652:53;:::i;:::-;5642:63;;5613:98;5333:388;;;;;:::o;5728:397::-;;;5867:2;5855:9;5846:7;5842:23;5838:32;5835:2;;;5883:1;5880;5873:12;5835:2;5946:1;5935:9;5931:17;5918:31;5969:18;5961:6;5958:30;5955:2;;;6001:1;5998;5991:12;5955:2;6029:80;6101:7;6092:6;6081:9;6077:22;6029:80;:::i;:::-;6011:98;;;;5897:218;5829:296;;;;;:::o;6132:516::-;;;;6285:2;6273:9;6264:7;6260:23;6256:32;6253:2;;;6301:1;6298;6291:12;6253:2;6364:1;6353:9;6349:17;6336:31;6387:18;6379:6;6376:30;6373:2;;;6419:1;6416;6409:12;6373:2;6447:80;6519:7;6510:6;6499:9;6495:22;6447:80;:::i;:::-;6429:98;;;;6315:218;6564:2;6582:50;6624:7;6615:6;6604:9;6600:22;6582:50;:::i;:::-;6572:60;;6543:95;6247:401;;;;;:::o;6655:235::-;;6756:2;6744:9;6735:7;6731:23;6727:32;6724:2;;;6772:1;6769;6762:12;6724:2;6807:1;6824:50;6866:7;6857:6;6846:9;6842:22;6824:50;:::i;:::-;6814:60;;6786:94;6718:172;;;;:::o;6897:257::-;;7009:2;6997:9;6988:7;6984:23;6980:32;6977:2;;;7025:1;7022;7015:12;6977:2;7060:1;7077:61;7130:7;7121:6;7110:9;7106:22;7077:61;:::i;:::-;7067:71;;7039:105;6971:183;;;;:::o;7161:1487::-;;;;;;;;;;;7487:3;7475:9;7466:7;7462:23;7458:33;7455:2;;;7504:1;7501;7494:12;7455:2;7539:1;7556:50;7598:7;7589:6;7578:9;7574:22;7556:50;:::i;:::-;7546:60;;7518:94;7643:2;7661:53;7706:7;7697:6;7686:9;7682:22;7661:53;:::i;:::-;7651:63;;7622:98;7779:2;7768:9;7764:18;7751:32;7803:18;7795:6;7792:30;7789:2;;;7835:1;7832;7825:12;7789:2;7863:80;7935:7;7926:6;7915:9;7911:22;7863:80;:::i;:::-;7845:98;;;;7730:219;8008:2;7997:9;7993:18;7980:32;8032:18;8024:6;8021:30;8018:2;;;8064:1;8061;8054:12;8018:2;8092:80;8164:7;8155:6;8144:9;8140:22;8092:80;:::i;:::-;8074:98;;;;7959:219;8237:3;8226:9;8222:19;8209:33;8262:18;8254:6;8251:30;8248:2;;;8294:1;8291;8284:12;8248:2;8322:80;8394:7;8385:6;8374:9;8370:22;8322:80;:::i;:::-;8304:98;;;;8188:220;8467:3;8456:9;8452:19;8439:33;8492:18;8484:6;8481:30;8478:2;;;8524:1;8521;8514:12;8478:2;8552:80;8624:7;8615:6;8604:9;8600:22;8552:80;:::i;:::-;8534:98;;;;8418:220;7449:1199;;;;;;;;;;;;;:::o;8655:369::-;;8780:2;8768:9;8759:7;8755:23;8751:32;8748:2;;;8796:1;8793;8786:12;8748:2;8859:1;8848:9;8844:17;8831:31;8882:18;8874:6;8871:30;8868:2;;;8914:1;8911;8904:12;8868:2;8934:74;9000:7;8991:6;8980:9;8976:22;8934:74;:::i;:::-;8924:84;;8810:204;8742:282;;;;:::o;9031:263::-;;9146:2;9134:9;9125:7;9121:23;9117:32;9114:2;;;9162:1;9159;9152:12;9114:2;9197:1;9214:64;9270:7;9261:6;9250:9;9246:22;9214:64;:::i;:::-;9204:74;;9176:108;9108:186;;;;:::o;9302:173::-;;9389:46;9431:3;9423:6;9389:46;:::i;:::-;9464:4;9459:3;9455:14;9441:28;;9382:93;;;;:::o;9484:173::-;;9571:46;9613:3;9605:6;9571:46;:::i;:::-;9646:4;9641:3;9637:14;9623:28;;9564:93;;;;:::o;9665:142::-;9756:45;9795:5;9756:45;:::i;:::-;9751:3;9744:58;9738:69;;:::o;9814:137::-;9913:32;9939:5;9913:32;:::i;:::-;9908:3;9901:45;9895:56;;:::o;9958:103::-;10031:24;10049:5;10031:24;:::i;:::-;10026:3;10019:37;10013:48;;:::o;10068:113::-;10151:24;10169:5;10151:24;:::i;:::-;10146:3;10139:37;10133:48;;:::o;10219:690::-;;10364:54;10412:5;10364:54;:::i;:::-;10431:86;10510:6;10505:3;10431:86;:::i;:::-;10424:93;;10538:56;10588:5;10538:56;:::i;:::-;10614:7;10642:1;10627:260;10652:6;10649:1;10646:13;10627:260;;;10719:6;10713:13;10740:63;10799:3;10784:13;10740:63;:::i;:::-;10733:70;;10820:60;10873:6;10820:60;:::i;:::-;10810:70;;10684:203;10674:1;10671;10667:9;10662:14;;10627:260;;;10631:14;10900:3;10893:10;;10343:566;;;;;;;:::o;10948:690::-;;11093:54;11141:5;11093:54;:::i;:::-;11160:86;11239:6;11234:3;11160:86;:::i;:::-;11153:93;;11267:56;11317:5;11267:56;:::i;:::-;11343:7;11371:1;11356:260;11381:6;11378:1;11375:13;11356:260;;;11448:6;11442:13;11469:63;11528:3;11513:13;11469:63;:::i;:::-;11462:70;;11549:60;11602:6;11549:60;:::i;:::-;11539:70;;11413:203;11403:1;11400;11396:9;11391:14;;11356:260;;;11360:14;11629:3;11622:10;;11072:566;;;;;;;:::o;11646:104::-;11723:21;11738:5;11723:21;:::i;:::-;11718:3;11711:34;11705:45;;:::o;11757:356::-;;11885:38;11917:5;11885:38;:::i;:::-;11935:88;12016:6;12011:3;11935:88;:::i;:::-;11928:95;;12028:52;12073:6;12068:3;12061:4;12054:5;12050:16;12028:52;:::i;:::-;12101:6;12096:3;12092:16;12085:23;;11865:248;;;;;:::o;12120:160::-;12220:54;12268:5;12220:54;:::i;:::-;12215:3;12208:67;12202:78;;:::o;12288:372::-;;12448:67;12512:2;12507:3;12448:67;:::i;:::-;12441:74;;12548:34;12544:1;12539:3;12535:11;12528:55;12617:5;12612:2;12607:3;12603:12;12596:27;12651:2;12646:3;12642:12;12635:19;;12434:226;;;:::o;12669:305::-;;12829:66;12893:1;12888:3;12829:66;:::i;:::-;12822:73;;12928:8;12924:1;12919:3;12915:11;12908:29;12965:2;12960:3;12956:12;12949:19;;12815:159;;;:::o;12983:371::-;;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13243:34;13239:1;13234:3;13230:11;13223:55;13312:4;13307:2;13302:3;13298:12;13291:26;13345:2;13340:3;13336:12;13329:19;;13129:225;;;:::o;13363:324::-;;13523:67;13587:2;13582:3;13523:67;:::i;:::-;13516:74;;13623:26;13619:1;13614:3;13610:11;13603:47;13678:2;13673:3;13669:12;13662:19;;13509:178;;;:::o;13696:321::-;;13856:67;13920:2;13915:3;13856:67;:::i;:::-;13849:74;;13956:23;13952:1;13947:3;13943:11;13936:44;14008:2;14003:3;13999:12;13992:19;;13842:175;;;:::o;14026:312::-;;14186:67;14250:2;14245:3;14186:67;:::i;:::-;14179:74;;14286:14;14282:1;14277:3;14273:11;14266:35;14329:2;14324:3;14320:12;14313:19;;14172:166;;;:::o;14347:315::-;;14507:67;14571:2;14566:3;14507:67;:::i;:::-;14500:74;;14607:17;14603:1;14598:3;14594:11;14587:38;14653:2;14648:3;14644:12;14637:19;;14493:169;;;:::o;14671:324::-;;14831:67;14895:2;14890:3;14831:67;:::i;:::-;14824:74;;14931:26;14927:1;14922:3;14918:11;14911:47;14986:2;14981:3;14977:12;14970:19;;14817:178;;;:::o;15004:382::-;;15164:67;15228:2;15223:3;15164:67;:::i;:::-;15157:74;;15264:34;15260:1;15255:3;15251:11;15244:55;15333:15;15328:2;15323:3;15319:12;15312:37;15377:2;15372:3;15368:12;15361:19;;15150:236;;;:::o;15395:324::-;;15555:67;15619:2;15614:3;15555:67;:::i;:::-;15548:74;;15655:26;15651:1;15646:3;15642:11;15635:47;15710:2;15705:3;15701:12;15694:19;;15541:178;;;:::o;15728:319::-;;15888:67;15952:2;15947:3;15888:67;:::i;:::-;15881:74;;15988:21;15984:1;15979:3;15975:11;15968:42;16038:2;16033:3;16029:12;16022:19;;15874:173;;;:::o;16056:331::-;;16216:67;16280:2;16275:3;16216:67;:::i;:::-;16209:74;;16316:33;16312:1;16307:3;16303:11;16296:54;16378:2;16373:3;16369:12;16362:19;;16202:185;;;:::o;16396:330::-;;16556:67;16620:2;16615:3;16556:67;:::i;:::-;16549:74;;16656:32;16652:1;16647:3;16643:11;16636:53;16717:2;16712:3;16708:12;16701:19;;16542:184;;;:::o;16735:296::-;;16912:83;16993:1;16988:3;16912:83;:::i;:::-;16905:90;;17023:1;17018:3;17014:11;17007:18;;16898:133;;;:::o;17040:391::-;;17200:67;17264:2;17259:3;17200:67;:::i;:::-;17193:74;;17300:34;17296:1;17291:3;17287:11;17280:55;17369:24;17364:2;17359:3;17355:12;17348:46;17422:2;17417:3;17413:12;17406:19;;17186:245;;;:::o;17439:103::-;17512:24;17530:5;17512:24;:::i;:::-;17507:3;17500:37;17494:48;;:::o;17549:113::-;17632:24;17650:5;17632:24;:::i;:::-;17627:3;17620:37;17614:48;;:::o;17669:271::-;;17822:93;17911:3;17902:6;17822:93;:::i;:::-;17815:100;;17932:3;17925:10;;17803:137;;;;:::o;17947:379::-;;18154:147;18297:3;18154:147;:::i;:::-;18147:154;;18318:3;18311:10;;18135:191;;;:::o;18333:222::-;;18460:2;18449:9;18445:18;18437:26;;18474:71;18542:1;18531:9;18527:17;18518:6;18474:71;:::i;:::-;18431:124;;;;:::o;18562:238::-;;18697:2;18686:9;18682:18;18674:26;;18711:79;18787:1;18776:9;18772:17;18763:6;18711:79;:::i;:::-;18668:132;;;;:::o;18807:254::-;;18950:2;18939:9;18935:18;18927:26;;18964:87;19048:1;19037:9;19033:17;19024:6;18964:87;:::i;:::-;18921:140;;;;:::o;19068:349::-;;19231:2;19220:9;19216:18;19208:26;;19245:79;19321:1;19310:9;19306:17;19297:6;19245:79;:::i;:::-;19335:72;19403:2;19392:9;19388:18;19379:6;19335:72;:::i;:::-;19202:215;;;;;:::o;19424:333::-;;19579:2;19568:9;19564:18;19556:26;;19593:71;19661:1;19650:9;19646:17;19637:6;19593:71;:::i;:::-;19675:72;19743:2;19732:9;19728:18;19719:6;19675:72;:::i;:::-;19550:207;;;;;:::o;19764:1112::-;;20153:3;20142:9;20138:19;20130:27;;20168:71;20236:1;20225:9;20221:17;20212:6;20168:71;:::i;:::-;20250:72;20318:2;20307:9;20303:18;20294:6;20250:72;:::i;:::-;20370:9;20364:4;20360:20;20355:2;20344:9;20340:18;20333:48;20395:108;20498:4;20489:6;20395:108;:::i;:::-;20387:116;;20551:9;20545:4;20541:20;20536:2;20525:9;20521:18;20514:48;20576:108;20679:4;20670:6;20576:108;:::i;:::-;20568:116;;20733:9;20727:4;20723:20;20717:3;20706:9;20702:19;20695:49;20758:108;20861:4;20852:6;20758:108;:::i;:::-;20750:116;;20124:752;;;;;;;;:::o;20883:1224::-;;21300:3;21289:9;21285:19;21277:27;;21315:71;21383:1;21372:9;21368:17;21359:6;21315:71;:::i;:::-;21397:72;21465:2;21454:9;21450:18;21441:6;21397:72;:::i;:::-;21517:9;21511:4;21507:20;21502:2;21491:9;21487:18;21480:48;21542:108;21645:4;21636:6;21542:108;:::i;:::-;21534:116;;21698:9;21692:4;21688:20;21683:2;21672:9;21668:18;21661:48;21723:108;21826:4;21817:6;21723:108;:::i;:::-;21715:116;;21880:9;21874:4;21870:20;21864:3;21853:9;21849:19;21842:49;21905:108;22008:4;21999:6;21905:108;:::i;:::-;21897:116;;22024:73;22092:3;22081:9;22077:19;22068:6;22024:73;:::i;:::-;21271:836;;;;;;;;;:::o;22114:210::-;;22235:2;22224:9;22220:18;22212:26;;22249:65;22311:1;22300:9;22296:17;22287:6;22249:65;:::i;:::-;22206:118;;;;:::o;22331:256::-;;22475:2;22464:9;22460:18;22452:26;;22489:88;22574:1;22563:9;22559:17;22550:6;22489:88;:::i;:::-;22446:141;;;;:::o;22594:416::-;;22794:2;22783:9;22779:18;22771:26;;22844:9;22838:4;22834:20;22830:1;22819:9;22815:17;22808:47;22869:131;22995:4;22869:131;:::i;:::-;22861:139;;22765:245;;;:::o;23017:416::-;;23217:2;23206:9;23202:18;23194:26;;23267:9;23261:4;23257:20;23253:1;23242:9;23238:17;23231:47;23292:131;23418:4;23292:131;:::i;:::-;23284:139;;23188:245;;;:::o;23440:416::-;;23640:2;23629:9;23625:18;23617:26;;23690:9;23684:4;23680:20;23676:1;23665:9;23661:17;23654:47;23715:131;23841:4;23715:131;:::i;:::-;23707:139;;23611:245;;;:::o;23863:416::-;;24063:2;24052:9;24048:18;24040:26;;24113:9;24107:4;24103:20;24099:1;24088:9;24084:17;24077:47;24138:131;24264:4;24138:131;:::i;:::-;24130:139;;24034:245;;;:::o;24286:416::-;;24486:2;24475:9;24471:18;24463:26;;24536:9;24530:4;24526:20;24522:1;24511:9;24507:17;24500:47;24561:131;24687:4;24561:131;:::i;:::-;24553:139;;24457:245;;;:::o;24709:416::-;;24909:2;24898:9;24894:18;24886:26;;24959:9;24953:4;24949:20;24945:1;24934:9;24930:17;24923:47;24984:131;25110:4;24984:131;:::i;:::-;24976:139;;24880:245;;;:::o;25132:416::-;;25332:2;25321:9;25317:18;25309:26;;25382:9;25376:4;25372:20;25368:1;25357:9;25353:17;25346:47;25407:131;25533:4;25407:131;:::i;:::-;25399:139;;25303:245;;;:::o;25555:416::-;;25755:2;25744:9;25740:18;25732:26;;25805:9;25799:4;25795:20;25791:1;25780:9;25776:17;25769:47;25830:131;25956:4;25830:131;:::i;:::-;25822:139;;25726:245;;;:::o;25978:416::-;;26178:2;26167:9;26163:18;26155:26;;26228:9;26222:4;26218:20;26214:1;26203:9;26199:17;26192:47;26253:131;26379:4;26253:131;:::i;:::-;26245:139;;26149:245;;;:::o;26401:416::-;;26601:2;26590:9;26586:18;26578:26;;26651:9;26645:4;26641:20;26637:1;26626:9;26622:17;26615:47;26676:131;26802:4;26676:131;:::i;:::-;26668:139;;26572:245;;;:::o;26824:416::-;;27024:2;27013:9;27009:18;27001:26;;27074:9;27068:4;27064:20;27060:1;27049:9;27045:17;27038:47;27099:131;27225:4;27099:131;:::i;:::-;27091:139;;26995:245;;;:::o;27247:416::-;;27447:2;27436:9;27432:18;27424:26;;27497:9;27491:4;27487:20;27483:1;27472:9;27468:17;27461:47;27522:131;27648:4;27522:131;:::i;:::-;27514:139;;27418:245;;;:::o;27670:416::-;;27870:2;27859:9;27855:18;27847:26;;27920:9;27914:4;27910:20;27906:1;27895:9;27891:17;27884:47;27945:131;28071:4;27945:131;:::i;:::-;27937:139;;27841:245;;;:::o;28093:416::-;;28293:2;28282:9;28278:18;28270:26;;28343:9;28337:4;28333:20;28329:1;28318:9;28314:17;28307:47;28368:131;28494:4;28368:131;:::i;:::-;28360:139;;28264:245;;;:::o;28516:222::-;;28643:2;28632:9;28628:18;28620:26;;28657:71;28725:1;28714:9;28710:17;28701:6;28657:71;:::i;:::-;28614:124;;;;:::o;28745:556::-;;28956:3;28945:9;28941:19;28933:27;;28971:71;29039:1;29028:9;29024:17;29015:6;28971:71;:::i;:::-;29053:72;29121:2;29110:9;29106:18;29097:6;29053:72;:::i;:::-;29136;29204:2;29193:9;29189:18;29180:6;29136:72;:::i;:::-;29219;29287:2;29276:9;29272:18;29263:6;29219:72;:::i;:::-;28927:374;;;;;;;:::o;29308:256::-;;29370:2;29364:9;29354:19;;29408:4;29400:6;29396:17;29507:6;29495:10;29492:22;29471:18;29459:10;29456:34;29453:62;29450:2;;;29528:1;29525;29518:12;29450:2;29548:10;29544:2;29537:22;29348:216;;;;:::o;29571:304::-;;29730:18;29722:6;29719:30;29716:2;;;29762:1;29759;29752:12;29716:2;29797:4;29789:6;29785:17;29777:25;;29860:4;29854;29850:15;29842:23;;29653:222;;;:::o;29882:304::-;;30041:18;30033:6;30030:30;30027:2;;;30073:1;30070;30063:12;30027:2;30108:4;30100:6;30096:17;30088:25;;30171:4;30165;30161:15;30153:23;;29964:222;;;:::o;30193:151::-;;30279:3;30271:11;;30317:4;30312:3;30308:14;30300:22;;30265:79;;;:::o;30351:151::-;;30437:3;30429:11;;30475:4;30470:3;30466:14;30458:22;;30423:79;;;:::o;30509:137::-;;30618:5;30612:12;30602:22;;30583:63;;;:::o;30653:137::-;;30762:5;30756:12;30746:22;;30727:63;;;:::o;30797:121::-;;30890:5;30884:12;30874:22;;30855:63;;;:::o;30925:108::-;;31023:4;31018:3;31014:14;31006:22;;31000:33;;;:::o;31040:108::-;;31138:4;31133:3;31129:14;31121:22;;31115:33;;;:::o;31156:178::-;;31286:6;31281:3;31274:19;31323:4;31318:3;31314:14;31299:29;;31267:67;;;;:::o;31343:178::-;;31473:6;31468:3;31461:19;31510:4;31505:3;31501:14;31486:29;;31454:67;;;;:::o;31530:144::-;;31665:3;31650:18;;31643:31;;;;:::o;31683:163::-;;31798:6;31793:3;31786:19;31835:4;31830:3;31826:14;31811:29;;31779:67;;;;:::o;31854:91::-;;31916:24;31934:5;31916:24;:::i;:::-;31905:35;;31899:46;;;:::o;31952:99::-;;32022:24;32040:5;32022:24;:::i;:::-;32011:35;;32005:46;;;:::o;32058:85::-;;32131:5;32124:13;32117:21;32106:32;;32100:43;;;:::o;32150:121::-;;32223:42;32216:5;32212:54;32201:65;;32195:76;;;:::o;32278:72::-;;32340:5;32329:16;;32323:27;;;:::o;32357:129::-;;32444:37;32475:5;32444:37;:::i;:::-;32431:50;;32425:61;;;:::o;32493:155::-;;32589:54;32637:5;32589:54;:::i;:::-;32576:67;;32570:78;;;:::o;32655:125::-;;32751:24;32769:5;32751:24;:::i;:::-;32738:37;;32732:48;;;:::o;32787:121::-;;32866:37;32897:5;32866:37;:::i;:::-;32853:50;;32847:61;;;:::o;32915:108::-;;32994:24;33012:5;32994:24;:::i;:::-;32981:37;;32975:48;;;:::o;33031:268::-;33096:1;33103:101;33117:6;33114:1;33111:13;33103:101;;;33193:1;33188:3;33184:11;33178:18;33174:1;33169:3;33165:11;33158:39;33139:2;33136:1;33132:10;33127:15;;33103:101;;;33219:6;33216:1;33213:13;33210:2;;;33284:1;33275:6;33270:3;33266:16;33259:27;33210:2;33080:219;;;;:::o;33307:117::-;33376:24;33394:5;33376:24;:::i;:::-;33369:5;33366:35;33356:2;;33415:1;33412;33405:12;33356:2;33350:74;:::o;33431:133::-;33508:32;33534:5;33508:32;:::i;:::-;33501:5;33498:43;33488:2;;33555:1;33552;33545:12;33488:2;33482:82;:::o;33571:111::-;33637:21;33652:5;33637:21;:::i;:::-;33630:5;33627:32;33617:2;;33673:1;33670;33663:12;33617:2;33611:71;:::o;33689:117::-;33758:24;33776:5;33758:24;:::i;:::-;33751:5;33748:35;33738:2;;33797:1;33794;33787:12;33738:2;33732:74;:::o
Swarm Source
ipfs://24adca062b7dce5bc4b48fa52b94f67e6f6dda1be6b39e4c8bb44dc29292fb25
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.