0 txs
820 calls
constructor
constructor()
functions
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
DELEGATE_SENDER_ROLE
viewfunction DELEGATE_SENDER_ROLE() view returns (bytes32)
getEscrow
viewfunction getEscrow(string clientId) view returns (address)
getEscrowBeacon
viewfunction getEscrowBeacon() view returns (address)
getIBCERC20Beacon
viewfunction getIBCERC20Beacon() view returns (address)
getPermit2
viewfunction getPermit2() view returns (address)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
ibcERC20Contract
viewfunction ibcERC20Contract(string denom) view returns (address)
ibcERC20Denom
viewfunction ibcERC20Denom(address token) view returns (string)
ics26
viewfunction ics26() view returns (address)
isTokenOperator
viewfunction isTokenOperator(address account) view returns (bool)
paused
viewfunction paused() view returns (bool)
PAUSER_ROLE
viewfunction PAUSER_ROLE() view returns (bytes32)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
TOKEN_OPERATOR_ROLE
viewfunction TOKEN_OPERATOR_ROLE() view returns (bytes32)
UNPAUSER_ROLE
viewfunction UNPAUSER_ROLE() view returns (bytes32)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
grantDelegateSenderRole
nonpayablefunction grantDelegateSenderRole(address account)
grantPauserRole
nonpayablefunction grantPauserRole(address account)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
grantTokenOperatorRole
nonpayablefunction grantTokenOperatorRole(address account)
grantUnpauserRole
nonpayablefunction grantUnpauserRole(address account)
initialize
nonpayablefunction initialize(address ics26Router, address escrowLogic, address ibcERC20Logic, address permit2)
multicall
nonpayablefunction multicall(bytes[] data) returns (bytes[] results)
onAcknowledgementPacket
nonpayablefunction onAcknowledgementPacket(tuple msg_)
onRecvPacket
nonpayablefunction onRecvPacket(tuple msg_) returns (bytes)
onTimeoutPacket
nonpayablefunction onTimeoutPacket(tuple msg_)
pause
nonpayablefunction pause()
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeDelegateSenderRole
nonpayablefunction revokeDelegateSenderRole(address account)
revokePauserRole
nonpayablefunction revokePauserRole(address account)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
revokeTokenOperatorRole
nonpayablefunction revokeTokenOperatorRole(address account)
revokeUnpauserRole
nonpayablefunction revokeUnpauserRole(address account)
sendTransfer
nonpayablefunction sendTransfer(tuple msg_) returns (uint64)
sendTransferWithPermit2
nonpayablefunction sendTransferWithPermit2(tuple msg_, tuple permit, bytes signature) returns (uint64)
sendTransferWithSender
nonpayablefunction sendTransferWithSender(tuple msg_, address sender) returns (uint64)
unpause
nonpayablefunction unpause()
upgradeEscrowTo
nonpayablefunction upgradeEscrowTo(address newEscrowLogic)
upgradeIBCERC20To
nonpayablefunction upgradeIBCERC20To(address newIBCERC20Logic)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
IBCERC20ContractCreated
event IBCERC20ContractCreated(address indexed contractAddress, string fullDenomPath)
Initialized
event Initialized(uint64 version)
Paused
event Paused(address account)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Unpaused
event Unpaused(address account)
Upgraded
event Upgraded(address indexed implementation)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
EnforcedPause
error EnforcedPause()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
ICS20DenomNotFound
error ICS20DenomNotFound(string denom)
ICS20EscrowNotFound
error ICS20EscrowNotFound(string clientID)
ICS20InvalidAddress
error ICS20InvalidAddress(string addr)
ICS20InvalidAmount
error ICS20InvalidAmount(uint256 amount)
ICS20InvalidPort
error ICS20InvalidPort(string expected, string actual)
ICS20Permit2TokenMismatch
error ICS20Permit2TokenMismatch(address permitToken, address sentToken)
ICS20Unauthorized
error ICS20Unauthorized(address caller)
ICS20UnauthorizedPacketSender
error ICS20UnauthorizedPacketSender(address packetSender)
ICS20UnexpectedEncoding
error ICS20UnexpectedEncoding(string expected, string actual)
ICS20UnexpectedERC20Balance
error ICS20UnexpectedERC20Balance(uint256 expected, uint256 actual)
ICS20UnexpectedVersion
error ICS20UnexpectedVersion(string expected, string version)
InvalidInitialization
error InvalidInitialization()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StringsInsufficientHexLength
error StringsInsufficientHexLength(uint256 value, uint256 length)
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a080604052346100c257306080525f5160206158b15f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b6040516157ea90816100c782396080518181816119b70152611a810152f35b6001600160401b0319166001600160401b039081175f5160206158b15f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a714612c755750806306ab20bc14612b44578063078c4a79146123255780631bbf2e23146122df5780631e5150e414612299578063248a9ca3146122465780632540e2da1461221c5780632ac3dc38146121625780632f2ff15d1461210457806332968782146120da57806333daf9801461209f57806336568abe146120415780633f4ba83a14611ed3578063428e4e1714611db25780634551d2b014611d155780634f1ef28614611a2f57806352d1902d1461199c57806353816a7c146116735780635c975abb146116315780635e32b6b6146115655780636ad7ba49146114c85780636c0e87e11461142b5780636c11c21c14611401578063826cae7a146113bb5780638456cb591461127357806391d1485414611209578063969631d51461118d578063a217fddf14611171578063a50ee2b4146110a9578063aaa2c34314610f75578063ac9650d814610dc7578063ad3cb1cc14610d66578063b29c715d14610b18578063c46023a314610a4b578063d413227d14610a05578063d547741f146109a2578063da0f21b514610967578063e163b1af14610857578063e63ab1e91461081c578063f17a7e6614610794578063f865af0814610766578063f8c8765e146102345763fb1bb9de146101f7575f80fd5b3461023157806003193601126102315760206040517f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a8152f35b80fd5b50346102315760806003193601126102315761024e612d13565b610256612d29565b604435906001600160a01b038216820361076257606435916001600160a01b03831680930361075e577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549360ff8560401c16159467ffffffffffffffff811680159081610756575b600114908161074c575b159081610743575b5061071b5790818660017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006001600160a01b039516177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556106c6575b50610337614bbc565b61033f614bbc565b610347614bbc565b61034f614bbc565b610357614bbc565b60ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300556103a7614bbc565b167fffffffffffffffffffffffff00000000000000000000000000000000000000007f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416177f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80355604051916105129283810181811067ffffffffffffffff82111761068e576104518291614de895878785396001600160a01b0316815230602082015260400190565b039087f080156106bb576001600160a01b03167fffffffffffffffffffffffff00000000000000000000000000000000000000007f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8045416177f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80455604051928084019284841067ffffffffffffffff85111761068e57918493916105079385396001600160a01b0316815230602082015260400190565b039084f08015610683576001600160a01b03167fffffffffffffffffffffffff00000000000000000000000000000000000000007f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8055416177f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f805557fffffffffffffffffffffffff00000000000000000000000000000000000000007f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8065416177f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f806556105ef5780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b6040513d85823e3d90fd5b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b6040513d88823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f61032e565b6004877ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f6102d1565b303b1591506102c9565b8791506102bf565b8480fd5b8380fd5b503461023157602060031936011261023157610790610783612d13565b61078b61368a565b613968565b5080f35b5034610231576020600319360112610231576001600160a01b0360406107b8612d13565b927f62150a51582c26f4255242a3c4ca35fb04250e7315069523d650676aed01a56a81527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b503461023157806003193601126102315760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b5034610231576020600319360112610231576108aa610874612d13565b6001600160a01b03165f527f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80260205260405f2090565b9060405191818154916108bc836132f3565b808652926001811690811561093d57506001146108fc575b6108f8856108e481870382612de0565b604051918291602083526020830190612d72565b0390f35b815260208120939250905b808210610923575090915081016020016108e4826108f86108d4565b919260018160209254838588010152019101909291610907565b8695506108f8969350602092506108e494915060ff191682840152151560051b82010192936108d4565b503461023157806003193601126102315760206040517f04c6d412b3efc8acc11f9a5a5dc9f2a5d9ae1f6d869984b47386662ab77133cd8152f35b5034610231576040600319360112610231576107906004356109c2612d29565b90610a006109fb825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b614248565b613a32565b503461023157806003193601126102315760206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051908152f35b5034610231576020600319360112610231576024610a67612d13565b60206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051938480927f24d7806c0000000000000000000000000000000000000000000000000000000082523360048301525afa9182156106835761079092610ae4918591610ae9575b503390612e9b565b61389e565b610b0b915060203d602011610b11575b610b038183612de0565b810190612e83565b5f610adc565b503d610af9565b50346102315760406003193601126102315760043567ffffffffffffffff8111610ce257806004019060e06003198236030112610d6257610b57612d29565b91610b606133b8565b610b68613344565b7f04c6d412b3efc8acc11f9a5a5dc9f2a5d9ae1f6d869984b47386662ab77133cd84527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604084206001600160a01b0333165f5260205260ff60405f20541615610d12576024820135918215610ce657610c02610bfd610bf660646001600160a01b03940185612f0b565b3691612e1f565b61347f565b1691610c1881610c118461321b565b8533613b08565b84610c228361321b565b91843b15610ce2576040517fb4f22eb70000000000000000000000000000000000000000000000000000000081526001600160a01b0393909316600484015233602484015260448301528160648183875af18015610cd757610cc2575b602085610c8d868686613d16565b907f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d67ffffffffffffffff60405191168152f35b610ccd858092612de0565b610762575f610c7f565b6040513d87823e3d90fd5b5080fd5b6024857f4f6df8d000000000000000000000000000000000000000000000000000000000815280600452fd5b6044847fe2517d3f000000000000000000000000000000000000000000000000000000008152336004527f04c6d412b3efc8acc11f9a5a5dc9f2a5d9ae1f6d869984b47386662ab77133cd602452fd5b8280fd5b5034610231578060031936011261023157506108f8604051610d89604082612de0565b600581527f352e302e300000000000000000000000000000000000000000000000000000006020820152604051918291602083526020830190612d72565b50346102315760206003193601126102315760043567ffffffffffffffff8111610ce25736602382011215610ce25780600401359067ffffffffffffffff8211610d6257602481013660248460051b84010111610762576040516020610e2d8183612de0565b85825280820192601f198201368537610e458661329a565b94610e536040519687612de0565b868652601f19610e628861329a565b0183895b828110610f6557505050875b87811015610ee857600190610ecc610ec6610e9560248460051b87010187612f0b565b91908d898c856040519687958487013784018281018481528e519283915e010190815203601f198101835282612de0565b306148d6565b610ed6828a6132b2565b52610ee181896132b2565b5001610e72565b83898860405191838301848452825180915260408401948060408360051b870101940192955b828710610f1b5785850386f35b909192938280610f55837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08a600196030186528851612d72565b9601920196019592919092610f0e565b606082828b010152018490610e66565b50346102315760206003193601126102315780610f90612d13565b602460206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051928380927f24d7806c0000000000000000000000000000000000000000000000000000000082523360048301525afa801561068357611009918491610ae957503390612e9b565b6001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f805541690813b156110a5576001600160a01b03602484928360405195869485937f3659cfe60000000000000000000000000000000000000000000000000000000085521660048401525af1801561109a576110895750f35b8161109391612de0565b6102315780f35b6040513d84823e3d90fd5b5050fd5b50346102315760206003193601126102315760043567ffffffffffffffff8111610ce2576110db903690600401612e55565b9091506001600160a01b03604051828482376020818481017f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f801815203019020541690811561112e57602082604051908152f35b905061116d6040519283927fe1275e2f000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f97565b0390fd5b5034610231578060031936011261023157602090604051908152f35b50346102315760206003193601126102315760043567ffffffffffffffff8111610ce257602091826111cb6001600160a01b03933690600401612e55565b925082604051938492833781017f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8008152030190205416604051908152f35b5034610231576040600319360112610231576001600160a01b03604061122d612d29565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b50346102315780600319360112610231577f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604081206001600160a01b0333165f5260205260ff60405f2054161561136b576112f36133b8565b600160ff197fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807fe2517d3f0000000000000000000000000000000000000000000000000000000060449252336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a602452fd5b503461023157806003193601126102315760206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8045416604051908152f35b50346102315760206003193601126102315761079061141e612d13565b61142661368a565b614525565b5034610231576020600319360112610231576024611447612d13565b60206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051938480927f24d7806c0000000000000000000000000000000000000000000000000000000082523360048301525afa91821561068357610790926114c3918591610ae957503390612e9b565b614459565b50346102315760206003193601126102315760246114e4612d13565b60206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051938480927f24d7806c0000000000000000000000000000000000000000000000000000000082523360048301525afa9182156106835761079092611560918591610ae957503390612e9b565b6137d4565b50346102315761160b61157736612d3f565b6115ad336001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80354163314612e9b565b6115b5613344565b6115bd6133b8565b61160360608201916115fa6115f46115ed6115e56115db8786612ed8565b6080810190612f0b565b8101906130b4565b9483612ed8565b80612f0b565b92909180612f0b565b9290916146b8565b807f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d80f35b5034610231578060031936011261023157602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b50346102315760c06003193601126102315760043567ffffffffffffffff8111610ce257806004019060e06003198236030112610d625760807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360112610d625760a43567ffffffffffffffff8111610762576116f4903690600401612e55565b6116ff9291926133b8565b611707613344565b60248201359182156119705761171b613205565b6001600160a01b038061172d8861321b565b16911614611739613205565b6117428761321b565b9115611936575050610bfd610bf6606461175d930187612f0b565b926001600160a01b03807f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8065416941693604051906040820182811067ffffffffffffffff821117611909579088949392916040528682526020820191868352813b1561190557856001600160a01b039161184c8296604051988997889687957f30f28b7a00000000000000000000000000000000000000000000000000000000875281611808612d29565b166004880152604435602488015260643560448801526084356064880152511660848601525160a48501523360c485015261010060e4850152610104840191612f97565b03925af1801561109a576118f0575b506118658461321b565b91833b15610ce2576040517fb4f22eb70000000000000000000000000000000000000000000000000000000081526001600160a01b0393909316600484015233602484015260448301528160648183865af180156118e5576118d0575b602084610c8d338587613d16565b6118db848092612de0565b610d62575f6118c2565b6040513d86823e3d90fd5b816118fa91612de0565b61076257835f61185b565b8580fd5b6024897f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b7fe36164780000000000000000000000000000000000000000000000000000000088526001600160a01b0390811660045216602452604486fd5b6024867f4f6df8d000000000000000000000000000000000000000000000000000000000815280600452fd5b50346102315780600319360112610231576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003611a075760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b807fe07c8dba0000000000000000000000000000000000000000000000000000000060049252fd5b50604060031936011261023157611a44612d13565b9060243567ffffffffffffffff8111610ce25736602382011215610ce257611a76903690602481600401359101612e1f565b916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016803014908115611ce0575b50611cb857611ab961368a565b6001600160a01b03811690604051937f52d1902d000000000000000000000000000000000000000000000000000000008552602085600481865afa80958596611c84575b50611b2e57602484847f4c9c8ce3000000000000000000000000000000000000000000000000000000008252600452fd5b9091847f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8103611c595750823b15611c2e57807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b8480a2805115611bfc57610790916148d6565b505034611c065780f35b807fb398979f0000000000000000000000000000000000000000000000000000000060049252fd5b7f4c9c8ce3000000000000000000000000000000000000000000000000000000008452600452602483fd5b7faa1d49a4000000000000000000000000000000000000000000000000000000008552600452602484fd5b9095506020813d602011611cb0575b81611ca060209383612de0565b8101031261075e5751945f611afd565b3d9150611c93565b6004827fe07c8dba000000000000000000000000000000000000000000000000000000008152fd5b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc541614155f611aac565b5034610231576020600319360112610231576024611d31612d13565b60206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051938480927f24d7806c0000000000000000000000000000000000000000000000000000000082523360048301525afa9182156106835761079092611dad918591610ae957503390612e9b565b61438d565b50346102315760206003193601126102315760043567ffffffffffffffff8111610ce2578060040160c06003198336030112610d6257611e1e336001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80354163314612e9b565b611e26613344565b611e2e6133b8565b611e3e610bf66084840183612f0b565b60208151910120602080604051611e56604082612de0565b818152017f4774d4a575993f963b1c06573736617a457abef8589178db8d10c94b4ab511ab81522014611eab575b82807f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d80f35b6116036064611ecc9301916115fa6115f46115ed6115e56115db8786612ed8565b5f80611e84565b50346102315780600319360112610231577f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a81527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604081206001600160a01b0333165f5260205260ff60405f20541615611ff1577fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff811615611fc95760ff19167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a180f35b6004827f8dfc202b000000000000000000000000000000000000000000000000000000008152fd5b807fe2517d3f0000000000000000000000000000000000000000000000000000000060449252336004527f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a602452fd5b50346102315760406003193601126102315761205b612d29565b336001600160a01b038216036120775761079090600435613a32565b6004827f6697b232000000000000000000000000000000000000000000000000000000008152fd5b503461023157806003193601126102315760206040517f62150a51582c26f4255242a3c4ca35fb04250e7315069523d650676aed01a56a8152f35b5034610231576020600319360112610231576107906120f7612d13565b6120ff61368a565b6142c1565b503461023157604060031936011261023157610790600435612124612d29565b9061215d6109fb825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b6145f1565b50346102315760206003193601126102315760043567ffffffffffffffff8111610ce257806004019060e06003198236030112610d62576121a16133b8565b6121a9613344565b60248101359081156121f0576121d0610bfd610bf660646001600160a01b03940186612f0b565b16906121e6816121df8561321b565b8433613b08565b836118658461321b565b6024847f4f6df8d000000000000000000000000000000000000000000000000000000000815280600452fd5b503461023157602060031936011261023157610790612239612d13565b61224161368a565b613705565b50346102315760206003193601126102315760206122916004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b503461023157806003193601126102315760206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8055416604051908152f35b503461023157806003193601126102315760206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8065416604051908152f35b50346102315761233436612d3f565b9061236b336001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80354163314612e9b565b612373613344565b61237b6133b8565b606082019161239a610bf66123908584612ed8565b6040810190612f0b565b602081519101206123a9612f5c565b60208151910120146123b9612f5c565b6123c66123908685612ed8565b909215612b0e575050506124186123e3610bf66115f48685612ed8565b602081519101206123f2612fdf565b6020815191012014612402612fdf565b906124106115f48786612ed8565b92909161301a565b612432610bf66124288584612ed8565b6060810190612f0b565b6020815191012061244161305e565b602081519101201461245161305e565b61245e6124288685612ed8565b909215612ad8575050506124b2612485610bf661247b8685612ed8565b6020810190612f0b565b60208151910120612494612fdf565b60208151910120146124a4612fdf565b9061241061247b8786612ed8565b6124c26115e56115db8584612ed8565b92606084018051156121f0576124db604086015161340b565b9160208401936124f1610bfd610bf68784612f0b565b9651946125206125046115f48585612ed8565b61251b6125118680612f0b565b9390923691612e1f565b6135eb565b9261252b848861491a565b156126b85750509051845195968795909250906020908781189088110287188061255d612558828b61322f565b613269565b9803920101602087015e61257285518661496c565b9590158681156126a6575b5061267d575b506001600160a01b03905b16905193813b15610762576040517f0779afe60000000000000000000000000000000000000000000000000000000081526001600160a01b039182166004820152921660248301526044820193909352918290606490829084905af1801561109a57612668575b6108f88260405190612608604083612de0565b601182527f7b22726573756c74223a2241513d3d227d00000000000000000000000000000060208301527f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d604051918291602083526020830190612d72565b612673828092612de0565b610231575f6125f5565b94506001600160a01b03906126a08261269588613181565b5416968715156131bf565b90612583565b6001600160a01b03915016155f61257d565b61272293506126ed83602098949361251b6125116126e56126dc8d98978998612ed8565b87810190612f0b565b939094612f0b565b926040519784899551918291018487015e8401908282018a8152815193849201905e010186815203601f198101855284612de0565b6001600160a01b038516946001600160a01b0361273e85613181565b54169384156127e3575b5084956001600160a01b038596959616908351823b156127df576040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0392909216600483015260248201529085908290604490829084905af1908115610cd75785916127ca575b50506001600160a01b039061258e565b816127d491612de0565b61076257835f6127ba565b8680fd5b93506001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80454166040517f4571e3a60000000000000000000000000000000000000000000000000000000060208201523060248201528760448201526060606482015261286b8161285d6084820189612d72565b03601f198101835282612de0565b604051916104e48084019084821067ffffffffffffffff831117612aab579184939161289b936152fa863961345f565b039086f08015610cd7576001600160a01b0316956128b885613181565b6001600160a01b0388167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055612923876001600160a01b03165f527f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80260205260405f2090565b9685519767ffffffffffffffff891161068e5761294081546132f3565b601f8111612a66575b50602098601f81116001146129e55780899a8a999a916129da575b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790555b7f6031fab685dd6d86e4dbac9a69eae347145f332c95b3a0d728d3730fc5233d626129cf8298604051918291602083526020830190612d72565b0390a2959493612748565b90508901515f612964565b818952898920601f1982168a5b818110612a4e5750908a9b83600194939c9b9c10612a17575b5050811b019055612995565b8b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f80612a0b565b8a8d0151835560209c8d019c600190930192016129f2565b81895260208920601f8b0160051c81019160208c10612aa1575b601f0160051c01905b818110612a965750612949565b898155600101612a89565b9091508190612a80565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b61116d906040519384937fd1ca953a00000000000000000000000000000000000000000000000000000000855260048501612fb7565b61116d906040519384937f094af3b800000000000000000000000000000000000000000000000000000000855260048501612fb7565b5034612c71576020600319360112612c7157612b5e612d13565b602460206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051928380927f24d7806c0000000000000000000000000000000000000000000000000000000082523360048301525afa8015612c6657612bd7915f91610ae957503390612e9b565b6001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f804541690813b15612c71576001600160a01b0360245f928360405195869485937f3659cfe60000000000000000000000000000000000000000000000000000000085521660048401525af18015612c6657612c58575080f35b612c6491505f90612de0565b005b6040513d5f823e3d90fd5b5f80fd5b34612c71576020600319360112612c7157600435907fffffffff000000000000000000000000000000000000000000000000000000008216809203612c7157817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115612ce9575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612ce2565b600435906001600160a01b0382168203612c7157565b602435906001600160a01b0382168203612c7157565b6020600319820112612c71576004359067ffffffffffffffff8211612c71576003198260a092030112612c715760040190565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b60a0810190811067ffffffffffffffff821117612db357604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f601f19910116810190811067ffffffffffffffff821117612db357604052565b67ffffffffffffffff8111612db357601f01601f191660200190565b929192612e2b82612e03565b91612e396040519384612de0565b829481845281830111612c71578281602093845f960137010152565b9181601f84011215612c715782359167ffffffffffffffff8311612c715760208381860195010111612c7157565b90816020910312612c7157518015158103612c715790565b15612ea35750565b6001600160a01b03907f2ecb3242000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6181360301821215612c71570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215612c71570180359067ffffffffffffffff8211612c7157602001918136038313612c7157565b60405190612f6b604083612de0565b600782527f69637332302d31000000000000000000000000000000000000000000000000006020830152565b601f8260209493601f1993818652868601375f8582860101520116010190565b91612fce612fdc9492604085526040850190612d72565b926020818503910152612f97565b90565b60405190612fee604083612de0565b600882527f7472616e736665720000000000000000000000000000000000000000000000006020830152565b929091921561302857505050565b61116d906040519384937f5d3a3cdd00000000000000000000000000000000000000000000000000000000855260048501612fb7565b6040519061306d604083612de0565b601a82527f6170706c69636174696f6e2f782d736f6c69646974792d6162690000000000006020830152565b9080601f83011215612c7157816020612fdc93359101612e1f565b602081830312612c715780359067ffffffffffffffff8211612c71570160a081830312612c7157604051916130e883612d97565b813567ffffffffffffffff8111612c715781613105918401613099565b8352602082013567ffffffffffffffff8111612c715781613127918401613099565b6020840152604082013567ffffffffffffffff8111612c71578161314c918401613099565b604084015260608201356060840152608082013567ffffffffffffffff8111612c71576131799201613099565b608082015290565b60208091604051928184925191829101835e81017f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80181520301902090565b156131c75750565b61116d906040519182917fe1275e2f000000000000000000000000000000000000000000000000000000008352602060048401526024830190612d72565b6024356001600160a01b0381168103612c715790565b356001600160a01b0381168103612c715790565b9190820391821161323c57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9061327382612e03565b6132806040519182612de0565b828152601f196132908294612e03565b0190602036910137565b67ffffffffffffffff8111612db35760051b60200190565b80518210156132c65760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b90600182811c9216801561333a575b602083101461330d57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691613302565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c6133905760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166133e357565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b61341681518261496c565b919015613421575090565b61116d906040519182917f3fed5d87000000000000000000000000000000000000000000000000000000008352602060048401526024830190612d72565b6040906001600160a01b03612fdc94931681528160208201520190612d72565b604051906001600160a01b03815192602081818501958087835e81017f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f80081520301902054169182156134d057505090565b9091506001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8055416604051907fc4d66de80000000000000000000000000000000000000000000000000000000060208301523060248301526024825261353d604483612de0565b604051916104e4908184019284841067ffffffffffffffff851117612db357849361356c936152fa863961345f565b03905ff08015612c66576001600160a01b036020911692604051928391518091835e81017f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8008152030190206001600160a01b0382167fffffffffffffffffffffffff000000000000000000000000000000000000000082541617905590565b6001809160208095612fdc958160405198858a9651918291018688015e8501917f2f0000000000000000000000000000000000000000000000000000000000000085840152602183013701017f2f000000000000000000000000000000000000000000000000000000000000008382015203017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1810184520182612de0565b602460206001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f8035416604051928380927f24d7806c0000000000000000000000000000000000000000000000000000000082523360048301525afa8015612c6657613703915f91610ae957503390612e9b565b565b6001600160a01b0381165f9081527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde4011602052604090205460ff16156137cf576001600160a01b03165f8181527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde401160205260408120805460ff191690553391907f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b505f90565b6001600160a01b0381165f9081527fd62723b73fed5fb0cae58785027a02356c6bdb68a107a140d6093b6871b6d9f4602052604090205460ff16156137cf576001600160a01b03165f8181527fd62723b73fed5fb0cae58785027a02356c6bdb68a107a140d6093b6871b6d9f460205260408120805460ff191690553391907f62150a51582c26f4255242a3c4ca35fb04250e7315069523d650676aed01a56a907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b6001600160a01b0381165f9081527f6af8e566f3cdd77e5fe3b944a8a260d555073fdf834bbffeb5e923cd960fa9b7602052604090205460ff16156137cf576001600160a01b03165f8181527f6af8e566f3cdd77e5fe3b944a8a260d555073fdf834bbffeb5e923cd960fa9b760205260408120805460ff191690553391907f04c6d412b3efc8acc11f9a5a5dc9f2a5d9ae1f6d869984b47386662ab77133cd907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b6001600160a01b0381165f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff16156137cf576001600160a01b03165f8181527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b60205260408120805460ff191690553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9080a4600190565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260ff60405f2054165f14613af557805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260405f2060ff1981541690556001600160a01b03339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b50505f90565b9190820180921161323c57565b916001600160a01b03909391931692604051927f70a082310000000000000000000000000000000000000000000000000000000084526001600160a01b03821691826004860152602085602481895afa948515612c66575f95613ce1575b506040517f23b872dd0000000000000000000000000000000000000000000000000000000060208281019182526001600160a01b039485166024840152939092166044820152606481018590525f9190613bc3816084810161285d565b519082885af115612c66575f513d613cd85750833b155b613cac576020906024604051809681937f70a0823100000000000000000000000000000000000000000000000000000000835260048301525afa928315612c66575f93613c76575b50613c2d9082613afb565b90821180613c6d575b15613c3f575050565b7f2fb30cfc000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b50808214613c36565b9092506020813d602011613ca4575b81613c9260209383612de0565b81010312612c71575191613c2d613c22565b3d9150613c85565b837f5274afe7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60011415613bda565b9094506020813d602011613d0e575b81613cfd60209383612de0565b81010312612c715751936020613b66565b3d9150613cf0565b613d226108748261321b565b5f9260405191825f825492613d36846132f3565b808452936001811690811561422657506001146141e2575b50613d5b92500383612de0565b818051155f1461411d5750505060a0613d84613d7e613d798461321b565b614a22565b94614a22565b93613d926040840184612f0b565b939095613de3613dc8613da860c0850185612f0b565b99909760405196613db888612d97565b8752602087019485523691612e1f565b9560408501968752606085019860208501358a523691612e1f565b94608084019586526001600160a01b037f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f803541695613e246060850185612f0b565b96909401359467ffffffffffffffff86168096036141195790613f38613e91949392613f2a613e51612fdf565b9c613e5a612fdf565b94613ef3613e66612f5c565b97613ec2613e7261305e565b9a6040519c8d986020808b01525160a060408b015260e08a0190612d72565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08983030160608a0152612d72565b90517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0878303016080880152612d72565b915160a0850152517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160c0850152612d72565b03601f198101865285612de0565b60405199613f458b612d97565b8a5260208a0152604089015260608801526080870152604051926060840184811067ffffffffffffffff8211176140ec579361408660209694613f9b613fef958a9567ffffffffffffffff996040523691612e1f565b835287830190815260408301998a52604051998a97889687957f4d6e7ce30000000000000000000000000000000000000000000000000000000087528b600488015251606060248801526084870190612d72565b925116604485015251907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8482030160648501526080614075614063614051614041865160a0875260a0870190612d72565b8d8701518682038f880152612d72565b60408601518582036040870152612d72565b60608501518482036060860152612d72565b920151906080818403910152612d72565b03925af19182156140df57819261409c57505090565b9091506020813d6020116140d7575b816140b860209383612de0565b81010312610ce257519067ffffffffffffffff82168203610231575090565b3d91506140ab565b50604051903d90823e3d90fd5b6024877f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b8880fd5b6141489061414261412f979497612fdf565b61413c6060880188612f0b565b916135eb565b9061491a565b614159575b50613d8460a091614a22565b6001600160a01b0361416a8461321b565b16803b15612c71576040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b03929092166004830152602084013560248301525f908290604490829084905af18015612c66571561414d576141d89193505f90612de0565b5f91613d8461414d565b90505f9291925260205f20905f915b81831061420a575050906020613d5b928201015f613d4e565b60209193508060019154838589010152019101909184926141f1565b60209350613d5b95925060ff1991501682840152151560051b8201015f613d4e565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0333165f5260205260ff60405f205416156142925750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b6001600160a01b0381165f9081527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde4011602052604090205460ff166137cf576001600160a01b03165f8181527f475b312747b0505dfd322c59063ca43b615bb2e6d10fdf52fb58877bbcde401160205260408120805460ff191660011790553391907f427da25fe773164f88948d3e215c94b6554e2ed5e5f203a821c9f2f6131cf75a907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b6001600160a01b0381165f9081527f6af8e566f3cdd77e5fe3b944a8a260d555073fdf834bbffeb5e923cd960fa9b7602052604090205460ff166137cf576001600160a01b03165f8181527f6af8e566f3cdd77e5fe3b944a8a260d555073fdf834bbffeb5e923cd960fa9b760205260408120805460ff191660011790553391907f04c6d412b3efc8acc11f9a5a5dc9f2a5d9ae1f6d869984b47386662ab77133cd907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b6001600160a01b0381165f9081527fd62723b73fed5fb0cae58785027a02356c6bdb68a107a140d6093b6871b6d9f4602052604090205460ff166137cf576001600160a01b03165f8181527fd62723b73fed5fb0cae58785027a02356c6bdb68a107a140d6093b6871b6d9f460205260408120805460ff191660011790553391907f62150a51582c26f4255242a3c4ca35fb04250e7315069523d650676aed01a56a907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b6001600160a01b0381165f9081527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b602052604090205460ff166137cf576001600160a01b03165f8181527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6b60205260408120805460ff191660011790553391907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9080a4600190565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260ff60405f205416155f14613af557805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260405f20600160ff198254161790556001600160a01b03339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b909193925f946001600160a01b03604051838382376020818581017f823f7a8ea9ae6df0eb03ec5e1682d7a2839417ad8a91774118e6acf2e8d2f800815203019020541692831561489757916147249161251b61472b9461471c60208a015161340b565b973691612e1f565b845161491a565b15614847576001600160a01b036147428451613181565b54169261475281518515156131bf565b6060810151843b15612c71576040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038416600482015260248101919091525f8160448183895af18015612c6657614831575b506060905b015192813b1561075e576040517f0779afe60000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201529216602483015260448201929092529082908290606490829084905af1801561109a5761481f575050565b61482a828092612de0565b6102315750565b61483e9195505f90612de0565b5f9360606147af565b6001600160a01b036148598451613181565b541692831561486b575b6060906147b4565b92506060614879845161340b565b9361489081516001600160a01b03871615156131bf565b9050614863565b509061116d6040519283927f5778f378000000000000000000000000000000000000000000000000000000008452602060048501526024840191612f97565b5f80612fdc93602081519101845af43d15614912573d916148f683612e03565b926149046040519485612de0565b83523d5f602085013e614b30565b606091614b30565b805190825180921061496557805191828082109118028083189214158202821890602061494a612558848661322f565b92808285019503920101835e51902090602081519101201490565b5050505f90565b805182118015614a1b575b6149c45760018211806149cc575b158015908160011b918204600214171561323c576028018060281161323c5782036149c4576001600160a01b0392915f6149be92614c13565b90921690565b50505f905f90565b507f30780000000000000000000000000000000000000000000000000000000000007fffff00000000000000000000000000000000000000000000000000000000000060208301511614614985565b505f614977565b6001600160a01b031680614a36602a612e03565b91614a446040519384612de0565b602a8352614a52602a612e03565b601f196020850191013682378351156132c657603090538251600110156132c6576078602184015360295b60018111614abe5750614a8e575090565b7fe22e27eb000000000000000000000000000000000000000000000000000000005f52600452601460245260445ffd5b90600f811660108110156132c65784518310156132c6577f3031323334353637383961626364656600000000000000000000000000000000901a8483016020015360041c90801561323c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614a7d565b90614b6d5750805115614b4557805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580614bb3575b614b7e575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15614b76565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615614beb57565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b9290926001840180851161323c57831180614cca575b158015908160011b918204600214171561323c57614c4c905f9492939495613afb565b915b818310614c5e5750505060019190565b9092919360ff614c957fff000000000000000000000000000000000000000000000000000000000000006020888601015116614d1b565b16600f8111614cbf578160041b918083046010149015171561323c57600191019401919290614c4e565b505f94508493505050565b507f30780000000000000000000000000000000000000000000000000000000000007fffff000000000000000000000000000000000000000000000000000000000000602086840101511614614c29565b60f81c602f811180614ddd575b15614d55577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00160ff1690565b6060811180614dd3575b15614d8c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa90160ff1690565b6040811180614dc9575b15614dc3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc90160ff1690565b5060ff90565b5060478110614d96565b5060678110614d5f565b50603a8110614d2856fe60803461013457601f61051238819003918201601f19168301916001600160401b03831184841017610138578084926040948552833981010312610134576100468161014c565b906001600160a01b039061005c9060200161014c565b16908115610121575f80546001600160a01b031981168417825560405193916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3803b1561010157600180546001600160a01b0319166001600160a01b039290921691821790557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a26103b190816101618239f35b63211eb15960e21b5f9081526001600160a01b0391909116600452602490fd5b631e4fbdf760e01b5f525f60045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101345756fe60806040526004361015610011575f80fd5b5f3560e01c80633659cfe61461027e5780635c60da1b1461022d578063715018a6146101935780638da5cb5b146101435763f2fde38b14610050575f80fd5b3461013f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013f5760043573ffffffffffffffffffffffffffffffffffffffff811680910361013f576100a8610358565b80156101135773ffffffffffffffffffffffffffffffffffffffff5f54827fffffffffffffffffffffffff00000000000000000000000000000000000000008216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b7f1e4fbdf7000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5f80fd5b3461013f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013f57602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b3461013f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013f576101c9610358565b5f73ffffffffffffffffffffffffffffffffffffffff81547fffffffffffffffffffffffff000000000000000000000000000000000000000081168355167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461013f575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013f57602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b3461013f5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013f5760043573ffffffffffffffffffffffffffffffffffffffff81169081810361013f576102d7610358565b3b1561032d57807fffffffffffffffffffffffff000000000000000000000000000000000000000060015416176001557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a2005b7f847ac564000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff5f5416330361037857565b7f118cdaa7000000000000000000000000000000000000000000000000000000005f523360045260245ffdfea164736f6c634300081c000a60a0806040526104e480380380916100178285610292565b833981016040828203126101eb5761002e826102c9565b602083015190926001600160401b0382116101eb57019080601f830112156101eb57815161005b816102dd565b926100696040519485610292565b8184526020840192602083830101116101eb57815f926020809301855e84010152823b15610274577fa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d5080546001600160a01b0319166001600160a01b038516908117909155604051635c60da1b60e01b8152909190602081600481865afa9081156101f7575f9161023a575b50803b1561021a5750817f1cf3b03a6cf19fa2baba4df148e9dcabedea7f8a5c07840e207e5c089be95d3e5f80a282511561020257602060049260405193848092635c60da1b60e01b82525afa9182156101f7575f926101ae575b505f809161018a945190845af43d156101a6573d9161016e836102dd565b9261017c6040519485610292565b83523d5f602085013e6102f8565b505b60805260405161018d908161035782396080518160460152f35b6060916102f8565b9291506020833d6020116101ef575b816101ca60209383610292565b810103126101eb575f80916101e161018a956102c9565b9394509150610150565b5f80fd5b3d91506101bd565b6040513d5f823e3d90fd5b505050341561018c5763b398979f60e01b5f5260045ffd5b634c9c8ce360e01b5f9081526001600160a01b0391909116600452602490fd5b90506020813d60201161026c575b8161025560209383610292565b810103126101eb57610266906102c9565b5f6100f5565b3d9150610248565b631933b43b60e21b5f9081526001600160a01b038416600452602490fd5b601f909101601f19168101906001600160401b038211908210176102b557604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101eb57565b6001600160401b0381116102b557601f01601f191660200190565b9061031c575080511561030d57805190602001fd5b63d6bda27560e01b5f5260045ffd5b8151158061034d575b61032d575090565b639996b31560e01b5f9081526001600160a01b0391909116600452602490fd5b50803b1561032556fe60806040527f5c60da1b000000000000000000000000000000000000000000000000000000006080526020608060048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa8015610107575f9015610163575060203d602011610100575b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f820116608001906080821067ffffffffffffffff8311176100d3576100ce91604052608001610112565b610163565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b503d610081565b6040513d5f823e3d90fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80602091011261015f5760805173ffffffffffffffffffffffffffffffffffffffff8116810361015f5790565b5f80fd5b5f8091368280378136915af43d5f803e1561017c573d5ff35b3d5ffdfea164736f6c634300081c000aa164736f6c634300081c000af0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00