0 txs
472 calls
constructor
constructor()
functions
autoBridgeCoordinator
viewfunction autoBridgeCoordinator() view returns (address)
depositCount
viewfunction depositCount() view returns (uint256)
depositGlobalUnlockAt
viewfunction depositGlobalUnlockAt() view returns (uint32)
deposits
viewfunction deposits(address, address, uint256) view returns (uint96 balance, uint32 unlockAt, uint96 receiptMinted, uint96 feeOwed, uint88 lastFeeIntegral, uint8 tbtcMigrationState, bool autoBridgingOptOut)
feeInfo
viewfunction feeInfo(address) view returns (uint96 totalMinted, uint32 lastFeeUpdateAt, uint88 feeIntegral, uint8 annualFee, uint8 mintCap, address receiptToken, uint96 feeCollected)
getDeposit
viewfunction getDeposit(address depositor, address token, uint256 depositId) view returns (tuple)
liquidityTreasury
viewfunction liquidityTreasury() view returns (address)
liquidityTreasuryManaged
viewfunction liquidityTreasuryManaged(address) view returns (bool)
maxLockPeriod
viewfunction maxLockPeriod() view returns (uint32)
mezoBridge
viewfunction mezoBridge() view returns (address)
minLockPeriod
viewfunction minLockPeriod() view returns (uint32)
owner
viewfunction owner() view returns (address)
pendingOwner
viewfunction pendingOwner() view returns (address)
tbtcMigrations
viewfunction tbtcMigrations(address) view returns (bool isAllowed, uint96 totalMigrating)
tbtcMigrationTreasury
viewfunction tbtcMigrationTreasury() view returns (address)
tbtcToken
viewfunction tbtcToken() view returns (address)
tokenAbility
viewfunction tokenAbility(address) view returns (uint8)
wbtcToken
viewfunction wbtcToken() view returns (address)
acceptOwnership
nonpayablefunction acceptOwnership()
autoBridgeDeposits
nonpayablefunction autoBridgeDeposits(address token, tuple[] _deposits)
autoBridgeWbtcDeposits
nonpayablefunction autoBridgeWbtcDeposits(tuple[] _deposits)
batchRequestWbtcToTbtcMigration
nonpayablefunction batchRequestWbtcToTbtcMigration(tuple[] _deposits)
completeTbtcMigration
nonpayablefunction completeTbtcMigration(address token, tuple[] migratedDeposits)
deposit
nonpayablefunction deposit(address token, uint96 amount, uint32 lockPeriod)
depositFor
nonpayablefunction depositFor(address depositOwner, address token, uint96 amount, uint32 lockPeriod)
initialize
nonpayablefunction initialize(tuple[] supportedTokens)
lock
nonpayablefunction lock(address token, uint256 depositId, uint32 lockPeriod)
receiveApproval
nonpayablefunction receiveApproval(address from, uint256 amount, address token, bytes data)
renounceOwnership
nonpayablefunction renounceOwnership()
repayReceipt
nonpayablefunction repayReceipt(address token, uint256 depositId, uint256 amount)
setAssetAsLiquidityTreasuryManaged
nonpayablefunction setAssetAsLiquidityTreasuryManaged(address asset, bool isManaged)
setAutoBridgeCoordinator
nonpayablefunction setAutoBridgeCoordinator(address _autoBridgeCoordinator)
setDepositAutoBridgingOptOut
nonpayablefunction setDepositAutoBridgingOptOut(address depositor, address token, uint256 depositId, bool optOut)
setDepositAutoBridgingOptOut
nonpayablefunction setDepositAutoBridgingOptOut(address token, uint256 depositId, bool optOut)
setDepositGlobalUnlockAt
nonpayablefunction setDepositGlobalUnlockAt(uint32 _depositGlobalUnlockAt)
setLiquidityTreasury
nonpayablefunction setLiquidityTreasury(address _liquidityTreasury)
setMezoBridge
nonpayablefunction setMezoBridge(address _mezoBridge)
setTbtcMigrationTreasury
nonpayablefunction setTbtcMigrationTreasury(address _tbtcMigrationTreasury)
setTbtcTokenAddress
nonpayablefunction setTbtcTokenAddress(address _tbtcToken)
setWbtcTokenAddress
nonpayablefunction setWbtcTokenAddress(address _wbtcToken)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
withdraw
nonpayablefunction withdraw(address token, uint256 depositId)
withdrawAsLiquidityTreasury
nonpayablefunction withdrawAsLiquidityTreasury(address token, uint256 amount)
withdrawForTbtcMigration
nonpayablefunction withdrawForTbtcMigration(address token, tuple[] depositsToMigrate)
withdrawPartially
nonpayablefunction withdrawPartially(address token, uint256 depositId, uint96 amount)
events
AutoBridgeCoordinatorUpdated
event AutoBridgeCoordinatorUpdated(address indexed previousAutoBridgeCoordinator, address indexed newAutoBridgeCoordinator)
DepositAutoBridged
event DepositAutoBridged(address indexed depositor, address indexed token, uint256 indexed depositId, uint256 amount)
DepositAutoBridgingOptOutSet
event DepositAutoBridgingOptOutSet(address indexed depositor, address indexed token, uint256 indexed depositId, bool optOut)
Deposited
event Deposited(address indexed depositor, address indexed token, uint256 indexed depositId, uint256 amount)
DepositGlobalUnlockAtUpdated
event DepositGlobalUnlockAtUpdated(uint32 previousDepositGlobalUnlockAt, uint32 newDepositGlobalUnlockAt)
FeeCollected
event FeeCollected(address indexed depositor, address indexed token, uint256 indexed depositId, uint256 fee)
FeeCollectedTbtcMigrated
event FeeCollectedTbtcMigrated(address indexed depositor, address indexed token, address tbtcToken, uint256 indexed depositId, uint256 feeInTbtc)
FundedFromTbtcMigration
event FundedFromTbtcMigration(uint256 amount)
Initialized
event Initialized(uint64 version)
LiquidityTreasuryManagedAssetUpdated
event LiquidityTreasuryManagedAssetUpdated(address indexed asset, bool isManaged)
LiquidityTreasuryUpdated
event LiquidityTreasuryUpdated(address indexed previousLiquidityTreasury, address indexed newLiquidityTreasury)
Locked
event Locked(address indexed depositor, address indexed token, uint256 indexed depositId, uint32 unlockAt, uint32 lockPeriod)
MaxLockPeriodUpdated
event MaxLockPeriodUpdated(uint32 maxLockPeriod)
MezoBridgeUpdated
event MezoBridgeUpdated(address indexed previousMezoBridge, address indexed newMezoBridge)
MinLockPeriodUpdated
event MinLockPeriodUpdated(uint32 minLockPeriod)
OptOutDepositAutoBridgingSkipped
event OptOutDepositAutoBridgingSkipped(address indexed depositor, address indexed token, uint256 indexed depositId)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
ReceiptMinted
event ReceiptMinted(address indexed depositor, address indexed token, uint256 indexed depositId, uint256 amount)
ReceiptMintedDepositAutoBridgingSkipped
event ReceiptMintedDepositAutoBridgingSkipped(address indexed depositor, address indexed token, uint256 indexed depositId)
ReceiptParamsUpdated
event ReceiptParamsUpdated(address indexed token, uint8 annualFee, uint8 mintCap, address receiptToken)
ReceiptRepaid
event ReceiptRepaid(address indexed depositor, address indexed token, uint256 indexed depositId, uint256 amount)
SupportedTokenAdded
event SupportedTokenAdded(address indexed token, uint8 tokenAbility)
TbtcMigratingDepositAutoBridgingSkipped
event TbtcMigratingDepositAutoBridgingSkipped(address indexed depositor, address indexed token, uint256 indexed depositId)
TbtcMigrationAllowedUpdated
event TbtcMigrationAllowedUpdated(address indexed token, bool isAllowed)
TbtcMigrationCompleted
event TbtcMigrationCompleted(address indexed depositor, address indexed token, uint256 indexed depositId)
TbtcMigrationRequested
event TbtcMigrationRequested(address indexed depositor, address indexed token, uint256 indexed depositId)
TbtcMigrationStarted
event TbtcMigrationStarted(address indexed depositor, address indexed token, uint256 indexed depositId)
TbtcMigrationTreasuryUpdated
event TbtcMigrationTreasuryUpdated(address indexed previousMigrationTreasury, address indexed newMigrationTreasury)
TbtcTokenAddressSet
event TbtcTokenAddressSet(address tbtc)
WbtcTokenAddressSet
event WbtcTokenAddressSet(address wbtcToken)
Withdrawn
event Withdrawn(address indexed depositor, address indexed token, uint256 indexed depositId, uint256 amount)
WithdrawnByLiquidityTreasury
event WithdrawnByLiquidityTreasury(address indexed token, uint256 amount)
WithdrawnDepositAutoBridgingSkipped
event WithdrawnDepositAutoBridgingSkipped(address indexed depositor, address indexed token, uint256 indexed depositId)
WithdrawnForTbtcMigration
event WithdrawnForTbtcMigration(address indexed token, uint256 amount)
WithdrawnTbtcMigrated
event WithdrawnTbtcMigrated(address indexed depositor, address indexed token, address tbtcToken, uint256 indexed depositId, uint256 amountInTbtc)
errors
AddressEmptyCode
error AddressEmptyCode(address target)
AddressInsufficientBalance
error AddressInsufficientBalance(address account)
AssetNotManagedByLiquidityTreasury
error AssetNotManagedByLiquidityTreasury(address asset)
CallerNotAutoBridgeCoordinator
error CallerNotAutoBridgeCoordinator()
DepositLocked
error DepositLocked(uint32 unlockAt)
DepositNotFound
error DepositNotFound()
FailedInnerCall
error FailedInnerCall()
IncorrectAmount
error IncorrectAmount(uint256 amount)
IncorrectAutoBridgeCoordinatorAddress
error IncorrectAutoBridgeCoordinatorAddress(address autoBridgeCoordinator)
IncorrectDepositGlobalUnlockAt
error IncorrectDepositGlobalUnlockAt(uint32 depositGlobalUnlockAt)
IncorrectDepositor
error IncorrectDepositor(address depositor)
IncorrectLockPeriod
error IncorrectLockPeriod(uint256 lockPeriod)
IncorrectMezoBridgeAddress
error IncorrectMezoBridgeAddress(address mezoBridge)
IncorrectReceiptTokenDecimals
error IncorrectReceiptTokenDecimals(address receiptToken)
IncorrectTokenAbility
error IncorrectTokenAbility(uint8 ability)
IncorrectTokenAddress
error IncorrectTokenAddress(address token)
InsufficientTokenAbility
error InsufficientTokenAbility(address token, uint8 tokenAbility)
InvalidInitialization
error InvalidInitialization()
LockPeriodOutOfRange
error LockPeriodOutOfRange(uint32 lockPeriod)
LockPeriodTooShort
error LockPeriodTooShort(uint32 lockPeriod, uint32 newUnlockAt, uint32 existingUnlockAt)
MaxAnnualFeeExceeded
error MaxAnnualFeeExceeded(uint8 annualFee)
MaxReceiptMintCapExceeded
error MaxReceiptMintCapExceeded(uint8 mintCap)
NotInitializing
error NotInitializing()
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
PartialWithdrawalAmountTooHigh
error PartialWithdrawalAmountTooHigh(uint256 depositAmount)
ReceiptFeeOwed
error ReceiptFeeOwed(uint256 feeOwed)
ReceiptMintingDisabled
error ReceiptMintingDisabled()
ReceiptMintLimitExceeded
error ReceiptMintLimitExceeded(uint256 mintLimit, uint96 currentlyMinted, uint256 feeOwed, uint256 amount)
ReceiptNotRepaid
error ReceiptNotRepaid(uint256 receiptMinted)
ReceiptTokenAlreadyInitialized
error ReceiptTokenAlreadyInitialized()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RepayAmountExceededDebt
error RepayAmountExceededDebt(uint96 mintedDebt, uint256 amount)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SenderNotLiquidityTreasury
error SenderNotLiquidityTreasury(address sender)
SenderNotTbtcMigrationTreasury
error SenderNotTbtcMigrationTreasury()
TbtcCanNotBeMigrated
error TbtcCanNotBeMigrated()
TbtcMigrationAndLiquidityManagementConflict
error TbtcMigrationAndLiquidityManagementConflict()
TbtcMigrationNotAllowed
error TbtcMigrationNotAllowed()
TbtcMigrationNotCompleted
error TbtcMigrationNotCompleted()
TbtcMigrationRequestedErr
error TbtcMigrationRequestedErr()
TbtcTokenAddressAlreadySet
error TbtcTokenAddressAlreadySet()
TbtcTokenAddressNotSet
error TbtcTokenAddressNotSet()
TokenAlreadySupported
error TokenAlreadySupported(address token, uint8 tokenAbility)
TokenApprovalFailure
error TokenApprovalFailure()
TokenNotSupported
error TokenNotSupported(address token)
UnexpectedTbtcMigrationState
error UnexpectedTbtcMigrationState(uint256 depositId, uint8 currentState, uint8 expectedState)
UnknownTokenDecimals
error UnknownTokenDecimals(address token)
WbtcAutoBridgingNotSupported
error WbtcAutoBridgingNotSupported()
creation bytecode
0x60806040523480156200001157600080fd5b506200001c62000022565b620000d6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff1615620000735760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b0390811614620000d35780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b615d3d80620000e66000396000f3fe608060405234801561001057600080fd5b50600436106102ff5760003560e01c8063674562a01161019c578063bc06b965116100ee578063e5d3d71411610097578063f5e8d32711610071578063f5e8d327146108e0578063fa4e00c0146108f3578063fe10b9fb1461090657600080fd5b8063e5d3d714146108a7578063f2fde38b146108ba578063f3fef3a3146108cd57600080fd5b8063c74b552e116100c8578063c74b552e14610879578063dfb6c2d21461088c578063e30c39781461089f57600080fd5b8063bc06b9651461070e578063be21aa8d14610721578063bfcfa66b1461073457600080fd5b80638da5cb5b11610150578063a2b7e2dd1161012a578063a2b7e2dd146106b4578063ab63e28e146106c7578063b918e5f9146106ef57600080fd5b80638da5cb5b146106865780638f4ffcb11461068e57806390729b66146106a157600080fd5b8063715018a611610181578063715018a61461066657806373ae54b51461066e57806379ba50971461067e57600080fd5b8063674562a0146105f75780636889d5d01461060a57600080fd5b80634dfebc9e11610255578063584c970b116102095780635d93a3fc116101e35780635d93a3fc146104d757806364b1061e146105b45780636572c5dd146105c757600080fd5b8063584c970b1461049e5780635a6c2958146104b15780635d4b19cf146104c457600080fd5b8063554e6e211161023a578063554e6e2114610458578063563170e31461046b57806357f811801461048b57600080fd5b80634dfebc9e146104325780634f10158c1461044557600080fd5b80632c4b24ae116102b75780633b6ede3c116102915780633b6ede3c146103df5780633c2b8745146103f25780634b1d29b41461040557600080fd5b80632c4b24ae146103a25780632dfdf0b5146103b557806331645d4e146103cc57600080fd5b80631ae41f84116102e85780631ae41f841461035157806325e102a91461036457806327614df81461037757600080fd5b80630b9c1784146103045780631980817114610319575b600080fd5b6103176103123660046150c6565b610919565b005b61033c6103273660046150f8565b60046020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61031761035f36600461512f565b610a19565b6103176103723660046150f8565b610eb2565b600b5461038a906001600160a01b031681565b6040516001600160a01b039091168152602001610348565b6103176103b0366004615236565b610f46565b6103be60015481565b604051908152602001610348565b6103176103da366004615307565b61120c565b6103176103ed36600461534f565b61121e565b6103176104003660046150f8565b611238565b60035461041d90640100000000900463ffffffff1681565b60405163ffffffff9091168152602001610348565b6103176104403660046150f8565b6112b4565b6103176104533660046150f8565b611374565b61031761046636600461539e565b61143b565b61047e6104793660046153c8565b611582565b6040516103489190615447565b610317610499366004615511565b6116e4565b6103176104ac366004615553565b611d62565b600a5461038a906001600160a01b031681565b6103176104d2366004615511565b611f19565b6105a16104e53660046153c8565b60006020818152938152604080822085529281528281209093528252902080546001909101546bffffffffffffffffffffffff808316926c0100000000000000000000000080820463ffffffff16937001000000000000000000000000000000009092048316928216919081046affffffffffffffffffffff169077010000000000000000000000000000000000000000000000810460ff90811691780100000000000000000000000000000000000000000000000090041687565b604051610348979695949392919061558a565b6103176105c23660046150f8565b61228f565b6105ea6105d53660046150f8565b60026020526000908152604090205460ff1681565b60405161034891906155ff565b61031761060536600461560d565b612356565b6106426106183660046150f8565b60086020526000908152604090205460ff81169061010090046bffffffffffffffffffffffff1682565b6040805192151583526bffffffffffffffffffffffff909116602083015201610348565b610317612362565b60035461041d9063ffffffff1681565b610317612376565b61038a6123d7565b61031761069c36600461564d565b61240c565b6103176106af3660046156e8565b6124bf565b60075461038a906001600160a01b031681565b600a5461041d9074010000000000000000000000000000000000000000900463ffffffff1681565b60035461038a906801000000000000000090046001600160a01b031681565b61031761071c3660046150f8565b612b5e565b60095461038a906001600160a01b031681565b6108106107423660046150f8565b600560205260009081526040902080546001909101546bffffffffffffffffffffffff8083169263ffffffff6c01000000000000000000000000820416926affffffffffffffffffffff7001000000000000000000000000000000008304169260ff7b0100000000000000000000000000000000000000000000000000000084048116937c0100000000000000000000000000000000000000000000000000000000900416916001600160a01b03811691740100000000000000000000000000000000000000009091041687565b604080516bffffffffffffffffffffffff988916815263ffffffff90971660208801526affffffffffffffffffffff9095169486019490945260ff9283166060860152911660808401526001600160a01b031660a08301529190911660c082015260e001610348565b61031761088736600461573b565b612c5a565b61031761089a36600461580a565b612f45565b61038a612f52565b60065461038a906001600160a01b031681565b6103176108c83660046150f8565b612f7b565b6103176108db36600461539e565b613018565b6103176108ee36600461585e565b6137ac565b610317610901366004615891565b61395b565b61031761091436600461573b565b613c9d565b610921613fd6565b8063ffffffff1660000361096e576040517feddc865c00000000000000000000000000000000000000000000000000000000815263ffffffff821660048201526024015b60405180910390fd5b600a546040805163ffffffff740100000000000000000000000000000000000000009093048316815291831660208301527fc36c74ae6427be0a197055cb90533a93c13592cca2791fcc82d791c11f21bee1910160405180910390a1600a805463ffffffff90921674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b6001600160a01b03831660009081526002602052604081205460ff1690816002811115610a4857610a48615404565b03610a8a576040517f06439c6b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610965565b816bffffffffffffffffffffffff16600003610ae2576040517f88967d2f0000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff83166004820152602401610965565b336000908152602081815260408083206001600160a01b038816845282528083208684529091528120805490916bffffffffffffffffffffffff9091169003610b57576040517f411321ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80546bffffffffffffffffffffffff90811690841610610bb65780546040517f9dd2b6810000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff9091166004820152602401610965565b6002826002811115610bca57610bca615404565b148015610bed575080546c01000000000000000000000000900463ffffffff1642105b8015610c405750600a5474010000000000000000000000000000000000000000900463ffffffff161580610c405750600a5474010000000000000000000000000000000000000000900463ffffffff1642105b15610c915780546040517fced227db0000000000000000000000000000000000000000000000000000000081526c0100000000000000000000000090910463ffffffff166004820152602401610965565b805470010000000000000000000000000000000090046bffffffffffffffffffffffff1615610d125780546040517f226503810000000000000000000000000000000000000000000000000000000081527001000000000000000000000000000000009091046bffffffffffffffffffffffff166004820152602401610965565b60018101546bffffffffffffffffffffffff1615610d725760018101546040517f01e9e74a0000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff9091166004820152602401610965565b6000600182015477010000000000000000000000000000000000000000000000900460ff166003811115610da857610da8615404565b14610ddf576040517faf343ffd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516bffffffffffffffffffffffff8416815284906001600160a01b0387169033907f91fb9d98b786c57d74c099ccd2beca1739e9f6a81fb49001ca465c4b7591bbe29060200160405180910390a4805483908290600090610e519084906bffffffffffffffffffffffff166158f3565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610eab33846bffffffffffffffffffffffff16876001600160a01b03166140219092919063ffffffff16565b5050505050565b610eba613fd6565b6003546040516001600160a01b038084169268010000000000000000900416907f087168495b2024a05f1e51c26b5abadc7eaa5984c24a419d3563f092693ca1d590600090a3600380546001600160a01b0390921668010000000000000000027fffffffff0000000000000000000000000000000000000000ffffffffffffffff909216919091179055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff16600081158015610f915750825b905060008267ffffffffffffffff166001148015610fae5750303b155b905081158015610fbc575080155b15610ff3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156110545784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61105d33614095565b600380547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016670167e9800024ea00179055600060018190555b86518110156111a25760008782815181106110b4576110b4615918565b602002602001015160000151905060008883815181106110d6576110d6615918565b602002602001015160200151905060006001600160a01b0316826001600160a01b03160361113b576040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610965565b6001600160a01b0382166000908152600260208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911690600190849081111561119357611193615404565b02179055505050600101611097565b5083156112045784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b61121933338585856140a6565b505050565b611226613fd6565b611232848484846144d0565b50505050565b611240613fd6565b6007546040516001600160a01b038084169216907f2393a3a0213901ea187a0528e61d30bfd31577cb6efa698270cc0757e82cc28e90600090a3600780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6112bc613fd6565b6001600160a01b038116611307576040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610965565b600b80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f169805d40572666bf19f8538d57ba7d145d65078c247474927c27c4c4345901a906020015b60405180910390a150565b61137c613fd6565b6001600160a01b0381166113c7576040517ff3726f4c0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610965565b600a546040516001600160a01b038084169216907f7cd64276473337e7274c405a19bf1cbd3cea535369fc6e681b2589864ec1029690600090a3600a80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6003546801000000000000000090046001600160a01b0316331461148d576040517fd4bcb487000000000000000000000000000000000000000000000000000000008152336004820152602401610965565b806000036114ca576040517f88967d2f00000000000000000000000000000000000000000000000000000000815260048101829052602401610965565b6001600160a01b03821660009081526004602052604090205460ff16611527576040517f1cc7e5cf0000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610965565b816001600160a01b03167f9ab9b817afca6d91dd7d523c53a3d2af8939f0a0805d85d0f67b07585fed524b8260405161156291815260200190565b60405180910390a261157e6001600160a01b0383163383614021565b5050565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526001600160a01b038481166000908152602081815260408083209387168352928152828220858352815290829020825160e08101845281546bffffffffffffffffffffffff80821683526c0100000000000000000000000080830463ffffffff1695840195909552700100000000000000000000000000000000909104811694820194909452600182015493841660608201529183046affffffffffffffffffffff166080830152909160a083019077010000000000000000000000000000000000000000000000900460ff16600381111561169957611699615404565b60038111156116aa576116aa615404565b8152600191909101547801000000000000000000000000000000000000000000000000900460ff16151560209091015290505b9392505050565b6116ec6145e9565b600a546001600160a01b03163314611730576040517f9b5e4f7600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546001600160a01b031661178157600b546040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610965565b6006546001600160a01b03166117d2576006546040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610965565b6009546001600160a01b0316611823576009546040517f458fcb9d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610965565b600b54600654604080517f313ce56700000000000000000000000000000000000000000000000000000000815290516001600160a01b039384169390921691600091849163313ce567916004808201926020929091908290030181865afa158015611892573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118b69190615947565b90506000826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061191c9190615947565b905060005b85811015611d5357600087878381811061193d5761193d615918565b61195392602060409092020190810191506150f8565b9050600088888481811061196957611969615918565b6001600160a01b03858116600090815260208181526040808320938e16835292815282822093830295909501850135808252929094529092206001810154929350917801000000000000000000000000000000000000000000000000900460ff16159050611a1a5781886001600160a01b0316846001600160a01b03167f7a67c585859c59179690393807aa800ad21b2b875b709383275f7707c72e4cd760405160405180910390a4505050611d4b565b80546bffffffffffffffffffffffff166000819003611a7d5782896001600160a01b0316856001600160a01b03167f56fbe018e533dbc6d2be5755e3ad49b265d376165b20db4b165a06a0706c55d260405160405180910390a450505050611d4b565b815470010000000000000000000000000000000090046bffffffffffffffffffffffff1615611af05782896001600160a01b0316856001600160a01b03167f44ecc41d90e0a538bc2bc5bba22c5b86bed902401571bf908be784786193400860405160405180910390a450505050611d4b565b6003600183015477010000000000000000000000000000000000000000000000900460ff166003811115611b2657611b26615404565b14611b5d576040517fe966904900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03808516600090815260208181526040808320938d168352928152828220868352905290812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560010180547fffffffffffffff00000000000000000000000000000000000000000000000000169055611be488888461462c565b6009546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526bffffffffffffffffffffffff831660248201529192508a169063095ea7b3906044016020604051808303816000875af1158015611c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c83919061596a565b611cb9576040517f168c2c0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6009546040517fdf4d46630000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff831660048201526001600160a01b0387811660248301529091169063df4d466390604401600060405180830381600087803b158015611d2d57600080fd5b505af1158015611d41573d6000803e3d6000fd5b5050505050505050505b600101611921565b505050505061157e6000600c55565b611d6a613fd6565b6001600160a01b03821660009081526002602052604081205460ff1690816002811115611d9957611d99615404565b03611ddb576040517f06439c6b0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610965565b6002816002811115611def57611def615404565b14611e48576001600160a01b038316600090815260026020526040908190205490517ff8d3a93600000000000000000000000000000000000000000000000000000000815261096591859160ff90911690600401615987565b6001600160a01b03831660009081526008602052604090205460ff1615611e9b576040517f0d232cb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03831660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f37757c6e0f561c1754a2bc68c5299e01bc49b31193e7928f6a6809920e6811e0910160405180910390a2505050565b600a546001600160a01b03163314611f5d576040517f9b5e4f7600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546001600160a01b03166000818152600860205260409020805460ff16611fb2576040517fa487737000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b83811015610eab576000858583818110611fd157611fd1615918565b611fe792602060409092020190810191506150f8565b90506000868684818110611ffd57611ffd615918565b6001600160a01b03858116600090815260208181526040808320938c16835292815282822093830295909501850135808252929094529092206001810154929350917801000000000000000000000000000000000000000000000000900460ff161590506120ae5781866001600160a01b0316846001600160a01b03167f7a67c585859c59179690393807aa800ad21b2b875b709383275f7707c72e4cd760405160405180910390a4505050612287565b80546bffffffffffffffffffffffff1660000361210e5781866001600160a01b0316846001600160a01b03167f56fbe018e533dbc6d2be5755e3ad49b265d376165b20db4b165a06a0706c55d260405160405180910390a4505050612287565b805470010000000000000000000000000000000090046bffffffffffffffffffffffff16156121805781866001600160a01b0316846001600160a01b03167f44ecc41d90e0a538bc2bc5bba22c5b86bed902401571bf908be784786193400860405160405180910390a4505050612287565b6000600182015477010000000000000000000000000000000000000000000000900460ff1660038111156121b6576121b6615404565b146122045781866001600160a01b0316846001600160a01b03167f640d57b5e1386d0d95a4c1c42a3f1f915a3d931d030229faabcedd7c6b4bcee060405160405180910390a4505050612287565b6001810180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff167701000000000000000000000000000000000000000000000017905560405182906001600160a01b0388811691908616907f4713d6a3ccd421deeb6fb632d8c97878f2e4ae58ac48de1e520b362040b4abf990600090a45050505b600101611fb5565b612297613fd6565b6001600160a01b0381166122e2576040517f458fcb9d0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610965565b6009546040516001600160a01b038084169216907fc3b76f61e0a861810597c34264dafd5b5b8f2f6a81723630de18d52504020ead90600090a3600980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b611219338484846144d0565b61236a613fd6565b61237460006146b2565b565b3380612380612f52565b6001600160a01b0316146123cb576040517f118cdaa70000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610965565b6123d4816146b2565b50565b6000807f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005b546001600160a01b031692915050565b6001600160a01b0383163314612459576040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610965565b6bffffffffffffffffffffffff8411156124a2576040517f88967d2f00000000000000000000000000000000000000000000000000000000815260048101859052602401610965565b60006124b0828401846150c6565b905061120486878688856140a6565b6124c76145e9565b600a546001600160a01b0316331461250b576040517f9b5e4f7600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b546001600160a01b031661255c57600b546040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610965565b6006546001600160a01b03166125ad576006546040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610965565b6009546001600160a01b03166125fe576009546040517f458fcb9d0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610965565b600b546001600160a01b0390811690841603612646576040517fa9a2fb4400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015612b5357600083838381811061266557612665615918565b61267b92602060409092020190810191506150f8565b9050600084848481811061269157612691615918565b6001600160a01b03858116600090815260208181526040808320938d16835292815282822093830295909501850135808252929094529092206001810154929350917801000000000000000000000000000000000000000000000000900460ff161590506127425781876001600160a01b0316846001600160a01b03167f7a67c585859c59179690393807aa800ad21b2b875b709383275f7707c72e4cd760405160405180910390a4505050612b4b565b80546bffffffffffffffffffffffff1660008190036127a55782886001600160a01b0316856001600160a01b03167f56fbe018e533dbc6d2be5755e3ad49b265d376165b20db4b165a06a0706c55d260405160405180910390a450505050612b4b565b815470010000000000000000000000000000000090046bffffffffffffffffffffffff16156128185782886001600160a01b0316856001600160a01b03167f44ecc41d90e0a538bc2bc5bba22c5b86bed902401571bf908be784786193400860405160405180910390a450505050612b4b565b6000600183015477010000000000000000000000000000000000000000000000900460ff16600381111561284e5761284e615404565b1461289d5782886001600160a01b0316856001600160a01b03167f640d57b5e1386d0d95a4c1c42a3f1f915a3d931d030229faabcedd7c6b4bcee060405160405180910390a450505050612b4b565b6001600160a01b038481166000908152602081815260408083208c85168085529083528184208885529092529182902080547fffffffff0000000000000000000000000000000000000000000000000000000016815560010180547fffffffffffffff0000000000000000000000000000000000000000000000000016905560095491517f095ea7b30000000000000000000000000000000000000000000000000000000081529190921660048201526024810183905263095ea7b3906044016020604051808303816000875af115801561297c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129a0919061596a565b6129d6576040517f168c2c0800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006546001600160a01b0390811690891603612a70576009546040517fdf4d4663000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0386811660248301529091169063df4d466390604401600060405180830381600087803b158015612a5357600080fd5b505af1158015612a67573d6000803e3d6000fd5b50505050612af8565b6009546040517f619121740000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015260248201849052868116604483015290911690636191217490606401600060405180830381600087803b158015612adf57600080fd5b505af1158015612af3573d6000803e3d6000fd5b505050505b82886001600160a01b0316856001600160a01b03167f5bc0086caed493b9a973fa0287fb4a34da0398920c46f3e6e2d0ea88621d14b084604051612b3e91815260200190565b60405180910390a4505050505b600101612649565b506112196000600c55565b612b66613fd6565b6001600160a01b038116612bb1576040517f6a2e6fbf0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610965565b6006546001600160a01b031615612bf4576040517f4bc00c4c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600680547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f3d8b27d0955baa4924ce9638e61ff44b8fca3c80475d3dfc8fd6582c5df016cf90602001611369565b6007546001600160a01b03163314612c9e576040517fc670608600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015612e4b576000838281518110612cbf57612cbf615918565b60200260200101516000015190506000848381518110612ce157612ce1615918565b6020908102919091018101518101516001600160a01b0380851660009081528084526040808220928b1682529184528181208382529093529091209091506002600182015477010000000000000000000000000000000000000000000000900460ff166003811115612d5557612d55615404565b14612da457818160010160179054906101000a900460ff1660026040517f0c278ce1000000000000000000000000000000000000000000000000000000008152600401610965939291906159a4565b8054612dbe906bffffffffffffffffffffffff16866159c5565b6001820180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff167703000000000000000000000000000000000000000000000017905560405190955082906001600160a01b0389811691908616907f68d9ffd354ad98f5572d5a19eb60d1be4e8cb57a2d8337d10a3ecfca40b1ebe990600090a4505050600101612ca2565b506001600160a01b0383166000908152600860205260409020805482908290600190612e8b90849061010090046bffffffffffffffffffffffff166158f3565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506000612edb85600660009054906101000a90046001600160a01b031685614702565b6040516bffffffffffffffffffffffff821681529091507f4c0f021c587c95b1c98d00bd52fef4dc732158bc51f121461f3dc4e41990c5639060200160405180910390a1600654610eab906001600160a01b031633306bffffffffffffffffffffffff85166147e4565b61123284338585856140a6565b6000807f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c006123fc565b612f83613fd6565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081178255612fdf6123d7565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a35050565b6001600160a01b03821660009081526002602052604081205460ff169081600281111561304757613047615404565b03613089576040517f06439c6b0000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610965565b336000908152602081815260408083206001600160a01b03871684528252808320858452909152902060018082015477010000000000000000000000000000000000000000000000900460ff1660038111156130e7576130e7615404565b148061312657506002600182015477010000000000000000000000000000000000000000000000900460ff16600381111561312457613124615404565b145b1561315d576040517fe966904900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600281111561317157613171615404565b148015613194575080546c01000000000000000000000000900463ffffffff1642105b80156131e75750600a5474010000000000000000000000000000000000000000900463ffffffff1615806131e75750600a5474010000000000000000000000000000000000000000900463ffffffff1642105b156132385780546040517fced227db0000000000000000000000000000000000000000000000000000000081526c0100000000000000000000000090910463ffffffff166004820152602401610965565b805470010000000000000000000000000000000090046bffffffffffffffffffffffff16156132b95780546040517f226503810000000000000000000000000000000000000000000000000000000081527001000000000000000000000000000000009091046bffffffffffffffffffffffff166004820152602401610965565b80546bffffffffffffffffffffffff166000819003613304576040517f411321ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003600183015477010000000000000000000000000000000000000000000000900460ff16600381111561333a5761333a615404565b036135935760018201546000906bffffffffffffffffffffffff16156133a3576001600160a01b03808716600090815260056020526040902060018082015460065491870154929361339f939181169216906bffffffffffffffffffffffff16614702565b9150505b6006546000906133be9088906001600160a01b031685614702565b905060006133cc83836158f3565b600654604080516001600160a01b0392831681526bffffffffffffffffffffffff841660208201529293508992918b169133917faabf355ccacfa8b7366b9f6a14af62036d7dd401797d7591faae42a5bbbc3db9910160405180910390a4600654604080516001600160a01b0392831681526bffffffffffffffffffffffff8616602082015289928b169133917f5f82682eb95ce785b4c40b5c57de2b7ae2ca818ac5f1e7ab89300e6142215d8f910160405180910390a46006546001600160a01b0316600090815260056020526040902060010180548491906014906134da9084907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166159c5565b82546101009290920a6bffffffffffffffffffffffff818102199093169183160217909155336000818152602081815260408083206001600160a01b038f811685529083528184208e855290925290912080547fffffffff0000000000000000000000000000000000000000000000000000000016815560010180547fffffffffffffff0000000000000000000000000000000000000000000000000016905560065461358b945016918416614021565b505050610eab565b60018201546000906bffffffffffffffffffffffff16156135f3576001600160a01b0380871660009081526005602052604090206001808201549086015491926135ef9291169089906bffffffffffffffffffffffff16614702565b9150505b60006135ff82846158f3565b6040516bffffffffffffffffffffffff8216815290915086906001600160a01b0389169033907f91fb9d98b786c57d74c099ccd2beca1739e9f6a81fb49001ca465c4b7591bbe29060200160405180910390a46040516bffffffffffffffffffffffff8316815286906001600160a01b0389169033907f205442d60b70af1203d43cab62352c3b69b94f091be32fe683198057282b5c929060200160405180910390a46001600160a01b038716600090815260056020526040902060010180548391906014906136f69084907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff166159c5565b82546101009290920a6bffffffffffffffffffffffff818102199093169183160217909155336000818152602081815260408083206001600160a01b038e168085529083528184208d855290925290912080547fffffffff0000000000000000000000000000000000000000000000000000000016815560010180547fffffffffffffff000000000000000000000000000000000000000000000000001690556137a39350918416614021565b50505050505050565b336000908152602081815260408083206001600160a01b038716845282528083208584529091528120805490916bffffffffffffffffffffffff9091169003613821576040517f411321ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03841660009081526002602081905260409091205460ff169081600281111561385357613853615404565b1461388e5784816040517ff8d3a936000000000000000000000000000000000000000000000000000000008152600401610965929190615987565b81546c01000000000000000000000000900463ffffffff1660006138b43388888861481d565b90508163ffffffff168163ffffffff1611613913576040517f9e03653a00000000000000000000000000000000000000000000000000000000815263ffffffff8087166004830152808316602483015283166044820152606401610965565b835463ffffffff9091166c01000000000000000000000000027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff909116179092555050505050565b6001600160a01b03808416600090815260056020526040902060018101549091166139b2576040517fce16ea8400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000036139ef576040517f88967d2f00000000000000000000000000000000000000000000000000000000815260048101839052602401610965565b336000908152602081815260408083206001600160a01b038816845282528083208684529091528120805490916bffffffffffffffffffffffff9091169003613a64576040517f411321ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805470010000000000000000000000000000000090046bffffffffffffffffffffffff16831115613aee5780546040517f5f6faf860000000000000000000000000000000000000000000000000000000081527001000000000000000000000000000000009091046bffffffffffffffffffffffff16600482015260248101849052604401610965565b613af88186614936565b805483908290601090613b2e90849070010000000000000000000000000000000090046bffffffffffffffffffffffff166158f3565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550828260000160008282829054906101000a90046bffffffffffffffffffffffff16613b8791906158f3565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555083856001600160a01b0316336001600160a01b03167f6043289a72dfdddcba5a5eebd82a24572023a2344a1292dfcf3b56c1a142f60686604051613bfb91815260200190565b60405180910390a46001820154613c1d906001600160a01b03163330866147e4565b60018201546040517f942c5875000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b039091169063942c587590602401600060405180830381600087803b158015613c7e57600080fd5b505af1158015613c92573d6000803e3d6000fd5b505050505050505050565b6007546001600160a01b03163314613ce1576040517fc670608600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b8251811015613eeb576000838281518110613d0257613d02615918565b60200260200101516000015190506000848381518110613d2457613d24615918565b6020908102919091018101518101516001600160a01b0380851660009081528084526040808220928b16825291845281812083825290935282208054919350916bffffffffffffffffffffffff9091169003613dac576040517f411321ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018082015477010000000000000000000000000000000000000000000000900460ff166003811115613de157613de1615404565b14613e3f576001818101546040517f0c278ce100000000000000000000000000000000000000000000000000000000815261096592859277010000000000000000000000000000000000000000000000900460ff16916004016159a4565b6001810180547fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff16770200000000000000000000000000000000000000000000001790558054613e9d906bffffffffffffffffffffffff16866159c5565b945081876001600160a01b0316846001600160a01b03167f41f6c6b107a872f7e7a62127f1104669af1b4b25a8eba2a4207a8266bd2b2c6460405160405180910390a4505050600101613ce5565b506001600160a01b0383166000908152600860205260409020805482908290600190613f2b90849061010090046bffffffffffffffffffffffff166159c5565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550836001600160a01b03167fd9953834583f8ccc107d531dd2133b07f00bf5c8cebe8f594486930986996c9883604051613fa691906bffffffffffffffffffffffff91909116815260200190565b60405180910390a2600754611232906001600160a01b0386811691166bffffffffffffffffffffffff8516614021565b33613fdf6123d7565b6001600160a01b031614612374576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610965565b6040516001600160a01b0383811660248301526044820183905261121991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050614b0b565b61409d614b87565b6123d481614bee565b6001600160a01b03831660009081526002602052604081205460ff16908160028111156140d5576140d5615404565b03614117576040517f06439c6b0000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610965565b60008263ffffffff1611801561413e5750600181600281111561413c5761413c615404565b145b156141795783816040517ff8d3a936000000000000000000000000000000000000000000000000000000008152600401610965929190615987565b6001600160a01b0386166141c4576040517f9c64f6a10000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610965565b826bffffffffffffffffffffffff1660000361421c576040517f88967d2f0000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff84166004820152602401610965565b6001805490600061422c836159ea565b90915550506001546040516bffffffffffffffffffffffff8516815281906001600160a01b0380881691908a16907ff5681f9d0db1b911ac18ee83d515a1cf1051853a9eae418316a2fdf7dea427c59060200160405180910390a46040518060e00160405280856bffffffffffffffffffffffff1681526020016142b28988858861481d565b63ffffffff16815260006020820181905260408201819052606082018190526080909101908152600060209182018190526001600160a01b03808b1682528183526040808320918a1683529083528082208583528352908190208351815493850151928501516bffffffffffffffffffffffff908116700100000000000000000000000000000000027fffffffff000000000000000000000000ffffffffffffffffffffffffffffffff63ffffffff9095166c010000000000000000000000009081027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909716938316939093179590951793909316939093178155606084015160018201805460808701516affffffffffffffffffffff169095027fffffffffffffffffff000000000000000000000000000000000000000000000090951691909316179290921780825560a084015191907fffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffff167701000000000000000000000000000000000000000000000083600381111561445257614452615404565b021790555060c09190910151600190910180549115157801000000000000000000000000000000000000000000000000027fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790556137a36001600160a01b03861687306bffffffffffffffffffffffff88166147e4565b6001600160a01b0380851660009081526020818152604080832093871683529281528282208583529052908120805490916bffffffffffffffffffffffff9091169003614549576040517f411321ed00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001810180548315157801000000000000000000000000000000000000000000000000027fffffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffff90911617905560405183906001600160a01b0380871691908816907f2655f39eb25a330612822bf00eb21a458b95ebfd6ea9438bae1728074d8253ee906145da90871515815260200190565b60405180910390a45050505050565b6001600c5403614625576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600c55565b60008260ff168460ff161015614670576146468484615a22565b61465190600a615b5b565b614669906bffffffffffffffffffffffff8416615b6a565b90506116dd565b8260ff168460ff1611156146ab576146888385615a22565b61469390600a615b5b565b614669906bffffffffffffffffffffffff8416615bb0565b5092915050565b7f237e158222e3e6968b72b9db0d8043aacf074ad9f650f0d1606b4d82ee432c0080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815561157e82614c39565b600080846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015614743573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147679190615947565b90506000846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156147a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147cd9190615947565b90506147da82828661462c565b9695505050505050565b6040516001600160a01b0384811660248301528381166044830152606482018390526112329186918216906323b872dd9060840161404e565b60008163ffffffff1660000361483457504261492e565b600061483f83614cc2565b905063ffffffff8116158061485f575060035463ffffffff908116908216105b8061487d575060035463ffffffff6401000000009091048116908216115b156148bc576040517f8dbf963f00000000000000000000000000000000000000000000000000000000815263ffffffff84166004820152602401610965565b60006148c88242615bc4565b905084866001600160a01b0316886001600160a01b03167f8b65b80ac62fde507cb8196bad6c93c114c2babc6ac846aae39ed6943ad36c49848660405161492292919063ffffffff92831681529116602082015260400190565b60405180910390a49150505b949350505050565b61493f81614ce4565b6001600160a01b03818116600090815260056020908152604091829020825160e08101845281546bffffffffffffffffffffffff80821683526c0100000000000000000000000080830463ffffffff169584019590955270010000000000000000000000000000000082046affffffffffffffffffffff9081169684018790527b01000000000000000000000000000000000000000000000000000000830460ff90811660608601527c0100000000000000000000000000000000000000000000000000000000909304909216608084015260019384015496871660a08401527401000000000000000000000000000000000000000090960490951660c0820152908601549093614a8193614a58939092041690615be1565b845470010000000000000000000000000000000090046bffffffffffffffffffffffff16614de6565b600184018054600090614aa39084906bffffffffffffffffffffffff166159c5565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550806040015183600101600c6101000a8154816affffffffffffffffffffff02191690836affffffffffffffffffffff160217905550505050565b6000614b206001600160a01b03841683614e20565b90508051600014158015614b45575080806020019051810190614b43919061596a565b155b15611219576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0384166004820152602401610965565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16612374576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b614bf6614b87565b6001600160a01b0381166123cb576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610965565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff000000000000000000000000000000000000000081166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6000614cd162093a8083615c05565b614cde9062093a80615c28565b92915050565b6001600160a01b038116600090815260056020526040812090614d0683614e2e565b8254909150600090614d2e906c01000000000000000000000000900463ffffffff1642615c50565b90506000614d428363ffffffff8416615c6d565b845490915081908590601090614d7a90849070010000000000000000000000000000000090046affffffffffffffffffffff16615c95565b82546101009290920a6affffffffffffffffffffff818102199093169190921691909102179055505082547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c010000000000000000000000004263ffffffff160217909255505050565b6000670de0b6b3a7640000614e166bffffffffffffffffffffffff84166affffffffffffffffffffff8616615b6a565b6116dd9190615bb0565b60606116dd83836000614f4f565b6001600160a01b038082166000908152600560209081526040808320815160e08101835281546bffffffffffffffffffffffff808216835263ffffffff6c01000000000000000000000000830416958301959095526affffffffffffffffffffff7001000000000000000000000000000000008204169382019390935260ff7b0100000000000000000000000000000000000000000000000000000084048116606083018190527c010000000000000000000000000000000000000000000000000000000090940416608082015260019091015494851660a08201527401000000000000000000000000000000000000000090940490911660c08401529091906301e1338090614f4590662386f26fc10000615c6d565b6116dd9190615cb9565b606081471015614f8d576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610965565b600080856001600160a01b03168486604051614fa99190615cd8565b60006040518083038185875af1925050503d8060008114614fe6576040519150601f19603f3d011682016040523d82523d6000602084013e614feb565b606091505b50915091506147da86838360608261500b576150068261506b565b6116dd565b815115801561502257506001600160a01b0384163b155b15615064576040517f9996b3150000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610965565b50806116dd565b80511561507b5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803563ffffffff811681146150c157600080fd5b919050565b6000602082840312156150d857600080fd5b6116dd826150ad565b80356001600160a01b03811681146150c157600080fd5b60006020828403121561510a57600080fd5b6116dd826150e1565b80356bffffffffffffffffffffffff811681146150c157600080fd5b60008060006060848603121561514457600080fd5b61514d846150e1565b92506020840135915061516260408501615113565b90509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156151bd576151bd61516b565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561520a5761520a61516b565b604052919050565b600067ffffffffffffffff82111561522c5761522c61516b565b5060051b60200190565b6000602080838503121561524957600080fd5b823567ffffffffffffffff81111561526057600080fd5b8301601f8101851361527157600080fd5b803561528461527f82615212565b6151c3565b81815260069190911b820183019083810190878311156152a357600080fd5b928401925b828410156152fc57604084890312156152c15760008081fd5b6152c961519a565b6152d2856150e1565b815285850135600381106152e65760008081fd5b81870152825260409390930192908401906152a8565b979650505050505050565b60008060006060848603121561531c57600080fd5b615325846150e1565b925061533360208501615113565b9150615162604085016150ad565b80151581146123d457600080fd5b6000806000806080858703121561536557600080fd5b61536e856150e1565b935061537c602086016150e1565b925060408501359150606085013561539381615341565b939692955090935050565b600080604083850312156153b157600080fd5b6153ba836150e1565b946020939093013593505050565b6000806000606084860312156153dd57600080fd5b6153e6846150e1565b92506153f4602085016150e1565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6004811061544357615443615404565b9052565b600060e0820190506bffffffffffffffffffffffff80845116835263ffffffff6020850151166020840152806040850151166040840152806060850151166060840152506affffffffffffffffffffff608084015116608083015260a08301516154b460a0840182615433565b5060c0928301511515919092015290565b60008083601f8401126154d757600080fd5b50813567ffffffffffffffff8111156154ef57600080fd5b6020830191508360208260061b850101111561550a57600080fd5b9250929050565b6000806020838503121561552457600080fd5b823567ffffffffffffffff81111561553b57600080fd5b615547858286016154c5565b90969095509350505050565b6000806040838503121561556657600080fd5b61556f836150e1565b9150602083013561557f81615341565b809150509250929050565b6bffffffffffffffffffffffff888116825263ffffffff881660208301528681166040830152851660608201526affffffffffffffffffffff8416608082015260e081016155db60a0830185615433565b82151560c083015298975050505050505050565b6003811061544357615443615404565b60208101614cde82846155ef565b60008060006060848603121561562257600080fd5b61562b846150e1565b925060208401359150604084013561564281615341565b809150509250925092565b60008060008060006080868803121561566557600080fd5b61566e866150e1565b945060208601359350615683604087016150e1565b9250606086013567ffffffffffffffff808211156156a057600080fd5b818801915088601f8301126156b457600080fd5b8135818111156156c357600080fd5b8960208285010111156156d557600080fd5b9699959850939650602001949392505050565b6000806000604084860312156156fd57600080fd5b615706846150e1565b9250602084013567ffffffffffffffff81111561572257600080fd5b61572e868287016154c5565b9497909650939450505050565b600080604080848603121561574f57600080fd5b615758846150e1565b925060208085013567ffffffffffffffff81111561577557600080fd5b8501601f8101871361578657600080fd5b803561579461527f82615212565b81815260069190911b820183019083810190898311156157b357600080fd5b928401925b828410156157fa5785848b0312156157d05760008081fd5b6157d861519a565b6157e1856150e1565b81528486013586820152825292850192908401906157b8565b8096505050505050509250929050565b6000806000806080858703121561582057600080fd5b615829856150e1565b9350615837602086016150e1565b925061584560408601615113565b9150615853606086016150ad565b905092959194509250565b60008060006060848603121561587357600080fd5b61587c846150e1565b925060208401359150615162604085016150ad565b6000806000606084860312156158a657600080fd5b6158af846150e1565b95602085013595506040909401359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6bffffffffffffffffffffffff8281168282160390808211156146ab576146ab6158c4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561595957600080fd5b815160ff811681146116dd57600080fd5b60006020828403121561597c57600080fd5b81516116dd81615341565b6001600160a01b0383168152604081016116dd60208301846155ef565b838152606081016159b86020830185615433565b61492e6040830184615433565b6bffffffffffffffffffffffff8181168382160190808211156146ab576146ab6158c4565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615a1b57615a1b6158c4565b5060010190565b60ff8281168282160390811115614cde57614cde6158c4565b600181815b80851115615a9457817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615a7a57615a7a6158c4565b80851615615a8757918102915b93841c9390800290615a40565b509250929050565b600082615aab57506001614cde565b81615ab857506000614cde565b8160018114615ace5760028114615ad857615af4565b6001915050614cde565b60ff841115615ae957615ae96158c4565b50506001821b614cde565b5060208310610133831016604e8410600b8410161715615b17575081810a614cde565b615b218383615a3b565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115615b5357615b536158c4565b029392505050565b60006116dd60ff841683615a9c565b8082028115828204841417614cde57614cde6158c4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082615bbf57615bbf615b81565b500490565b63ffffffff8181168382160190808211156146ab576146ab6158c4565b6affffffffffffffffffffff8281168282160390808211156146ab576146ab6158c4565b600063ffffffff80841680615c1c57615c1c615b81565b92169190910492915050565b63ffffffff818116838216028082169190828114615c4857615c486158c4565b505092915050565b63ffffffff8281168282160390808211156146ab576146ab6158c4565b6bffffffffffffffffffffffff818116838216028082169190828114615c4857615c486158c4565b6affffffffffffffffffffff8181168382160190808211156146ab576146ab6158c4565b60006bffffffffffffffffffffffff80841680615c1c57615c1c615b81565b6000825160005b81811015615cf95760208186018101518583015201615cdf565b50600092019182525091905056fea2646970667358221220fc01d59a656f57a49a3c2a9f31934d7b11162a8df9a18a62fd162a97bbf8adb964736f6c63430008180033