0 txs
2 calls
constructor
constructor(bytes32 updateClientProgramVkey, bytes32 membershipProgramVkey, bytes32 updateClientAndMembershipProgramVkey, bytes32 misbehaviourProgramVkey, address sp1Verifier, bytes _clientState, bytes32 _consensusState, address roleManager)
functions
ALLOWED_SP1_CLOCK_DRIFT
viewfunction ALLOWED_SP1_CLOCK_DRIFT() view returns (uint16)
clientState
viewfunction clientState() view returns (string chainId, tuple trustLevel, tuple latestHeight, uint32 trustingPeriod, uint32 unbondingPeriod, bool isFrozen, uint8 zkAlgorithm)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getClientState
viewfunction getClientState() view returns (bytes)
getConsensusStateHash
viewfunction getConsensusStateHash(uint64 revisionHeight) view returns (bytes32)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
MEMBERSHIP_PROGRAM_VKEY
viewfunction MEMBERSHIP_PROGRAM_VKEY() view returns (bytes32)
MISBEHAVIOUR_PROGRAM_VKEY
viewfunction MISBEHAVIOUR_PROGRAM_VKEY() view returns (bytes32)
PROOF_SUBMITTER_ROLE
viewfunction PROOF_SUBMITTER_ROLE() view returns (bytes32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY
viewfunction UPDATE_CLIENT_AND_MEMBERSHIP_PROGRAM_VKEY() view returns (bytes32)
UPDATE_CLIENT_PROGRAM_VKEY
viewfunction UPDATE_CLIENT_PROGRAM_VKEY() view returns (bytes32)
upgradeClient
viewfunction upgradeClient(bytes) view
VERIFIER
viewfunction VERIFIER() view returns (address)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
misbehaviour
nonpayablefunction misbehaviour(bytes misbehaviourMsg)
multicall
nonpayablefunction multicall(bytes[] data) returns (bytes[] results)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
updateClient
nonpayablefunction updateClient(bytes updateMsg) returns (uint8)
verifyMembership
nonpayablefunction verifyMembership(tuple msg_) returns (uint256)
verifyNonMembership
nonpayablefunction verifyNonMembership(tuple msg_) returns (uint256)
events
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)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
CannotHandleMisbehavior
error CannotHandleMisbehavior()
ChainIdMismatch
error ChainIdMismatch(string expected, string actual)
ClientStateMismatch
error ClientStateMismatch(bytes expected, bytes actual)
ConsensusStateHashMismatch
error ConsensusStateHashMismatch(bytes32 expected, bytes32 actual)
ConsensusStateNotFound
error ConsensusStateNotFound()
ConsensusStateRootMismatch
error ConsensusStateRootMismatch(bytes32 expected, bytes32 actual)
EmptyValue
error EmptyValue()
FailedCall
error FailedCall()
FeatureNotSupported
error FeatureNotSupported()
FrozenClientState
error FrozenClientState()
InvalidMembershipProof
error InvalidMembershipProof()
KeyValuePairNotInCache
error KeyValuePairNotInCache(bytes[] path, bytes value)
LengthIsOutOfRange
error LengthIsOutOfRange(uint256 length, uint256 min, uint256 max)
MembershipProofKeyNotFound
error MembershipProofKeyNotFound(bytes[] path)
MembershipProofValueMismatch
error MembershipProofValueMismatch(bytes expected, bytes actual)
ProofHeightMismatch
error ProofHeightMismatch(uint64 expectedRevisionNumber, uint64 expectedRevisionHeight, uint64 actualRevisionNumber, uint64 actualRevisionHeight)
ProofIsInTheFuture
error ProofIsInTheFuture(uint256 now, uint256 proofTimestamp)
ProofIsTooOld
error ProofIsTooOld(uint256 now, uint256 proofTimestamp)
TrustingPeriodMismatch
error TrustingPeriodMismatch(uint256 expected, uint256 actual)
TrustingPeriodTooLong
error TrustingPeriodTooLong(uint256 trustingPeriod, uint256 unbondingPeriod)
TrustThresholdMismatch
error TrustThresholdMismatch(uint256 expectedNumerator, uint256 expectedDenominator, uint256 actualNumerator, uint256 actualDenominator)
UnbondingPeriodMismatch
error UnbondingPeriodMismatch(uint256 expected, uint256 actual)
UnknownMembershipProofType
error UnknownMembershipProofType(uint8 proofType)
UnknownZkAlgorithm
error UnknownZkAlgorithm(uint8 algorithm)
VerificationKeyMismatch
error VerificationKeyMismatch(bytes32 expected, bytes32 actual)
creation bytecode
0x61012060405234610541576137e48038038061001a81610564565b928339810161010082820312610541578151916020810151604082015160608301519061004960808501610589565b60a08501519095906001600160401b0381116105415785019080601f8301121561054157815161007b9260200161059d565b9261008d60e060c08701519601610589565b9660805260a05260c05260e05280518101906020820190602081840312610541576020810151906001600160401b038211610541570191829003601f1981019061012013610541576040519160e083016001600160401b0381118482101761052d5760405260208401516001600160401b038111610541576020908501019080601f830112156105415781516101259260200161059d565b825260408112610541576040610139610545565b916101458286016105dd565b8352610153606086016105dd565b602084015260208401928352603f19011261054157610170610545565b61017c608085016105eb565b815261018a60a085016105eb565b6020820152604083019081526101a260c085016105ff565b90606084019182526101b660e086016105ff565b92608085019384526101008601519586151587036105415760a0860196875261012001519460028610156105415760c08101958652518051906001600160401b03821161052d57600154600181811c91168015610523575b602082101461050f57601f81116104ac575b50602090601f831160011461043f5763ffffffff95949392915f9183610434575b50508160011b915f199060031b1c1916176001555b5160ff81511661ff00602060025493015160081b169161ffff191617176002555160018060401b0381511660035491602068010000000000000000600160801b0391015160401b169160018060801b031916171760035551169267ffffffff00000000600454925160201b169051151560401b92519160028310156104205769ff00000000000000000068ff00000000000000009360481b169469ff000000000000000000199160018060481b0319161716179116171760045560018060401b0360035460401c165f52600560205260405f205560018060a01b03166101005260045463ffffffff8116610708810163ffffffff811161040c5763ffffffff809360201c1692839116116103f757826001600160a01b0381166103de575061037c610706565b505b604051612fbb908161078982396080518181816105620152611531015260a0518181816102040152611eed015260c051818181610d9f0152612271015260e0518181816102ab0152610bad015261010051818181610d640152611b060152f35b806103eb6103f192610610565b50610686565b5061037e565b6333fae18560e21b5f5260045260245260445ffd5b634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b015190505f80610241565b90601f1983169160015f52815f20925f5b818110610494575091600193918563ffffffff99989796941061047c575b505050811b01600155610256565b01515f1960f88460031b161c191690555f808061046e565b92936020600181928786015181550195019301610450565b60015f527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6601f840160051c81019160208510610505575b601f0160051c01905b8181106104fa5750610220565b5f81556001016104ed565b90915081906104e4565b634e487b7160e01b5f52602260045260245ffd5b90607f169061020e565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b60408051919082016001600160401b0381118382101761052d57604052565b6040519190601f01601f191682016001600160401b0381118382101761052d57604052565b51906001600160a01b038216820361054157565b9192916001600160401b03821161052d576105c1601f8301601f1916602001610564565b938285528282011161054157815f926020928387015e84010152565b519060ff8216820361054157565b51906001600160401b038216820361054157565b519063ffffffff8216820361054157565b6001600160a01b0381165f9081525f5160206137c45f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137c45f395f51905f5260205260408120805460ff191660011790553391905f5160206137445f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206137645f395f51905f52602052604090205460ff16610681576001600160a01b03165f8181525f5160206137645f395f51905f5260205260408120805460ff191660011790553391905f5160206137a45f395f51905f52905f5160206137445f395f51905f529080a4600190565b5f80525f5160206137645f395f51905f526020525f5160206137845f395f51905f525460ff16610784575f8080525f5160206137645f395f51905f526020525f5160206137845f395f51905f52805460ff1916600117905533905f5160206137a45f395f51905f525f5160206137445f395f51905f528280a4600190565b5f9056fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610dc2575080630225293e14610d8857806308c84e7014610d385780630bece35614610c7557806323842fb814610c45578063248a9ca314610c1b5780632c3ee47414610bff5780632f2ff15d14610bd0578063314d4dff14610b9657806336568abe14610b3a5780634d6d9ffb14610a585780635972185a14610a1e578063682ed5f0146108fa5780638a8e4c5d1461085657806391d148541461080d578063a217fddf146107f3578063ac9650d814610675578063bd3ce6b014610585578063ca7242f91461054b578063d547741f14610515578063ddba653714610227578063e45a6d0d146101ed5763ef913a4b14610119575f80fd5b346101e9575f6003193601126101e9576101e560405160208082015261012060408201526101d18161014e6101608201610fb2565b60ff600254818116606085015260081c16608083015267ffffffffffffffff60035481811660a085015260401c1660c083015260ff60045463ffffffff811660e085015263ffffffff8160201c16610100850152818160401c16151561012085015260481c166101bd8161114b565b61014083015203601f198101835282611128565b604051918291602083526020830190610ee4565b0390f35b5f80fd5b346101e9575f6003193601126101e95760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101e95761023536610e60565b6004549160ff8360401c166104ed575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47546102a3929060ff16156104e0575b8101906111c5565b6102d28151517f0000000000000000000000000000000000000000000000000000000000000000808214611275565b6020815101518051810160208101916020818303126101e957602081015167ffffffffffffffff81116101e957019061018090829003126101e9576040519061031a826110b8565b602081015167ffffffffffffffff81116101e957839082016020019061033f9161134c565b825261034d60408201611434565b60208301908152906103628460608301611305565b60408401908152916103778560a08401611305565b606085019081529461038c8160e08501611451565b926080860193845261014001906103a291611451565b9360a081019485525190516fffffffffffffffffffffffffffffffff166103c89161270d565b516040805182516fffffffffffffffffffffffffffffffff16602080830191825284015182840152919092015160608084019190915282529061040c608082611128565b51902090516020015167ffffffffffffffff1661042890611735565b6104359190818114611968565b516040805182516fffffffffffffffffffffffffffffffff166020808301918252840151828401529190920151606080840191909152825290610479608082611128565b51902090516020015167ffffffffffffffff1661049590611735565b6104a29190818114611968565b516104ac90611aef565b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff1668010000000000000000176004555f80f35b6104e861187a565b61029b565b7f928b1233000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101e95761054961052636610eb1565b9061054461053f825f525f602052600160405f20015490565b611902565b611c91565b005b346101e9575f6003193601126101e95760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101e9575f6003193601126101e9576040516105ac816105a581610fb2565b0382611128565b6101206040516105bb8161106f565b60025460ff8116825260ff602083019160081c16815260ff6040516105df8161106f565b67ffffffffffffffff600354818116835281602084019160401c168152816004549385808660481c16978161061f6040519d8d8f9e8f9081520190610ee4565b9a511660208c0152511660408a0152511660608801525116608086015263ffffffff811660a086015263ffffffff8160201c1660c086015260401c16151560e084015261066b8161114b565b6101008301520390f35b346101e95760206003193601126101e95760043567ffffffffffffffff81116101e957366023820112156101e957806004013567ffffffffffffffff81116101e957602482013660248360051b850101116101e9576020906040516106da8382611128565b5f815282810191601f1984013684376106f285611821565b956107006040519788611128565b858752601f1961070f87611821565b01855f5b8281106107e3575050505f5b868110156107d0576001906107ac5f806107798861074560248760051b8a01018a61177c565b8d8d6040959395519483869484860198893784019083820190898252519283915e010185815203601f198101835282611128565b5190305af43d156107c8573d9061078f82611155565b9161079d6040519384611128565b82523d5f8b84013e5b30612dce565b6107b6828b611839565b526107c1818a611839565b500161071f565b6060906107a6565b604051868152806101e58189018b610f09565b606082828c010152018690610713565b346101e9575f6003193601126101e95760206040515f8152f35b346101e95761081b36610eb1565b905f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602060ff60405f2054166040519015158152f35b346101e95761086436610e60565b505060ff60045460401c166104ed575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff16156108ed575b7fda81d7c2000000000000000000000000000000000000000000000000000000005f5260045ffd5b6108f561187a565b6108c5565b346101e95760206003193601126101e95760043567ffffffffffffffff81116101e9578060040160a060031983360301126101e95760ff60045460401c166104ed575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475460ff1615610a11575b608482019161099d838361177c565b9050156109e957602092826109b5816109e19561177c565b60246109d96109d26109ca60648901876117cd565b97909661177c565b3691611171565b950191611dda565b604051908152f35b7f1208b21b000000000000000000000000000000000000000000000000000000005f5260045ffd5b610a1961187a565b61098e565b346101e9575f6003193601126101e95760206040517fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b8152f35b346101e95760206003193601126101e95760043567ffffffffffffffff81116101e95780600401608060031983360301126101e95760ff60045460401c166104ed575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e060209081527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac475490926109e192909160ff1615610b2d575b610b10610b03828061177c565b91909260648501906117cd565b929091602460405195610b238988611128565b5f87520191611dda565b610b3561187a565b610af6565b346101e957610b4836610eb1565b3373ffffffffffffffffffffffffffffffffffffffff821603610b6e5761054991611c91565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b346101e9575f6003193601126101e95760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101e957610549610be136610eb1565b90610bfa61053f825f525f602052600160405f20015490565b611bbf565b346101e9575f6003193601126101e95760206040516107088152f35b346101e95760206003193601126101e95760206109e16004355f525f602052600160405f20015490565b346101e95760206003193601126101e95760043567ffffffffffffffff811681036101e9576109e1602091611735565b346101e957610c8336610e60565b60ff60045460401c166104ed575f80527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06020527f6e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac4754610ceb929060ff1615610d2b5761151d565b6040516003821015610cfe576020918152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b610d3361187a565b61151d565b346101e9575f6003193601126101e957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101e9575f6003193601126101e95760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101e95760206003193601126101e957600435907fffffffff0000000000000000000000000000000000000000000000000000000082168092036101e957817f7965db0b0000000000000000000000000000000000000000000000000000000060209314908115610e36575b5015158152f35b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501483610e2f565b9060206003198301126101e95760043567ffffffffffffffff81116101e957826023820112156101e95780600401359267ffffffffffffffff84116101e957602484830101116101e9576024019190565b60031960409101126101e9576004359060243573ffffffffffffffffffffffffffffffffffffffff811681036101e95790565b90601f19601f602080948051918291828752018686015e5f8582860101520116010190565b9080602083519182815201916020808360051b8301019401925f915b838310610f3457505050505090565b9091929394602080610f5283601f1986600196030187528951610ee4565b97019301930191939290610f25565b90600182811c92168015610fa8575b6020831014610f7b57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610f70565b6001545f9291610fc182610f61565b80825291600181169081156110355750600114610fdc575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b83831061101b575060209250010190565b60018160209294939454838587010152019101919061100a565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6040810190811067ffffffffffffffff82111761108b57604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b60c0810190811067ffffffffffffffff82111761108b57604052565b6020810190811067ffffffffffffffff82111761108b57604052565b6060810190811067ffffffffffffffff82111761108b57604052565b60e0810190811067ffffffffffffffff82111761108b57604052565b90601f601f19910116810190811067ffffffffffffffff82111761108b57604052565b60021115610cfe57565b67ffffffffffffffff811161108b57601f01601f191660200190565b92919261117d82611155565b9161118b6040519384611128565b8294818452818301116101e9578281602093845f960137010152565b9080601f830112156101e9578160206111c293359101611171565b90565b6020818303126101e95780359067ffffffffffffffff82116101e95701906020828203126101e957604051916111fa836110d4565b80359067ffffffffffffffff82116101e957016060818303126101e95760405191611224836110f0565b81358352602082013567ffffffffffffffff81116101e957816112489184016111a7565b6020840152604082013567ffffffffffffffff81116101e95761126b92016111a7565b6040820152815290565b1561127e575050565b7fd56bdc26000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b9291926112b882611155565b916112c66040519384611128565b8294818452818301116101e9578281602093845f96015e010152565b519060ff821682036101e957565b519067ffffffffffffffff821682036101e957565b91908260409103126101e95760405161131d8161106f565b602061133681839561132e816112f0565b8552016112f0565b910152565b519063ffffffff821682036101e957565b91908281039261012084126101e957604051916113688361110c565b8294825167ffffffffffffffff81116101e957830182601f820112156101e95760409161139e84836020601f19955191016112ac565b865201126101e9576113e3906040516113b68161106f565b6113c2602085016112e2565b81526113d0604085016112e2565b6020820152602085015260608301611305565b60408301526113f460a0820161133b565b606083015261140560c0820161133b565b608083015260e08101519081151582036101e9576101009160a084015201519060028210156101e95760c00152565b51906fffffffffffffffffffffffffffffffff821682036101e957565b91908260609103126101e957604051611469816110f0565b604080829461147781611434565b8452602081015160208501520151910152565b9190610180838203126101e957604051906114a4826110b8565b819380519167ffffffffffffffff83116101e957610140826114cd8360a096611336960161134c565b86526114dc8360208301611451565b60208701526114ee8360808301611451565b60408701526114ff60e08201611434565b6060870152611512836101008301611305565b608087015201611305565b611529918101906111c5565b6115588151517f0000000000000000000000000000000000000000000000000000000000000000808214611275565b60208151015180518101906020818303126101e95760208101519167ffffffffffffffff83116101e95761159392602080920192010161148a565b9061159d8261199f565b6115a682611a32565b916003831015610cfe57826116d857908167ffffffffffffffff6020604060a06111c2960193845184848201511685600354851c168111611650575b5050015160405161163581611627858201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b03601f198101835282611128565b51902092510151165f52600560205260405f20555b51611aef565b61168f866116d193511667ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b7fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff6fffffffffffffffff00000000000000006003549260401b16911617600355565b5f806115e2565b506001820361171d576111c290680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff600454161760045561164a565b6002821461172e576111c29061164a565b5050600290565b67ffffffffffffffff165f52600560205260405f205480156117545790565b7f5b48b457000000000000000000000000000000000000000000000000000000005f5260045ffd5b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101e9570180359067ffffffffffffffff82116101e9576020019181360383136101e957565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101e9570180359067ffffffffffffffff82116101e957602001918160051b360383136101e957565b67ffffffffffffffff811161108b5760051b60200190565b805182101561184d5760209160051b010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b335f9081527f4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e0602052604090205460ff16156118b257565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527fbd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10b60245260445ffd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156119395750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b15611971575050565b7f6d23e8a3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b611a30906119c581516fffffffffffffffffffffffffffffffff6060840151169061270d565b611a2867ffffffffffffffff6020608081850151604051611a1a81611627868201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b519020940151015116611735565b808214611968565b565b67ffffffffffffffff602060a08301510151165f52600560205260405f205480155f14611a5f5750505f90565b60408201908151604051611aa88161162760208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b5190201491821592611ac6575b505015611ac157600190565b600290565b6fffffffffffffffffffffffffffffffff91925060208291015151169151511611155f80611ab5565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169080516040602083015192015192803b156101e9575f92611b8792611b99604051968795869485947f41493c600000000000000000000000000000000000000000000000000000000086526004860152606060248601526064850190610ee4565b90600319848303016044850152610ee4565b03915afa8015611bb457611baa5750565b5f611a3091611128565b6040513d5f823e3d90fd5b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f14611c8b57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f14611c8b57805f525f60205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a4600190565b3567ffffffffffffffff811681036101e95790565b929190611d7a81611821565b93611d886040519586611128565b602085838152019160051b8101918383116101e95781905b838210611dae575050505050565b813567ffffffffffffffff81116101e957602091611dcf87849387016111a7565b815201910190611da0565b9094929193948015612654578101906020818303126101e95780359067ffffffffffffffff82116101e957016040818303126101e95760405191611e1d8361106f565b813560028110156101e9578352602082013567ffffffffffffffff81116101e957611e4892016111a7565b90602081019182528051611e5b8161114b565b611e648161114b565b6120d1575051908151820160208101926020818303126101e957602081015167ffffffffffffffff81116101e9570190608090829003126101e95760405192611eac8461106f565b602082015167ffffffffffffffff81116101e95782611ed5836020604094611edd970101612a7f565b865201611451565b9460208301958652611f148351517f0000000000000000000000000000000000000000000000000000000000000000808214611275565b6020835101519182518301926020818503126101e95760208101519067ffffffffffffffff82116101e95701926040848203126101e95760405193611f588561106f565b6020810151855260408101519167ffffffffffffffff83116101e957611f85926020809201920101612ae5565b94611f9f602085019680885251801515806120c557612c32565b5f805b8751805183101561209257611fba83611fcd92611839565b5151611fc7368888611d6e565b90612e67565b156120885750869461202c612041956fffffffffffffffffffffffffffffffff9a989561202561164a966020633b9aca009f9d819861200c9151611839565b51015190815181518082149182612074575b5050612c70565b6001612cbe565b5195019461203986611d59565b875191612ed9565b516001815111612055575b50505151160490565b61206161206d92611d59565b90848451511691612f69565b5f8061204c565b909150898401209089830120145f8061201e565b9060010190611fa2565b5061164a9250602091509461202c612041956fffffffffffffffffffffffffffffffff9a9895633b9aca009c9a98612cbe565b5061ffff811115612c32565b949060018695939495516120e48161114b565b6120ed8161114b565b146121345760ff86516120ff8161114b565b6121088161114b565b7fd3a2e6c9000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b90919293945051926060602060405161214c8161106f565b604051612158816110b8565b6040516121648161110c565b8481526040516121738161106f565b5f81525f858201528482015260405161218b8161106f565b5f81525f8582015260408201525f858201525f60808201525f60a08201525f60c082015281526121b9612a47565b838201526121c5612a47565b60408201525f848201526040516121db8161106f565b5f81525f8482015260808201526040516121f48161106f565b5f81525f8482015260a08201528152015283518401936020818603126101e95760208101519067ffffffffffffffff82116101e95701936020858203126101e95760405194612242866110d4565b60208101519067ffffffffffffffff82116101e957602061226b92816122989501920101612a7f565b808652517f0000000000000000000000000000000000000000000000000000000000000000808214611275565b602084510151948551860160208101966020818303126101e957602081015167ffffffffffffffff81116101e9570190604090829003126101e957604051966122e08861106f565b602082015167ffffffffffffffff81116101e9578160206123039285010161148a565b885260408201519167ffffffffffffffff83116101e9576123279201602001612ae5565b93612341602088019580875251801515806120c557612c32565b602081019561234f87611d59565b67ffffffffffffffff60a08a5101519181602084015116918291161480612635575b61237a85611d59565b9267ffffffffffffffff61238d8c611d59565b91511691156125e757505050506123a89061164a895161199f565b6123b28751611a32565b6003811015610cfe57806125b657506123ca86611d59565b67ffffffffffffffff8060035460401c16911611612563575b5060408651015160405161242c8161162760208201948591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902067ffffffffffffffff61244187611d59565b165f52600560205260405f20555b5f805b8551805183101561253857611fba8361246a92611839565b1561252e5750633b9aca0096936fffffffffffffffffffffffffffffffff9693612025879460206124a16124b99660409b51611839565b51015190815181518082149182612518575050612c70565b6124e08351858101519067ffffffffffffffff602060a08185015193015101511690612ed9565b5160018151116124f6575b505051015151160490565b61250261251192611d59565b90858585510151511691612f69565b5f806124eb565b9091506020840120906020830120145f8061201e565b9060010190612452565b5060409592506124b99150936fffffffffffffffffffffffffffffffff9693633b9aca009895612cbe565b61256f6125a491611d59565b67ffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000006003541617600355565b6125b061168f86611d59565b5f6123e3565b600191500361244f577f59bc8fd3000000000000000000000000000000000000000000000000000000005f5260045ffd5b6084945067ffffffffffffffff9081604051957fb8d8167e00000000000000000000000000000000000000000000000000000000875216600486015216602484015260448301526064820152fd5b5061263f84611d59565b67ffffffffffffffff80845116911614612371565b50509091612667602061267c9201611d59565b91604051946126758661106f565b3691611d6e565b83526020830191825260405161269b8161162786602083019586612979565b5190205c9151905182156126b5575050633b9aca00900490565b906127096126f7926040519384937ff06fc33b000000000000000000000000000000000000000000000000000000008552604060048601526044850190610f09565b90600319848303016024850152610ee4565b0390fd5b906fffffffffffffffffffffffffffffffff633b9aca0091160442811161294a5780420342811161291d57610708106128ee575080515161274f600154610f61565b14806128c7575b815190156128875750602081015160ff815116906002549160ff831692838214928361286e575b6020015160ff169215612826575050505063ffffffff606082015116906004549163ffffffff83168082036127f857505063ffffffff608081920151169160201c168082036127ca575050565b7f1eb5c1eb000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b7f73b1bde3000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b6084945060ff90604051947fd382033a000000000000000000000000000000000000000000000000000000008652600486015260081c16602484015260448301526064820152fd5b6020810151600883901c60ff908116911614935061277d565b612709906040519182917ff6b6676b000000000000000000000000000000000000000000000000000000008352604060048401526126f760448401610fb2565b508051602081519101206040516128e1816105a581610fb2565b6020815191012014612756565b7f12e74add000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f20daedb6000000000000000000000000000000000000000000000000000000005f524260045260245260445ffd5b9067ffffffffffffffff90939293168152604060208201526080810190835191604080830152825180915260a0820190602060a08260051b8501019401915f905b8282106129fe575050505060206111c2939401519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc082850301910152610ee4565b90919294602080612a39837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6089600196030186528951610ee4565b9701920192019092916129ba565b60405190612a54826110f0565b5f6040838281528260208201520152565b9080601f830112156101e95781516111c2926020016112ac565b91906060838203126101e95760405190612a98826110f0565b819380518352602081015167ffffffffffffffff81116101e95782612abe918301612a65565b602084015260408101519167ffffffffffffffff83116101e9576040926113369201612a65565b9080601f830112156101e957815191612afd83611821565b92612b0b6040519485611128565b80845260208085019160051b830101918383116101e95760208101915b838310612b3757505050505090565b825167ffffffffffffffff81116101e9578201906040601f1983880301126101e95760405190612b668261106f565b602083015167ffffffffffffffff81116101e95760209084010187601f820112156101e9578051612b9681611821565b91612ba46040519384611128565b81835260208084019260051b820101918a83116101e95760208201905b838210612c045750505050825260408301519167ffffffffffffffff83116101e957612bf588602080969581960101612a65565b83820152815201920191612b28565b815167ffffffffffffffff81116101e957602091612c278e848094880101612a65565b815201910190612bc1565b15612c3a5750565b7fb0369c31000000000000000000000000000000000000000000000000000000005f52600452600160245261ffff60445260645ffd5b91909115612c7c575050565b906127096126f7926040519384937f5f1ca381000000000000000000000000000000000000000000000000000000008552604060048601526044850190610ee4565b91909115612cca575050565b604051907ffef760c700000000000000000000000000000000000000000000000000000000825280602483016020600485015252604482019260448260051b84010191815f907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603015b838310612d435786860387fd5b90919293947fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc8782030188528535828112156101e9578301906020823592019167ffffffffffffffff81116101e95780360383136101e957602082601f19601f8480600198869897879852868601375f85828601015201160101970198019301919096939296612d36565b90612e0b5750805115612de357805190602001fd5b7fd6bda275000000000000000000000000000000000000000000000000000000005f5260045ffd5b81511580612e5e575b612e1c575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b50803b15612e14565b908151815103611c8b575f5b8251811015612ed157612e868184611839565b5151612e928284611839565b515103612eca57612ea38184611839565b5160208151910120612eb58284611839565b516020815191012003612eca57600101612e73565b5050505f90565b505050600190565b91612f2e602092611a2860405185810190612f2581611627888591909160408060608301946fffffffffffffffffffffffffffffffff8151168452602081015160208501520151910152565b51902091611735565b0151808203612f3b575050565b7f4b2dfe98000000000000000000000000000000000000000000000000000000005f5260045260245260445ffd5b929190925f5b8451811015612fa7578083612f8660019388611839565b51604051612f9d8161162760208201948986612979565b5190205d01612f6f565b505050905056fea164736f6c634300081c000a2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d4c48d1d2b0f4f7485fc28e3db22341d96a20aa29e6efa8149da9751603abd4e06e0c24a6e293ff9b755263dbaa15ba3796b0b8d3fe17cfb4ddf8143b268eac47bd893629a699470e4ec82a5715bb4981fdaacc5d0a728bf5f55b801d8f4ef10bad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb50021c5f644cfdb58399a1010e5d80a6838271912d109120790a7b9bc25cc6905001a3af80c0b66b0ee1ebf2d721a6bbd6e323307d4f3f7ef6e18990cf37e7bac00592ca29b4691bc1e864202b2412f953c9b01738f4fb8855b530d3ba3c28f81009fc2cebe15d91df0ebcee563f018e7e2433cb2032a0cc4d5869c85131fd124000000000000000000000000397a5f7f3dbd538f23de225b51f532c34448da9b000000000000000000000000000000000000000000000000000000000000010059578eec55a9282d443ca684873c33ec2a2a586c683e875137d91adab7c7ed0b0000000000000000000000003af134307d5ee90faa2ba9cdba14ba66414cf1a7000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000019a5c4000000000000000000000000000000000000000000000000000000000012750000000000000000000000000000000000000000000000000000000000001baf800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106c65646765722d6d61696e6e65742d3100000000000000000000000000000000