0 txs
679 calls
constructor
constructor()
functions
CLIENT_ID_CUSTOMIZER_ROLE
viewfunction CLIENT_ID_CUSTOMIZER_ROLE() view returns (bytes32)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getClient
viewfunction getClient(string clientId) view returns (address)
getCommitment
viewfunction getCommitment(bytes32 hashedPath) view returns (bytes32)
getCounterparty
viewfunction getCounterparty(string clientId) view returns (tuple)
getGovAdmin
viewfunction getGovAdmin() view returns (address)
getIBCApp
viewfunction getIBCApp(string portId) view returns (address)
getLightClientMigratorRole
purefunction getLightClientMigratorRole(string clientId) pure returns (bytes32)
getNextClientSeq
viewfunction getNextClientSeq() view returns (uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getTimelockedAdmin
viewfunction getTimelockedAdmin() view returns (address)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isAdmin
viewfunction isAdmin(address account) view returns (bool)
PORT_CUSTOMIZER_ROLE
viewfunction PORT_CUSTOMIZER_ROLE() view returns (bytes32)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
RELAYER_ROLE
viewfunction RELAYER_ROLE() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
ackPacket
nonpayablefunction ackPacket(tuple msg_)
addClient
nonpayablefunction addClient(tuple counterpartyInfo, address client) returns (string)
addClient
nonpayablefunction addClient(string clientId, tuple counterpartyInfo, address client) returns (string)
addIBCApp
nonpayablefunction addIBCApp(address app)
addIBCApp
nonpayablefunction addIBCApp(string portId, address app)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address timelockedAdmin)
migrateClient
nonpayablefunction migrateClient(string subjectClientId, string substituteClientId)
multicall
nonpayablefunction multicall(bytes[] data) returns (bytes[] results)
recvPacket
nonpayablefunction recvPacket(tuple msg_)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
sendPacket
nonpayablefunction sendPacket(tuple msg_) returns (uint64)
setGovAdmin
nonpayablefunction setGovAdmin(address newGovAdmin)
setTimelockedAdmin
nonpayablefunction setTimelockedAdmin(address newTimelockedAdmin)
submitMisbehaviour
nonpayablefunction submitMisbehaviour(string clientId, bytes misbehaviourMsg)
timeoutPacket
nonpayablefunction timeoutPacket(tuple msg_)
updateClient
nonpayablefunction updateClient(string clientId, bytes updateMsg) returns (uint8)
upgradeClient
nonpayablefunction upgradeClient(string clientId, bytes upgradeMsg)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
events
AckPacket
event AckPacket(string indexed clientId, uint256 indexed sequence, (uint64 sequence, string sourceClient, string destClient, uint64 timeoutTimestamp, (string sourcePort, string destPort, string version, string encoding, bytes value)[] payloads) packet, bytes acknowledgement)
IBCAppAdded
event IBCAppAdded(string portId, address app)
IBCAppRecvPacketCallbackError
event IBCAppRecvPacketCallbackError(bytes reason)
ICS02ClientAdded
event ICS02ClientAdded(string clientId, (string clientId, bytes[] merklePrefix) counterpartyInfo)
ICS02ClientMigrated
event ICS02ClientMigrated(string subjectClientId, string substituteClientId)
ICS02MisbehaviourSubmitted
event ICS02MisbehaviourSubmitted(string clientId, bytes misbehaviourMsg)
Initialized
event Initialized(uint64 version)
Noop
event Noop()
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)
SendPacket
event SendPacket(string indexed clientId, uint256 indexed sequence, (uint64 sequence, string sourceClient, string destClient, uint64 timeoutTimestamp, (string sourcePort, string destPort, string version, string encoding, bytes value)[] payloads) packet)
TimeoutPacket
event TimeoutPacket(string indexed clientId, uint256 indexed sequence, (uint64 sequence, string sourceClient, string destClient, uint64 timeoutTimestamp, (string sourcePort, string destPort, string version, string encoding, bytes value)[] payloads) packet)
Upgraded
event Upgraded(address indexed implementation)
WriteAcknowledgement
event WriteAcknowledgement(string indexed clientId, uint256 indexed sequence, (uint64 sequence, string sourceClient, string destClient, uint64 timeoutTimestamp, (string sourcePort, string destPort, string version, string encoding, bytes value)[] payloads) packet, bytes[] acknowledgements)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
DefaultAdminRoleCannotBeGranted
error DefaultAdminRoleCannotBeGranted()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
FailedCall
error FailedCall()
IBCAppNotFound
error IBCAppNotFound(string portId)
IBCAsyncAcknowledgementNotSupported
error IBCAsyncAcknowledgementNotSupported()
IBCClientAlreadyExists
error IBCClientAlreadyExists(string clientId)
IBCClientNotFound
error IBCClientNotFound(string clientId)
IBCCounterpartyClientNotFound
error IBCCounterpartyClientNotFound(string counterpartyClientId)
IBCErrorUniversalAcknowledgement
error IBCErrorUniversalAcknowledgement()
IBCFailedCallback
error IBCFailedCallback()
IBCInvalidClientId
error IBCInvalidClientId(string clientId)
IBCInvalidCounterparty
error IBCInvalidCounterparty(string expected, string actual)
IBCInvalidPortIdentifier
error IBCInvalidPortIdentifier(string portId)
IBCInvalidTimeoutDuration
error IBCInvalidTimeoutDuration(uint256 maxTimeoutDuration, uint256 actualTimeoutDuration)
IBCInvalidTimeoutTimestamp
error IBCInvalidTimeoutTimestamp(uint256 timeoutTimestamp, uint256 comparedTimestamp)
IBCMultiPayloadPacketNotSupported
error IBCMultiPayloadPacketNotSupported()
IBCPacketAcknowledgementAlreadyExists
error IBCPacketAcknowledgementAlreadyExists(bytes path)
IBCPacketCommitmentAlreadyExists
error IBCPacketCommitmentAlreadyExists(bytes path)
IBCPacketCommitmentMismatch
error IBCPacketCommitmentMismatch(bytes32 expected, bytes32 actual)
IBCPacketReceiptMismatch
error IBCPacketReceiptMismatch(bytes32 expected, bytes32 actual)
IBCPortAlreadyExists
error IBCPortAlreadyExists(string portId)
IBCUnauthorizedSender
error IBCUnauthorizedSender(address caller)
InvalidInitialization
error InvalidInitialization()
InvalidMerklePrefix
error InvalidMerklePrefix(bytes[] prefix)
NoAcknowledgements
error NoAcknowledgements()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
StringsInsufficientHexLength
error StringsInsufficientHexLength(uint256 value, uint256 length)
Unauthorized
error Unauthorized()
Unreachable
error Unreachable()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
creation bytecode
0x60a080604052346100c257306080525f516020615c2e5f395f51905f525460ff8160401c166100b3576002600160401b03196001600160401b03821601610060575b604051615b6790816100c78239608051818181611457015261150d0152f35b6001600160401b0319166001600160401b039081175f516020615c2e5f395f51905f525581527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a15f80610041565b63f92ee8a960e01b5f5260045ffd5b5f80fdfe6080806040526004361015610012575f80fd5b5f905f3560e01c90816301ffc9a7146123fc57508063075beb64146122f25780631bca011a1461224e5780631ec43e231461213b5780632447af2914612105578063248a9ca3146120bb57806324d7806c1461202857806327f146f314611fec5780632f2ff15d14611f61578063340cbac414611e2e578063365388a214611de957806336568abe14611d8c5780634b720d5b14611c4b5780634d6e7ce3146118175780634f1ef286146114cf57806352d1902d1461143d57806354a5979b146113f85780635ebd10ca146113825780635f516889146112355780636fbf80791461114a5780637795820c146111015780637eb78932146110b457806391d148541461104b578063926d7d7f146110115780639e2e5c8314610f0c5780639ea7ff9914610bd1578063a217fddf14610bb5578063ac9650d814610a58578063ad3cb1cc146109f7578063b0777bfa14610984578063b0830ab914610940578063b98c330a14610890578063c4d66de8146105f1578063d3352436146105b6578063d547741f1461054f578063df5426a214610514578063e3cb36a0146102675763f4b1b9c6146101c0575f80fd5b3461025457806101e56001600160a01b036101da36612660565b939294919094613c2d565b1691823b1561026257610232928492836040518096819582947f8a8e4c5d0000000000000000000000000000000000000000000000000000000084526020600485015260248401916127e2565b03925af18015610257576102435750f35b8161024d91612547565b6102545780f35b80fd5b6040513d84823e3d90fd5b505050fd5b5034610254576040600319360112610254576004359067ffffffffffffffff82116102545760406003198336030112610254576102a26124b0565b916102ab614bed565b927f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a44960254915f1983146104e757600183017f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a449602558383807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008110156104bc575b50806d04ee2d6d415b85acef8100000000600a9210156104a1575b662386f26fc1000081101561048d575b6305f5e10081101561047c575b61271081101561046d575b606481101561045f575b1015610457575b6001810193600a5f1960216103a561038f8961256a565b9861039d6040519a8b612547565b808a5261256a565b94601f1960208a0196013687378801015b01917f30313233343536373839616263646566000000000000000000000000000000008282061a8353049081156103f257600a905f19906103b6565b505061045395602095866104369361043f9760405199858b9651918291018588015e85019083820190858252519283915e010190815203601f198101865285612547565b60040183614df1565b6040519182916020835260208301906125da565b0390f35b600101610378565b606460029104920191610371565b61271060049104920191610367565b6305f5e1006008910492019161035c565b662386f26fc100006010910492019161034f565b6d04ee2d6d415b85acef81000000006020910492019161033f565b604092507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000090049050600a610324565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b503461025457806003193601126102545760206040517f1847ed6e688b00b58f7e764e924810488954afc87ff57a9bd46989d55e220b4a8152f35b5034610254576040600319360112610254576105b260043561056f6124b0565b906105ad6105a8825f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b61481d565b61448d565b5080f35b503461025457806003193601126102545760206040517f096b77bf22504ea02e56ca151e761dc4056f6deffcbf73f5a30a309469e1f6e68152f35b50346102545760206003193601126102545761060b61249a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549060ff8260401c16159167ffffffffffffffff811680159081610888575b600114908161087e575b159081610875575b5061084d5790818360017fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000061075c9516177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556107f8575b506106be615930565b6106c6615930565b6106ce615930565b6106d6615930565b6106de615930565b6106e6615930565b6001600160a01b0381167fffffffffffffffffffffffff00000000000000000000000000000000000000007fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b005416177fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0055614574565b506107645780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b7fffffffffffffffffffffffffffffffffffffffffffffff0000000000000000001668010000000000000001177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00555f6106b5565b6004847ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f61065d565b303b159150610655565b84915061064b565b50346102545761090d6108a23661262d565b6108aa614721565b7fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc483527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052604083205f805260205260ff60405f2054161561093357613ffe565b807f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d80f35b61093b614795565b613ffe565b5034610254576020600319360112610254576004359067ffffffffffffffff821161025457602061097c61097736600486016125bc565b613f89565b604051908152f35b5034610254576020600319360112610254576004359067ffffffffffffffff8211610254576104536109c26109bc36600486016125ff565b90613e96565b6040519182916020835260206109e3825160408387015260608601906125da565b910151601f198483030160408501526126b2565b503461025457806003193601126102545750610453604051610a1a604082612547565b600581527f352e302e3000000000000000000000000000000000000000000000000000000060208201526040519182916020835260208301906125da565b5034610254576020600319360112610254576004359067ffffffffffffffff821161025457366023830112156102545781600401359067ffffffffffffffff821161025457602483013660248460051b86010111610bb1576040516020610abf8183612547565b83825280820192601f198201368537610ad786612879565b96610ae56040519889612547565b868852601f19610af488612879565b0183875b828110610ba157505050855b87811015610b8e57600190610b7288808989610b5e8a610b2c60248960051b8c01018c612791565b9190946040519483869484860198893784019083820190898252519283915e010185815203601f198101835282612547565b5190305af4610b6b613606565b90306158a4565b610b7c828c6128d8565b52610b87818b6128d8565b5001610b04565b604051848152806104538187018c6126b2565b606082828d010152018490610af8565b5080fd5b5034610254578060031936011261025457602090604051908152f35b503461025457610be036612660565b610bf56105a861097795949395368587612586565b610bff8284613c2d565b50610c0a8185613c2d565b610c148385613e96565b50610c1f8286613e96565b610c29848661327b565b815180519067ffffffffffffffff8211610edf57610c5182610c4b8554613cb4565b85613d1b565b6020908a601f8411600114610e7757928060209593610c869360019692610dd7575b50505f198260011b9260031b1c19161790565b81555b01910151906020825192610c9d8484613d60565b019088526020882088915b838310610d6a575050505093610d64917f463efa06bb86a991e2699ec804ab65d99abe14cc1466de129e9da101cd39e95c956001600160a01b03604051868882376020818881017f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a44960081520301902091167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055610d566040519586956040875260408701916127e2565b9184830360208601526127e2565b0390a180f35b805180519067ffffffffffffffff8211610e4a57610d9282610d8c8654613cb4565b86613d1b565b6020908c601f8411600114610de2578360019592946020948796610dc89492610dd75750505f198260011b9260031b1c19161790565b85555b01920192019190610ca8565b015190505f80610c73565b9190601f198416868452828420935b818110610e325750936020936001969387969383889510610e1a575b505050811b018555610dcb565b01515f1960f88460031b161c191690555f8080610e0d565b92936020600181928786015181550195019301610df1565b60248c7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b50838b52818b209190601f1984168c5b818110610ec757509260019491928593836020989610610eaf575b505050811b018155610c89565b01515f1960f88460031b161c191690555f8080610ea2565b92936020600181928786015181550195019301610e87565b60248a7f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b503461100d57610f1b36612660565b939291906001600160a01b03610f318385613c2d565b16803b1561100d575f60405180927fddba653700000000000000000000000000000000000000000000000000000000825260206004830152818381610f7a602482018d8a6127e2565b03925af1801561100257610fc8575b50610d64907f3079017cc3f80ad654a6ff75d682b86142a2dbfcefac74196a335b7e8e21cf389495610d566040519586956040875260408701916127e2565b7f3079017cc3f80ad654a6ff75d682b86142a2dbfcefac74196a335b7e8e21cf38945090610ff95f610d6493612547565b5f945090610f89565b6040513d5f823e3d90fd5b5f80fd5b3461100d575f60031936011261100d5760206040517fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc48152f35b3461100d57604060031936011261100d576110646124b0565b6004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526001600160a01b0360405f2091165f52602052602060ff60405f2054166040519015158152f35b3461100d57602060031936011261100d5760043567ffffffffffffffff811161100d576110f06110ea60209236906004016125ff565b90613c2d565b6001600160a01b0360405191168152f35b3461100d57602060031936011261100d576004355f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600602052602060405f2054604051908152f35b3461100d576111a760206111686001600160a01b036101da36612660565b16905f6040518096819582947f0bece35600000000000000000000000000000000000000000000000000000000845288600485015260248401916127e2565b03925af1908115611002575f916111fa575b5060405160038210156111cd576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b90506020813d60201161122d575b8161121560209383612547565b8101031261100d5751600381101561100d57816111b9565b3d9150611208565b3461100d57604060031936011261100d5760043567ffffffffffffffff811161100d576112669036906004016125ff565b61126e6124b0565b90611277614721565b335f9081527fbe71605159609bf7cedf18a6c3c0c5f604a505e8e3d3025e89dee6c315d18c33602052604090205460ff16156113325782816112c28161130d96611308951515613be4565b6112e481836112dd6112d5368484612586565b8051906157ee565b5015613be4565b61130181836112fc6112f7368484612586565b614c39565b613be4565b3691612586565b615200565b5f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d005b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f096b77bf22504ea02e56ca151e761dc4056f6deffcbf73f5a30a309469e1f6e660245260445ffd5b3461100d5761130d6113933661262d565b61139b614721565b5f80527fa9ed30483ca8e7e18edb58c7d68a44612fe881c88cebad0b52b41698e9844de26020527f7da75c9e7fb589ffc1546b17c72ae6e6035d0fe841dc8aedea027efb04b29e605460ff16613635576113f3614795565b613635565b3461100d575f60031936011261100d5760206001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b015416604051908152f35b3461100d575f60031936011261100d576001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114a75760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba000000000000000000000000000000000000000000000000000000005f5260045ffd5b604060031936011261100d576114e361249a565b60243567ffffffffffffffff811161100d576115039036906004016125bc565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168030149081156117e2575b506114a7576001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b005416331480156117af575b15611787576001600160a01b038216916040517f52d1902d000000000000000000000000000000000000000000000000000000008152602081600481875afa5f9181611753575b506115e957837f4c9c8ce3000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8592036117285750813b156116fd57807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b5f80a28151156116cc575f808360206116ca95519101845af46116c4613606565b916158a4565b005b5050346116d557005b7fb398979f000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4c9c8ce3000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b7faa1d49a4000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b9091506020813d60201161177f575b8161176f60209383612547565b8101031261100d575190856115b8565b3d9150611762565b7f82b42900000000000000000000000000000000000000000000000000000000005f5260045ffd5b506001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0154163314611571565b90506001600160a01b037f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141583611538565b3461100d57602060031936011261100d5760043567ffffffffffffffff811161100d5780600401906060600319823603011261100d57611855614721565b60448101916001600160a01b0361187e611878611872868561270a565b80612791565b906132b3565b163303611c1f5760246118946109bc8380612791565b519201906118c26118a483612864565b42906118af85612864565b9067ffffffffffffffff4291161161333a565b620151806118e24267ffffffffffffffff6118dc86612864565b1661337c565b116118f94267ffffffffffffffff6118dc86612864565b90611bed5750602061190b8280612791565b919082604051938492833781017f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476018152030190209267ffffffffffffffff8454169467ffffffffffffffff8614611bc05767ffffffffffffffff60016119a897011694857fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000008254161790556119a08380612791565b969094612864565b6040948551976119b8878a612547565b60018952601f1987015f5b818110611b8a5750509267ffffffffffffffff8899936119f9611a2194611a30978b519d8e6119f1816124c6565b523691612586565b9660208c01978852898c01521660608a01528260808a0152611a1c36918761270a565b6129a8565b611a2a826128cb565b526128cb565b50611a48815167ffffffffffffffff8751169061533c565b6020815191012090815f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e0747600602052611a93845f205415915167ffffffffffffffff8851169061533c565b9015611b495750937fab3a4458a269be61dfa43faa33aa7b1f5d570716f83ad078bc2ba5dab039abae611b1d611b008694602098611ad0866153b6565b905f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476008a52875f205580612791565b90818751928392833781015f815203902092855191829182613389565b0390a35f7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d51908152f35b611b869084519182917f91ffd9240000000000000000000000000000000000000000000000000000000083526020600484015260248301906125da565b0390fd5b8089602080938e6060845194611b9f866124c6565b818652818587015285015260608085015260606080850152010152016119c3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f715fed60000000000000000000000000000000000000000000000000000000005f526201518060045260245260445ffd5b7fbe2f2b45000000000000000000000000000000000000000000000000000000005f523360045260245ffd5b3461100d57602060031936011261100d57611c6461249a565b611c6c614721565b6001600160a01b0381169081611c82602a61256a565b90611c906040519283612547565b602a8252611c9e602a61256a565b601f19602084019101368237825115611d5f5760309053815160011015611d5f576078602183015360295b60018111611d115750611ce05761130d9250615200565b827fe22e27eb000000000000000000000000000000000000000000000000000000005f52600452601460245260445ffd5b90600f81166010811015611d5f577f3031323334353637383961626364656600000000000000000000000000000000901a611d4c8385614c28565b5360041c908015611bc0575f1901611cc9565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b3461100d57604060031936011261100d57611da56124b0565b336001600160a01b03821603611dc1576116ca9060043561448d565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461100d575f60031936011261100d5760206001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b005416604051908152f35b3461100d57602060031936011261100d57611e4761249a565b6001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b00541633148015611f2e575b15611787576116ca90611eb76001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0154166143c2565b506001600160a01b0381167fffffffffffffffffffffffff00000000000000000000000000000000000000007fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b015416177fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0155614574565b506001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0154163314611e7b565b3461100d57604060031936011261100d57600435611f7d6124b0565b8115611fc45781611fbf6105a86116ca945f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b61463c565b7f13909ba6000000000000000000000000000000000000000000000000000000005f5260045ffd5b3461100d575f60031936011261100d5760207f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a44960254604051908152f35b3461100d57602060031936011261100d57602061204361249a565b6001600160a01b03807fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0054169116908114908115612087575b506040519015158152f35b90506001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b015416148261207c565b3461100d57602060031936011261100d57602061097c6004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b3461100d57602060031936011261100d5760043567ffffffffffffffff811161100d576110f061187860209236906004016125ff565b3461100d57606060031936011261100d5760043567ffffffffffffffff811161100d5761216c9036906004016125bc565b6024359067ffffffffffffffff821161100d576040600319833603011261100d57604435916001600160a01b038316830361100d57335f9081527ff2c9e119400f73419cd030eb8d27dcbab1bded62e670b132f4f27472c0540ee2602052604090205460ff16156121fe576104539261043f916121ec8480511515613235565b610436846121f981614c39565b613235565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f1847ed6e688b00b58f7e764e924810488954afc87ff57a9bd46989d55e220b4a60245260445ffd5b3461100d57602060031936011261100d5760043567ffffffffffffffff811161100d5760a0600319823603011261100d5761130d9061228b614721565b5f80527fa9ed30483ca8e7e18edb58c7d68a44612fe881c88cebad0b52b41698e9844de26020527f7da75c9e7fb589ffc1546b17c72ae6e6035d0fe841dc8aedea027efb04b29e605460ff16156122e5575b600401612d1c565b6122ed614795565b6122dd565b3461100d57602060031936011261100d5761230b61249a565b6001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0054169081331480156123c9575b15611787576123526116ca926143c2565b506001600160a01b0381167fffffffffffffffffffffffff00000000000000000000000000000000000000007fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b005416177fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0055614574565b506001600160a01b037fba83ed17c16070da0debaa680185af188d82c999a75962a12a40699ca48a2b0154163314612341565b3461100d57602060031936011261100d57600435907fffffffff00000000000000000000000000000000000000000000000000000000821680920361100d57817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115612470575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483612469565b600435906001600160a01b038216820361100d57565b602435906001600160a01b038216820361100d57565b60a0810190811067ffffffffffffffff8211176124e257604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6040810190811067ffffffffffffffff8211176124e257604052565b6080810190811067ffffffffffffffff8211176124e257604052565b90601f601f19910116810190811067ffffffffffffffff8211176124e257604052565b67ffffffffffffffff81116124e257601f01601f191660200190565b9291926125928261256a565b916125a06040519384612547565b82948184528183011161100d578281602093845f960137010152565b9080601f8301121561100d578160206125d793359101612586565b90565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9181601f8401121561100d5782359167ffffffffffffffff831161100d576020838186019501011161100d57565b602060031982011261100d576004359067ffffffffffffffff821161100d576003198260809203011261100d5760040190565b604060031982011261100d5760043567ffffffffffffffff811161100d578161268b916004016125ff565b929092916024359067ffffffffffffffff821161100d576126ae916004016125ff565b9091565b9080602083519182815201916020808360051b8301019401925f915b8383106126dd57505050505090565b90919293946020806126fb83601f19866001960301875289516125da565b970193019301919392906126ce565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff618136030182121561100d570190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561100d570180359067ffffffffffffffff821161100d57602001918160051b3603831361100d57565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18136030182121561100d570180359067ffffffffffffffff821161100d5760200191813603831361100d57565b601f8260209493601f1993818652868601375f8582860101520116010190565b9290921561280f57505050565b6128529291611b86916040519485947f9fff831f0000000000000000000000000000000000000000000000000000000086526040600487015260448601906125da565b916003198584030160248601526127e2565b3567ffffffffffffffff8116810361100d5790565b67ffffffffffffffff81116124e25760051b60200190565b604080519091906128a28382612547565b6001815291601f1901825f5b8281106128ba57505050565b8060606020809385010152016128ae565b805115611d5f5760200190565b8051821015611d5f5760209160051b010190565b359067ffffffffffffffff8216820361100d57565b919082604091031261100d576040516129198161250f565b602061293281839561292a816128ec565b8552016128ec565b910152565b906125d79160208152606061299361295b845160a0602086015260c08501906125da565b602085810151805167ffffffffffffffff90811660408801529101511660608501526040850151601f198583030160808601526126b2565b9201519060a0601f19828503019101526125da565b919060a08382031261100d57604051906129c1826124c6565b8193803567ffffffffffffffff811161100d57826129e09183016125bc565b8352602081013567ffffffffffffffff811161100d5782612a029183016125bc565b6020840152604081013567ffffffffffffffff811161100d5782612a279183016125bc565b6040840152606081013567ffffffffffffffff811161100d5782612a4c9183016125bc565b606084015260808101359167ffffffffffffffff831161100d5760809261293292016125bc565b6125d7916080612acb612ab9612aa7612a95865160a0875260a08701906125da565b602087015186820360208801526125da565b604086015185820360408701526125da565b606085015184820360608601526125da565b9201519060808184039101526125da565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561100d57016020813591019167ffffffffffffffff821161100d57813603831361100d57565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561100d57016020813591019167ffffffffffffffff821161100d578160051b3603831361100d57565b9067ffffffffffffffff612b92836128ec565b168152612bfd612bd7612bbc612bab6020860186612adc565b60a0602087015260a08601916127e2565b612bc96040860186612adc565b9085830360408701526127e2565b9267ffffffffffffffff612bed606083016128ec565b1660608401526080810190612b2c565b9290916080818303910152828152602081019260208160051b83010193835f917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6182360301945b848410612c55575050505050505090565b90919293949596601f1982820301835287358781121561100d576020612d0b6001938783940190612cfd612cf2612cd7612cbc612ca3612c958780612adc565b60a0885260a08801916127e2565b612caf89880188612adc565b908783038b8901526127e2565b612cc96040870187612adc565b9086830360408801526127e2565b612ce46060860186612adc565b9085830360608701526127e2565b926080810190612adc565b9160808185039101526127e2565b990193019401929195949390612c44565b6001612d35612d2b838061270a565b608081019061273d565b90500361320d57612d49612d2b828061270a565b15611d5f57612d5981839261270a565b5f6020612edf81612d796109bc612d70888061270a565b83810190612791565b612dbd8151838151910120612d9e611301612d948b8061270a565b6040810190612791565b84815191012014825190612db5612d948b8061270a565b929091612802565b612df1612dec612dd0612d948a8061270a565b9190612de4612ddf8c8061270a565b612864565b923691612586565b614896565b90612e6a612e46612e2e8a612e1561130188612e0b612891565b93019e8f90612791565b612e1e826128cb565b52612e28816128cb565b50614927565b93612e3c60408c018c612791565b9690940151614a4c565b916040519387850152868452612e5d604085612547565b604051946113018661252b565b8352612e793660608a01612901565b85840152604083015260608201526001600160a01b03612ea86110ea612e9f898061270a565b86810190612791565b16906040519485809481937f682ed5f000000000000000000000000000000000000000000000000000000000835260048301612937565b03925af18015611002576131de575b50612f01612efc838061270a565b614b0a565b156131b5576001600160a01b03612f1b6118788380612791565b16612f33612f29848061270a565b6020810190612791565b612f43612d94868096949661270a565b612f53612ddf888095949561270a565b91612f5e8989612791565b9790916040519560c087019487861067ffffffffffffffff8711176124e257612f96612fbf94612f9f94612fce986040523691612586565b88523691612586565b956020860196875267ffffffffffffffff604087019516855236906129a8565b96606085019788523691612586565b6080830190815260a0830191338352853b1561100d5760405196879586957f428e4e170000000000000000000000000000000000000000000000000000000087526004870160209052516024870160c0905260e4870161302d916125da565b9051908681037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc016044880152613063916125da565b915167ffffffffffffffff16606486015251908481037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc0160848601526130a991612a73565b9051908381037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc0160a48501526130df916125da565b90516001600160a01b031660c483015203815a5f948591f18015611002576131a0927ff9bab74bcdb634f4d3dd064cc42a13df056598e1c0336905d2f5750fbfb08b7b92613190926131a5575b5061313a612f29828061270a565b94909561315e61314d612ddf858061270a565b91613158858061270a565b94612791565b96909781604051928392833781015f81520390209567ffffffffffffffff604051958695604087526040870190612b7f565b92858403602087015216976127e2565b0390a3565b5f6131af91612547565b5f61312c565b5050507fd08bf58b0e4eec5bfc697a4fdbb6839057fbf4dd06f1b1ce07445c0e5a654caf5f80a1565b6020813d602011613205575b816131f760209383612547565b8101031261100d5751612eee565b3d91506131ea565b7f356f4dbd000000000000000000000000000000000000000000000000000000005f5260045ffd5b1561323d5750565b611b86906040519182917f4870bd740000000000000000000000000000000000000000000000000000000083526020600484015260248301906125da565b60209082604051938492833781017f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a44960181520301902090565b6001600160a01b03604051838382376020818581017fc5779f3c2c21083eefa6d04f6a698bc0d8c10db124ad5e0df6ef394b6d7bf60081520301902054169182156132fd57505090565b611b866040519283927fa09dbf590000000000000000000000000000000000000000000000000000000084526020600485015260248401916127e2565b15613343575050565b67ffffffffffffffff907f65d30129000000000000000000000000000000000000000000000000000000005f521660045260245260445ffd5b91908203918211611bc057565b906020825267ffffffffffffffff815116602083015260806133d36133bd602084015160a0604087015260c08601906125da565b6040840151601f198683030160608701526125da565b9167ffffffffffffffff6060820151168285015201519160a0601f1982840301910152815180825260208201916020808360051b8301019401925f915b83831061341f57505050505090565b909192939460208061343d83601f1986600196030187528951612a73565b97019301930191939290613410565b919060a08382031261100d57604051613464816124c6565b809361346f816128ec565b8252602081013567ffffffffffffffff811161100d57836134919183016125bc565b6020830152604081013567ffffffffffffffff811161100d57836134b69183016125bc565b60408301526134c7606082016128ec565b606083015260808101359067ffffffffffffffff821161100d57019180601f8401121561100d5782356134f981612879565b936135076040519586612547565b81855260208086019260051b8201019183831161100d5760208201905b83821061353657505050505060800152565b813567ffffffffffffffff811161100d57602091613559878480948801016129a8565b815201910190613524565b9060806001600160a01b03816135c161359b613589875160a0885260a08801906125da565b602088015187820360208901526125da565b67ffffffffffffffff604088015116604087015260608701518682036060880152612a73565b9401511691015290565b604051906135da604083612547565b602082527f4774d4a575993f963b1c06573736617a457abef8589178db8d10c94b4ab511ab6020830152565b3d15613630573d906136178261256a565b916136256040519384612547565b82523d5f602084013e565b606090565b6001613644612d2b838061270a565b90500361320d57613658612d2b828061270a565b15611d5f57806136679161270a565b905f602061376e8161367f6109bc612d94878061270a565b6136b1815183815191012061369a611301612e9f8a8061270a565b84815191012014825190612db5612e9f8a8061270a565b6136da6136c960606136c3898061270a565b01612864565b42906118af60606136c38b8061270a565b61370a6137056136f66136ed898061270a565b85810190612791565b9190612de4612ddf8b8061270a565b61533c565b90613739612e4661372c613727366137228c8061270a565b61344c565b6153b6565b93612e3c868b018b612791565b83526137483660408901612901565b85840152604083015260608201526001600160a01b03612ea86110ea612d94888061270a565b03925af1801561100257613bb5575b5061379061378b828061270a565b61561b565b15613b8d575f806138636137a2612891565b9467ffffffffffffffff61381b6001600160a01b036137c76118786020860186612791565b16926137d6612f29898061270a565b93906138098a612ddf612f966137fb6137f2612d94858061270a565b9390948061270a565b94604051996113018b6124c6565b602086015216604084015236906129a8565b60608201523360808201526040519485809481937f078c4a79000000000000000000000000000000000000000000000000000000008352602060048401526024830190613564565b03925af15f9181613b11575b50613a86575061387d613606565b805115613a5e576138bd7fb9edb487876e8be10f54e377c1a815a54ad92a6db1c9561dfe8fad2f0d1da84f916040519182916020835260208301906125da565b0390a16138c86135cb565b6138d1836128cb565b526138db826128cb565b505b6138e7818061270a565b60408101613956612de4612dec61390f612dec6139048688612791565b9190612de489612864565b6020815191012094855f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060205261394e60405f2054159582612791565b939091612864565b9015613a20575061396683614927565b905f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060205260405f20557f76765590e2b799b0506100f8a6610cfecab2c71e8e1f8aa981b099aff0dfdb74613a106131a06139c6612d94858061270a565b6139e06139d9612ddf888096959661270a565b968061270a565b9281604051928392833781015f81520390209467ffffffffffffffff604051948594604086526040860190612b7f565b91848303602086015216966126b2565b611b86906040519182917f40470d740000000000000000000000000000000000000000000000000000000083526020600484015260248301906125da565b7fadef7fb8000000000000000000000000000000000000000000000000000000005f5260045ffd5b805115613ae95780516020820120613a9c6135cb565b6020815191012014613ac157613ab1836128cb565b52613abb826128cb565b506138dd565b7f6b2675e3000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fecfef798000000000000000000000000000000000000000000000000000000005f5260045ffd5b9091503d805f833e613b238183612547565b81019060208183031261100d5780519067ffffffffffffffff821161100d570181601f8201121561100d57805190613b5a8261256a565b92613b686040519485612547565b8284526020838301011161100d57815f9260208093018386015e83010152905f61386f565b50507fd08bf58b0e4eec5bfc697a4fdbb6839057fbf4dd06f1b1ce07445c0e5a654caf5f80a1565b6020813d602011613bdc575b81613bce60209383612547565b8101031261100d575161377d565b3d9150613bc1565b91909115613bf0575050565b611b866040519283927f14d712470000000000000000000000000000000000000000000000000000000084526020600485015260248401916127e2565b6001600160a01b03604051838382376020818581017f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a4496008152030190205416918215613c7757505090565b611b866040519283927fa0db16fe0000000000000000000000000000000000000000000000000000000084526020600485015260248401916127e2565b90600182811c92168015613cfb575b6020831014613cce57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691613cc3565b818110613d10575050565b5f8155600101613d05565b9190601f8111613d2a57505050565b613d54925f5260205f20906020601f840160051c83019310613d56575b601f0160051c0190613d05565b565b9091508190613d47565b906801000000000000000081116124e257815491818155828210613d8357505050565b5f5260205f2091820191015b818110613d9a575050565b80613da760019254613cb4565b80613db4575b5001613d8f565b601f81118314613dc957505f81555b5f613dad565b613de590825f5283601f60205f20920160051c82019101613d05565b805f525f6020812081835555613dc3565b5f9291815491613e0583613cb4565b8083529260018116908115613e5a5750600114613e2157505050565b5f9081526020812093945091925b838310613e40575060209250010190565b600181602092949394548385870101520191019190613e2f565b905060209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b60606020604051613ea68161250f565b8281520152613eb5828261327b565b91600160405193613ec58561250f565b604051613edd81613ed68185613df6565b0382612547565b8552018054613eeb81612879565b91613ef96040519384612547565b81835260208301905f5260205f205f915b838310613f645750505050602084015282515115613f2757505090565b611b866040519283927fdf95155a0000000000000000000000000000000000000000000000000000000084526020600485015260248401916127e2565b600160208192604051613f7b81613ed68189613df6565b815201920192019190613f0a565b6020613ff881604051613f9d604082612547565b601b815201927f4c494748545f434c49454e545f4d49475241544f525f524f4c455f00000000008452603b604051938492601b82850197885e8284015f8152815192839201905e8201015f815203601f198101835282612547565b51902090565b600161400d612d2b838061270a565b90500361320d57614021612d2b828061270a565b15611d5f57806140309161270a565b9060206140436109bc612d70848061270a565b614075815183815191012061405e611301612d94878061270a565b84815191012014825190612db5612d94878061270a565b6140b561409f61409a61408b612d94878061270a565b9190612de4612ddf898061270a565b6156fd565b6140ab84860186612791565b9490930151614a4c565b916040516060810181811067ffffffffffffffff8211176124e257602093614193936140e5926040523691612586565b81526141715f6140f83660408901612901565b92858101938452604081019687526141c36001600160a01b0361412a6110ea6141218c8061270a565b8a810190612791565b1694604051988997889687957f4d6d9ffb0000000000000000000000000000000000000000000000000000000087528b6004880152516080602488015260a48701906125da565b9251604486019067ffffffffffffffff60208092828151168552015116910152565b517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8483030160848501526126b2565b03925af18015611002575f9061438e575b61420a915067ffffffffffffffff6141f160606136c3868061270a565b1681101561420460606136c3868061270a565b9061333a565b614217612efc828061270a565b15613b8d57816142986001600160a01b0361423e6118788467ffffffffffffffff97612791565b169161424d612f29858061270a565b959061428661425f612d94888061270a565b61427d61426f612ddf8b8061270a565b946040519b6113018d6124c6565b8a523691612586565b602088015216604086015236906129a8565b6060840152336080840152803b1561100d576142ef5f939184926040519586809481937f5e32b6b6000000000000000000000000000000000000000000000000000000008352602060048401526024830190613564565b03925af19182156110025767ffffffffffffffff9261437e575b507f01e5ed58494819ef3f6480dd08e433b7c08ed75c7abdf2c22c6f04b71340a168614338612f29838061270a565b61435261434b612ddf868098959861270a565b948061270a565b9481604051928392833781015f8152039020926131a06040519283926020845216956020830190612b7f565b5f61438891612547565b5f614309565b506020813d6020116143ba575b816143a860209383612547565b8101031261100d5761420a90516141d4565b3d915061439b565b6001600160a01b0381165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff1615614488576001600160a01b03165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690553391907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b8180a4600190565b505f90565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260ff60405f2054165f1461456e57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541690556001600160a01b03339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b50505f90565b6001600160a01b0381165f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16614488576001600160a01b03165f8181527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790553391907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8180a4600190565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260ff60405f205416155f1461456e57805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0383165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008254161790556001600160a01b03339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005c61476d5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005d565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b335f9081527fa9ed30483ca8e7e18edb58c7d68a44612fe881c88cebad0b52b41698e9844de2602052604090205460ff16156147cd57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fe2b7fb3b832174769106daebcfd6d1970523240dda11281102db9363b83b0dc460245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f206001600160a01b0333165f5260205260ff60405f205416156148675750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b60096125d7916020937fffffffffffffffff000000000000000000000000000000000000000000000000856040519687948051918291018387015e840101917f0300000000000000000000000000000000000000000000000000000000000000835260c01b1660018201520301601f198101835282612547565b60209291908391805192839101825e019081520190565b90815115614a245760209160405161493f8482612547565b5f8152905f915b81518310156149ab57845f8161495c86866128d8565b51604051918183925191829101835e8101838152039060025afa15611002576001906149a35f51916149956040519384928a8401614910565b03601f198101835282612547565b920191614946565b90505f9150929192604051614a0460218286808201957f020000000000000000000000000000000000000000000000000000000000000087528051918291018484015e810186838201520301601f198101835282612547565b604051918291518091835e8101838152039060025afa15611002575f5190565b7f760d6a9b000000000000000000000000000000000000000000000000000000005f5260045ffd5b90815115614acf5781515f198101908111611bc0576020918280614a73614aa994876128d8565b51926040519584879551918291018487015e8401908282015f8152815193849201905e01015f815203601f198101835282612547565b81515f198101908111611bc057614acb91614ac482856128d8565b52826128d8565b5090565b6040517fa7c34e4f0000000000000000000000000000000000000000000000000000000081526020600482015280611b8660248201856126b2565b614b28613705614b1d6020840184612791565b9190612de485612864565b6020815191012090815f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060205260405f20548015614be657614b7f613727614b75613727368661344c565b831493369061344c565b9115614bb85750505f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e07476006020525f6040812055600190565b7f3f87a2ec000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b5050505f90565b60405190614bfc604083612547565b600782527f636c69656e742d000000000000000000000000000000000000000000000000006020830152565b908151811015611d5f570160200190565b805160048110908115614de6575b5061448857614c8d604051614c5d604082612547565b600881527f6368616e6e656c2d000000000000000000000000000000000000000000000000602082015282615777565b8015614dcf575b614488575f5b8151811015614dc857614cad8183614c28565b5160f81c60618110159081614dbc575b8115614d9e575b8115614d80575b8115614d41575b8115614cec575b50614ce45750505f90565b600101614c9a565b6023811491508115614d36575b8115614d2b575b8115614d20575b8115614d15575b505f614cd9565b603e9150145f614d0e565b603c81149150614d07565b605d81149150614d00565b605b81149150614cf9565b9050602e81148015614d76575b8015614d6c575b8015614d62575b90614cd2565b50602d8114614d5c565b50602b8114614d55565b50605f8114614d4e565b9050604181101580614d93575b90614ccb565b50605a811115614d8d565b9050603081101580614db1575b90614cc4565b506039811115614dab565b607a8111159150614cbd565b5050600190565b50614de1614ddb614bed565b82615777565b614c94565b60809150115f614c47565b91604051906001600160a01b03845192602081818801958087835e81017f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a44960081520301902054166151c5576001600160a01b038060405160208188518088835e81017f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a4496008152030190209216167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556020604051809285518091835e81017f515a8336edcaab4ae6524d41223c1782132890f89189ba6632107a7b5a449601815203019020614ee38280612791565b9067ffffffffffffffff82116124e257614f0182610c4b8554613cb4565b5f90601f831160011461515e579180614f3192600195945f926150e95750505f198260011b9260031b1c19161790565b81555b016020820190614f44828461273d565b9091614f508282613d60565b5f9081526020812092805b838310615078575050505050906040519160408352614faa614f8060408501866125da565b918483036020860152614fa4614f968580612adc565b6040865260408601916127e2565b93612b2c565b90916020818503910152808352602083019260208260051b82010193835f925b84841061504057505050505050917fd2c92219dbd5bb64d875319b9c59caba8dbbe581c6e3c8d3c72b4dbfe5bcb0648261500a93615011950390a1613f89565b339061463c565b1561501857565b7fe7c926c0000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919293949560208061506883601f1986600196030188526150628b88612adc565b906127e2565b9801940194019294939190614fca565b6150828183612791565b9067ffffffffffffffff82116124e2576150a6826150a08954613cb4565b89613d1b565b5f90601f83116001146150f457926150da836001959460209487965f926150e95750505f198260011b9260031b1c19161790565b88555b01950192019193614f5b565b013590505f80610c73565b601f19831691885f5260205f20925f5b818110615146575093602093600196938796938388951061512d575b505050811b0188556150dd565b5f1960f88560031b161c199101351690555f8080615120565b91936020600181928787013581550195019201615104565b601f19831691845f5260205f20925f5b8181106151ad5750916001959492918387959310615194575b505050811b018155614f34565b5f1960f88560031b161c199101351690555f8080615187565b9193602060018192878701358155019501920161516e565b6040517f87dfb2670000000000000000000000000000000000000000000000000000000081526020600482015280611b8660248201876125da565b90604051906001600160a01b03835192602081818701958087835e81017fc5779f3c2c21083eefa6d04f6a698bc0d8c10db124ad5e0df6ef394b6d7bf600815203019020541661530157916152f6916001600160a01b037fa6ec8e860960e638347460dc632fbe0175c51a5ca130e336138bbe26ff3044999416906020604051809285518091835e81017fc5779f3c2c21083eefa6d04f6a698bc0d8c10db124ad5e0df6ef394b6d7bf6008152030190206001600160a01b0382167fffffffffffffffffffffffff00000000000000000000000000000000000000008254161790556040519283926040845260408401906125da565b9060208301520390a1565b6040517f837f46a60000000000000000000000000000000000000000000000000000000081526020600482015280611b8660248201866125da565b60096125d7916020937fffffffffffffffff000000000000000000000000000000000000000000000000856040519687948051918291018387015e840101917f0100000000000000000000000000000000000000000000000000000000000000835260c01b1660018201520301601f198101835282612547565b906020916040516153c78482612547565b5f8152905f915b6080820151805184101561551d57836153e6916128d8565b51855f818351604051918183925191829101835e8101838152039060025afa15611002575f5190865f8180840151604051918183925191829101835e8101838152039060025afa15611002575f5191875f816040850151604051918183925191829101835e8101838152039060025afa15611002575f5192885f816060860151604051918183925191829101835e8101838152039060025afa1561100257885f8160808251960151604051918183925191829101835e8101838152039060025afa156110025788935f938451916040519387850195865260408501526060840152608083015260a082015260a081526154e060c082612547565b604051918291518091835e8101838152039060025afa15611002576001906155155f51916149956040519384928a8401614910565b9201916153ce565b509150929192825f816040840151604051918183925191829101835e8101838152039060025afa1561100257825f606081519301516040517fffffffffffffffff0000000000000000000000000000000000000000000000008482019260c01b1682526008815261558f602882612547565b604051918291518091835e8101838152039060025afa1561100257825f81815194604051918183925191829101835e8101838152039060025afa15611002575f91825160405191858301937f0200000000000000000000000000000000000000000000000000000000000000855260218401526041830152606182015260618152614a04608182612547565b61564b61563c61409a6156316040850185612791565b9190612de486612864565b6020815191012091369061344c565b60405161566081614995602082019485613389565b51902090805f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060205260405f2054828114614be657806156cd57505f527f1260944489272988d9df285149b5aa1b0f48f2136d6f416159f840a3e074760060205260405f2055600190565b90507f657b94fe000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b60096125d7916020937fffffffffffffffff000000000000000000000000000000000000000000000000856040519687948051918291018387015e840101917f0200000000000000000000000000000000000000000000000000000000000000835260c01b1660018201520301601f198101835282612547565b80519082518083106157e65782808210911802808318921415820282189060206157a1838561337c565b92806157c56157af8661256a565b956157bd6040519788612547565b80875261256a565b95601f19848701970136883703920101835e51902090602081519101201490565b505050505f90565b80518211801561589d575b61584657600182118061584e575b158015908160011b9182046002141715611bc05760280180602811611bc0578203615846576001600160a01b0392915f61584092615987565b90921690565b50505f905f90565b507f30780000000000000000000000000000000000000000000000000000000000007fffff00000000000000000000000000000000000000000000000000000000000060208301511614615807565b505f6157f9565b906158e157508051156158b957805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580615927575b6158f2575090565b6001600160a01b03907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b156158ea565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561595f57565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b92909260018401808511611bc057831180615a3d575b15938415948560011b9586046002141715611bc0575f948101809111611bc0579192905b8183106159d15750505060019190565b9092919360ff615a087fff000000000000000000000000000000000000000000000000000000000000006020888601015116615a8e565b16600f8111615a32578160041b9180830460101490151715611bc0576001910194019192906159c1565b505f94508493505050565b507f30780000000000000000000000000000000000000000000000000000000000007fffff00000000000000000000000000000000000000000000000000000000000060208684010151161461599d565b60f81c602f811180615b50575b15615ac8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00160ff1690565b6060811180615b46575b15615aff577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa90160ff1690565b6040811180615b3c575b15615b36577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc90160ff1690565b5060ff90565b5060478110615b09565b5060678110615ad2565b50603a8110615a9b56fea164736f6c634300081c000af0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00