Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Read Proxy
Write Contract
Write Proxy
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- CErc20Delegator
- Optimization enabled
- true
- Compiler version
- v0.8.11+commit.d7f03943
- Optimization runs
- 200
- Verified at
- 2023-10-15T14:07:17.550184Z
src/CErc20Delegator.sol
// SPDX-License-Identifier: BSD-3-Clausepragma solidity ^0.8.10;import "./CTokenInterfaces.sol";/*** @title Compound's CErc20Delegator Contract* @notice CTokens which wrap an EIP-20 underlying and delegate to an implementation* @author Compound*/contract CErc20Delegator isCTokenInterface,CErc20Interface,CDelegatorInterface{/*** @notice Construct a new money market* @param underlying_ The address of the underlying asset* @param comptroller_ The address of the Comptroller* @param interestRateModel_ The address of the interest rate model* @param initialExchangeRateMantissa_ The initial exchange rate, scaled by 1e18* @param name_ ERC-20 name of this token* @param symbol_ ERC-20 symbol of this token* @param decimals_ ERC-20 decimal precision of this token* @param admin_ Address of the administrator of this token* @param implementation_ The address of the implementation the contract delegates to* @param becomeImplementationData The encoded args for becomeImplementation*/constructor(address underlying_,ComptrollerInterface comptroller_,InterestRateModel interestRateModel_,uint256 initialExchangeRateMantissa_,string memory name_,string memory symbol_,uint8 decimals_,address payable admin_,address implementation_,bytes memory becomeImplementationData) {// Creator of the contract is admin during initialization
/InterestRateModel.sol
// SPDX-License-Identifier: BSD-3-Clausepragma solidity ^0.8.10;/*** @title Compound's InterestRateModel Interface* @author Compound*/abstract contract InterestRateModel {/// @notice Indicator that this is an InterestRateModel contract (for inspection)bool public constant isInterestRateModel = true;/*** @notice Calculates the current borrow interest rate per block* @param cash The total amount of cash the market has* @param borrows The total amount of borrows the market has outstanding* @param reserves The total amount of reserves the market has* @return The borrow rate per block (as a percentage, and scaled by 1e18)*/function getBorrowRate(uint256 cash, uint256 borrows, uint256 reserves)externalviewvirtualreturns (uint256);/*** @notice Calculates the current supply interest rate per block* @param cash The total amount of cash the market has* @param borrows The total amount of borrows the market has outstanding* @param reserves The total amount of reserves the market has* @param reserveFactorMantissa The current reserve factor the market has* @return The supply rate per block (as a percentage, and scaled by 1e18)*/function getSupplyRate(uint256 cash,uint256 borrows,uint256 reserves,uint256 reserveFactorMantissa)externalviewvirtual
/ErrorReporter.sol
// SPDX-License-Identifier: BSD-3-Clausepragma solidity ^0.8.10;contract ComptrollerErrorReporter {enum Error // no longer possible{NO_ERROR,UNAUTHORIZED,COMPTROLLER_MISMATCH,INSUFFICIENT_SHORTFALL,INSUFFICIENT_LIQUIDITY,INVALID_CLOSE_FACTOR,INVALID_COLLATERAL_FACTOR,INVALID_LIQUIDATION_INCENTIVE,MARKET_NOT_ENTERED,MARKET_NOT_LISTED,MARKET_ALREADY_LISTED,MATH_ERROR,NONZERO_BORROW_BALANCE,PRICE_ERROR,REJECTION,SNAPSHOT_ERROR,TOO_MANY_ASSETS,TOO_MUCH_REPAY}enum FailureInfo {ACCEPT_ADMIN_PENDING_ADMIN_CHECK,ACCEPT_PENDING_IMPLEMENTATION_ADDRESS_CHECK,EXIT_MARKET_BALANCE_OWED,EXIT_MARKET_REJECTION,SET_CLOSE_FACTOR_OWNER_CHECK,SET_CLOSE_FACTOR_VALIDATION,SET_COLLATERAL_FACTOR_OWNER_CHECK,SET_COLLATERAL_FACTOR_NO_EXISTS,SET_COLLATERAL_FACTOR_VALIDATION,SET_COLLATERAL_FACTOR_WITHOUT_PRICE,SET_IMPLEMENTATION_OWNER_CHECK,SET_LIQUIDATION_INCENTIVE_OWNER_CHECK,SET_LIQUIDATION_INCENTIVE_VALIDATION,SET_MAX_ASSETS_OWNER_CHECK,
/EIP20NonStandardInterface.sol
// SPDX-License-Identifier: BSD-3-Clausepragma solidity ^0.8.10;/*** @title EIP20NonStandardInterface* @dev Version of ERC20 with no return values for `transfer` and `transferFrom`* See https://medium.com/coinmonks/missing-return-value-bug-at-least-130-tokens-affected-d67bf08521ca*/interface EIP20NonStandardInterface {/*** @notice Get the total number of tokens in circulation* @return The supply of tokens*/function totalSupply() external view returns (uint256);/*** @notice Gets the balance of the specified address* @param owner The address from which the balance will be retrieved* @return balance The balance*/function balanceOf(address owner)externalviewreturns (uint256 balance);/// !!!!!!!!!!!!!!/// !!! NOTICE !!! `transfer` does not return a value, in violation of the ERC-20 specification/// !!!!!!!!!!!!!!/*** @notice Transfer `amount` tokens from `msg.sender` to `dst`* @param dst The address of the destination account* @param amount The number of tokens to transfer*/function transfer(address dst, uint256 amount) external;/// !!!!!!!!!!!!!!/// !!! NOTICE !!! `transferFrom` does not return a value, in violation of the ERC-20 specification/// !!!!!!!!!!!!!!/**
/ComptrollerInterface.sol
// SPDX-License-Identifier: BSD-3-Clausepragma solidity ^0.8.10;abstract contract ComptrollerInterface {/// @notice Indicator that this is a Comptroller contract (for inspection)bool public constant isComptroller = true;/**** Assets You Are In ***/function enterMarkets(address[] calldata cTokens)externalvirtualreturns (uint256[] memory);function exitMarket(address cToken) external virtual returns (uint256);/**** Policy Hooks ***/function mintAllowed(address cToken, address minter, uint256 mintAmount)externalvirtualreturns (uint256);function mintVerify(address cToken,address minter,uint256 mintAmount,uint256 mintTokens)externalvirtual;function redeemAllowed(address cToken,address redeemer,uint256 redeemTokens)externalvirtual
/CTokenInterfaces.sol
// SPDX-License-Identifier: BSD-3-Clausepragma solidity ^0.8.10;import "./ComptrollerInterface.sol";import "./InterestRateModel.sol";import "./EIP20NonStandardInterface.sol";import "./ErrorReporter.sol";contract CTokenStorage {/*** @dev Guard variable for re-entrancy checks*/bool internal _notEntered;/*** @notice EIP-20 token name for this token*/string public name;/*** @notice EIP-20 token symbol for this token*/string public symbol;/*** @notice EIP-20 token decimals for this token*/uint8 public decimals;// Maximum borrow rate that can ever be applied (.0005% / block)uint internal constant borrowRateMaxMantissa = 0.0005e16;// Maximum fraction of interest that can be set aside for reservesuint internal constant reserveFactorMaxMantissa = 1e18;/*** @notice Administrator for this contract*/address payable public admin;/**
Compiler Settings
{"remappings":["ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/"],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"compilationTarget":{"src/CErc20Delegator.sol":"CErc20Delegator"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"underlying_","internalType":"address"},{"type":"address","name":"comptroller_","internalType":"contract ComptrollerInterface"},{"type":"address","name":"interestRateModel_","internalType":"contract InterestRateModel"},{"type":"uint256","name":"initialExchangeRateMantissa_","internalType":"uint256"},{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"uint8","name":"decimals_","internalType":"uint8"},{"type":"address","name":"admin_","internalType":"address payable"},{"type":"address","name":"implementation_","internalType":"address"},{"type":"bytes","name":"becomeImplementationData","internalType":"bytes"}]},{"type":"event","name":"AccrueInterest","inputs":[{"type":"uint256","name":"cashPrior","internalType":"uint256","indexed":false},{"type":"uint256","name":"interestAccumulated","internalType":"uint256","indexed":false},{"type":"uint256","name":"borrowIndex","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalBorrows","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Borrow","inputs":[{"type":"address","name":"borrower","internalType":"address","indexed":false},{"type":"uint256","name":"borrowAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"accountBorrows","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalBorrows","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LiquidateBorrow","inputs":[{"type":"address","name":"liquidator","internalType":"address","indexed":false},{"type":"address","name":"borrower","internalType":"address","indexed":false},{"type":"uint256","name":"repayAmount","internalType":"uint256","indexed":false},{"type":"address","name":"cTokenCollateral","internalType":"address","indexed":false},{"type":"uint256","name":"seizeTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Mint","inputs":[{"type":"address","name":"minter","internalType":"address","indexed":false},{"type":"uint256","name":"mintAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"mintTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"oldAdmin","internalType":"address","indexed":false},{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewComptroller","inputs":[{"type":"address","name":"oldComptroller","internalType":"contract ComptrollerInterface","indexed":false},{"type":"address","name":"newComptroller","internalType":"contract ComptrollerInterface","indexed":false}],"anonymous":false},{"type":"event","name":"NewImplementation","inputs":[{"type":"address","name":"oldImplementation","internalType":"address","indexed":false},{"type":"address","name":"newImplementation","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewMarketInterestRateModel","inputs":[{"type":"address","name":"oldInterestRateModel","internalType":"contract InterestRateModel","indexed":false},{"type":"address","name":"newInterestRateModel","internalType":"contract InterestRateModel","indexed":false}],"anonymous":false},{"type":"event","name":"NewPendingAdmin","inputs":[{"type":"address","name":"oldPendingAdmin","internalType":"address","indexed":false},{"type":"address","name":"newPendingAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewReserveFactor","inputs":[{"type":"uint256","name":"oldReserveFactorMantissa","internalType":"uint256","indexed":false},{"type":"uint256","name":"newReserveFactorMantissa","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Redeem","inputs":[{"type":"address","name":"redeemer","internalType":"address","indexed":false},{"type":"uint256","name":"redeemAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"redeemTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RepayBorrow","inputs":[{"type":"address","name":"payer","internalType":"address","indexed":false},{"type":"address","name":"borrower","internalType":"address","indexed":false},{"type":"uint256","name":"repayAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"accountBorrows","internalType":"uint256","indexed":false},{"type":"uint256","name":"totalBorrows","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ReservesAdded","inputs":[{"type":"address","name":"benefactor","internalType":"address","indexed":false},{"type":"uint256","name":"addAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"newTotalReserves","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ReservesReduced","inputs":[{"type":"address","name":"admin","internalType":"address","indexed":false},{"type":"uint256","name":"reduceAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"newTotalReserves","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_acceptAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_addReserves","inputs":[{"type":"uint256","name":"addAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_reduceReserves","inputs":[{"type":"uint256","name":"reduceAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_setComptroller","inputs":[{"type":"address","name":"newComptroller","internalType":"contract ComptrollerInterface"}]},{"type":"function","stateMutability":"nonpayable","name":"_setImplementation","inputs":[{"type":"address","name":"implementation_","internalType":"address"},{"type":"bool","name":"allowResign","internalType":"bool"},{"type":"bytes","name":"becomeImplementationData","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_setInterestRateModel","inputs":[{"type":"address","name":"newInterestRateModel","internalType":"contract InterestRateModel"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_setPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address payable"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_setReserveFactor","inputs":[{"type":"uint256","name":"newReserveFactorMantissa","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"accrualBlockNumber","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"accrueInterest","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOfUnderlying","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"borrow","inputs":[{"type":"uint256","name":"borrowAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"borrowBalanceCurrent","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"borrowBalanceStored","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"borrowIndex","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"borrowRatePerBlock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract ComptrollerInterface"}],"name":"comptroller","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"delegateToImplementation","inputs":[{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"delegateToViewImplementation","inputs":[{"type":"bytes","name":"data","internalType":"bytes"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"exchangeRateCurrent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"exchangeRateStored","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getAccountSnapshot","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCash","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract InterestRateModel"}],"name":"interestRateModel","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isCToken","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidateBorrow","inputs":[{"type":"address","name":"borrower","internalType":"address"},{"type":"uint256","name":"repayAmount","internalType":"uint256"},{"type":"address","name":"cTokenCollateral","internalType":"contract CTokenInterface"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"mint","inputs":[{"type":"uint256","name":"mintAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"pendingAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"protocolSeizeShareMantissa","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"redeem","inputs":[{"type":"uint256","name":"redeemTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"redeemUnderlying","inputs":[{"type":"uint256","name":"redeemAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"repayBorrow","inputs":[{"type":"uint256","name":"repayAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"repayBorrowBehalf","inputs":[{"type":"address","name":"borrower","internalType":"address"},{"type":"uint256","name":"repayAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reserveFactorMantissa","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"seize","inputs":[{"type":"address","name":"liquidator","internalType":"address"},{"type":"address","name":"borrower","internalType":"address"},{"type":"uint256","name":"seizeTokens","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"supplyRatePerBlock","inputs":[]},{"type":"function","stateMutability":"nonpayable","name":"sweepToken","inputs":[{"type":"address","name":"token","internalType":"contract EIP20NonStandardInterface"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBorrows","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalBorrowsCurrent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalReserves","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"src","internalType":"address"},{"type":"address","name":"dst","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"underlying","inputs":[]}]
Contract Creation Code
0x60806040523480156200001157600080fd5b50604051620022023803806200220283398101604081905262000034916200041a565b60038054610100600160a81b0319163361010002179055604051620000a590839062000071908d908d908d908d908d908d908d9060240162000556565b60408051601f198184030181529190526020810180516001600160e01b03908116631a31d46560e01b17909152620000ea16565b50620000b48260008362000169565b5050600380546001600160a01b0390921661010002610100600160a81b031990921691909117905550620005f995505050505050565b6060600080846001600160a01b031684604051620001099190620005bf565b600060405180830381855af49150503d806000811462000146576040519150601f19603f3d011682016040523d82523d6000602084013e6200014b565b606091505b5091509150600082141562000161573d60208201fd5b949350505050565b60035461010090046001600160a01b03163314620001f35760405162461bcd60e51b815260206004820152603960248201527f43457263323044656c656761746f723a3a5f736574496d706c656d656e74617460448201527f696f6e3a2043616c6c6572206d7573742062652061646d696e00000000000000606482015260840160405180910390fd5b811562000235576040805160048152602481019091526020810180516001600160e01b0390811663153ab50560e01b17909152620002339190620002f016565b505b601280546001600160a01b038581166001600160a01b0319831617909255604051911690620002a2906200026e908490602401620005dd565b60408051601f198184030181529190526020810180516001600160e01b03908116630adccee560e31b17909152620002f016565b50601254604080516001600160a01b03808516825290921660208301527fd604de94d45953f9138079ec1b82d533cb2160c906d1076d1f7ed54befbca97a910160405180910390a150505050565b6012546060906200030b906001600160a01b031683620000ea565b92915050565b80516001600160a01b03811681146200032957600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200036157818101518382015260200162000347565b8381111562000371576000848401525b50505050565b600082601f8301126200038957600080fd5b81516001600160401b0380821115620003a657620003a66200032e565b604051601f8301601f19908116603f01168101908282118183101715620003d157620003d16200032e565b81604052838152866020858801011115620003eb57600080fd5b620003fe84602083016020890162000344565b9695505050505050565b805160ff811681146200032957600080fd5b6000806000806000806000806000806101408b8d0312156200043b57600080fd5b620004468b62000311565b99506200045660208c0162000311565b98506200046660408c0162000311565b60608c015160808d015191995097506001600160401b03808211156200048b57600080fd5b620004998e838f0162000377565b975060a08d0151915080821115620004b057600080fd5b620004be8e838f0162000377565b9650620004ce60c08e0162000408565b9550620004de60e08e0162000311565b9450620004ef6101008e0162000311565b93506101208d01519150808211156200050757600080fd5b50620005168d828e0162000377565b9150509295989b9194979a5092959850565b600081518084526200054281602086016020860162000344565b601f01601f19169290920160200192915050565b6001600160a01b0388811682528781166020830152861660408201526060810185905260e060808201819052600090620005939083018662000528565b82810360a0840152620005a7818662000528565b91505060ff831660c083015298975050505050505050565b60008251620005d381846020870162000344565b9190910192915050565b602081526000620005f2602083018462000528565b9392505050565b611bf980620006096000396000f3fe6080604052600436106102ff5760003560e01c806370a0823111610190578063bd6d894d116100dc578063f2b3abbd11610095578063f851a4401161006f578063f851a440146109c3578063f8f9da28146109e8578063fca7820b146109fd578063fe9c44ae14610a1d576102ff565b8063f2b3abbd14610963578063f3fdb15a14610983578063f5e3c462146109a3576102ff565b8063bd6d894d14610899578063c37f68e2146108ae578063c5ebeaec146108ee578063db006a751461090e578063dd62ed3e1461092e578063e9c714f21461094e576102ff565b8063a0712d6811610149578063aa5af0fd11610123578063aa5af0fd1461082e578063ae9d70b014610844578063b2a02ff114610859578063b71d1a0c14610879576102ff565b8063a0712d68146107d9578063a6afed95146107f9578063a9059cbb1461080e576102ff565b806370a082311461073957806373acee9814610759578063852a12e31461076e5780638f840ddd1461078e57806395d89b41146107a457806395dd9193146107b9576102ff565b80633af9e6691161024f578063555bcc4011610208578063601a0bf1116101e2578063601a0bf1146106ce5780636752e702146106ee5780636c540baf146107035780636f307dc314610719576102ff565b8063555bcc401461066e5780635c60da1b1461068e5780635fe3b567146106ae576102ff565b80633af9e669146105c35780633b1d21a2146105e35780633e941010146105f85780634487152f146106185780634576b5db1461063857806347bd371814610658576102ff565b806318160ddd116102bc57806323b872dd1161029657806323b872dd1461051f5780632608f8181461053f578063267822471461055f578063313ce56714610597576102ff565b806318160ddd146104d2578063182df0f5146104e85780631be19560146104fd576102ff565b806306fdde03146103f35780630933c1ed1461041e578063095ea7b31461043e5780630e7527021461046e578063173b99041461049c57806317bfdfbc146104b2575b34156103785760405162461bcd60e51b815260206004820152603760248201527f43457263323044656c656761746f723a66616c6c6261636b3a2063616e6e6f7460448201527f2073656e642076616c756520746f2066616c6c6261636b00000000000000000060648201526084015b60405180910390fd5b6012546040516000916001600160a01b0316906103989083903690611773565b600060405180830381855af49150503d80600081146103d3576040519150601f19603f3d011682016040523d82523d6000602084013e6103d8565b606091505b505090506040513d6000823e8180156103ef573d82f35b3d82fd5b3480156103ff57600080fd5b50610408610a32565b60405161041591906117df565b60405180910390f35b34801561042a57600080fd5b506104086104393660046118b7565b610ac0565b34801561044a57600080fd5b5061045e610459366004611904565b610adf565b6040519015158152602001610415565b34801561047a57600080fd5b5061048e610489366004611930565b610b51565b604051908152602001610415565b3480156104a857600080fd5b5061048e60085481565b3480156104be57600080fd5b5061048e6104cd366004611949565b610bb6565b3480156104de57600080fd5b5061048e600d5481565b3480156104f457600080fd5b5061048e610c03565b34801561050957600080fd5b5061051d610518366004611949565b610c56565b005b34801561052b57600080fd5b5061045e61053a366004611966565b610ca1565b34801561054b57600080fd5b5061048e61055a366004611904565b610d1c565b34801561056b57600080fd5b5060045461057f906001600160a01b031681565b6040516001600160a01b039091168152602001610415565b3480156105a357600080fd5b506003546105b19060ff1681565b60405160ff9091168152602001610415565b3480156105cf57600080fd5b5061048e6105de366004611949565b610d86565b3480156105ef57600080fd5b5061048e610dd3565b34801561060457600080fd5b5061048e610613366004611930565b610e0a565b34801561062457600080fd5b506104086106333660046118b7565b610e52565b34801561064457600080fd5b5061048e610653366004611949565b610f10565b34801561066457600080fd5b5061048e600b5481565b34801561067a57600080fd5b5061051d6106893660046119b5565b610f5d565b34801561069a57600080fd5b5060125461057f906001600160a01b031681565b3480156106ba57600080fd5b5060055461057f906001600160a01b031681565b3480156106da57600080fd5b5061048e6106e9366004611930565b6110cf565b3480156106fa57600080fd5b5061048e600081565b34801561070f57600080fd5b5061048e60095481565b34801561072557600080fd5b5060115461057f906001600160a01b031681565b34801561074557600080fd5b5061048e610754366004611949565b611117565b34801561076557600080fd5b5061048e611164565b34801561077a57600080fd5b5061048e610789366004611930565b61119b565b34801561079a57600080fd5b5061048e600c5481565b3480156107b057600080fd5b506104086111e3565b3480156107c557600080fd5b5061048e6107d4366004611949565b6111f0565b3480156107e557600080fd5b5061048e6107f4366004611930565b61123d565b34801561080557600080fd5b5061048e611285565b34801561081a57600080fd5b5061045e610829366004611904565b6112bc565b34801561083a57600080fd5b5061048e600a5481565b34801561085057600080fd5b5061048e611310565b34801561086557600080fd5b5061048e610874366004611966565b611347565b34801561088557600080fd5b5061048e610894366004611949565b6113b9565b3480156108a557600080fd5b5061048e611406565b3480156108ba57600080fd5b506108ce6108c9366004611949565b61143d565b604080519485526020850193909352918301526060820152608001610415565b3480156108fa57600080fd5b5061048e610909366004611930565b6114bd565b34801561091a57600080fd5b5061048e610929366004611930565b611505565b34801561093a57600080fd5b5061048e610949366004611a17565b61154d565b34801561095a57600080fd5b5061048e6115a2565b34801561096f57600080fd5b5061048e61097e366004611949565b6115d9565b34801561098f57600080fd5b5060065461057f906001600160a01b031681565b3480156109af57600080fd5b5061048e6109be366004611a50565b611626565b3480156109cf57600080fd5b5060035461057f9061010090046001600160a01b031681565b3480156109f457600080fd5b5061048e611682565b348015610a0957600080fd5b5061048e610a18366004611930565b6116b9565b348015610a2957600080fd5b5061045e600181565b60018054610a3f90611a92565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6b90611a92565b8015610ab85780601f10610a8d57610100808354040283529160200191610ab8565b820191906000526020600020905b815481529060010190602001808311610a9b57829003601f168201915b505050505081565b601254606090610ad9906001600160a01b031683611701565b92915050565b6040516001600160a01b0383166024820152604481018290526000908190610b339060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b179052610ac0565b905080806020019051810190610b499190611acd565b949350505050565b600080610b9983604051602401610b6a91815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663073a938160e11b179052610ac0565b905080806020019051810190610baf9190611aea565b9392505050565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b03166305eff7ef60e21b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b031663182df0f560e01b1790526000908190610c3a90610e52565b905080806020019051810190610c509190611aea565b91505090565b6040516001600160a01b0382166024820152610c9d9060440160408051601f198184030181529190526020810180516001600160e01b031662df0cab60e51b179052610ac0565b5050565b6040516001600160a01b03808516602483015283166044820152606481018290526000908190610cfd9060840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b179052610ac0565b905080806020019051810190610d139190611acd565b95945050505050565b6040516001600160a01b0383166024820152604481018290526000908190610d709060640160408051601f198184030181529190526020810180516001600160e01b03166304c11f0360e31b179052610ac0565b905080806020019051810190610b499190611aea565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b0316633af9e66960e01b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b0316631d8e90d160e11b1790526000908190610c3a90610e52565b600080610b9983604051602401610e2391815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166303e9410160e41b179052610ac0565b6060600080306001600160a01b031684604051602401610e7291906117df565b60408051601f198184030181529181526020820180516001600160e01b0316630933c1ed60e01b17905251610ea79190611b03565b600060405180830381855afa9150503d8060008114610ee2576040519150601f19603f3d011682016040523d82523d6000602084013e610ee7565b606091505b50915091506000821415610efc573d60208201fd5b80806020019051810190610b499190611b1f565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b0316634576b5db60e01b179052610ac0565b60035461010090046001600160a01b03163314610fe25760405162461bcd60e51b815260206004820152603960248201527f43457263323044656c656761746f723a3a5f736574496d706c656d656e74617460448201527f696f6e3a2043616c6c6572206d7573742062652061646d696e00000000000000606482015260840161036f565b811561101c576040805160048152602481019091526020810180516001600160e01b031663153ab50560e01b17905261101a90610ac0565b505b601280546001600160a01b038581166001600160a01b0319831617909255604051911690611081906110529084906024016117df565b60408051601f198184030181529190526020810180516001600160e01b0316630adccee560e31b179052610ac0565b50601254604080516001600160a01b03808516825290921660208301527fd604de94d45953f9138079ec1b82d533cb2160c906d1076d1f7ed54befbca97a910160405180910390a150505050565b600080610b99836040516024016110e891815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663601a0bf160e01b179052610ac0565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b179052610e52565b6040805160048152602481019091526020810180516001600160e01b0316630e759dd360e31b1790526000908190610c3a90610ac0565b600080610b99836040516024016111b491815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663852a12e360e01b179052610ac0565b60028054610a3f90611a92565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b03166395dd919360e01b179052610e52565b600080610b998360405160240161125691815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663140e25ad60e31b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b031663a6afed9560e01b1790526000908190610c3a90610ac0565b6040516001600160a01b0383166024820152604481018290526000908190610b339060640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b0316630ae9d70b60e41b1790526000908190610c3a90610e52565b6040516001600160a01b038085166024830152831660448201526064810182905260009081906113a39060840160408051601f198184030181529190526020810180516001600160e01b031663b2a02ff160e01b179052610ac0565b905080806020019051810190610d139190611aea565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b0316632dc7468360e21b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b031663bd6d894d60e01b1790526000908190610c3a90610ac0565b60008060008060006114978660405160240161146891906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166361bfb47160e11b179052610e52565b9050808060200190518101906114ad9190611b8d565b9450945094509450509193509193565b600080610b99836040516024016114d691815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663317afabb60e21b179052610ac0565b600080610b998360405160240161151e91815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663db006a7560e01b179052610ac0565b6040516001600160a01b038084166024830152821660448201526000908190610d709060640160408051601f198184030181529190526020810180516001600160e01b0316636eb1769f60e11b179052610e52565b6040805160048152602481019091526020810180516001600160e01b03166374e38a7960e11b1790526000908190610c3a90610ac0565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b031663f2b3abbd60e01b179052610ac0565b6040516001600160a01b038085166024830152604482018490528216606482015260009081906113a39060840160408051601f198184030181529190526020810180516001600160e01b0316637af1e23160e11b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b0316631f1f3b4560e31b1790526000908190610c3a90610e52565b600080610b99836040516024016116d291815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663fca7820b60e01b179052610ac0565b6060600080846001600160a01b03168460405161171e9190611b03565b600060405180830381855af49150503d8060008114611759576040519150601f19603f3d011682016040523d82523d6000602084013e61175e565b606091505b50915091506000821415610b49573d60208201fd5b8183823760009101908152919050565b60005b8381101561179e578181015183820152602001611786565b838111156117ad576000848401525b50505050565b600081518084526117cb816020860160208601611783565b601f01601f19169290920160200192915050565b602081526000610baf60208301846117b3565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611831576118316117f2565b604052919050565b600067ffffffffffffffff821115611853576118536117f2565b50601f01601f191660200190565b600082601f83011261187257600080fd5b813561188561188082611839565b611808565b81815284602083860101111561189a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156118c957600080fd5b813567ffffffffffffffff8111156118e057600080fd5b610b4984828501611861565b6001600160a01b038116811461190157600080fd5b50565b6000806040838503121561191757600080fd5b8235611922816118ec565b946020939093013593505050565b60006020828403121561194257600080fd5b5035919050565b60006020828403121561195b57600080fd5b8135610baf816118ec565b60008060006060848603121561197b57600080fd5b8335611986816118ec565b92506020840135611996816118ec565b929592945050506040919091013590565b801515811461190157600080fd5b6000806000606084860312156119ca57600080fd5b83356119d5816118ec565b925060208401356119e5816119a7565b9150604084013567ffffffffffffffff811115611a0157600080fd5b611a0d86828701611861565b9150509250925092565b60008060408385031215611a2a57600080fd5b8235611a35816118ec565b91506020830135611a45816118ec565b809150509250929050565b600080600060608486031215611a6557600080fd5b8335611a70816118ec565b9250602084013591506040840135611a87816118ec565b809150509250925092565b600181811c90821680611aa657607f821691505b60208210811415611ac757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611adf57600080fd5b8151610baf816119a7565b600060208284031215611afc57600080fd5b5051919050565b60008251611b15818460208701611783565b9190910192915050565b600060208284031215611b3157600080fd5b815167ffffffffffffffff811115611b4857600080fd5b8201601f81018413611b5957600080fd5b8051611b6761188082611839565b818152856020838501011115611b7c57600080fd5b610d13826020830160208601611783565b60008060008060808587031215611ba357600080fd5b50508251602084015160408501516060909501519196909550909250905056fea2646970667358221220671c73705e284406da98ff5a3b950a59ed91a15d561648cc4f0d7180acd8a7f764736f6c634300080b0033000000000000000000000000fb8255f0de21acebf490f1df6f0bdd48cc1df03b0000000000000000000000005e23dc409fc2f832f83cec191e245a191a4bcc5c0000000000000000000000009748b6d59fd4c4f087294087bd94b6b9d95b42930000000000000000000000000000000000000000000000000de0b6b3a764000000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000000000000000000000000000000000000000000600000000000000000000000003cf8710bba14c32232efe0613fd44b8199995ec0000000000000000000000004eb33355a84c709f85e233035f4f4a5da29921fa00000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000001c436f6c6c61746572616c697a6564205553205969656c6420436f696e000000000000000000000000000000000000000000000000000000000000000000000005635553594300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode
0x6080604052600436106102ff5760003560e01c806370a0823111610190578063bd6d894d116100dc578063f2b3abbd11610095578063f851a4401161006f578063f851a440146109c3578063f8f9da28146109e8578063fca7820b146109fd578063fe9c44ae14610a1d576102ff565b8063f2b3abbd14610963578063f3fdb15a14610983578063f5e3c462146109a3576102ff565b8063bd6d894d14610899578063c37f68e2146108ae578063c5ebeaec146108ee578063db006a751461090e578063dd62ed3e1461092e578063e9c714f21461094e576102ff565b8063a0712d6811610149578063aa5af0fd11610123578063aa5af0fd1461082e578063ae9d70b014610844578063b2a02ff114610859578063b71d1a0c14610879576102ff565b8063a0712d68146107d9578063a6afed95146107f9578063a9059cbb1461080e576102ff565b806370a082311461073957806373acee9814610759578063852a12e31461076e5780638f840ddd1461078e57806395d89b41146107a457806395dd9193146107b9576102ff565b80633af9e6691161024f578063555bcc4011610208578063601a0bf1116101e2578063601a0bf1146106ce5780636752e702146106ee5780636c540baf146107035780636f307dc314610719576102ff565b8063555bcc401461066e5780635c60da1b1461068e5780635fe3b567146106ae576102ff565b80633af9e669146105c35780633b1d21a2146105e35780633e941010146105f85780634487152f146106185780634576b5db1461063857806347bd371814610658576102ff565b806318160ddd116102bc57806323b872dd1161029657806323b872dd1461051f5780632608f8181461053f578063267822471461055f578063313ce56714610597576102ff565b806318160ddd146104d2578063182df0f5146104e85780631be19560146104fd576102ff565b806306fdde03146103f35780630933c1ed1461041e578063095ea7b31461043e5780630e7527021461046e578063173b99041461049c57806317bfdfbc146104b2575b34156103785760405162461bcd60e51b815260206004820152603760248201527f43457263323044656c656761746f723a66616c6c6261636b3a2063616e6e6f7460448201527f2073656e642076616c756520746f2066616c6c6261636b00000000000000000060648201526084015b60405180910390fd5b6012546040516000916001600160a01b0316906103989083903690611773565b600060405180830381855af49150503d80600081146103d3576040519150601f19603f3d011682016040523d82523d6000602084013e6103d8565b606091505b505090506040513d6000823e8180156103ef573d82f35b3d82fd5b3480156103ff57600080fd5b50610408610a32565b60405161041591906117df565b60405180910390f35b34801561042a57600080fd5b506104086104393660046118b7565b610ac0565b34801561044a57600080fd5b5061045e610459366004611904565b610adf565b6040519015158152602001610415565b34801561047a57600080fd5b5061048e610489366004611930565b610b51565b604051908152602001610415565b3480156104a857600080fd5b5061048e60085481565b3480156104be57600080fd5b5061048e6104cd366004611949565b610bb6565b3480156104de57600080fd5b5061048e600d5481565b3480156104f457600080fd5b5061048e610c03565b34801561050957600080fd5b5061051d610518366004611949565b610c56565b005b34801561052b57600080fd5b5061045e61053a366004611966565b610ca1565b34801561054b57600080fd5b5061048e61055a366004611904565b610d1c565b34801561056b57600080fd5b5060045461057f906001600160a01b031681565b6040516001600160a01b039091168152602001610415565b3480156105a357600080fd5b506003546105b19060ff1681565b60405160ff9091168152602001610415565b3480156105cf57600080fd5b5061048e6105de366004611949565b610d86565b3480156105ef57600080fd5b5061048e610dd3565b34801561060457600080fd5b5061048e610613366004611930565b610e0a565b34801561062457600080fd5b506104086106333660046118b7565b610e52565b34801561064457600080fd5b5061048e610653366004611949565b610f10565b34801561066457600080fd5b5061048e600b5481565b34801561067a57600080fd5b5061051d6106893660046119b5565b610f5d565b34801561069a57600080fd5b5060125461057f906001600160a01b031681565b3480156106ba57600080fd5b5060055461057f906001600160a01b031681565b3480156106da57600080fd5b5061048e6106e9366004611930565b6110cf565b3480156106fa57600080fd5b5061048e600081565b34801561070f57600080fd5b5061048e60095481565b34801561072557600080fd5b5060115461057f906001600160a01b031681565b34801561074557600080fd5b5061048e610754366004611949565b611117565b34801561076557600080fd5b5061048e611164565b34801561077a57600080fd5b5061048e610789366004611930565b61119b565b34801561079a57600080fd5b5061048e600c5481565b3480156107b057600080fd5b506104086111e3565b3480156107c557600080fd5b5061048e6107d4366004611949565b6111f0565b3480156107e557600080fd5b5061048e6107f4366004611930565b61123d565b34801561080557600080fd5b5061048e611285565b34801561081a57600080fd5b5061045e610829366004611904565b6112bc565b34801561083a57600080fd5b5061048e600a5481565b34801561085057600080fd5b5061048e611310565b34801561086557600080fd5b5061048e610874366004611966565b611347565b34801561088557600080fd5b5061048e610894366004611949565b6113b9565b3480156108a557600080fd5b5061048e611406565b3480156108ba57600080fd5b506108ce6108c9366004611949565b61143d565b604080519485526020850193909352918301526060820152608001610415565b3480156108fa57600080fd5b5061048e610909366004611930565b6114bd565b34801561091a57600080fd5b5061048e610929366004611930565b611505565b34801561093a57600080fd5b5061048e610949366004611a17565b61154d565b34801561095a57600080fd5b5061048e6115a2565b34801561096f57600080fd5b5061048e61097e366004611949565b6115d9565b34801561098f57600080fd5b5060065461057f906001600160a01b031681565b3480156109af57600080fd5b5061048e6109be366004611a50565b611626565b3480156109cf57600080fd5b5060035461057f9061010090046001600160a01b031681565b3480156109f457600080fd5b5061048e611682565b348015610a0957600080fd5b5061048e610a18366004611930565b6116b9565b348015610a2957600080fd5b5061045e600181565b60018054610a3f90611a92565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6b90611a92565b8015610ab85780601f10610a8d57610100808354040283529160200191610ab8565b820191906000526020600020905b815481529060010190602001808311610a9b57829003601f168201915b505050505081565b601254606090610ad9906001600160a01b031683611701565b92915050565b6040516001600160a01b0383166024820152604481018290526000908190610b339060640160408051601f198184030181529190526020810180516001600160e01b031663095ea7b360e01b179052610ac0565b905080806020019051810190610b499190611acd565b949350505050565b600080610b9983604051602401610b6a91815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663073a938160e11b179052610ac0565b905080806020019051810190610baf9190611aea565b9392505050565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b03166305eff7ef60e21b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b031663182df0f560e01b1790526000908190610c3a90610e52565b905080806020019051810190610c509190611aea565b91505090565b6040516001600160a01b0382166024820152610c9d9060440160408051601f198184030181529190526020810180516001600160e01b031662df0cab60e51b179052610ac0565b5050565b6040516001600160a01b03808516602483015283166044820152606481018290526000908190610cfd9060840160408051601f198184030181529190526020810180516001600160e01b03166323b872dd60e01b179052610ac0565b905080806020019051810190610d139190611acd565b95945050505050565b6040516001600160a01b0383166024820152604481018290526000908190610d709060640160408051601f198184030181529190526020810180516001600160e01b03166304c11f0360e31b179052610ac0565b905080806020019051810190610b499190611aea565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b0316633af9e66960e01b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b0316631d8e90d160e11b1790526000908190610c3a90610e52565b600080610b9983604051602401610e2391815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166303e9410160e41b179052610ac0565b6060600080306001600160a01b031684604051602401610e7291906117df565b60408051601f198184030181529181526020820180516001600160e01b0316630933c1ed60e01b17905251610ea79190611b03565b600060405180830381855afa9150503d8060008114610ee2576040519150601f19603f3d011682016040523d82523d6000602084013e610ee7565b606091505b50915091506000821415610efc573d60208201fd5b80806020019051810190610b499190611b1f565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b0316634576b5db60e01b179052610ac0565b60035461010090046001600160a01b03163314610fe25760405162461bcd60e51b815260206004820152603960248201527f43457263323044656c656761746f723a3a5f736574496d706c656d656e74617460448201527f696f6e3a2043616c6c6572206d7573742062652061646d696e00000000000000606482015260840161036f565b811561101c576040805160048152602481019091526020810180516001600160e01b031663153ab50560e01b17905261101a90610ac0565b505b601280546001600160a01b038581166001600160a01b0319831617909255604051911690611081906110529084906024016117df565b60408051601f198184030181529190526020810180516001600160e01b0316630adccee560e31b179052610ac0565b50601254604080516001600160a01b03808516825290921660208301527fd604de94d45953f9138079ec1b82d533cb2160c906d1076d1f7ed54befbca97a910160405180910390a150505050565b600080610b99836040516024016110e891815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663601a0bf160e01b179052610ac0565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b03166370a0823160e01b179052610e52565b6040805160048152602481019091526020810180516001600160e01b0316630e759dd360e31b1790526000908190610c3a90610ac0565b600080610b99836040516024016111b491815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663852a12e360e01b179052610ac0565b60028054610a3f90611a92565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b03166395dd919360e01b179052610e52565b600080610b998360405160240161125691815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663140e25ad60e31b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b031663a6afed9560e01b1790526000908190610c3a90610ac0565b6040516001600160a01b0383166024820152604481018290526000908190610b339060640160408051601f198184030181529190526020810180516001600160e01b031663a9059cbb60e01b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b0316630ae9d70b60e41b1790526000908190610c3a90610e52565b6040516001600160a01b038085166024830152831660448201526064810182905260009081906113a39060840160408051601f198184030181529190526020810180516001600160e01b031663b2a02ff160e01b179052610ac0565b905080806020019051810190610d139190611aea565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b0316632dc7468360e21b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b031663bd6d894d60e01b1790526000908190610c3a90610ac0565b60008060008060006114978660405160240161146891906001600160a01b0391909116815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166361bfb47160e11b179052610e52565b9050808060200190518101906114ad9190611b8d565b9450945094509450509193509193565b600080610b99836040516024016114d691815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663317afabb60e21b179052610ac0565b600080610b998360405160240161151e91815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663db006a7560e01b179052610ac0565b6040516001600160a01b038084166024830152821660448201526000908190610d709060640160408051601f198184030181529190526020810180516001600160e01b0316636eb1769f60e11b179052610e52565b6040805160048152602481019091526020810180516001600160e01b03166374e38a7960e11b1790526000908190610c3a90610ac0565b6040516001600160a01b03821660248201526000908190610b999060440160408051601f198184030181529190526020810180516001600160e01b031663f2b3abbd60e01b179052610ac0565b6040516001600160a01b038085166024830152604482018490528216606482015260009081906113a39060840160408051601f198184030181529190526020810180516001600160e01b0316637af1e23160e11b179052610ac0565b6040805160048152602481019091526020810180516001600160e01b0316631f1f3b4560e31b1790526000908190610c3a90610e52565b600080610b99836040516024016116d291815260200190565b60408051601f198184030181529190526020810180516001600160e01b031663fca7820b60e01b179052610ac0565b6060600080846001600160a01b03168460405161171e9190611b03565b600060405180830381855af49150503d8060008114611759576040519150601f19603f3d011682016040523d82523d6000602084013e61175e565b606091505b50915091506000821415610b49573d60208201fd5b8183823760009101908152919050565b60005b8381101561179e578181015183820152602001611786565b838111156117ad576000848401525b50505050565b600081518084526117cb816020860160208601611783565b601f01601f19169290920160200192915050565b602081526000610baf60208301846117b3565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611831576118316117f2565b604052919050565b600067ffffffffffffffff821115611853576118536117f2565b50601f01601f191660200190565b600082601f83011261187257600080fd5b813561188561188082611839565b611808565b81815284602083860101111561189a57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156118c957600080fd5b813567ffffffffffffffff8111156118e057600080fd5b610b4984828501611861565b6001600160a01b038116811461190157600080fd5b50565b6000806040838503121561191757600080fd5b8235611922816118ec565b946020939093013593505050565b60006020828403121561194257600080fd5b5035919050565b60006020828403121561195b57600080fd5b8135610baf816118ec565b60008060006060848603121561197b57600080fd5b8335611986816118ec565b92506020840135611996816118ec565b929592945050506040919091013590565b801515811461190157600080fd5b6000806000606084860312156119ca57600080fd5b83356119d5816118ec565b925060208401356119e5816119a7565b9150604084013567ffffffffffffffff811115611a0157600080fd5b611a0d86828701611861565b9150509250925092565b60008060408385031215611a2a57600080fd5b8235611a35816118ec565b91506020830135611a45816118ec565b809150509250929050565b600080600060608486031215611a6557600080fd5b8335611a70816118ec565b9250602084013591506040840135611a87816118ec565b809150509250925092565b600181811c90821680611aa657607f821691505b60208210811415611ac757634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215611adf57600080fd5b8151610baf816119a7565b600060208284031215611afc57600080fd5b5051919050565b60008251611b15818460208701611783565b9190910192915050565b600060208284031215611b3157600080fd5b815167ffffffffffffffff811115611b4857600080fd5b8201601f81018413611b5957600080fd5b8051611b6761188082611839565b818152856020838501011115611b7c57600080fd5b610d13826020830160208601611783565b60008060008060808587031215611ba357600080fd5b50508251602084015160408501516060909501519196909550909250905056fea2646970667358221220671c73705e284406da98ff5a3b950a59ed91a15d561648cc4f0d7180acd8a7f764736f6c634300080b0033