0 txs
2k calls
constructor
constructor(address usdai_, address baseToken_, uint256 adminFeeRate_, address adminFeeRecipient_, address priceOracle_)
functions
adminFeeRate
viewfunction adminFeeRate() view returns (uint256)
adminFeeRecipient
viewfunction adminFeeRecipient() view returns (address)
allowance
viewfunction allowance(address owner, address spender) view returns (uint256)
asset
viewfunction asset() view returns (address)
balanceOf
viewfunction balanceOf(address account) view returns (uint256)
claimableBaseYield
viewfunction claimableBaseYield() view returns (uint256)
claimableRedeemRequest
viewfunction claimableRedeemRequest(uint256 redemptionId, address controller) view returns (uint256)
convertToAssets
viewfunction convertToAssets(uint256 shares) view returns (uint256)
convertToShares
viewfunction convertToShares(uint256 assets) view returns (uint256)
decimals
viewfunction decimals() view returns (uint8)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
depositSharePrice
viewfunction depositSharePrice() view returns (uint256)
DOMAIN_SEPARATOR
viewfunction DOMAIN_SEPARATOR() view returns (bytes32)
eip712Domain
viewfunction eip712Domain() view returns (bytes1 fields, string name, string version, uint256 chainId, address verifyingContract, bytes32 salt, uint256[] extensions)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
IMPLEMENTATION_VERSION
viewfunction IMPLEMENTATION_VERSION() view returns (string)
isOperator
viewfunction isOperator(address controller, address operator) view returns (bool status)
maxDeposit
purefunction maxDeposit(address) pure returns (uint256)
maxMint
purefunction maxMint(address) pure returns (uint256)
maxRedeem
viewfunction maxRedeem(address controller) view returns (uint256)
maxWithdraw
viewfunction maxWithdraw(address controller) view returns (uint256)
name
viewfunction name() view returns (string)
nav
viewfunction nav() view returns (uint256)
nonces
viewfunction nonces(address owner) view returns (uint256)
paused
viewfunction paused() view returns (bool)
pendingRedeemRequest
viewfunction pendingRedeemRequest(uint256 redemptionId, address controller) view returns (uint256)
pools
viewfunction pools() view returns (address[])
poolTicks
viewfunction poolTicks(address pool) view returns (uint256[])
previewDeposit
viewfunction previewDeposit(uint256 assets) view returns (uint256)
previewMint
viewfunction previewMint(uint256 shares) view returns (uint256)
previewRedeem
purefunction previewRedeem(uint256) pure returns (uint256)
previewWithdraw
purefunction previewWithdraw(uint256) pure returns (uint256)
priceOracle
viewfunction priceOracle() view returns (address)
redemption
viewfunction redemption(uint256 redemptionId) view returns (tuple, uint256)
redemptionIds
viewfunction redemptionIds(address controller) view returns (uint256[])
redemptionQueueInfo
viewfunction redemptionQueueInfo() view returns (uint256 index, uint256 head, uint256 tail, uint256 pending, uint256 redemptionBalance)
redemptionSharePrice
viewfunction redemptionSharePrice() view returns (uint256)
share
viewfunction share() view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
timelock
viewfunction timelock() view returns (uint64)
totalAssets
viewfunction totalAssets() view returns (uint256)
totalShares
viewfunction totalShares() view returns (uint256)
totalSupply
viewfunction totalSupply() view returns (uint256)
approve
nonpayablefunction approve(address spender, uint256 value) returns (bool)
burn
nonpayablefunction burn(address from, uint256 amount)
claimBaseYield
nonpayablefunction claimBaseYield()
deposit
nonpayablefunction deposit(uint256 amount, address receiver, uint256 minShares) returns (uint256)
deposit
nonpayablefunction deposit(uint256 amount, address receiver) returns (uint256)
depositBaseYield
nonpayablefunction depositBaseYield(uint256 usdaiAmount) returns (uint256, uint256)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address admin, uint64 timelock_)
mint
nonpayablefunction mint(address to, uint256 amount)
mint
nonpayablefunction mint(uint256 shares, address receiver, uint256 maxAmount) returns (uint256)
mint
nonpayablefunction mint(uint256 shares, address receiver) returns (uint256 assets)
multicall
nonpayablefunction multicall(bytes[] data) returns (bytes[] results)
pause
nonpayablefunction pause()
permit
nonpayablefunction permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
poolDeposit
nonpayablefunction poolDeposit(address pool, uint128 tick, uint256 usdaiAmount, uint256 poolCurrencyAmountMinimum, uint256 minShares, bytes data) returns (uint256)
poolRedeem
nonpayablefunction poolRedeem(address pool, uint128 tick, uint256 shares) returns (uint128)
poolWithdraw
nonpayablefunction poolWithdraw(address pool, uint128 tick, uint128 redemptionId, uint256 poolCurrencyAmountMaximum, uint256 usdaiAmountMinimum, bytes data) returns (uint256)
redeem
nonpayablefunction redeem(uint256 shares, address receiver, address controller) returns (uint256)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
requestRedeem
nonpayablefunction requestRedeem(uint256 shares, address controller, address owner) returns (uint256)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
serviceRedemptions
nonpayablefunction serviceRedemptions(uint256 shares) returns (uint256)
setBlacklist
nonpayablefunction setBlacklist(address account, bool isBlacklisted)
setOperator
nonpayablefunction setOperator(address operator, bool approved) returns (bool)
setTimelock
nonpayablefunction setTimelock(uint64 timelock_)
transfer
nonpayablefunction transfer(address to, uint256 value) returns (bool)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 value) returns (bool)
unpause
nonpayablefunction unpause()
withdraw
nonpayablefunction withdraw(uint256 amount, address receiver, address controller) returns (uint256)
events
Approval
event Approval(address indexed owner, address indexed spender, uint256 value)
BaseYieldDeposited
event BaseYieldDeposited(uint256 depositedAmount, uint256 adminFee)
Blacklisted
event Blacklisted(address indexed value, bool isBlacklisted)
Deposit
event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares)
EIP712DomainChanged
event EIP712DomainChanged()
Initialized
event Initialized(uint64 version)
OperatorSet
event OperatorSet(address indexed controller, address indexed operator, bool approved)
Paused
event Paused(address account)
PoolDeposited
event PoolDeposited(address indexed pool, uint128 indexed tick, uint256 usdaiAmount, uint256 poolCurrencyAmount)
PoolRedeemed
event PoolRedeemed(address indexed pool, uint128 indexed tick, uint256 shares, uint128 redemptionId)
PoolWithdrawn
event PoolWithdrawn(address indexed pool, uint128 indexed tick, uint256 shares, uint128 redemptionId, uint256 poolCurrencyAmount, uint256 usdaiAmount)
RedeemRequest
event RedeemRequest(address indexed controller, address indexed owner, uint256 indexed requestId, address sender, uint256 shares)
RedemptionProcessed
event RedemptionProcessed(uint256 indexed redemptionId, address indexed controller, uint256 fulfilledShares, uint256 amount, uint256 pendingShares)
RedemptionsServiced
event RedemptionsServiced(uint256 shares, uint256 amount, bool allRedemptionsServiced)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Transfer
event Transfer(address indexed from, address indexed to, uint256 value)
Unpaused
event Unpaused(address account)
Withdraw
event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
BlacklistedAddress
error BlacklistedAddress(address value)
DisabledImplementation
error DisabledImplementation()
ECDSAInvalidSignature
error ECDSAInvalidSignature()
ECDSAInvalidSignatureLength
error ECDSAInvalidSignatureLength(uint256 length)
ECDSAInvalidSignatureS
error ECDSAInvalidSignatureS(bytes32 s)
EnforcedPause
error EnforcedPause()
ERC20InsufficientAllowance
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed)
ERC20InsufficientBalance
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed)
ERC20InvalidApprover
error ERC20InvalidApprover(address approver)
ERC20InvalidReceiver
error ERC20InvalidReceiver(address receiver)
ERC20InvalidSender
error ERC20InvalidSender(address sender)
ERC20InvalidSpender
error ERC20InvalidSpender(address spender)
ERC2612ExpiredSignature
error ERC2612ExpiredSignature(uint256 deadline)
ERC2612InvalidSigner
error ERC2612InvalidSigner(address signer, address owner)
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
InsufficientBalance
error InsufficientBalance()
InvalidAccountNonce
error InvalidAccountNonce(address account, uint256 currentNonce)
InvalidAddress
error InvalidAddress()
InvalidAmount
error InvalidAmount()
InvalidCaller
error InvalidCaller()
InvalidInitialization
error InvalidInitialization()
InvalidPoolCurrencyAmount
error InvalidPoolCurrencyAmount()
InvalidRedemptionState
error InvalidRedemptionState()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
UnsupportedCurrency
error UnsupportedCurrency(address currency)
creation bytecode
0x610120346101fa57601f615e3438819003918201601f19168301916001600160401b038311848410176101fe5780849260a0946040528339810103126101fa5761004881610212565b9061005560208201610212565b604082015190610073608061006c60608601610212565b9401610212565b6001600160a01b0394851660805290841660a05260c09190915260e09190915216610100525f516020615e145f395f51905f5254604081901c60ff166101eb576002600160401b03196001600160401b03821601610195575b604051615bed90816102278239608051818181610af1015281816111cc0152818161130e015281816114f50152818161176901528181611d0c0152818161288101528181612b7d01528181614404015281816146b9015261535f015260a051818181610a92015281816111f401528181613c4401528181614659015281816148e00152615857015260c051818181610b7e0152611e09015260e0518181816106090152610ba701526101005181818161283601528181612c8301528181613cc2015261494a0152f35b6001600160401b0319166001600160401b039081175f516020615e145f395f51905f52556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f6100cc565b63f92ee8a960e01b5f5260045ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101fa5756fe60806040526004361015610011575f80fd5b5f3560e01c806301e1d11414613c1957806301ffc9a714613b1957806306fdde0314613a3657806307a2d13a14611859578063095ea7b314613a105780630a28a477146124de578063153b0d1e1461392d5780631798de8114612ef657806318160ddd14612ecd5780631acd243214612e375780631eb510a114612e1d57806323b872dd14612cde578063248a9ca314612ca75780632630c12f14612c645780632f2ff15d14612c1a578063313ce56714612bff5780633644e51514612be557806336568abe14612ba157806338d52e0f14612b5e5780633a98ef3914612b445780633cc8cd39146127805780633f4ba83a146126dc578063402d267d1461101e57806340c10f19146126815780634a1dc092146124e35780634cdad506146124de578063558a7297146123f35780635c975abb146123b25780636e553f651461234257806370a08231146122fe578063754b377c146122b95780637d41c86e146120aa5780637ecebe0014612053578063836a104014611fea5780638456cb5914611f5357806384b0196e14611e2c5780638cece52714611df257806391d1485414611d9c578063927c9b0114611d8257806394bf804d14611c9357806395d89b4114611b775780639dc29fac14611af3578063a217fddf14611ad9578063a8d5fd6514611abf578063a9059cbb14611a8e578063ac9650d814611877578063b3d7f6b914611859578063b460af941461164b578063b6363cf2146115d3578063ba08765214611387578063bc157ac11461129a578063c05b0333146111a5578063c1590cd7146111a0578063c5354218146110fa578063c5c51dca14611023578063c63d75b61461101e578063c6e6f592146105cc578063c7d0ea3714610eb7578063c961fbc014610e08578063ce96cb7714610d6b578063cf45e6fc14610a49578063d33219b414610a03578063d505accf146108ad578063d547741f1461085c578063d905777e146107ad578063dd62ed3e14610734578063eaed1d071461070e578063ecab31a0146106f4578063ecc2b4471461062d578063ee11d5eb146105ea578063ef8b30f7146105cc578063f0aa2ffc14610440578063f4a6564d146103795763f5a23d8d14610347575f80fd5b3461037557604036600319011261037557602061036d610365613ddd565b60043561487d565b604051908152f35b5f80fd5b34610375575f3660031901126103755760a05f516020615b785f395f51905f52547fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d4901547fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d4902547fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490354907fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490454926040519485526020850152604084015260608301526080820152f35b346103755760203660031901126103755760043561045c614a3c565b80156105bd5761046a614e74565b604051906313a8e6b360e11b82525f516020615b785f395f51905f526004830152826024830152604482015260408160648173f5c4690c857f6c8e0d51091117b99bdbaa814d715af49182156105b2575f915f93610570575b506104cc615344565b82116105615760607fa16c24a7ff42567beaea6e484e0f9da2f5950beb8523be465dbcd288ab4ca13b91602094610524857fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490454614180565b7fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490455604051918252848683015215156040820152a1604051908152f35b631e9acf1760e31b5f5260045ffd5b915091506040813d6040116105aa575b8161058d60409383613ec7565b81010312610375576105a3602082519201614600565b91836104c3565b3d9150610580565b6040513d5f823e3d90fd5b63162908e360e11b5f5260045ffd5b3461037557602036600319011261037557602061036d600435614793565b34610375575f3660031901126103755760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103755760203660031901126103755760043567ffffffffffffffff811680910361037557335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156106dd5767ffffffffffffffff197f2063345ccd85fc8f12bb2252d09411330c71f2174e47ce4f7919d5f3ad4b97005416177f2063345ccd85fc8f12bb2252d09411330c71f2174e47ce4f7919d5f3ad4b9700555f80f35b63e2517d3f60e01b5f52336004525f60245260445ffd5b34610375575f36600319011261037557602061036d614e74565b3461037557604036600319011261037557602061036d61072c613ddd565b600435614805565b346103755760403660031901126103755761074d613dc7565b6001600160a01b03610797610760613ddd565b926001600160a01b03165f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160205260405f2090565b91165f52602052602060405f2054604051908152f35b34610375576020366003190112610375576107c6613dc7565b6001600160a01b03604051916322604be160e01b83525f516020615b785f395f51905f52600484015216602482015260408160448173f5c4690c857f6c8e0d51091117b99bdbaa814d715af480156105b2576020915f9161082b575b50604051908152f35b61084d915060403d604011610855575b6108458183613ec7565b810190614296565b905082610822565b503d61083b565b34610375576040366003190112610375576108ab60043561087b613ddd565b906108a66108a1825f525f516020615b385f395f51905f52602052600160405f20015490565b614b89565b614fec565b005b346103755760e0366003190112610375576108c6613dc7565b6108ce613ddd565b604435906064359260843560ff81168103610375578442116109f0576109c66109bd6001600160a01b039283851697885f527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb0060205260405f20908154916001830190556040519060208201927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c984528b6040840152878a1660608401528a608084015260a083015260c082015260c0815261098b60e082613ec7565b51902061099661551d565b906040519161190160f01b83526002830152602282015260c43591604260a4359220615946565b909291926159c8565b168481036109d957506108ab93506153f7565b84906325c0072360e11b5f5260045260245260445ffd5b8463313c898160e11b5f5260045260245ffd5b34610375575f36600319011261037557602067ffffffffffffffff7f2063345ccd85fc8f12bb2252d09411330c71f2174e47ce4f7919d5f3ad4b97005416604051908152f35b3461037557602036600319011261037557610a62614a3c565b610a6a614d27565b610a7d610a75615842565b6004356141c1565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169190602081602481865afa9081156105b2575f91610d39575b5081116105615760405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600482018190526024820183905291906020816044815f885af180156105b257610d02575b5060405192638b6099db60e01b8452600484015260248301525f60448301523060648301526020826084815f855af19182156105b2575f92610cce575b508190612710610ba37f0000000000000000000000000000000000000000000000000000000000000000856141a1565b04907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b038116151580610cc5575b610c2c575b604084847fb39b4ae6957990aa62a3e88956dbfa7dff34092422f81aa4fa62eef0f2cf040b838051848152836020820152a160015f516020615b585f395f51905f525582519182526020820152f35b60405163a9059cbb60e01b81526001600160a01b0391909116600482015260248101839052919250602090829060449082905f905af180156105b257610c82575b50610c7a816040936141b4565b908380610bdd565b916020833d602011610cbd575b81610c9c60209383613ec7565b810103126103755781610c7a91610cb4604095614600565b50935050610c6d565b3d9150610c8f565b50821515610bd8565b9091506020813d602011610cfa575b81610cea60209383613ec7565b8101031261037557519082610b73565b3d9150610cdd565b6020813d602011610d31575b81610d1b60209383613ec7565b8101031261037557610d2c90614600565b610b36565b3d9150610d0e565b90506020813d602011610d63575b81610d5460209383613ec7565b81010312610375575183610ad3565b3d9150610d47565b3461037557602036600319011261037557610d84613dc7565b6001600160a01b03604051916322604be160e01b83525f516020615b785f395f51905f52600484015216602482015260408160448173f5c4690c857f6c8e0d51091117b99bdbaa814d715af480156105b2576020915f91610de85750604051908152f35b610e01915060403d604011610855576108458183613ec7565b5082610822565b3461037557602036600319011261037557610e5a610e24613dc7565b6001600160a01b03165f527f0a32e6e3ec9caf40523489fb56ffc3afa6eadc68c0df235d444c084ba724fc0260205260405f2090565b6040519081602082549182815201915f5260205f20905f5b818110610ea157610e9d85610e8981870382613ec7565b604051918291602083526020830190613f4d565b0390f35b8254845260209093019260019283019201610e72565b3461037557606036600319011261037557610ed0613dc7565b610ed8613e42565b60443591610ee4614a3c565b610eec614d27565b6001600160a01b0381166001600160801b036040519363660618a560e11b855216918260048501528460248501526020846044815f865af19384156105b2575f94610fd7575b5060406020956002610f957f07376a0b7bb5a4ad654ea41e6abed15d5a2d28404d71e56f48059fa9cec4aea0946001600160a01b03165f527f0a32e6e3ec9caf40523489fb56ffc3afa6eadc68c0df235d444c084ba724fc0260205260405f2090565b01855f528752610fb26001600160801b03835f2097168097615659565b5081519081528587820152a360015f516020615b585f395f51905f5255604051908152f35b9093506020813d602011611016575b81610ff360209383613ec7565b810103126103755751936001600160801b03851685036103755793926040610f32565b3d9150610fe6565b613e86565b34610375575f366003190112610375576040518060205f516020615b985f395f51905f5254928381520180925f516020615b985f395f51905f525f527feec343e34b5322c3ad2177a4ec6ce9b4c2eee199542473b417a881430a43c239905f5b8181106110e45750505081611099910382613ec7565b604051918291602083019060208452518091526040830191905f5b8181106110c2575050500390f35b82516001600160a01b03168452859450602093840193909201916001016110b4565b8254845260209093019260019283019201611083565b34610375576020366003190112610375576001600160a01b0361111b613dc7565b168015611191575f527fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490660205260405f206040519081602082549182815201915f5260205f20905f5b81811061117b57610e9d85610e8981870382613ec7565b8254845260209093019260019283019201611164565b63e6c4247b60e01b5f5260045ffd5b613c19565b34610375575f3660031901126103755760405163ddeae03360e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000166020826024815f855af19081156105b2575f9260209261127f575b5060246040518094819363ddeae03360e01b83523060048401525af180156105b25761125757005b6108ab9060203d602011611278575b6112708183613ec7565b810190614625565b503d611266565b61129590833d8511611278576112708183613ec7565b61122f565b34610375576112a836613f23565b90916112b2615089565b6112ba614d27565b80156105bd576001600160a01b038316908115611191576112da81614793565b92831590811561137d575b506105bd576112fe836020956112f96156b5565b6150c3565b6113338130336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016615801565b60405190815282848201527fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d760403392a360015f516020615b585f395f51905f5255604051908152f35b90508310856112e5565b346103755761139536613ee9565b61139d615089565b335f525f516020615af85f395f51905f5260205260ff60405f2054166115c0576001600160a01b0316805f525f516020615af85f395f51905f5260205260ff60405f2054166115ae576001600160a01b038216805f525f516020615af85f395f51905f5260205260ff60405f2054166115ae57611418614d27565b83156105bd578015611191578115611191573382141580611565575b61155657604051936309ad7da760e11b85525f516020615b785f395f51905f52600486015280602486015282604486015260208560648173f5c4690c857f6c8e0d51091117b99bdbaa814d715af49384156105b2575f94611521575b6020955084806114e7575b505060405190848252858201527ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db60403392a460015f516020615b585f395f51905f5255604051908152f35b61151a916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016615308565b858461149b565b93506020853d60201161154e575b8161153c60209383613ec7565b81010312610375576020945193611490565b3d915061152f565b6348f5c3ed60e01b5f5260045ffd5b50815f527f407fc66dcc0b10c2a8ec69f9095c4cd702e9ed0fb1a7e0f6b6f65bd03e77610060205260405f206001600160a01b0333165f5260205260ff60405f20541615611434565b63d33f19e760e01b5f5260045260245ffd5b63d33f19e760e01b5f523360045260245ffd5b34610375576040366003190112610375576115ec613dc7565b6001600160a01b036115fc613ddd565b91165f527f407fc66dcc0b10c2a8ec69f9095c4cd702e9ed0fb1a7e0f6b6f65bd03e7761006020526001600160a01b0360405f2091165f52602052602060ff60405f2054166040519015158152f35b346103755761165936613ee9565b611664929192615089565b335f525f516020615af85f395f51905f5260205260ff60405f2054166115c0576001600160a01b0316805f525f516020615af85f395f51905f5260205260ff60405f2054166115ae576001600160a01b038316805f525f516020615af85f395f51905f5260205260ff60405f2054166115ae576116df614d27565b82156105bd578015611191578115611191573382141580611810575b611556576040519263dd2c578d60e01b84525f516020615b785f395f51905f52600485015280602485015282604485015260208460648173f5c4690c857f6c8e0d51091117b99bdbaa814d715af49384156105b2575f946117d8575b5061178e816020966001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016615308565b60405190815283858201527ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db60403392a460015f516020615b585f395f51905f5255604051908152f35b9493506020853d602011611808575b816117f460209383613ec7565b81010312610375579351929361178e611757565b3d91506117e7565b50815f527f407fc66dcc0b10c2a8ec69f9095c4cd702e9ed0fb1a7e0f6b6f65bd03e77610060205260405f206001600160a01b0333165f5260205260ff60405f205416156116fb565b3461037557602036600319011261037557602061036d6004356141df565b346103755760203660031901126103755760043567ffffffffffffffff811161037557366023820112156103755780600401359067ffffffffffffffff8211610375573660248360051b83010111610375579060206040516118d98282613ec7565b5f815281810190601f1983013683376118f18461460d565b946118ff6040519687613ec7565b848652601f1961190e8661460d565b015f5b818110611a7f5750503681900360421901905f5b86811015611a225760248160051b830101358381121561037557820160248101359067ffffffffffffffff821161037557604401908036038213610375575f918761199a84938b6040519382859383850197883783018281018881528d519283915e010185815203601f198101835282613ec7565b5190305af4903d15611a14573d9167ffffffffffffffff8311611a00576040516001936119e492906119d5601f8201601f19168c0184613ec7565b82523d5f8b84013e5b306158ec565b6119ee828b61476b565b526119f9818a61476b565b5001611925565b634e487b7160e01b5f52604160045260245ffd5b6119e46001926060906119de565b6040805187815289518189018190525f92600582901b83018101918c8b01918b9085015b828710611a535785850386f35b909192938280611a6f600193603f198a82030186528851613da3565b9601920196019592919092611a46565b60608882018701528501611911565b3461037557604036600319011261037557611ab4611aaa613dc7565b6024359033614e95565b602060405160018152f35b34610375575f366003190112610375576020604051308152f35b34610375575f3660031901126103755760206040515f8152f35b3461037557604036600319011261037557611b53611b0f613dc7565b611b2c6024358092611b1f615089565b611b27614b1a565b6151d5565b7f3625978433c3d3388ec2dddfdf4dd931786e9db5f2382a6ed08621dc9fb95f0054614180565b7f3625978433c3d3388ec2dddfdf4dd931786e9db5f2382a6ed08621dc9fb95f0055005b34610375575f366003190112610375576040515f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0454611bb681613f80565b8084529060018116908115611c6f5750600114611bf2575b610e9d83611bde81850382613ec7565b604051918291602083526020830190613da3565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace045f9081527f46a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa939250905b808210611c5557509091508101602001611bde611bce565b919260018160209254838588010152019101909291611c3d565b60ff191660208086019190915291151560051b84019091019150611bde9050611bce565b3461037557604036600319011261037557600435611caf613ddd565b90611cb8615089565b611cc0614d27565b80156105bd576001600160a01b038216801561119157611cdf826141df565b9182158015611d7b575b6105bd57611cfc816020956112f96156b5565b611d318330336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016615801565b60405190838252848201527fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d760403392a360015f516020615b585f395f51905f5255604051908152f35b505f611ce9565b34610375575f36600319011261037557602061036d614644565b3461037557604036600319011261037557611db5613ddd565b6004355f525f516020615b385f395f51905f526020526001600160a01b0360405f2091165f52602052602060ff60405f2054166040519015158152f35b34610375575f3660031901126103755760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b34610375575f366003190112610375577fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100541580611f2a575b15611ee557611eb7611e75613fb8565b610e9d611e806140ad565b611ec560405191611e92602084613ec7565b5f83525f368137604051958695600f60f81b875260e0602088015260e0870190613da3565b908582036040870152613da3565b904660608501523060808501525f60a085015283820360c0850152613f4d565b60405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a656400000000000000000000006044820152606490fd5b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1015415611e65565b34610375575f36600319011261037557611f6b614aab565b611f73615089565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a1005b3461037557611ff836613f23565b9091612002615089565b61200a614d27565b80156105bd576001600160a01b0383169081156111915761202a816141df565b928315908115612049575b506105bd57611cfc816020956112f96156b5565b9050831185612035565b34610375576020366003190112610375576001600160a01b03612074613dc7565b165f527f5ab42ced628888259c08ac98db1eb0cf702fc1501344311d8b100cd1bfe4bb00602052602060405f2054604051908152f35b34610375576001600160a01b036120c036613ee9565b92906120ca615089565b1691825f525f516020615af85f395f51905f5260205260ff60405f2054166122a6576120f4614d27565b81156105bd578215611191576001600160a01b03811690811561119157338214158061225d575b61155657815f525f516020615ad85f395f51905f526020528260405f2054106105615782612148916151d5565b67ffffffffffffffff7f2063345ccd85fc8f12bb2252d09411330c71f2174e47ce4f7919d5f3ad4b970054169160405192637be873f160e11b84525f516020615b785f395f51905f526004850152602484015280604484015283606484015260208360848173f5c4690c857f6c8e0d51091117b99bdbaa814d715af49283156105b2575f93612226575b5060408051338152602080820193909352919484939290917f1fdc681a13d8c5da54e301c7ce6542dcde4581e4725043fdab2db12ddc57450691a460015f516020615b585f395f51905f5255604051908152f35b9250906020833d602011612255575b8161224260209383613ec7565b81010312610375579151919060206121d2565b3d9150612235565b50815f527f407fc66dcc0b10c2a8ec69f9095c4cd702e9ed0fb1a7e0f6b6f65bd03e77610060205260405f206001600160a01b0333165f5260205260ff60405f2054161561211b565b8263d33f19e760e01b5f5260045260245ffd5b34610375575f36600319011261037557610e9d6040516122da604082613ec7565b6003815262312e3160e81b6020820152604051918291602083526020830190613da3565b34610375576020366003190112610375576001600160a01b0361231f613dc7565b165f525f516020615ad85f395f51905f52602052602060405f2054604051908152f35b346103755760403660031901126103755760043561235e613ddd565b90612367615089565b61236f614d27565b80156105bd576001600160a01b03821680156111915761238e82614793565b91821580156123ab575b6105bd576112fe836020956112f96156b5565b505f612398565b34610375575f36600319011261037557602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b346103755761240136613e13565b9061240a615089565b335f525f516020615af85f395f51905f5260205260ff60405f2054166115c0576001600160a01b039061243b614d27565b169081156111915781331461119157335f527f407fc66dcc0b10c2a8ec69f9095c4cd702e9ed0fb1a7e0f6b6f65bd03e77610060205260405f20825f526020526124948160405f209060ff801983541691151516179055565b60405190151581527fceb576d9f15e4e200fdb5096d64d5dfd667e16def20c1eefd14256d8e3faa26760203392a360015f516020615b585f395f51905f5255602060405160018152f35b613df3565b34610375576020366003190112610375575f60c060405161250381613eab565b8281528260208201528260408201528260608201528260808201528260a08201520152604051636d04446560e11b81525f516020615b785f395f51905f52600482015260043560248201526101008160448173f5c4690c857f6c8e0d51091117b99bdbaa814d715af480156105b2575f905f906125dd575b610100925067ffffffffffffffff60c06040519380518552602081015160208601526040810151604086015260608101516060860152608081015160808601526001600160a01b0360a08201511660a086015201511660c083015260e0820152f35b5050806101003d811161267a575b6125f58183613ec7565b81010361010081126103755760e0136103755760405161261481613eab565b815181526020820151602082015260408201516040820152606082015160608201526080820151608082015261264c60a083016142ac565b60a082015260c082015167ffffffffffffffff81168103610375576101009260e09160c0840152015161257b565b503d6125eb565b3461037557604036600319011261037557611b5361269d613dc7565b6126b560243580926126ad615089565b6112f9614b1a565b7f3625978433c3d3388ec2dddfdf4dd931786e9db5f2382a6ed08621dc9fb95f00546141b4565b34610375575f366003190112610375576126f4614aab565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff8116156127715760ff19167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b638dfc202b60e01b5f5260045ffd5b346103755760c036600319011261037557612799613dc7565b6127a1613e42565b6044359060a43567ffffffffffffffff8111610375576127c5903690600401613e58565b936127ce614a3c565b6127d6614d27565b604051631acbe8dd60e21b81526001600160a01b0382169290602081600481875afa9081156105b2575f91612b0a575b5060405191631c58dc8760e31b83526001600160a01b038216928360048201526020816024816001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165afa9081156105b2575f91612ad0575b5015612abd576040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690602081602481855afa80156105b2575f90612a89575b6128ed91507fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490454906141b4565b881161056157875f60209461291e6040519c8d968795869463fdd2b4af60e01b8652309160643591600488016142c0565b03925af19586156105b2575f96612a51575b5061299591869161294085615584565b5061298f6001600160801b03612986846001600160a01b03165f527f0a32e6e3ec9caf40523489fb56ffc3afa6eadc68c0df235d444c084ba724fc0260205260405f2090565b97168097615659565b50614d5f565b60405192638a2ecb4d60e01b845282600485015284602485015260843560448501526020846064815f865af19384156105b2575f94612a1a575b5060407f45b7d2c5f451c4103336c1b36960be829bd51652b849d16470ba37340dd4b17991602096825191825287820152a360015f516020615b585f395f51905f5255604051908152f35b9493506020853d602011612a49575b81612a3660209383613ec7565b81010312610375579351929360406129cf565b3d9150612a29565b9195506020823d602011612a81575b81612a6d60209383613ec7565b810103126103755761299591519591612930565b3d9150612a60565b506020813d602011612ab5575b81612aa360209383613ec7565b81010312610375576128ed90516128c0565b3d9150612a96565b82636ee9993b60e01b5f5260045260245ffd5b90506020813d602011612b02575b81612aeb60209383613ec7565b8101031261037557612afc90614600565b89612866565b3d9150612ade565b90506020813d602011612b3c575b81612b2560209383613ec7565b8101031261037557612b36906142ac565b87612806565b3d9150612b18565b34610375575f36600319011261037557602061036d614598565b34610375575f3660031901126103755760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461037557604036600319011261037557612bba613ddd565b336001600160a01b03821603612bd6576108ab90600435614fec565b63334bd91960e11b5f5260045ffd5b34610375575f36600319011261037557602061036d61551d565b34610375575f36600319011261037557602060405160128152f35b34610375576040366003190112610375576108ab600435612c39613ddd565b90612c5f6108a1825f525f516020615b385f395f51905f52602052600160405f20015490565b614c80565b34610375575f3660031901126103755760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461037557602036600319011261037557602061036d6004355f525f516020615b385f395f51905f52602052600160405f20015490565b3461037557606036600319011261037557612cf7613dc7565b612cff613ddd565b60443590612d3d836001600160a01b03165f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160205260405f2090565b6001600160a01b0333165f5260205260405f2054925f198410612d65575b611ab49350614e95565b828410612e02576001600160a01b03811615612def573315612ddc57611ab493612dbf826001600160a01b03165f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160205260405f2090565b6001600160a01b0333165f526020528360405f2091039055612d5b565b634a1406b160e11b5f525f60045260245ffd5b63e602df0560e01b5f525f60045260245ffd5b8284637dc7a0d960e11b5f523360045260245260445260645ffd5b34610375575f36600319011261037557602061036d614e25565b346103755760c036600319011261037557612e50613dc7565b612e58613e42565b90604435906001600160801b03821682036103755760a4359167ffffffffffffffff831161037557602093612e94612eb4943690600401613e58565b939092612e9f614a3c565b612ea7614d27565b608435926064359261430b565b60015f516020615b585f395f51905f5255604051908152f35b34610375575f3660031901126103755760205f516020615b185f395f51905f5254604051908152f35b3461037557604036600319011261037557612f0f613dc7565b6024359067ffffffffffffffff8216809203610375577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549060ff8260401c16159167ffffffffffffffff811680159081613925575b600114908161391b575b159081613912575b506139035767ffffffffffffffff1981166001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055826138c4575b50612fbc61548b565b612fc461425b565b92604093845190612fd58683613ec7565b600682527f7355534461690000000000000000000000000000000000000000000000000000602083015261300761548b565b61300f61548b565b80519067ffffffffffffffff8211611a0057819061304d7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0354613f80565b601f8111613837575b50602090601f8311600114613793575f92613788575b50508160011b915f199060031b1c1916177f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03555b80519067ffffffffffffffff8211611a005781906130de7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0454613f80565b601f81116136fb575b50602090601f8311600114613657575f9261364c575b50508160011b915f199060031b1c1916177f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace04555b61313961425b565b61314161548b565b84519061314e8683613ec7565b60018252603160f81b602083015261316461548b565b80519067ffffffffffffffff8211611a005781906131a27fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10254613f80565b601f81116135bf575b50602090601f831160011461351b575f92613510575b50508160011b915f199060031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102555b80519067ffffffffffffffff8211611a00576132317fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354613f80565b601f811161348e575b50602090601f83116001146133e657613358949392915f91836133db575b50508160011b915f199060031b1c1916177fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d103555b5f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100555f7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101556132da61548b565b6132e261548b565b6132ea61548b565b60015f516020615b585f395f51905f525561330361548b565b67ffffffffffffffff197f2063345ccd85fc8f12bb2252d09411330c71f2174e47ce4f7919d5f3ad4b97005416177f2063345ccd85fc8f12bb2252d09411330c71f2174e47ce4f7919d5f3ad4b970055614bd6565b5061335f57005b60207fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29168ff0000000000000000197ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555160018152a1005b015190508780613258565b90601f198316917fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f52815f20925f5b8181106134765750916001939185613358989796941061345e575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035561328c565b01515f1960f88460031b161c19169055878080613431565b92936020600181928786015181550195019301613416565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f527f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b75601f840160051c81019160208510613506575b601f0160051c01905b8181106134fb575061323a565b5f81556001016134ee565b90915081906134e5565b0151905087806131c1565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f9081528281209350601f198516905b8181106135a7575090846001959493921061358f575b505050811b017fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d102556131f5565b01515f1960f88460031b161c19169055878080613562565b9293602060018192878601518155019501930161354c565b7fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f529091507f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d601f840160051c81019160208510613642575b90601f859493920160051c01905b81811061363457506131ab565b5f8155849350600101613627565b9091508190613619565b0151905086806130fd565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace045f9081528281209350601f198516905b8181106136e357509084600195949392106136cb575b505050811b017f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0455613131565b01515f1960f88460031b161c1916905586808061369e565b92936020600181928786015181550195019301613688565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace045f529091507f46a2803e59a4de4e7a4c574b1243f25977ac4c77d5a1a4a609b5394cebb4a2aa601f840160051c8101916020851061377e575b90601f859493920160051c01905b81811061377057506130e7565b5f8155849350600101613763565b9091508190613755565b01519050878061306c565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace035f9081528281209350601f198516905b81811061381f5750908460019594939210613807575b505050811b017f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace03556130a0565b01515f1960f88460031b161c191690558780806137da565b929360206001819287860151815501950193016137c4565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace035f529091507f2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab0601f840160051c810191602085106138ba575b90601f859493920160051c01905b8181106138ac5750613056565b5f815584935060010161389f565b9091508190613891565b68ffffffffffffffffff191668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005583612fb3565b63f92ee8a960e01b5f5260045ffd5b90501585612f77565b303b159150612f6f565b849150612f65565b346103755761393b36613e13565b335f9081527fa4444b324116f496357b4fac8227ad63bed8ee53a87b9fb37937afb1d9de7916602052604090205490919060ff16156139d95760206001600160a01b037fcf3473b85df1594d47b6958f29a32bea0abff9dd68296f7bf33443646793cfd8921692835f525f516020615af85f395f51905f5282526139ce8160405f209060ff801983541691151516179055565b6040519015158152a2005b63e2517d3f60e01b5f52336004527f750555ed2187fef9a15b1b2d80b65634c266437a86c68f049ea8b5da4a2bd96d60245260445ffd5b3461037557604036600319011261037557611ab4613a2c613dc7565b60243590336153f7565b34610375575f366003190112610375576040515f7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0354613a7581613f80565b8084529060018116908115611c6f5750600114613a9c57610e9d83611bde81850382613ec7565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace035f9081527f2ae08a8e29253f69ac5d979a101956ab8f8d9d7ded63fa7a83b16fc47648eab0939250905b808210613aff57509091508101602001611bde611bce565b919260018160209254838588010152019101909291613ae7565b346103755760203660031901126103755760043563ffffffff60e01b8116809103610375576020906336372b0760e01b8114908115613c08575b8115613bf7575b8115613be6575b8115613bd5575b8115613bc4575b8115613bb3575b8115613b88575b506040519015158152f35b637965db0b60e01b811491508115613ba2575b5082613b7d565b6301ffc9a760e01b14905082613b9b565b632f0a18c560e01b81149150613b76565b63dd0390b560e01b81149150613b6f565b632c5290db60e01b81149150613b68565b63e3bc4e6560e01b81149150613b61565b631883ba3960e21b81149150613b5a565b63043eff2d60e51b81149150613b53565b34610375575f366003190112610375576040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156105b2575f91613d6f575b50613c92613ca091613c8c615842565b906141a1565b613c9a614644565b90614180565b604051631a9dc50560e01b81525f516020615b985f395f51905f5260048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166024820152600160448201529060208260648173aa0d16bfcfbf2780d05a47a7b17e159d7ede24345af49182156105b2575f92613d39575b602061036d613d318585614180565b613c9a615344565b91506020823d602011613d67575b81613d5460209383613ec7565b8101031261037557905190613d31613d22565b3d9150613d47565b90506020813d602011613d9b575b81613d8a60209383613ec7565b810103126103755751613c92613c7c565b3d9150613d7d565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b600435906001600160a01b038216820361037557565b602435906001600160a01b038216820361037557565b346103755760203660031901126103755763f12dfb6960e01b5f5260045ffd5b6040906003190112610375576004356001600160a01b0381168103610375579060243580151581036103755790565b602435906001600160801b038216820361037557565b9181601f840112156103755782359167ffffffffffffffff8311610375576020838186019501011161037557565b3461037557602036600319011261037557613e9f613dc7565b5060206040515f198152f35b60e0810190811067ffffffffffffffff821117611a0057604052565b90601f8019910116810190811067ffffffffffffffff821117611a0057604052565b606090600319011261037557600435906024356001600160a01b038116810361037557906044356001600160a01b03811681036103755790565b606090600319011261037557600435906024356001600160a01b0381168103610375579060443590565b90602080835192838152019201905f5b818110613f6a5750505090565b8251845260209384019390920191600101613f5d565b90600182811c92168015613fae575b6020831014613f9a57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613f8f565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025491613fea83613f80565b808352926001811690811561408e5750600114614010575b61400e92500383613ec7565b565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1025f90815290917f42ad5d3e1f2e6e70edcf6d991b8a3023d3fca8047a131592f9edb9fd9b89d57d5b81831061407257505090602061400e92820101614002565b602091935080600191548385890101520191019091849261405a565b6020925061400e94915060ff191682840152151560051b820101614002565b604051905f827fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d10354916140df83613f80565b808352926001811690811561408e57506001146141025761400e92500383613ec7565b507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d1035f90815290917f5f9ce34815f8e11431c7bb75a8e6886a91478f7ffc1dbb0a98dc240fddd76b755b81831061416457505090602061400e92820101614002565b602091935080600191548385890101520191019091849261414c565b9190820180921161418d57565b634e487b7160e01b5f52601160045260245ffd5b8181029291811591840414171561418d57565b9190820391821161418d57565b81156141cb570490565b634e487b7160e01b5f52601260045260245ffd5b61421361421b91620f42405f516020615b185f395f51905f5254105f1461424d576001600160801b03620f42405b16614180565b613c8c614e25565b670de0b6b3a764000081019081811161418d57670de0b6b3a763ffff0190811161418d57670de0b6b3a7640000900490565b6001600160801b035f61420d565b6040519061426a604083613ec7565b600c82527f5374616b656420555344616900000000000000000000000000000000000000006020830152565b9190826040910312610375576020825192015190565b51906001600160a01b038216820361037557565b94919386949360c097946001600160a01b0380941688526020880152604087015216606085015260a060808501528160a0850152848401375f828201840152601f01601f1916010190565b6001600160a01b03909694939295919616936040519363e59adeaf60e01b85526001600160801b03805f99169788600488015216928360248701526040866044815f8b5af19485156105b2575f965f96614571575b5085116145625773aa0d16bfcfbf2780d05a47a7b17e159d7ede2434803b15610375575f608491604051928380926318cc79bd60e01b82525f516020615b985f395f51905f5260048301528c60248301528d60448301528960648301525af480156105b25761454d575b50841561454257604051631acbe8dd60e21b8152916020836004818b5afa8015614537578a906144f5575b602093508a6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169261443989856001600160a01b038616614d5f565b61445c60405197889687958694630365f9bb60e61b86528d3092600488016142c0565b03925af19687156144e957966144ae575b50916080917f581997fcc4c97b4ff1ac1f86ed5086415a7b99f556baf46227d8ea949f3170979360405192835260208301526040820152856060820152a390565b91929095506020823d6020116144e1575b816144cc60209383613ec7565b8101031261037557905194909190608061446d565b3d91506144bf565b604051903d90823e3d90fd5b5090916020813d60201161452f575b8161451160209383613ec7565b8101031261452b5790614526602093926142ac565b6143f5565b8980fd5b3d9150614504565b6040513d8c823e3d90fd5b505050505050505090565b61455a9199505f90613ec7565b5f975f6143ca565b6314ed798960e31b5f5260045ffd5b90955061458e91965060403d604011610855576108458183613ec7565b959095945f614360565b6145fd6145d55f516020615b185f395f51905f52547f3625978433c3d3388ec2dddfdf4dd931786e9db5f2382a6ed08621dc9fb95f005490614180565b7fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d49035490614180565b90565b5190811515820361037557565b67ffffffffffffffff8111611a005760051b60200190565b9081602091031261037557516001600160f01b03811681036103755790565b604051632c78616360e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316602082602481845afa9182156105b2575f92614746575b50602060249160405192838092632c78616360e01b82526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048301525afa9081156105b2576001600160f01b039182915f91614727575b50169116016001600160f01b03811161418d576145fd906001600160f01b03614720615842565b91166141a1565b614740915060203d602011611278576112708183613ec7565b5f6146f9565b6024919250614763602091823d8411611278576112708183613ec7565b929150614698565b805182101561477f5760209160051b010190565b634e487b7160e01b5f52603260045260245ffd5b620f42405f516020615b185f395f51905f525410670de0b6b3a7640000820291808304670de0b6b3a7640000149015171561418d576147dd6145fd926147d7614e25565b906141c1565b90156147f7576001600160801b03620f42405b16906141b4565b6001600160801b035f6147f0565b5f527fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490560205260405f20906001600160a01b03600583015491166001600160a01b0382161490811591614864575b5061485f576003015490565b505f90565b905067ffffffffffffffff429160a01c1610155f614853565b5f527fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490560205260405f20906001600160a01b038060058401541691160361485f576002015490565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa9081156105b2575f91614a08575b50613c9261492891613c8c615842565b604051631a9dc50560e01b81525f516020615b985f395f51905f5260048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166024820152909160028110156149f457604482015260208160648173aa0d16bfcfbf2780d05a47a7b17e159d7ede24345af49081156105b2575f916149c0575b50613d31906145fd92614180565b90506020813d6020116149ec575b816149db60209383613ec7565b8101031261037557516145fd6149b2565b3d91506149ce565b634e487b7160e01b5f52602160045260245ffd5b90506020813d602011614a34575b81614a2360209383613ec7565b810103126103755751613c92614918565b3d9150614a16565b335f9081527fe07e4ffc58bbedf569156c699e19bc9793408c00260a0ed646c831b87af97ecb602052604090205460ff1615614a7457565b63e2517d3f60e01b5f52336004527f5604e2fe54b4de17b81a5ded6f82357d742fd2722d67304e37ff20bd589b4f3860245260445ffd5b335f9081527f20564623c340898287df7920e31a390c34a65bf4ab6fd3ad283beda989f363b7602052604090205460ff1615614ae357565b63e2517d3f60e01b5f52336004527f5abc35f3ddf4502abf40df80a9ee922191cea883919dcc4c1fdc7afe4464f22260245260445ffd5b335f9081527f4a62185f689105f6389790e152a31939ebc754bfd563a08c0f9340f3b27bc50a602052604090205460ff1615614b5257565b63e2517d3f60e01b5f52336004527f751b795d24b92e3d92d1d0d8f2885f4e9c9c269da350af36ae6b49069babf4bf60245260445ffd5b805f525f516020615b385f395f51905f5260205260405f206001600160a01b0333165f5260205260ff60405f20541615614bc05750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1661485f576001600160a01b03165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d60205260408120805460ff191660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b805f525f516020615b385f395f51905f5260205260405f206001600160a01b0383165f5260205260ff60405f205416155f14614d2157805f525f516020615b385f395f51905f5260205260405f206001600160a01b0383165f5260205260405f20600160ff198254161790556001600160a01b03339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b60025f516020615b585f395f51905f525414614d505760025f516020615b585f395f51905f5255565b633ee5aeb560e01b5f5260045ffd5b60405163095ea7b360e01b60208083019182526001600160a01b0385166024840152604480840196909652948252929390925f90614d9e606486613ec7565b84519082855af15f513d82614e00575b505015614dba57505050565b614dfb61400e936001600160a01b036040519163095ea7b360e01b60208401521660248201525f604482015260448152614df5606482613ec7565b826154c9565b6154c9565b909150614e1d57506001600160a01b0381163b15155b5f80614dae565b600114614e16565b614e2d614598565b614e3d57670de0b6b3a764000090565b614e4760016148c5565b670de0b6b3a7640000810290808204670de0b6b3a7640000149015171561418d576145fd906147d7614598565b614e7c614598565b614e8c57670de0b6b3a764000090565b614e475f6148c5565b6001600160a01b0316908115614fd9576001600160a01b0316918215614fc657335f525f516020615af85f395f51905f5260205260ff60405f2054166115c057815f525f516020615af85f395f51905f5260205260ff60405f205416614fb357825f525f516020615af85f395f51905f5260205260ff60405f2054166122a657815f525f516020615ad85f395f51905f5260205260405f2054818110614f9a57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f525f516020615ad85f395f51905f5284520360405f2055845f525f516020615ad85f395f51905f52825260405f20818154019055604051908152a3565b8263391434e360e21b5f5260045260245260445260645ffd5b5063d33f19e760e01b5f5260045260245ffd5b63ec442f0560e01b5f525f60045260245ffd5b634b637e8f60e11b5f525f60045260245ffd5b805f525f516020615b385f395f51905f5260205260405f206001600160a01b0383165f5260205260ff60405f2054165f14614d2157805f525f516020615b385f395f51905f5260205260405f206001600160a01b0383165f5260205260405f2060ff1981541690556001600160a01b03339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166150b457565b63d93c066560e01b5f5260045ffd5b6001600160a01b0316908115614fc657335f525f516020615af85f395f51905f5260205260ff60405f2054166115c0575f80525f516020615af85f395f51905f526020527f3d16e9e3a2b7240f8bb0d95adbe3a6102cd5d458e7e1d4eee7c4eed7d2ba664f5460ff166151c257815f525f516020615af85f395f51905f5260205260ff60405f205416614fb3577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60208261518d5f945f516020615b185f395f51905f5254614180565b5f516020615b185f395f51905f52558484525f516020615ad85f395f51905f52825260408420818154019055604051908152a3565b63d33f19e760e01b5f525f60045260245ffd5b9091906001600160a01b03168015614fd957335f525f516020615af85f395f51905f5260205260ff60405f2054166115c057805f525f516020615af85f395f51905f5260205260ff60405f2054166115ae575f80525f516020615af85f395f51905f526020527f3d16e9e3a2b7240f8bb0d95adbe3a6102cd5d458e7e1d4eee7c4eed7d2ba664f5460ff166151c257805f525f516020615ad85f395f51905f5260205260405f20548381106152ee576020845f94957fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef938587525f516020615ad85f395f51905f528452036040862055805f516020615b185f395f51905f5254035f516020615b185f395f51905f5255604051908152a3565b915063391434e360e21b5f5260045260245260445260645ffd5b60405163a9059cbb60e01b60208201526001600160a01b0392909216602483015260448083019390935291815261400e91614dfb606483613ec7565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156105b2575f906153c3575b6145fd91507fc6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d490454906141b4565b506020813d6020116153ef575b816153dd60209383613ec7565b81010312610375576145fd9051615396565b3d91506153d0565b916001600160a01b038316918215612def576001600160a01b0316928315612ddc577f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925916154776020926001600160a01b03165f527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0160205260405f2090565b855f5282528060405f2055604051908152a3565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156154ba57565b631afcd79f60e31b5f5260045ffd5b905f602091828151910182855af1156105b2575f513d61551457506001600160a01b0381163b155b6154f85750565b6001600160a01b0390635274afe760e01b5f521660045260245ffd5b600114156154f1565b615525615a28565b61552d615a92565b6040519060208201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8452604083015260608201524660808201523060a082015260a0815261557e60c082613ec7565b51902090565b805f527f0a32e6e3ec9caf40523489fb56ffc3afa6eadc68c0df235d444c084ba724fc0160205260405f2054155f1461485f575f516020615b985f395f51905f525468010000000000000000811015611a005760018101805f516020615b985f395f51905f525581101561477f577feec343e34b5322c3ad2177a4ec6ce9b4c2eee199542473b417a881430a43c239018190555f516020615b985f395f51905f52545f9182527f0a32e6e3ec9caf40523489fb56ffc3afa6eadc68c0df235d444c084ba724fc01602052604090912055600190565b6001810190825f528160205260405f2054155f146156ae57805468010000000000000000811015611a00576001810180835581101561477f578390825f5260205f20015554915f5260205260405f2055600190565b5050505f90565b620f42405f516020615b185f395f51905f5254106156cf57565b335f525f516020615af85f395f51905f5260205260ff60405f2054166115c0575f80525f516020615af85f395f51905f526020527f3d16e9e3a2b7240f8bb0d95adbe3a6102cd5d458e7e1d4eee7c4eed7d2ba664f5460ff166151c25761dead5f525f516020615af85f395f51905f526020527f2201d4344fd889443db89db4930408866d1464bec0807d341982dd4916dd707d5460ff166157ec575f516020615b185f395f51905f5254620f4240810180911161418d575f516020615b185f395f51905f525561dead5f525f516020615ad85f395f51905f5260205260405f20620f4240815401905561dead5f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6020604051620f42408152a3565b63d33f19e760e01b5f5261dead60045260245ffd5b9091926001600160a01b0361400e9481604051956323b872dd60e01b6020880152166024860152166044840152606483015260648252614dfb608483613ec7565b60405163313ce56760e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa80156105b2575f906158af575b60ff91501660120360ff811161418d5760ff16604d811161418d57600a0a90565b506020813d6020116158e4575b816158c960209383613ec7565b81010312610375575160ff811681036103755760ff9061588e565b3d91506158bc565b90615910575080511561590157805190602001fd5b63d6bda27560e01b5f5260045ffd5b8151158061593d575b615921575090565b6001600160a01b0390639996b31560e01b5f521660045260245ffd5b50803b15615919565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a084116159bd579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa156105b2575f516001600160a01b038116156159b357905f905f90565b505f906001905f90565b5050505f9160039190565b60048110156149f457806159da575050565b600181036159f15763f645eedf60e01b5f5260045ffd5b60028103615a0c575063fce698f760e01b5f5260045260245ffd5b600314615a165750565b6335e2f38360e21b5f5260045260245ffd5b615a30613fb8565b8051908115615a40576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d100548015615a6d5790565b507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47090565b615a9a6140ad565b8051908115615aaa576020012090565b50507fa16a46d94261c7517cc8ff89f61c0ce93598e3c849801011dee649a6a557d101548015615a6d579056fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00d72eee3ef38e7b6c56e7e7a072b9106d43cf4d2b07e30824aa9ed4fd4bd66c0052c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0202dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00c6ad599b80e437d86c31abd9e2cd5c6ce030f11e9dbae11bc05446f7af4d49000a32e6e3ec9caf40523489fb56ffc3afa6eadc68c0df235d444c084ba724fc00a2646970667358221220598b9efff4b464529461af7d3629adf0e3df482f726ad0a5ac2d7b35483d14a264736f6c634300081d0033f0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a000000000000000000000000000a1a1a107e45b7ced86833863f482bc5f4ed82ef000000000000000000000000437cc33344a0b27a429f795ff6b469c72698b29100000000000000000000000000000000000000000000000000000000000003e80000000000000000000000005f0bc72fb5952b2f3f2e11404398ed507b25841f000000000000000000000000ec335fb6151354c74a8f97e84e770377945d00b3