0 txs
47.8k calls
constructor
constructor(address _timelock, address _contango, address _orderManager, address _vault, address _permit2, address _spotExecutor, address _treasury, address _router)
functions
ALL
viewfunction ALL() view returns (uint256)
contango
viewfunction contango() view returns (address)
INTEGRATIONS_SLOT
viewfunction INTEGRATIONS_SLOT() view returns (bytes32)
isIntegration
viewfunction isIntegration(address integration) view returns (bool)
nativeToken
viewfunction nativeToken() view returns (address)
orderManager
viewfunction orderManager() view returns (address)
permit2
viewfunction permit2() view returns (address)
positionNFT
viewfunction positionNFT() view returns (address)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
router
viewfunction router() view returns (address)
spotExecutor
viewfunction spotExecutor() view returns (address)
timelock
viewfunction timelock() view returns (address)
treasury
viewfunction treasury() view returns (address)
vault
viewfunction vault() view returns (address)
applyPermit
nonpayablefunction applyPermit(address token, tuple permit, address spender)
cancel
payablefunction cancel(bytes32 orderId) payable
deposit
payablefunction deposit(address token, uint256 amount) payable returns (uint256)
depositNative
payablefunction depositNative() payable returns (uint256)
depositWithPermit
payablefunction depositWithPermit(address token, tuple permit, uint256 amount) payable returns (uint256)
depositWithPermit2
payablefunction depositWithPermit2(address token, tuple permit, uint256 amount) payable returns (uint256)
multicall
payablefunction multicall(bytes[] data) payable returns (bytes[] results)
placeLinkedOrder
payablefunction placeLinkedOrder(bytes32 positionId, tuple params) payable returns (bytes32 orderId)
route
payablefunction route(address integration, uint256 value, bytes data) payable returns (bytes result)
setIntegration
nonpayablefunction setIntegration(address integration, bool whitelisted)
swapAndDeposit
payablefunction swapAndDeposit(address tokenToSell, address tokenToDeposit, tuple swapData) payable returns (uint256)
swapAndDepositNative
payablefunction swapAndDepositNative(address tokenToDeposit, tuple swapData) payable returns (uint256)
swapAndDepositWithPermit
payablefunction swapAndDepositWithPermit(address tokenToSell, address tokenToDeposit, tuple swapData, tuple permit) payable returns (uint256)
swapAndDepositWithPermit2
payablefunction swapAndDepositWithPermit2(address tokenToSell, address tokenToDeposit, tuple swapData, tuple permit) payable returns (uint256)
swapAndWithdraw
payablefunction swapAndWithdraw(address tokenToSell, address tokenToReceive, tuple swapData, address to) payable returns (uint256)
swapAndWithdrawNative
payablefunction swapAndWithdrawNative(address tokenToSell, tuple swapData, address to) payable returns (uint256 output)
trade
payablefunction trade(tuple tradeParams, tuple execParams) payable returns (bytes32, tuple)
tradeAndLinkedOrder
payablefunction tradeAndLinkedOrder(tuple tradeParams, tuple execParams, tuple linkedOrderParams) payable returns (bytes32 positionId, tuple trade_, bytes32 linkedOrderId)
tradeAndLinkedOrders
payablefunction tradeAndLinkedOrders(tuple tradeParams, tuple execParams, tuple linkedOrderParams1, tuple linkedOrderParams2) payable returns (bytes32 positionId, tuple trade_, bytes32 linkedOrderId1, bytes32 linkedOrderId2)
tradeAndLinkedOrdersWithFees
payablefunction tradeAndLinkedOrdersWithFees(tuple tradeParams, tuple execParams, tuple linkedOrderParams1, tuple linkedOrderParams2, tuple feeParams) payable returns (bytes32 positionId, tuple trade_, bytes32 linkedOrderId1, bytes32 linkedOrderId2)
tradeAndLinkedOrderWithFees
payablefunction tradeAndLinkedOrderWithFees(tuple tradeParams, tuple execParams, tuple linkedOrderParams, tuple feeParams) payable returns (bytes32 positionId, tuple trade_, bytes32 linkedOrderId)
tradeWithFees
payablefunction tradeWithFees(tuple tradeParams, tuple execParams, tuple feeParams) payable returns (bytes32 positionId_, tuple trade_)
transferPosition
payablefunction transferPosition(bytes32 positionId, address to, bytes data) payable
upgradeTo
nonpayablefunction upgradeTo(address newImplementation)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
usePermit2
nonpayablefunction usePermit2(address token, tuple permit, uint256 amount, address to)
withdraw
payablefunction withdraw(address token, uint256 amount, address to) payable returns (uint256)
withdrawNative
payablefunction withdrawNative(uint256 amount, address to) payable returns (uint256)
events
AdminChanged
event AdminChanged(address previousAdmin, address newAdmin)
BeaconUpgraded
event BeaconUpgraded(address indexed beacon)
FeeCollected
event FeeCollected(bytes32 indexed positionId, address indexed trader, address treasury, address token, uint256 amount, uint8 basisPoints)
Initialized
event Initialized(uint8 version)
IntegrationSet
event IntegrationSet(address indexed integration, bool whitelisted)
Upgraded
event Upgraded(address indexed implementation)
errors
AboveMaxGasMultiplier
error AboveMaxGasMultiplier(uint64 gasMultiplier)
BelowMinGasMultiplier
error BelowMinGasMultiplier(uint64 gasMultiplier)
CashflowCcyRequired
error CashflowCcyRequired()
ClosingOnly
error ClosingOnly()
InstrumentAlreadyExists
error InstrumentAlreadyExists(bytes16 symbol)
InsufficientBaseCashflow
error InsufficientBaseCashflow(int256 expected, int256 actual)
InsufficientBaseOnOpen
error InsufficientBaseOnOpen(uint256 expected, int256 actual)
InsufficientPermitAmount
error InsufficientPermitAmount(uint256 required, uint256 actual)
InvalidCashflow
error InvalidCashflow()
InvalidCashflowCcy
error InvalidCashflowCcy()
InvalidDeadline
error InvalidDeadline(uint256 deadline, uint256 blockTimestamp)
InvalidInstrument
error InvalidInstrument(bytes16 symbol)
InvalidOrderType
error InvalidOrderType(uint8 orderType)
InvalidPrice
error InvalidPrice(uint256 forwardPrice, uint256 limitPrice)
InvalidQuantity
error InvalidQuantity()
InvalidTolerance
error InvalidTolerance(uint256 tolerance)
MismatchingPositionId
error MismatchingPositionId(bytes32 orderId1, bytes32 orderId2)
NotEnoughBalance
error NotEnoughBalance(address token, uint256 balance, uint256 requested)
NotFlashBorrowProvider
error NotFlashBorrowProvider(address msgSender)
NotNativeToken
error NotNativeToken(address token)
OnlyFullClosureAllowedAfterExpiry
error OnlyFullClosureAllowedAfterExpiry()
OrderAlreadyExists
error OrderAlreadyExists(bytes32 orderId)
OrderDoesNotExist
error OrderDoesNotExist(bytes32 orderId)
OrderExpired
error OrderExpired(bytes32 orderId, uint256 deadline, uint256 blockTimestamp)
OrderInvalidated
error OrderInvalidated(bytes32 orderId)
PositionDoesNotExist
error PositionDoesNotExist(bytes32 positionId)
PriceAboveLimit
error PriceAboveLimit(uint256 limit, uint256 actual)
PriceBelowLimit
error PriceBelowLimit(uint256 limit, uint256 actual)
SenderIsNotNativeToken
error SenderIsNotNativeToken(address msgSender, address nativeToken)
Unauthorised
error Unauthorised(address msgSender)
UnexpectedCallback
error UnexpectedCallback()
UnexpectedTrade
error UnexpectedTrade()
UnknownIntegration
error UnknownIntegration(address integration)
UnsupportedToken
error UnsupportedToken(address token)
ZeroAddress
error ZeroAddress()
ZeroAmount
error ZeroAmount()
ZeroDestination
error ZeroDestination()
ZeroPayer
error ZeroPayer()
creation bytecode
0x6101e060405230608052348015610014575f5ffd5b506040516144ab3803806144ab8339810160408190526100339161017a565b6001600160a01b0380891660a05287811660c081905287821660e0528682166101005285821661016052848216610180529083166101a052604080516323228ecb60e01b815290516323228ecb916004808201926020929091908290030181865afa1580156100a4573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100c89190610225565b6001600160a01b0316610120816001600160a01b031681525050846001600160a01b031663e1758bd86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561011e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101429190610225565b6001600160a01b0390811661014052166101c0525061024795505050505050565b6001600160a01b0381168114610177575f5ffd5b50565b5f5f5f5f5f5f5f5f610100898b031215610192575f5ffd5b885161019d81610163565b60208a01519098506101ae81610163565b60408a01519097506101bf81610163565b60608a01519096506101d081610163565b60808a01519095506101e181610163565b60a08a01519094506101f281610163565b60c08a015190935061020381610163565b60e08a015190925061021481610163565b809150509295985092959890939650565b5f60208284031215610235575f5ffd5b815161024081610163565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516140b06103fb5f395f81816107840152610b3e01525f818161050201528181611807015281816119aa01526119ea01525f8181610622015281816108a3015281816108d201528181611187015281816111b60152818161128301528181611e6c0152611ea201525f818161037e015261102c01525f818161025c0152818161029e0152818161072b015281816108fa015281816109c101528181610df201528181610e66015261144801525f81816103c40152818161157d01528181611730015281816117b601528181611b430152611b8301525f81816107ea0152818161085201528181610bf901528181610ef701528181610fa5015281816114760152818161151c0152818161184401528181611a7b01528181611b070152611eff01525f81816107b7015281816115a7015281816116b301526123fb01525f81816103120152818161190801526122b401525f81816106dd015281816110910152611ca201525f81816109fa01528181610a3a01528181610c7901528181610cb90152610d4a01526140b05ff3fe60806040526004361061024c575f3560e01c80637548a83211610134578063c4d252f5116100b3578063e1758bd811610078578063e1758bd81461071a578063e8eb681a1461074d578063f76876e514610760578063f887ea4014610773578063f9b6117f146107a6578063fbfa77cf146107d9575f5ffd5b8063c4d252f5146106a6578063c53be1e2146106b9578063d33219b4146106cc578063db6b5246146106ff578063de44019e14610707575f5ffd5b8063a4261f77116100f9578063a4261f77146105fe578063a5efcaf314610611578063ac9650d814610644578063b8ca8dd814610664578063bd4f14a414610677575f5ffd5b80637548a832146105755780637786ee76146105945780637b788c2d146105b757806384959e1d146105ca578063867083fc146105dd575f5ffd5b80634353b376116101cb5780635cbd1405116101905780635cbd1405146104cb5780635e4eb088146104de57806361d027b3146104f157806369328dec1461052457806370b76bb014610537578063723ab25c14610556575f5ffd5b80634353b3761461046b578063435f0d411461047e57806347e7ef24146104915780634f1ef286146104a457806352d1902d146104b7575f5ffd5b806323228ecb1161021157806323228ecb146103b35780632680328b146103e65780633659cfe6146104195780633825d5b214610438578063419f2c0c1461044b575f5ffd5b8063055d4110146102d65780630a295975146103015780630dc5637c1461034c57806312261ee71461036d57806319226543146103a0575f5ffd5b366102d257336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102d0576040516347810d0960e01b81523360048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660248201526044015b60405180910390fd5b005b5f5ffd5b6102e96102e4366004612efe565b61080c565b6040516102f89392919061302d565b60405180910390f35b34801561030c575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102f8565b61035f61035a366004613061565b61084a565b6040519081526020016102f8565b348015610378575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b61035f6103ae36600461309e565b610897565b3480156103be575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f1575f5ffd5b5061035f7f48d124d25151d5976121b844cbee3c2cc819699b28d8afbac50c64d3c1cfa46c81565b348015610424575f5ffd5b506102d06104333660046130fd565b6109f0565b61035f610446366004613118565b610acd565b61045e61045936600461317c565b610af0565b6040516102f8919061322d565b61035f61047936600461323f565b610bbe565b348015610489575f5ffd5b5061035f5f81565b61035f61049f36600461329c565b610bcb565b6102d06104b236600461333e565b610c6f565b3480156104c2575f5ffd5b5061035f610d3e565b61035f6104d936600461338a565b610def565b6102e96104ec3660046133cc565b610e8c565b3480156104fc575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b61035f610532366004613428565b610ecc565b348015610542575f5ffd5b506102d061055136600461345c565b61100f565b348015610561575f5ffd5b506102d06105703660046134ab565b61105d565b348015610580575f5ffd5b506102d061058f3660046134f4565b611086565b6105a76105a236600461352b565b61112e565b6040516102f894939291906135ac565b61035f6105c53660046135d5565b61117b565b61035f6105d8366004613118565b611276565b6105f06105eb36600461363a565b6112b3565b6040516102f892919061366f565b6105a761060c366004613684565b6112fe565b34801561061c575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b6106576106523660046136e8565b611344565b6040516102f89190613757565b61035f6106723660046137ba565b61142b565b348015610682575f5ffd5b506106966106913660046130fd565b61154b565b60405190151581526020016102f8565b6102d06106b43660046137dd565b61155f565b6105f06106c736600461384b565b61170e565b3480156106d7575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b61035f611a5c565b61035f610715366004613061565b611aed565b348015610725575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b61035f61075b36600461389e565b611b35565b6102d061076e3660046138c9565b611b74565b34801561077e575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b3480156107b1575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b3480156107e4575f5ffd5b506103347f000000000000000000000000000000000000000000000000000000000000000081565b5f610815612c80565b5f61082f61082836899003890189613913565b878661170e565b909350915061083e8386611b35565b90509450945094915050565b5f61087684847f000000000000000000000000000000000000000000000000000000000000000061105d565b61088d8483156108865783610bcb565b8435610bcb565b90505b9392505050565b5f6108c78484604001357f0000000000000000000000000000000000000000000000000000000000000000610ecc565b506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634fd4b191857f000000000000000000000000000000000000000000000000000000000000000061092960408801602089016130fd565b6040880135606089013561094060208b018b6130fd565b61094d60808c018c61392d565b306040518a63ffffffff1660e01b815260040161097299989796959493929190613997565b6020604051808303815f875af115801561098e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b29190613a00565b90506109e86001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168383611bf8565b509392505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610a385760405162461bcd60e51b81526004016102c790613a17565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610a805f5160206140695f395f51905f52546001600160a01b031690565b6001600160a01b031614610aa65760405162461bcd60e51b81526004016102c790613a63565b610aaf81611c97565b604080515f80825260208201909252610aca91839190611ce2565b50565b5f610ad985833061105d565b610ae533868686611e4c565b90505b949350505050565b6060610afb8561154b565b8590610b2657604051635765b5ff60e11b81526001600160a01b0390911660048201526024016102c7565b50604051631067cb0360e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063419f2c0c908690610b7b908990839089908990600401613aaf565b5f6040518083038185885af1158015610b96573d5f5f3e3d5ffd5b50505050506040513d5f823e601f3d908101601f19168201604052610ae59190810190613ad6565b5f61088d33858585611e4c565b604051638340f54960e01b81526001600160a01b038381166004830152336024830152604482018390525f917f000000000000000000000000000000000000000000000000000000000000000090911690638340f549906064015b6020604051808303815f875af1158015610c42573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c669190613a00565b90505b92915050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610cb75760405162461bcd60e51b81526004016102c790613a17565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610cff5f5160206140695f395f51905f52546001600160a01b031690565b6001600160a01b031614610d255760405162461bcd60e51b81526004016102c790613a63565b610d2e82611c97565b610d3a82826001611ce2565b5050565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ddd5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016102c7565b505f5160206140695f395f51905f5290565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004015f604051808303818588803b158015610e49575f5ffd5b505af1158015610e5b573d5f5f3e3d5ffd5b5050505050610c66307f00000000000000000000000000000000000000000000000000000000000000008585611e4c565b5f610e95612c80565b604080516060810182525f80825260208201819052918101829052610ebc8787878461080c565b9350935093505093509350939050565b5f82610f6357604051633de222bb60e21b81526001600160a01b0385811660048301523360248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa158015610f3c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f609190613a00565b92505b825f03610f7157505f610890565b604051630748bfbb60e11b81526001600160a01b0385811660048301523360248301526044820185905283811660648301527f00000000000000000000000000000000000000000000000000000000000000001690630e917f76906084016020604051808303815f875af1158015610feb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088d9190613a00565b6110568461102236869003860186613b4a565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169190853386611f98565b5050505050565b61108161106f36849003840184613b4a565b6001600160a01b0385169033846120c7565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110d15760405163570870ef60e11b81523360048201526024016102c7565b806110db83612118565b805460ff191691151591909117905560405181151581526001600160a01b038316907f5510611ccb977678860d78693af0efce1329c157ba5ba77543da477ef92f29e99060200160405180910390a25050565b5f611137612c80565b5f8061115261114b368b90038b018b613913565b898761170e565b90945092506111618488611b35565b915061116d8487611b35565b905095509550955095915050565b5f6111ab8584604001357f0000000000000000000000000000000000000000000000000000000000000000610ecc565b506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634fd4b19186866111ed60408801602089016130fd565b6040880135606089013561120460208b018b6130fd565b61121160808c018c61392d565b8b6040518a63ffffffff1660e01b815260040161123699989796959493929190613997565b6020604051808303815f875af1158015611252573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae59190613a00565b5f6112a7858385604001357f000000000000000000000000000000000000000000000000000000000000000061100f565b610ae55f868686611e4c565b5f6112bc612c80565b604080516060810182525f80825260208201819052918101919091526112f16112ea36879003870187613913565b858361170e565b92509250505b9250929050565b5f611307612c80565b604080516060810182525f808252602082018190529181018290528190611331898989898561112e565b929c919b50995090975095505050505050565b6060816001600160401b0381111561135e5761135e612d04565b60405190808252806020026020018201604052801561139157816020015b606081526020019060019003908161137c5790505b5090505f5b82811015611424576113ff308585848181106113b4576113b4613b8f565b90506020028101906113c6919061392d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061217c92505050565b82828151811061141157611411613b8f565b6020908102919091010152600101611396565b5092915050565b5f826114e257604051633de222bb60e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301523360248301527f0000000000000000000000000000000000000000000000000000000000000000169063f7888aec90604401602060405180830381865afa1580156114bb573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114df9190613a00565b92505b825f036114f057505f610c69565b6040516341974a4960e11b8152336004820152602481018490526001600160a01b0383811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063832e949290606401610c26565b5f61155582612118565b5460ff1692915050565b6040516309c3f1e960e41b8152600481018290526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163e985e9c5917f00000000000000000000000000000000000000000000000000000000000000001690639c3f1e909060240161012060405180830381865afa1580156115ed573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116119190613bb9565b5160405160e083901b6001600160e01b03191681526001600160a01b039091166004820152336024820152604401602060405180830381865afa15801561165a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061167e9190613c46565b61169d5760405163570870ef60e11b81523360048201526024016102c7565b60405163c4d252f560e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c4d252f5906024015f604051808303815f87803b1580156116fc575f5ffd5b505af1158015611056573d5f5f3e3d5ffd5b5f611717612c80565b8451604051630e29a66960e21b815260048101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906338a699a490602401602060405180830381865afa15801561177d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a19190613c46565b156117de5784516117dc906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906121a1565b505b5f83602001511180156117f457505f8560800151135b1561182d5761182b835f015184602001517f0000000000000000000000000000000000000000000000000000000000000000610ecc565b505b6001600160ff1b038560800151036118f1576118eb7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f7888aec61187a886122b0565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152336024820152604401602060405180830381865afa1580156118c2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e69190613a00565b61238b565b60808601525b6040516332688cb160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906332688cb19061194190889088903390600401613c6c565b610160604051808303815f875af115801561195e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119829190613d6f565b6020850151919350915015611a54575f8560800151136119d0576119ce835f015184602001517f0000000000000000000000000000000000000000000000000000000000000000610ecc565b505b825160208085015160408087015181516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682529095169385019390935283015260ff166060820152339083907fd63e9f2b88e885e24991a073e2fdda0160365cb52f5a476d9553de72db0ba6b49060800160405180910390a35b935093915050565b6040516333bb7f9160e01b81523360048201525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906333bb7f9190349060240160206040518083038185885af1158015611ac3573d5f5f3e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611ae89190613a00565b905090565b5f8115611afa5781611afd565b82355b9150611b2b8484847f000000000000000000000000000000000000000000000000000000000000000061100f565b61088d8483610bcb565b5f611b696001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846121a1565b50610c6683836123f8565b604051635c46a7ef60e11b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b88d4fde90611bc6903390869088908790600401613e4e565b5f604051808303815f87803b158015611bdd575f5ffd5b505af1158015611bef573d5f5f3e3d5ffd5b50505050505050565b5f6001600160a01b038316611c2057604051637d0f1ea160e01b815260040160405180910390fd5b815f03611c2e575080610890565b604051632e1a7d4d60e01b8152600481018390526001600160a01b03851690632e1a7d4d906024015f604051808303815f87803b158015611c6d575f5ffd5b505af1158015611c7f573d5f5f3e3d5ffd5b50611424925050506001600160a01b038416836124e4565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610aca5760405163570870ef60e11b81523360048201526024016102c7565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611d1557611081836125f9565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611d6f575060408051601f3d908101601f19168201909252611d6c91810190613a00565b60015b611dd25760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016102c7565b5f5160206140695f395f51905f528114611e405760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016102c7565b50611081838383612694565b5f6001600160a01b03851615611e9757611e956001600160a01b038516867f000000000000000000000000000000000000000000000000000000000000000060408601356126b8565b505b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016634fd4b1918686611ed960408801602089016130fd565b60408801356060890135611ef060208b018b6130fd565b611efd60808c018c61392d565b7f00000000000000000000000000000000000000000000000000000000000000006040518a63ffffffff1660e01b8152600401611f4299989796959493929190613997565b6020604051808303815f875af1158015611f5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f829190613a00565b9050611f8e8482610bcb565b9695505050505050565b6040805160a080820183526001600160a01b0388811660608085018281528a516080808801919091529086528a5160208c81015189518c881681840152998a0195909552928801528601919091525f94918b16936330f28b7a9390929183019101604051602081830303815290604052805190602001205f1c815260200188602001518152506040518060400160405280866001600160a01b03168152602001888152508689604001518a60600151604051602001612061929190918252602082015260400190565b6040516020818303038152906040526040518563ffffffff1660e01b815260040161208f9493929190613e80565b5f604051808303815f87803b1580156120a6575f5ffd5b505af11580156120b8573d5f5f3e3d5ffd5b50959998505050505050505050565b82516020840151606085015161211292859285926120e99060ff1c601b613f0d565b604089015160608a01516001600160a01b038c16969594939291906001600160ff1b031661273d565b50505050565b6040516bffffffffffffffffffffffff19606083901b1660208201527f48d124d25151d5976121b844cbee3c2cc819699b28d8afbac50c64d3c1cfa46c60348201525f90610c69906054016040516020818303038152906040528051906020012090565b6060610c66838360405180606001604052806027815260200161408960279139612908565b60405163100ca19960e21b8152600481018290525f906001600160a01b03841690634032866490602401602060405180830381865afa1580156121e6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220a9190613f26565b90506001600160a01b0381163314801590612290575060405163e985e9c560e01b81526001600160a01b03828116600483015233602483015284169063e985e9c590604401602060405180830381865afa15801561226a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228e9190613c46565b155b15610c695760405163570870ef60e11b81523360048201526024016102c7565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c4dac5d56122eb855f015190565b6040516001600160e01b031960e084901b1681526fffffffffffffffffffffffffffffffff19909116600482015260240160a060405180830381865afa158015612337573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061235b9190613f41565b905060018360600151600281111561237557612375612f6d565b14612384578060400151610890565b5192915050565b5f6001600160ff1b038211156123f45760405162461bcd60e51b815260206004820152602860248201527f53616665436173743a2076616c756520646f65736e27742066697420696e2061604482015267371034b73a191a9b60c11b60648201526084016102c7565b5090565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663bfe382866040518061010001604052808681526020016f7fffffffffffffffffffffffffffffff19600f0b8152602001855f01516001600160801b0316815260200185602001516001600160801b031681526020015f600f0b81526020018560400151600281111561249857612498612f6d565b8152602001856060015163ffffffff168152602001856080015160028111156124c3576124c3612f6d565b815250336040518363ffffffff1660e01b8152600401610c26929190613fa9565b804710156125345760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016102c7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461257d576040519150601f19603f3d011682016040523d82523d5f602084013e612582565b606091505b50509050806110815760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016102c7565b6001600160a01b0381163b6126665760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016102c7565b5f5160206140695f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b61269d83612972565b5f825111806126a95750805b1561108157612112838361217c565b5f6001600160a01b0384166126e05760405163a26bef6960e01b815260040160405180910390fd5b6001600160a01b03831661270757604051637d0f1ea160e01b815260040160405180910390fd5b826001600160a01b0316846001600160a01b03161480612725575081155b15612731575080610ae8565b610ae5858585856129b1565b604051623f675f60e91b81526001600160a01b0388811660048301525f91908a1690637ecebe0090602401602060405180830381865afa158015612783573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a79190613a00565b60405163d505accf60e01b81526001600160a01b038a811660048301528981166024830152604482018990526064820188905260ff8716608483015260a4820186905260c48201859052919250908a169063d505accf9060e4015f604051808303815f87803b158015612818575f5ffd5b505af115801561282a573d5f5f3e3d5ffd5b5050604051623f675f60e91b81526001600160a01b038b811660048301525f93508c169150637ecebe0090602401602060405180830381865afa158015612873573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128979190613a00565b90506128a482600161403f565b81146128fc5760405162461bcd60e51b815260206004820152602160248201527f5361666545524332303a207065726d697420646964206e6f74207375636365656044820152601960fa1b60648201526084016102c7565b50505050505050505050565b60605f5f856001600160a01b0316856040516129249190614052565b5f60405180830381855af49150503d805f811461295c576040519150601f19603f3d011682016040523d82523d5f602084013e612961565b606091505b5091509150611f8e868383876129f0565b61297b816125f9565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b5f6001600160a01b03841630146129dc576129d76001600160a01b038616858585612a68565b6109e8565b6109e86001600160a01b0386168484612ad3565b60608315612a5e5782515f03612a57576001600160a01b0385163b612a575760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016102c7565b5081610ae8565b610ae88383612b03565b6040516001600160a01b03808516602483015283166044820152606481018290526121129085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612b2d565b6040516001600160a01b03831660248201526044810182905261108190849063a9059cbb60e01b90606401612a9c565b815115612b135781518083602001fd5b8060405162461bcd60e51b81526004016102c7919061322d565b5f612b81826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c009092919063ffffffff16565b905080515f1480612ba1575080806020019051810190612ba19190613c46565b6110815760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016102c7565b606061088d84845f85855f5f866001600160a01b03168587604051612c259190614052565b5f6040518083038185875af1925050503d805f8114612c5f576040519150601f19603f3d011682016040523d82523d5f602084013e612c64565b606091505b5091509150612c75878383876129f0565b979650505050505050565b6040518060e001604052805f8152602001612cb96040805160808101909152805f81526020015f81526020015f81526020015f81525090565b81526020015f81526020015f81526020015f81526020015f6002811115612ce257612ce2612f6d565b81526020015f81525090565b5f60a08284031215612cfe575f5ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b0381118282101715612d3a57612d3a612d04565b60405290565b604051608081016001600160401b0381118282101715612d3a57612d3a612d04565b60405161012081016001600160401b0381118282101715612d3a57612d3a612d04565b60405160e081016001600160401b0381118282101715612d3a57612d3a612d04565b604051601f8201601f191681016001600160401b0381118282101715612dcf57612dcf612d04565b604052919050565b80356001600160801b0381168114612ded575f5ffd5b919050565b60038110610aca575f5ffd5b5f60a08284031215612e0e575f5ffd5b612e16612d18565b9050612e2182612dd7565b8152612e2f60208301612dd7565b60208201526040820135612e4281612df2565b6040820152606082013563ffffffff81168114612e5d575f5ffd5b60608201526080820135612e7081612df2565b608082015292915050565b6001600160a01b0381168114610aca575f5ffd5b5f60608284031215612e9f575f5ffd5b604051606081016001600160401b0381118282101715612ec157612ec1612d04565b6040529050808235612ed281612e7b565b815260208381013590820152604083013560ff81168114612ef1575f5ffd5b6040919091015292915050565b5f5f5f5f6101c08587031215612f12575f5ffd5b612f1c8686612cee565b935060a08501356001600160401b03811115612f36575f5ffd5b612f4287828801612cee565b935050612f528660c08701612dfe565b9150612f62866101608701612e8f565b905092959194509250565b634e487b7160e01b5f52602160045260245ffd5b60038110610aca57634e487b7160e01b5f52602160045260245ffd5b612fa681612f81565b9052565b8051825260208101518051612fbe81612f81565b80602085015250602081015160408401526040810151606084015260608101516080840152506040810151612ff660a0840182612f9d565b50606081015160c0830152608081015160e083015260a081015161301e610100840182612f9d565b5060c001516101209190910152565b83815261018081016130426020830185612faa565b82610160830152949350505050565b5f60808284031215612cfe575f5ffd5b5f5f5f60c08486031215613073575f5ffd5b833561307e81612e7b565b925061308d8560208601613051565b9295929450505060a0919091013590565b5f5f5f606084860312156130b0575f5ffd5b83356130bb81612e7b565b925060208401356001600160401b038111156130d5575f5ffd5b6130e186828701612cee565b92505060408401356130f281612e7b565b809150509250925092565b5f6020828403121561310d575f5ffd5b813561089081612e7b565b5f5f5f5f60e0858703121561312b575f5ffd5b843561313681612e7b565b9350602085013561314681612e7b565b925060408501356001600160401b03811115613160575f5ffd5b61316c87828801612cee565b925050612f628660608701613051565b5f5f5f5f6060858703121561318f575f5ffd5b843561319a81612e7b565b93506020850135925060408501356001600160401b038111156131bb575f5ffd5b8501601f810187136131cb575f5ffd5b80356001600160401b038111156131e0575f5ffd5b8760208284010111156131f1575f5ffd5b949793965060200194505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610c6660208301846131ff565b5f5f5f60608486031215613251575f5ffd5b833561325c81612e7b565b9250602084013561326c81612e7b565b915060408401356001600160401b03811115613286575f5ffd5b61329286828701612cee565b9150509250925092565b5f5f604083850312156132ad575f5ffd5b82356132b881612e7b565b946020939093013593505050565b5f6001600160401b038211156132de576132de612d04565b50601f01601f191660200190565b5f82601f8301126132fb575f5ffd5b813561330e613309826132c6565b612da7565b818152846020838601011115613322575f5ffd5b816020850160208301375f918101602001919091529392505050565b5f5f6040838503121561334f575f5ffd5b823561335a81612e7b565b915060208301356001600160401b03811115613374575f5ffd5b613380858286016132ec565b9150509250929050565b5f5f6040838503121561339b575f5ffd5b82356133a681612e7b565b915060208301356001600160401b038111156133c0575f5ffd5b61338085828601612cee565b5f5f5f61016084860312156133df575f5ffd5b6133e98585612cee565b925060a08401356001600160401b03811115613403575f5ffd5b61340f86828701612cee565b92505061341f8560c08601612dfe565b90509250925092565b5f5f5f6060848603121561343a575f5ffd5b833561344581612e7b565b92506020840135915060408401356130f281612e7b565b5f5f5f5f60e0858703121561346f575f5ffd5b843561347a81612e7b565b93506134898660208701613051565b925060a0850135915060c08501356134a081612e7b565b939692955090935050565b5f5f5f60c084860312156134bd575f5ffd5b83356134c881612e7b565b92506134d78560208601613051565b915060a08401356130f281612e7b565b8015158114610aca575f5ffd5b5f5f60408385031215613505575f5ffd5b823561351081612e7b565b91506020830135613520816134e7565b809150509250929050565b5f5f5f5f5f6102608688031215613540575f5ffd5b61354a8787612cee565b945060a08601356001600160401b03811115613564575f5ffd5b61357088828901612cee565b9450506135808760c08801612dfe565b9250613590876101608801612dfe565b91506135a0876102008801612e8f565b90509295509295909350565b8481526101a081016135c16020830186612faa565b610160820193909352610180015292915050565b5f5f5f5f608085870312156135e8575f5ffd5b84356135f381612e7b565b9350602085013561360381612e7b565b925060408501356001600160401b0381111561361d575f5ffd5b61362987828801612cee565b92505060608501356134a081612e7b565b5f5f60c0838503121561364b575f5ffd5b6136558484612cee565b915060a08301356001600160401b038111156133c0575f5ffd5b82815261016081016108906020830184612faa565b5f5f5f5f6102008587031215613698575f5ffd5b6136a28686612cee565b935060a08501356001600160401b038111156136bc575f5ffd5b6136c887828801612cee565b9350506136d88660c08701612dfe565b9150612f62866101608701612dfe565b5f5f602083850312156136f9575f5ffd5b82356001600160401b0381111561370e575f5ffd5b8301601f8101851361371e575f5ffd5b80356001600160401b03811115613733575f5ffd5b8560208260051b8401011115613747575f5ffd5b6020919091019590945092505050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b828110156137ae57603f198786030184526137998583516131ff565b9450602093840193919091019060010161377d565b50929695505050505050565b5f5f604083850312156137cb575f5ffd5b82359150602083013561352081612e7b565b5f602082840312156137ed575f5ffd5b5035919050565b5f60a08284031215613804575f5ffd5b61380c612d18565b8235815260208084013590820152604080840135908201529050606082013561383481612df2565b606082015260809182013591810191909152919050565b5f5f5f610120848603121561385e575f5ffd5b61386885856137f4565b925060a08401356001600160401b03811115613882575f5ffd5b61388e86828701612cee565b92505061341f8560c08601612e8f565b5f5f60c083850312156138af575f5ffd5b823591506138c08460208501612dfe565b90509250929050565b5f5f5f606084860312156138db575f5ffd5b8335925060208401356138ed81612e7b565b915060408401356001600160401b03811115613907575f5ffd5b613292868287016132ec565b5f60a08284031215613923575f5ffd5b610c6683836137f4565b5f5f8335601e19843603018112613942575f5ffd5b8301803591506001600160401b0382111561395b575f5ffd5b6020019150368190038213156112f7575f5ffd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038a81168252898116602083015288811660408301526060820188905260808201879052851660a082015261010060c082018190525f906139e2908301858761396f565b905060018060a01b03831660e08301529a9950505050505050505050565b5f60208284031215613a10575f5ffd5b5051919050565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b60018060a01b0385168152836020820152606060408201525f611f8e60608301848661396f565b5f60208284031215613ae6575f5ffd5b81516001600160401b03811115613afb575f5ffd5b8201601f81018413613b0b575f5ffd5b8051613b19613309826132c6565b818152856020838501011115613b2d575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b5f6080828403128015613b5b575f5ffd5b50613b64612d40565b8235815260208084013590820152604080840135908201526060928301359281019290925250919050565b634e487b7160e01b5f52603260045260245ffd5b8051612ded81612e7b565b8051612ded81612df2565b5f610120828403128015613bcb575f5ffd5b50613bd4612d62565b613bdd83613ba3565b81526020838101519082015260408084015190820152606080840151908201526080808401519082015260a08084015190820152613c1d60c08401613bae565b60c082015260e08381015190820152613c396101008401613bae565b6101008201529392505050565b5f60208284031215613c56575f5ffd5b8151610890816134e7565b8035612ded81612e7b565b8351815260208401516020820152604084015160408201525f6060850151613c9381612f81565b60608301526080858101519083015260e060a08301528335613cb481612e7b565b6001600160a01b031660e08301526020840135613cd081612e7b565b6001600160a01b03166101008301526040840135610120830152606084013536859003601e19018112613d01575f5ffd5b84016020810190356001600160401b03811115613d1c575f5ffd5b803603821315613d2a575f5ffd5b60a0610140850152613d416101808501828461396f565b915050613d5060808601613c61565b6001600160a01b03908116610160850152841660c08401529050610ae8565b5f5f828403610160811215613d82575f5ffd5b83519250610140601f1982011215613d98575f5ffd5b613da0612d85565b602085015181526080603f1983011215613db8575f5ffd5b613dc0612d40565b91506040850151613dd081612df2565b82526060858101516020808501919091526080870151604085015260a0870151918401919091528101829052613e0860c08601613bae565b604082015260e08501516060820152610100850151608082018190529150613e336101208601613bae565b60a0820152610140949094015160c085015250909391925050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f90611f8e908301846131ff565b613e9e81865180516001600160a01b03168252602090810151910152565b6020850151604082015260408501516060820152613ed2608082018580516001600160a01b03168252602090810151910152565b6001600160a01b03831660c082015261010060e082018190525f90611f8e908301846131ff565b634e487b7160e01b5f52601160045260245ffd5b60ff8181168382160190811115610c6957610c69613ef9565b5f60208284031215613f36575f5ffd5b815161089081612e7b565b5f60a0828403128015613f52575f5ffd5b50613f5b612d18565b8251613f6681612e7b565b8152602083810151908201526040830151613f8081612e7b565b6040820152606083810151908201526080830151613f9d816134e7565b60808201529392505050565b5f61012082019050835182526020840151600f0b60208301526001600160801b036040850151166040830152606084015160608301526080840151600f0b608083015260a0840151613ffe60a0840182612f9d565b5060c084015161401660c084018263ffffffff169052565b5060e084015161402960e0840182612f9d565b506001600160a01b038316610100830152610890565b80820180821115610c6957610c69613ef9565b5f82518060208501845e5f92019182525091905056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564000000000000000000000000c0939a4ed0129bc5162f6f693935b3f72a46a90d0000000000000000000000006cae28b3d09d8f8fc74ccd496ac986fc84c0c24e000000000000000000000000a64f0dbb10c473978c2efe069da207991e8e3cb30000000000000000000000003f37c7d8e61c000085aac0515775b06a3412f36b000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000e8d430364f831e9e2c8e1adb1e8789f229c76feb000000000000000000000000fee97c6f9bce786a08b1252eac9223057508c7600000000000000000000000004ee92ea287f4efa62b2ea6af87c3573e2d530e61