3 txs
920 calls
constructor
constructor(address tokenMessenger, address cctpMessageTransmitterProxy, address token, address[] allowlist, address rmnProxy, address router, address previousPool)
functions
getAllowList
viewfunction getAllowList() view returns (address[])
getAllowListEnabled
viewfunction getAllowListEnabled() view returns (bool)
getCurrentInboundRateLimiterState
viewfunction getCurrentInboundRateLimiterState(uint64 remoteChainSelector) view returns (tuple)
getCurrentOutboundRateLimiterState
viewfunction getCurrentOutboundRateLimiterState(uint64 remoteChainSelector) view returns (tuple)
getDomain
viewfunction getDomain(uint64 chainSelector) view returns (tuple)
getRateLimitAdmin
viewfunction getRateLimitAdmin() view returns (address)
getRemotePools
viewfunction getRemotePools(uint64 remoteChainSelector) view returns (bytes[])
getRemoteToken
viewfunction getRemoteToken(uint64 remoteChainSelector) view returns (bytes)
getRmnProxy
viewfunction getRmnProxy() view returns (address rmnProxy)
getRouter
viewfunction getRouter() view returns (address router)
getSupportedChains
viewfunction getSupportedChains() view returns (uint64[])
getToken
viewfunction getToken() view returns (address token)
getTokenDecimals
viewfunction getTokenDecimals() view returns (uint8 decimals)
i_localDomainIdentifier
viewfunction i_localDomainIdentifier() view returns (uint32)
i_messageTransmitterProxy
viewfunction i_messageTransmitterProxy() view returns (address)
i_previousPool
viewfunction i_previousPool() view returns (address)
i_tokenMessenger
viewfunction i_tokenMessenger() view returns (address)
isRemotePool
viewfunction isRemotePool(uint64 remoteChainSelector, bytes remotePoolAddress) view returns (bool)
isSupportedChain
viewfunction isSupportedChain(uint64 remoteChainSelector) view returns (bool)
isSupportedToken
viewfunction isSupportedToken(address token) view returns (bool)
owner
viewfunction owner() view returns (address)
SUPPORTED_USDC_VERSION
viewfunction SUPPORTED_USDC_VERSION() view returns (uint32)
supportsInterface
purefunction supportsInterface(bytes4 interfaceId) pure returns (bool)
typeAndVersion
viewfunction typeAndVersion() view returns (string)
acceptOwnership
nonpayablefunction acceptOwnership()
addRemotePool
nonpayablefunction addRemotePool(uint64 remoteChainSelector, bytes remotePoolAddress)
applyAllowListUpdates
nonpayablefunction applyAllowListUpdates(address[] removes, address[] adds)
applyChainUpdates
nonpayablefunction applyChainUpdates(uint64[] remoteChainSelectorsToRemove, tuple[] chainsToAdd)
lockOrBurn
nonpayablefunction lockOrBurn(tuple lockOrBurnIn) returns (tuple)
releaseOrMint
nonpayablefunction releaseOrMint(tuple releaseOrMintIn) returns (tuple)
removeRemotePool
nonpayablefunction removeRemotePool(uint64 remoteChainSelector, bytes remotePoolAddress)
setChainRateLimiterConfig
nonpayablefunction setChainRateLimiterConfig(uint64 remoteChainSelector, tuple outboundConfig, tuple inboundConfig)
setChainRateLimiterConfigs
nonpayablefunction setChainRateLimiterConfigs(uint64[] remoteChainSelectors, tuple[] outboundConfigs, tuple[] inboundConfigs)
setDomains
nonpayablefunction setDomains(tuple[] domains)
setRateLimitAdmin
nonpayablefunction setRateLimitAdmin(address rateLimitAdmin)
setRouter
nonpayablefunction setRouter(address newRouter)
transferOwnership
nonpayablefunction transferOwnership(address to)
events
AllowListAdd
event AllowListAdd(address sender)
AllowListRemove
event AllowListRemove(address sender)
ChainAdded
event ChainAdded(uint64 remoteChainSelector, bytes remoteToken, (bool isEnabled, uint128 capacity, uint128 rate) outboundRateLimiterConfig, (bool isEnabled, uint128 capacity, uint128 rate) inboundRateLimiterConfig)
ChainConfigured
event ChainConfigured(uint64 remoteChainSelector, (bool isEnabled, uint128 capacity, uint128 rate) outboundRateLimiterConfig, (bool isEnabled, uint128 capacity, uint128 rate) inboundRateLimiterConfig)
ChainRemoved
event ChainRemoved(uint64 remoteChainSelector)
ConfigChanged
event ConfigChanged((bool isEnabled, uint128 capacity, uint128 rate) config)
ConfigSet
event ConfigSet(address tokenMessenger)
DomainsSet
event DomainsSet((bytes32 allowedCaller, bytes32 mintRecipient, uint32 domainIdentifier, uint64 destChainSelector, bool enabled)[])
InboundRateLimitConsumed
event InboundRateLimitConsumed(uint64 indexed remoteChainSelector, address token, uint256 amount)
LockedOrBurned
event LockedOrBurned(uint64 indexed remoteChainSelector, address token, address sender, uint256 amount)
OutboundRateLimitConsumed
event OutboundRateLimitConsumed(uint64 indexed remoteChainSelector, address token, uint256 amount)
OwnershipTransferred
event OwnershipTransferred(address indexed from, address indexed to)
OwnershipTransferRequested
event OwnershipTransferRequested(address indexed from, address indexed to)
RateLimitAdminSet
event RateLimitAdminSet(address rateLimitAdmin)
ReleasedOrMinted
event ReleasedOrMinted(uint64 indexed remoteChainSelector, address token, address sender, address recipient, uint256 amount)
RemotePoolAdded
event RemotePoolAdded(uint64 indexed remoteChainSelector, bytes remotePoolAddress)
RemotePoolRemoved
event RemotePoolRemoved(uint64 indexed remoteChainSelector, bytes remotePoolAddress)
RouterUpdated
event RouterUpdated(address oldRouter, address newRouter)
errors
AllowListNotEnabled
error AllowListNotEnabled()
BucketOverfilled
error BucketOverfilled()
CallerIsNotARampOnRouter
error CallerIsNotARampOnRouter(address caller)
CannotTransferToSelf
error CannotTransferToSelf()
ChainAlreadyExists
error ChainAlreadyExists(uint64 chainSelector)
ChainNotAllowed
error ChainNotAllowed(uint64 remoteChainSelector)
CursedByRMN
error CursedByRMN()
DisabledNonZeroRateLimit
error DisabledNonZeroRateLimit((bool isEnabled, uint128 capacity, uint128 rate) config)
InvalidConfig
error InvalidConfig()
InvalidDecimalArgs
error InvalidDecimalArgs(uint8 expected, uint8 actual)
InvalidDestinationDomain
error InvalidDestinationDomain(uint32 expected, uint32 got)
InvalidDomain
error InvalidDomain((bytes32 allowedCaller, bytes32 mintRecipient, uint32 domainIdentifier, uint64 destChainSelector, bool enabled) domain)
InvalidMessageLength
error InvalidMessageLength(uint256 length)
InvalidMessageVersion
error InvalidMessageVersion(uint32 version)
InvalidNonce
error InvalidNonce(uint64 expected, uint64 got)
InvalidPreviousPool
error InvalidPreviousPool()
InvalidRateLimitRate
error InvalidRateLimitRate((bool isEnabled, uint128 capacity, uint128 rate) rateLimiterConfig)
InvalidReceiver
error InvalidReceiver(bytes receiver)
InvalidRemoteChainDecimals
error InvalidRemoteChainDecimals(bytes sourcePoolData)
InvalidRemotePoolForChain
error InvalidRemotePoolForChain(uint64 remoteChainSelector, bytes remotePoolAddress)
InvalidSourceDomain
error InvalidSourceDomain(uint32 expected, uint32 got)
InvalidSourcePoolAddress
error InvalidSourcePoolAddress(bytes sourcePoolAddress)
InvalidToken
error InvalidToken(address token)
InvalidTokenMessengerVersion
error InvalidTokenMessengerVersion(uint32 version)
InvalidTransmitterInProxy
error InvalidTransmitterInProxy()
MismatchedArrayLengths
error MismatchedArrayLengths()
MustBeProposedOwner
error MustBeProposedOwner()
NonExistentChain
error NonExistentChain(uint64 remoteChainSelector)
OnlyCallableByOwner
error OnlyCallableByOwner()
OverflowDetected
error OverflowDetected(uint8 remoteDecimals, uint8 localDecimals, uint256 remoteAmount)
OwnerCannotBeZero
error OwnerCannotBeZero()
PoolAlreadyAdded
error PoolAlreadyAdded(uint64 remoteChainSelector, bytes remotePoolAddress)
SenderNotAllowed
error SenderNotAllowed(address sender)
TokenMaxCapacityExceeded
error TokenMaxCapacityExceeded(uint256 capacity, uint256 requested, address tokenAddress)
TokenRateLimitReached
error TokenRateLimitReached(uint256 minWaitInSeconds, uint256 available, address tokenAddress)
Unauthorized
error Unauthorized(address caller)
UnknownDomain
error UnknownDomain(uint64 domain)
UnlockingUSDCFailed
error UnlockingUSDCFailed()
ZeroAddressNotAllowed
error ZeroAddressNotAllowed()
creation bytecode
0x610180806040523461061757615e7e803803809161001d8285610952565b8339810160e0828203126106175781516001600160a01b0381169190828103610617576020840151916001600160a01b038316908184036106175760408601516001600160a01b03811696908781036106175760608201516001600160401b0381116106175782019280601f85011215610617578351936001600160401b0385116105b4578460051b9060208201956100b96040519788610952565b865260208087019282010192831161061757602001905b82821061093a575050506100e660808301610975565b906100ff60c06100f860a08601610975565b9401610975565b98331561092957600180546001600160a01b0319163317905580158015610918575b8015610907575b6108f65760049260209260805260c0526040519283809263313ce56760e01b82525afa80916000916108ba575b5090610896575b50600660a052600480546001600160a01b0319166001600160a01b03929092169190911790558051151560e081905261076f575b50831561075e57604051632c12192160e01b8152602081600481885afa90811561062457600091610724575b5060405163054fd4d560e41b81526001600160a01b03919091169190602081600481865afa80156106245763ffffffff91600091610705575b5016806106f15750604051639cdbb18160e01b8152602081600481895afa80156106245763ffffffff916000916106d2575b5016806106be57506020600491604051928380926367e0ed8360e11b82525afa8015610624578291600091610670575b506001600160a01b03160361065f5760049260209261010052610120526040519283809263234d8e3d60e21b82525afa90811561062457600091610630575b506101405260805161010051604051636eb1769f60e11b81523060048201526001600160a01b0391821660248201819052949290911690602081604481855afa908115610624576000916105ed575b5060001981018091116105d75760405190602082019563095ea7b360e01b8752602483015260448201526044815261031e606482610952565b6000806040968751936103318986610952565b602085527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646020860152519082865af13d156105ca573d906001600160401b0382116105b45786516103a2949092610393601f8201601f191660200185610952565b83523d6000602085013e610b47565b80519081610540575b50506001600160a01b0381163081146104b75780151590816104c8575b506104b7577f2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea954491602091610160528351908152a1516152669081610c1882396080518181816105c60152818161066b015281816113d201528181612d21015281816145540152614a25015260a051816106d3015260c05181818161216601528181613b2601526140f3015260e0518181816109c5015281816122a7015261485c015261010051818181610be501526114800152610120518181816112380152612c8d015261014051818181610d42015281816115620152613cdb0152610160518181816107c70152612bfe0152f35b632d4d3c3d60e21b60005260046000fd5b84516301ffc9a760e01b8152630e64dd2960e01b60048201529150602090829060249082905afa90811561053557600091610506575b5015386103c8565b610528915060203d60201161052e575b6105208183610952565b8101906109a5565b386104fe565b503d610516565b84513d6000823e3d90fd5b6020806105519383010191016109a5565b1561055d5738806103ab565b825162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b634e487b7160e01b600052604160045260246000fd5b916103a292606091610b47565b634e487b7160e01b600052601160045260246000fd5b90506020813d60201161061c575b8161060860209383610952565b810103126106175751386102e5565b600080fd5b3d91506105fb565b6040513d6000823e3d90fd5b610652915060203d602011610658575b61064a8183610952565b810190610989565b38610296565b503d610640565b632a32133b60e11b60005260046000fd5b9091506020813d6020116106b6575b8161068c60209383610952565b810103126106b25751906001600160a01b03821682036106af5750819038610257565b80fd5b5080fd5b3d915061067f565b6316ba39c560e31b60005260045260246000fd5b6106eb915060203d6020116106585761064a8183610952565b38610227565b6334697c6b60e11b60005260045260246000fd5b61071e915060203d6020116106585761064a8183610952565b386101f5565b90506020813d602011610756575b8161073f60209383610952565b810103126106175761075090610975565b386101bc565b3d9150610732565b6306b7c75960e31b60005260046000fd5b60405192946020946107818686610952565b60008552600036813760e051156108855760005b85518110156107fc576001906001600160a01b036107b382896109bd565b5116886107bf826109ff565b6107cc575b505001610795565b7f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756691604051908152a138886107c4565b50919350919460005b8451811015610879576001906001600160a01b0361082382886109bd565b51168015610873578761083582610ae7565b610843575b50505b01610805565b7f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d891604051908152a1388761083a565b5061083d565b50925092509238610190565b6335f4a7b360e01b60005260046000fd5b60ff166006811461015c576332ad3e0760e11b600052600660045260245260446000fd5b6020813d6020116108ee575b816108d360209383610952565b810103126106b257519060ff821682036106af575038610155565b3d91506108c6565b6342bcdf7f60e11b60005260046000fd5b506001600160a01b03831615610128565b506001600160a01b03841615610121565b639b15e16f60e01b60005260046000fd5b6020809161094784610975565b8152019101906100d0565b601f909101601f19168101906001600160401b038211908210176105b457604052565b51906001600160a01b038216820361061757565b90816020910312610617575163ffffffff811681036106175790565b90816020910312610617575180151581036106175790565b80518210156109d15760209160051b010190565b634e487b7160e01b600052603260045260246000fd5b80548210156109d15760005260206000200190600090565b6000818152600360205260409020548015610ae05760001981018181116105d7576002546000198101919082116105d757818103610a8f575b5050506002548015610a795760001901610a538160026109e7565b8154906000199060031b1b19169055600255600052600360205260006040812055600190565b634e487b7160e01b600052603160045260246000fd5b610ac8610aa0610ab19360026109e7565b90549060031b1c92839260026109e7565b819391549060031b91821b91600019901b19161790565b90556000526003602052604060002055388080610a38565b5050600090565b80600052600360205260406000205415600014610b4157600254680100000000000000008110156105b457610b28610ab182600185940160025560026109e7565b9055600254906000526003602052604060002055600190565b50600090565b91929015610ba95750815115610b5b575090565b3b15610b645790565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b825190915015610bbc5750805190602001fd5b6040519062461bcd60e51b8252602060048301528181519182602483015260005b838110610bff5750508160006044809484010152601f80199101168101030190fd5b60208282018101516044878401015285935001610bdd56fe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a714610267578063181f5a771461026257806321df0da71461025d578063240028e81461025857806324f65ee714610253578063390775371461024e5780633e591f2c146102495780634c5ef0ed1461024457806354c8a4f31461023f5780636155cda01461023a57806362ddd3c4146102355780636b716b0d146102305780636d3d1a581461022b57806379ba5097146102265780637d54534e146102215780638926f54f1461021c5780638da5cb5b14610217578063962d40201461021257806398db96431461020d5780639a4575b9146102085780639fdf13ff14610203578063a42a7b8b146101fe578063a7cd63b7146101f9578063acfecf91146101f4578063af58d59f146101ef578063b0f479a1146101ea578063b7946580146101e5578063c0d78655146101e0578063c4bffe2b146101db578063c75eea9c146101d6578063c781d0e3146101d1578063cf7401f3146101cc578063dc0bd971146101c7578063dfadfa35146101c2578063e0351e13146101bd578063e8a1da17146101b85763f2fde38b146101b357600080fd5b6126eb565b6122cc565b612271565b61218a565b61211b565b611fff565b611e8a565b611e21565b611d70565b611c30565b611bdb565b611b78565b611aae565b611982565b6118f0565b6117d0565b611718565b6112af565b6111ed565b611030565b610fad565b610f50565b610ea1565b610db8565b610d66565b610d07565b610c84565b610b9a565b610993565b61088b565b61077c565b6106f7565b61069b565b610613565b61057b565b6104fa565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610357576004357fffffffff00000000000000000000000000000000000000000000000000000000811680910361035757807faff2afbf000000000000000000000000000000000000000000000000000000006020921490811561032d575b8115610303575b506040519015158152f35b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014386102f8565b7f0e64dd2900000000000000000000000000000000000000000000000000000000811491506102f1565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176103a757604052565b61035c565b6080810190811067ffffffffffffffff8211176103a757604052565b6020810190811067ffffffffffffffff8211176103a757604052565b6040810190811067ffffffffffffffff8211176103a757604052565b60a0810190811067ffffffffffffffff8211176103a757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176103a757604052565b6040519061046c60408361041c565b565b6040519061046c60a08361041c565b6040519061046c60208361041c565b6040519061046c60808361041c565b919082519283825260005b8481106104e55750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016104a6565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757610577604080519061053b818361041c565b601382527f55534443546f6b656e506f6f6c20312e362e320000000000000000000000000060208301525191829160208352602083019061049b565b0390f35b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b73ffffffffffffffffffffffffffffffffffffffff81160361035757565b359061046c826105ea565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610357576020610691600435610653816105ea565b73ffffffffffffffffffffffffffffffffffffffff807f00000000000000000000000000000000000000000000000000000000000000001691161490565b6040519015158152f35b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575760043567ffffffffffffffff8111610357576101007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261035757610773602091600401612b6e565b60405190518152f35b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b67ffffffffffffffff81160361035757565b359061046c826107eb565b92919267ffffffffffffffff82116103a75760405191610850601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0166020018461041c565b829481845281830111610357578281602093846000960137010152565b9080601f830112156103575781602061088893359101610808565b90565b346103575760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610357576004356108c6816107eb565b60243567ffffffffffffffff8111610357576020916108ec61069192369060040161086d565b90612e67565b9181601f840112156103575782359167ffffffffffffffff8311610357576020808501948460051b01011161035757565b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126103575760043567ffffffffffffffff8111610357578161096c916004016108f2565b929092916024359067ffffffffffffffff82116103575761098f916004016108f2565b9091565b34610357576109bb6109c36109a736610923565b94916109b4939193613e48565b3691612ebc565b923691612ebc565b7f000000000000000000000000000000000000000000000000000000000000000015610b705760005b8251811015610ab15780610a1f610a0560019386613011565b5173ffffffffffffffffffffffffffffffffffffffff1690565b610a5b610a5673ffffffffffffffffffffffffffffffffffffffff83165b73ffffffffffffffffffffffffffffffffffffffff1690565b614bd9565b610a67575b50016109ec565b60405173ffffffffffffffffffffffffffffffffffffffff9190911681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf756690602090a138610a60565b5060005b8151811015610b6e5780610ace610a0560019385613011565b73ffffffffffffffffffffffffffffffffffffffff811615610b6857610b11610b0c73ffffffffffffffffffffffffffffffffffffffff8316610a3d565b614e8f565b610b1e575b505b01610ab5565b60405173ffffffffffffffffffffffffffffffffffffffff9190911681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d890602090a183610b16565b50610b18565b005b7f35f4a7b30000000000000000000000000000000000000000000000000000000060005260046000fd5b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b60407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82011261035757600435610c3f816107eb565b9160243567ffffffffffffffff811161035757826023820112156103575780600401359267ffffffffffffffff84116103575760248483010111610357576024019190565b3461035757610c9236610c09565b610c9d929192613e48565b67ffffffffffffffff8216610cbf816000526006602052604060002054151590565b15610cda5750610b6e92610cd4913691610808565b90613eb4565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405163ffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575760005473ffffffffffffffffffffffffffffffffffffffff81163303610e77577fffffffffffffffffffffffff00000000000000000000000000000000000000006001549133828416176001551660005573ffffffffffffffffffffffffffffffffffffffff3391167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3005b7f02b543c60000000000000000000000000000000000000000000000000000000060005260046000fd5b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610357577f44676b5284b809a22248eba0da87391d79098be38bb03154be88a58bf4d09174602073ffffffffffffffffffffffffffffffffffffffff600435610f14816105ea565b610f1c613e48565b16807fffffffffffffffffffffffff00000000000000000000000000000000000000006009541617600955604051908152a1005b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602061069167ffffffffffffffff600435610f99816107eb565b166000526006602052604060002054151590565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602073ffffffffffffffffffffffffffffffffffffffff60015416604051908152f35b9181601f840112156103575782359167ffffffffffffffff8311610357576020808501946060850201011161035757565b346103575760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575760043567ffffffffffffffff81116103575761107f9036906004016108f2565b9060243567ffffffffffffffff8111610357576110a0903690600401610fff565b9060443567ffffffffffffffff8111610357576110c1903690600401610fff565b6110e3610a3d60095473ffffffffffffffffffffffffffffffffffffffff1690565b331415806111c2575b61119057838614801590611186575b61115c5760005b86811061110b57005b8061115661112461111f6001948b8b612f62565b612b5a565b61112f838989612f77565b61115061114861114086898b612f77565b923690611fb6565b913690611fb6565b91613f79565b01611102565b7f568efce20000000000000000000000000000000000000000000000000000000060005260046000fd5b50808614156110fb565b7f8e4a23d6000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6000fd5b506111e5610a3d60015473ffffffffffffffffffffffffffffffffffffffff1690565b3314156110ec565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b906108889160208152602061127c8351604083850152606084019061049b565b9201519060407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08285030191015261049b565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575760043567ffffffffffffffff811161035757806004019060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc823603011261035757611329612f87565b50611333826140a9565b6024810161136561136061134683612b5a565b67ffffffffffffffff16600052600a602052604060002090565b612fa0565b6113796113756060830151151590565b1590565b6116d657602061138985806127f2565b90500361169257602081810151611465956064919081156116755750945b0135936113bb604084015163ffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169687945160405198899485947ff856ddb60000000000000000000000000000000000000000000000000000000086528a60048701919360809363ffffffff73ffffffffffffffffffffffffffffffffffffffff9398979660a0860199865216602085015260408401521660608201520152565b0381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af192831561167057610577946000946115ff575b5061153a836115e3937ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff61153f956115326114fb6115b79a612b5a565b6040805173ffffffffffffffffffffffffffffffffffffffff90971687523360208801528601929092529116929081906060820190565b0390a2612b5a565b6131de565b9261155b61154b61045d565b67ffffffffffffffff9092168252565b63ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602082015260405192839160208301919091602063ffffffff81604084019567ffffffffffffffff8151168552015116910152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0810183528261041c565b6115eb61045d565b91825260208201526040519182918261125c565b61153f9194506115b7936115e3937ff33bc26b4413b0e7f19f1ea739fdf99098c0061f1f87d954b11f5293fad9ae1067ffffffffffffffff61165b61153a9560203d602011611669575b611653818361041c565b810190612ffc565b9895505050935093506114b5565b503d611649565b612b14565b61168c915080611684916127f2565b810190612fed565b946113a7565b61169c84806127f2565b906116d26040519283927fa3c8cf0900000000000000000000000000000000000000000000000000000000845260048401612fdc565b0390fd5b6111be6116e283612b5a565b7fd201c48a0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405160008152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061178557505050505090565b90919293946020806117c1837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08660019603018752895161049b565b97019301930191939290611776565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575767ffffffffffffffff600435611814816107eb565b16600052600760205261182d6005604060002001614ae3565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061187361185d84612ea4565b9361186b604051958661041c565b808552612ea4565b0160005b8181106118df57505060005b81518110156118d157806118b56118b061189f60019486613011565b516000526008602052604060002090565b613078565b6118bf8286613011565b526118ca8185613011565b5001611883565b604051806105778582611752565b806060602080938701015201611877565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757611927614a4d565b60405180916020820160208352815180915260206040840192019060005b818110611953575050500390f35b825173ffffffffffffffffffffffffffffffffffffffff16845285945060209384019390920191600101611945565b346103575761199036610c09565b61199b929192613e48565b67ffffffffffffffff8216916119c1611375846000526006602052604060002054151590565b611a7757611a0461137560056119eb8467ffffffffffffffff166000526007602052604060002090565b016119f7368689610808565b6020815191012090614d84565b611a4057507f52d00ee4d9bd51b40168f2afc5848837288ce258784ad914278791464b3f4d769192611a3b60405192839283612fdc565b0390a2005b6116d284926040519384937f74f23c7c00000000000000000000000000000000000000000000000000000000855260048501613138565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575767ffffffffffffffff600435611af2816107eb565b611afa613159565b50166000526007602052610577611b1f611b1a6002604060002001613184565b6141b9565b6040519182918291909160806fffffffffffffffffffffffffffffffff8160a084019582815116855263ffffffff6020820151166020860152604081015115156040860152826060820151166060860152015116910152565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602073ffffffffffffffffffffffffffffffffffffffff60045416604051908152f35b90602061088892818152019061049b565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757610577611c1c60043561153a816107eb565b60405191829160208352602083019061049b565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575773ffffffffffffffffffffffffffffffffffffffff600435611c80816105ea565b611c88613e48565b168015611d025760407f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849160045490807fffffffffffffffffffffffff000000000000000000000000000000000000000083161760045573ffffffffffffffffffffffffffffffffffffffff8351921682526020820152a1005b7f8579befe0000000000000000000000000000000000000000000000000000000060005260046000fd5b602060408183019282815284518094520192019060005b818110611d505750505090565b825167ffffffffffffffff16845260209384019390920191600101611d43565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757611da7614a98565b8051907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0611dd761185d84612ea4565b0136602084013760005b8151811015611e13578067ffffffffffffffff611e0060019385613011565b5116611e0c8286613011565b5201611de1565b604051806105778582611d2c565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575767ffffffffffffffff600435611e65816107eb565b611e6d613159565b50166000526007602052610577611b1f611b1a6040600020613184565b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575760043567ffffffffffffffff8111610357573660238201121561035757806004013567ffffffffffffffff81116103575736602460a0830284010111610357576024610b6e9201613200565b8015150361035757565b35906fffffffffffffffffffffffffffffffff8216820361035757565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60609101126103575760405190611f638261038b565b81608435611f7081611f05565b815260a4356fffffffffffffffffffffffffffffffff8116810361035757602082015260c435906fffffffffffffffffffffffffffffffff821682036103575760400152565b919082606091031261035757604051611fce8161038b565b6040611ffa8183958035611fe181611f05565b8552611fef60208201611f0f565b602086015201611f0f565b910152565b346103575760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575760043561203a816107eb565b60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc360112610357576040516120708161038b565b60243561207c81611f05565b81526044356fffffffffffffffffffffffffffffffff811681036103575760208201526064356fffffffffffffffffffffffffffffffff811681036103575760408201526120c936611f2c565b9073ffffffffffffffffffffffffffffffffffffffff60095416331415806120f9575b61119057610b6e92613f79565b5073ffffffffffffffffffffffffffffffffffffffff600154163314156120ec565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575767ffffffffffffffff6004356121ce816107eb565b600060606040516121de816103ac565b828152826020820152826040820152015216600052600a602052610577604060002060ff600260405192612211846103ac565b8054845260018101546020850152015463ffffffff8116604084015260201c1615156060820152604051918291829190916060806080830194805184526020810151602085015263ffffffff604082015116604085015201511515910152565b346103575760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575760206040517f000000000000000000000000000000000000000000000000000000000000000015158152f35b34610357576122da36610923565b9190926122e5613e48565b6000915b8083106125975750505060009163ffffffff4216925b82811061230857005b61231b612316828585613643565b613702565b906060820161232a8151614296565b60808301936123398551614296565b604084019081515115611d025761237361137561236e612361885167ffffffffffffffff1690565b67ffffffffffffffff1690565b614f20565b61254c576124ac6123ac612392879a999a5167ffffffffffffffff1690565b67ffffffffffffffff166000526007602052604060002090565b61246f8961246987516124506123d560408301516fffffffffffffffffffffffffffffffff1690565b916124376124006123f960208401516fffffffffffffffffffffffffffffffff1690565b9251151590565b61242e61240b61046e565b6fffffffffffffffffffffffffffffffff851681529763ffffffff166020890152565b15156040870152565b6fffffffffffffffffffffffffffffffff166060850152565b6fffffffffffffffffffffffffffffffff166080830152565b82613791565b6124a1896124988a516124506123d560408301516fffffffffffffffffffffffffffffffff1690565b60028301613791565b60048451910161389d565b602085019660005b885180518210156124ef57906124e96001926124e2836124dc8c5167ffffffffffffffff1690565b92613011565b5190613eb4565b016124b4565b505097965094906125437f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c293926125306001975167ffffffffffffffff1690565b92519351905190604051948594856139c4565b0390a1016122ff565b6111be612561865167ffffffffffffffff1690565b7f1d5ad3c50000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff16600452602490565b9091926125a861111f858486612f62565b946125bf61137567ffffffffffffffff8816614cbd565b6126b3576125ec60056125e68867ffffffffffffffff166000526007602052604060002090565b01614ae3565b9360005b855181101561263857600190612631600561261f8b67ffffffffffffffff166000526007602052604060002090565b0161262a838a613011565b5190614d84565b50016125f0565b509350937f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599166126a56001939761268a6126858267ffffffffffffffff166000526007602052604060002090565b613594565b60405167ffffffffffffffff90911681529081906020820190565b0390a10191909392936122e9565b7f1e670e4b0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff861660045260246000fd5b346103575760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126103575773ffffffffffffffffffffffffffffffffffffffff60043561273b816105ea565b612743613e48565b163381146127b557807fffffffffffffffffffffffff0000000000000000000000000000000000000000600054161760005573ffffffffffffffffffffffffffffffffffffffff600154167fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278600080a3005b7fdad89dca0000000000000000000000000000000000000000000000000000000060005260046000fd5b604051906127ec826103c8565b60008252565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610357570180359067ffffffffffffffff82116103575760200191813603831361035757565b359063ffffffff8216820361035757565b9081604091031261035757612884602060405192612871846103e4565b803561287c816107eb565b845201612843565b602082015290565b6020818303126103575780359067ffffffffffffffff8211610357570160408183031261035757604051916128c0836103e4565b813567ffffffffffffffff811161035757816128dd91840161086d565b8352602082013567ffffffffffffffff811161035757612884920161086d565b908160209103126103575760405190612915826103c8565b51815290565b90357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18236030181121561035757016020813591019167ffffffffffffffff821161035757813603831361035757565b601f82602094937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0938186528686013760008582860101520116010190565b906108889160208152612ae3612ad8612a9b6129dc6129c9868061291b565b610100602088015261012087019161296b565b6129fc6129eb602088016107fd565b67ffffffffffffffff166040870152565b612a28612a0b60408801610608565b73ffffffffffffffffffffffffffffffffffffffff166060870152565b60608601356080860152612a5e612a4160808801610608565b73ffffffffffffffffffffffffffffffffffffffff1660a0870152565b612a6b60a087018761291b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08784030160c088015261296b565b612aa860c086018661291b565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030160e087015261296b565b9260e081019061291b565b916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08286030191015261296b565b6040513d6000823e3d90fd5b90816020910312610357575161088881611f05565b9091612b4c6108889360408452604084019061049b565b91602081840391015261049b565b35610888816107eb565b35610888816105ea565b612b766127df565b50606081013590612b878282613a59565b612b9f612b9760c08301836127f2565b810190612854565b612bc2612bba612bb260e08501856127f2565b81019061288c565b918251613c85565b612be7610a3d60748351015173ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690818015159182612e47575b5050612dc7575060208181612c7293519101519060405193849283927f57ecfd2800000000000000000000000000000000000000000000000000000000845260048401612b35565b0381600073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af190811561167057600091612d98575b5015612d6e577ffc5e3a5bddc11d92c2dc20fae6f7d5eb989f056be35239f7de7e86150609abc067ffffffffffffffff612d066040612cff60208601612b5a565b9401612b64565b6040805173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081168252336020830152929092169082015260608101859052921691608090a2612d6861047d565b90815290565b7fbf969f220000000000000000000000000000000000000000000000000000000060005260046000fd5b612dba915060203d602011612dc0575b612db2818361041c565b810190612b20565b38612cbe565b503d612da8565b60009350612e0891506020926040519485809481937f39077537000000000000000000000000000000000000000000000000000000008352600483016129aa565b03925af190811561167057600091612e1e575090565b610888915060203d602011612e40575b612e38818361041c565b8101906128fd565b503d612e2e565b73ffffffffffffffffffffffffffffffffffffffff161490508138612c2a565b9067ffffffffffffffff61088892166000526007602052600560406000200190602081519101209060019160005201602052604060002054151590565b67ffffffffffffffff81116103a75760051b60200190565b929190612ec881612ea4565b93612ed6604051958661041c565b602085838152019160051b810192831161035757905b828210612ef857505050565b602080918335612f07816105ea565b815201910190612eec565b67ffffffffffffffff61088891166000526006602052604060002054151590565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015612f725760051b0190565b612f33565b9190811015612f72576060020190565b60405190612f94826103e4565b60606020838281520152565b90604051612fad816103ac565b606060ff600283958054855260018101546020860152015463ffffffff8116604085015260201c161515910152565b91602061088893818152019161296b565b90816020910312610357573590565b908160209103126103575751610888816107eb565b8051821015612f725760209160051b010190565b90600182811c9216801561306e575b602083101461303f57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691613034565b906040519182600082549261308c84613025565b80845293600181169081156130f857506001146130b1575b5061046c9250038361041c565b90506000929192526020600020906000915b8183106130dc57505090602061046c92820101386130a4565b60209193508060019154838589010152019101909184926130c3565b6020935061046c9592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091501682840152151560051b820101386130a4565b60409067ffffffffffffffff6108889593168152816020820152019161296b565b6040519061316682610400565b60006080838281528260208201528260408201528260608201520152565b9060405161319181610400565b60806fffffffffffffffffffffffffffffffff6001839560ff8154848116875263ffffffff81871c16602088015260a01c1615156040860152015481808216166060850152821c16910152565b67ffffffffffffffff1660005260076020526108886004604060002001613078565b613208613e48565b60005b82811061324a5750907fe6d14ea297366c7bc1265d289d924bfd8b9afb148eb972b481f70da41c842cf5916132456040519283928361343d565b0390a1565b61325d6132588285856133cf565b6133df565b80511580156133a9575b61333c5790613336826132dc611346606061328b6040600198015163ffffffff1690565b936132cd60208201516132c58351976132a76080860151151590565b926132b061048c565b998a5260208a015263ffffffff166040890152565b151586840152565b015167ffffffffffffffff1690565b6002908251815560208301516001820155019063ffffffff6040820151167fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000064ff0000000060608554940151151560201b16921617179055565b0161320b565b604080517fa606c63500000000000000000000000000000000000000000000000000000000815282516004820152602083015160248201529082015163ffffffff166044820152606082015167ffffffffffffffff1660648201526080909101511515608482015260a490fd5b5067ffffffffffffffff6133c8606083015167ffffffffffffffff1690565b1615613267565b9190811015612f725760a0020190565b60a081360312610357576080604051916133f883610400565b803583526020810135602084015261341260408201612843565b60408401526060810135613425816107eb565b6060840152013561343581611f05565b608082015290565b602080825281018390526040019160005b81811061345b5750505090565b90919260a080600192863581526020870135602082015263ffffffff61348360408901612843565b16604082015267ffffffffffffffff60608801356134a0816107eb565b16606082015260808701356134b481611f05565b1515608082015201940192910161344e565b916134fe918354907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055565b81811061350d575050565b60008155600101613502565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181029291811591840414171561355b57565b613519565b8054906000815581613570575050565b6000526020600020908101905b818110613588575050565b6000815560010161357d565b600561046c9160008155600060018201556000600282015560006003820155600481016135c18154613025565b90816135d0575b505001613560565b81601f600093116001146135e85750555b38806135c8565b8183526020832061360391601f01861c810190600101613502565b808252602082209081548360011b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8560031b1c1916179055556135e1565b9190811015612f725760051b810135907ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee181360301821215610357570190565b9080601f8301121561035757813561369a81612ea4565b926136a8604051948561041c565b81845260208085019260051b820101918383116103575760208201905b8382106136d457505050505090565b813567ffffffffffffffff8111610357576020916136f78784809488010161086d565b8152019101906136c5565b61012081360312610357576040519061371a82610400565b613723816107fd565b8252602081013567ffffffffffffffff8111610357576137469036908301613683565b602083015260408101359067ffffffffffffffff821161035757613770613435923690830161086d565b60408401526137823660608301611fb6565b606084015260c0369101611fb6565b8151815460208401516040850151608091821b73ffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff9485167fffffffffffffffffffffff000000000000000000000000000000000000000000909416939093179290921791151560a01b74ff000000000000000000000000000000000000000016919091178355606084015193810151901b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016921691909117600190910155565b9190601f811161386757505050565b61046c926000526020600020906020601f840160051c83019310613893575b601f0160051c0190613502565b9091508190613886565b919091825167ffffffffffffffff81116103a7576138c5816138bf8454613025565b84613858565b6020601f821160011461391f5781906134fe939495600092613914575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b0151905038806138e2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082169061395284600052602060002090565b9160005b8181106139ac57509583600195969710613975575b505050811b019055565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c1916905538808061396b565b9192602060018192868b015181550194019201613956565b613a286139f361046c9597969467ffffffffffffffff60a095168452610100602085015261010084019061049b565b9660408301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b01906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808101613a6c61137561065383612b64565b613c3757506020810190613b0d6020613ab2613a8a61236186612b5a565b60801b7fffffffffffffffffffffffffffffffff000000000000000000000000000000001690565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116600482015291829081906024820190565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561167057600091613c18575b50613bee57613b6d613b6883612b5a565b6143d7565b613b7682612b5a565b90613b9661137560a08301936108ec613b8f86866127f2565b3691610808565b613bae57505090613ba961046c92612b5a565b6144fb565b613bb892506127f2565b906116d26040519283927f24eb47e500000000000000000000000000000000000000000000000000000000845260048401612fdc565b7f53ad11d80000000000000000000000000000000000000000000000000000000060005260046000fd5b613c31915060203d602011612dc057612db2818361041c565b38613b57565b613c436111be91612b64565b7f961c9a4f0000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff16600452602490565b90815160748110613e1b5750600482015163ffffffff8116613de857506008820151916014600c82015191015192613cc4602084015163ffffffff1690565b63ffffffff811663ffffffff831603613daf5750507f000000000000000000000000000000000000000000000000000000000000000063ffffffff811663ffffffff831603613d765750505167ffffffffffffffff1667ffffffffffffffff811667ffffffffffffffff831603613d39575050565b7ff917ffea0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff9081166004521660245260446000fd5b7f77e480260000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7fe366a1170000000000000000000000000000000000000000000000000000000060005263ffffffff9081166004521660245260446000fd5b7f68d2f8d60000000000000000000000000000000000000000000000000000000060005263ffffffff1660045260246000fd5b7f758b22cc0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff600154163303613e6957565b7f2b5c74de0000000000000000000000000000000000000000000000000000000060005260046000fd5b60409067ffffffffffffffff6108889493168152816020820152019061049b565b90805115611d02578051602082012067ffffffffffffffff831692836000526007602052613ee9826005604060002001614f76565b15613f42575081613f317f7d628c9a1796743d365ab521a8b2a4686e419b3269919dc9145ea2ce853b54ea93613f2c613f3d946000526008602052604060002090565b61389d565b60405191829182611bca565b0390a2565b90506116d26040519283927f393b8ad200000000000000000000000000000000000000000000000000000000845260048401613e93565b67ffffffffffffffff16600081815260066020526040902054909291901561407b579161407860e09261404485613fd07f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b97614296565b846000526007602052613fe78160406000206145ac565b613ff083614296565b84600052600760205261400a8360026040600020016145ac565b60405194855260208501906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b60808301906fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565ba1565b827f1e670e4b0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b608081016140bc61137561065383612b64565b613c37575060208101906140da6020613ab2613a8a61236186612b5a565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561167057600091614160575b50613bee57606061415761046c9361414661414160408601612b64565b61485a565b61111f61415282612b5a565b6148f1565b910135906149cf565b614179915060203d602011612dc057612db2818361041c565b38614124565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161355b57565b9190820391821161355b57565b6141c1613159565b506fffffffffffffffffffffffffffffffff6060820151166fffffffffffffffffffffffffffffffff82511690602083019163ffffffff835116420342811161355b57614225906fffffffffffffffffffffffffffffffff60808701511690613548565b810180911161355b5761424b6fffffffffffffffffffffffffffffffff92918392615247565b161682524263ffffffff16905290565b61046c9092919260608101936fffffffffffffffffffffffffffffffff60408092805115158552826020820151166020860152015116910152565b80511561433a5760408101516fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff6142fa6142e560208501516fffffffffffffffffffffffffffffffff1690565b6fffffffffffffffffffffffffffffffff1690565b9116116143045750565b6116d2906040519182917f8020d1240000000000000000000000000000000000000000000000000000000083526004830161425b565b6fffffffffffffffffffffffffffffffff61436860408301516fffffffffffffffffffffffffffffffff1690565b16158015906143af575b6143795750565b6116d2906040519182917fd68af9cc0000000000000000000000000000000000000000000000000000000083526004830161425b565b506143d06142e560208301516fffffffffffffffffffffffffffffffff1690565b1515614372565b6143e361137582612f12565b6144c457602061445c9161440f610a3d60045473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90921660048301523360248301529092839190829081906044820190565b03915afa908115611670576000916144a5575b501561447757565b7f728fe07b000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b6144be915060203d602011612dc057612db2818361041c565b3861446f565b7fa9902c7e0000000000000000000000000000000000000000000000000000000060005267ffffffffffffffff1660045260246000fd5b67ffffffffffffffff7f50f6fbee3ceedce6b7fd7eaef18244487867e6718aec7208187efb6b7908c14c9116918260005260076020528061457c600260406000200173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016928391615004565b6040805173ffffffffffffffffffffffffffffffffffffffff909216825260208201929092529081908101613f3d565b7f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199161478b6132459280546145fd6145f76145ee8363ffffffff9060801c1690565b63ffffffff1690565b426141ac565b9081614797575b5050614745600161462860208601516fffffffffffffffffffffffffffffffff1690565b926146b36146766142e56fffffffffffffffffffffffffffffffff61465d85546fffffffffffffffffffffffffffffffff1690565b166fffffffffffffffffffffffffffffffff8816615247565b82906fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b6147066146c08751151590565b82547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690151560a01b74ff000000000000000000000000000000000000000016178255565b019182906fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b604083015181546fffffffffffffffffffffffffffffffff1660809190911b7fffffffffffffffffffffffffffffffff0000000000000000000000000000000016179055565b6040519182918261425b565b6142e5614676916fffffffffffffffffffffffffffffffff61480b614812958261480460018a015492826147fd6147f66147e0876fffffffffffffffffffffffffffffffff1690565b996fffffffffffffffffffffffffffffffff1690565b9560801c90565b1690613548565b9116614e65565b9116615247565b80547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff00000000000000000000000000000000161781553880614604565b7f00000000000000000000000000000000000000000000000000000000000000006148825750565b73ffffffffffffffffffffffffffffffffffffffff16806000526003602052604060002054156148af5750565b7fd0d259760000000000000000000000000000000000000000000000000000000060005260045260246000fd5b908160209103126103575751610888816105ea565b6148fd61137582612f12565b6144c457602061496e91614929610a3d60045473ffffffffffffffffffffffffffffffffffffffff1690565b60405180809581947fa8d87a3b0000000000000000000000000000000000000000000000000000000083526004830191909167ffffffffffffffff6020820193169052565b03915afa80156116705773ffffffffffffffffffffffffffffffffffffffff916000916149a0575b5016330361447757565b6149c2915060203d6020116149c8575b6149ba818361041c565b8101906148dc565b38614996565b503d6149b0565b67ffffffffffffffff7fff0133389f9bb82d5b9385826160eaf2328039f6fa950eeb8cf0836da81789449116918260005260076020528061457c604060002073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016928391615004565b604051906002548083528260208101600260005260206000209260005b818110614a7f57505061046c9250038361041c565b8454835260019485019487945060209093019201614a6a565b604051906005548083528260208101600560005260206000209260005b818110614aca57505061046c9250038361041c565b8454835260019485019487945060209093019201614ab5565b906040519182815491828252602082019060005260206000209260005b818110614b1557505061046c9250038361041c565b8454835260019485019487945060209093019201614b00565b8054821015612f725760005260206000200190600090565b80548015614baa577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190614b7b8282614b2e565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82549160031b1b1916905555565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081815260036020526040902054908115614cb6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161355b57600254927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840193841161355b578383600095614c759503614c7b575b505050614c646002614b46565b600390600052602052604060002090565b55600190565b614c64614ca791614c9d614c93614cad956002614b2e565b90549060031b1c90565b9283916002614b2e565b906134c6565b55388080614c57565b5050600090565b600081815260066020526040902054908115614cb6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019082821161355b57600554927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840193841161355b578383600095614c759503614d59575b505050614d486005614b46565b600690600052602052604060002090565b614d48614ca791614d71614c93614d7b956005614b2e565b9283916005614b2e565b55388080614d3b565b6001810191806000528260205260406000205492831515600014614e5c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff840184811161355b578354937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff850194851161355b576000958583614c7597614e149503614e23575b505050614b46565b90600052602052604060002090565b614e43614ca791614e3a614c93614e539588614b2e565b92839187614b2e565b8590600052602052604060002090565b55388080614e0c565b50505050600090565b9190820180921161355b57565b92614e7d9192613548565b810180911161355b5761088891615247565b600081815260036020526040902054614f1a57600254680100000000000000008110156103a757614f01614ecc8260018594016002556002614b2e565b81939154907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060031b92831b921b19161790565b9055600254906000526003602052604060002055600190565b50600090565b600081815260066020526040902054614f1a57600554680100000000000000008110156103a757614f5d614ecc8260018594016005556005614b2e565b9055600554906000526006602052604060002055600190565b6000828152600182016020526040902054614cb657805490680100000000000000008210156103a75782614fb4614ecc846001809601855584614b2e565b905580549260005201602052604060002055600190565b8115614fd5570490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b8054939290919060ff60a086901c1615801561523f575b6152385761503a6fffffffffffffffffffffffffffffffff86166142e5565b90600184019586546150746145f76145ee6150676142e5856fffffffffffffffffffffffffffffffff1690565b9460801c63ffffffff1690565b806151a4575b505083811061515957508282106150da575061046c93945061509f916142e5916141ac565b6fffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffff00000000000000000000000000000000825416179055565b906151116111be9361510c6150fd846150f76142e58c5460801c90565b936141ac565b6151068361417f565b90614e65565b614fcb565b7fd0c8d23a0000000000000000000000000000000000000000000000000000000060005260045260245273ffffffffffffffffffffffffffffffffffffffff16604452606490565b7f1a76572a00000000000000000000000000000000000000000000000000000000600052600452602483905273ffffffffffffffffffffffffffffffffffffffff1660445260646000fd5b82859293951161520e576151be6142e56151c59460801c90565b9185614e72565b84547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff164260801b73ffffffff000000000000000000000000000000001617855591388061507a565b7f9725942a0000000000000000000000000000000000000000000000000000000060005260046000fd5b5050509050565b50811561501b565b9080821015615254575090565b90509056fea164736f6c634300081a000a0000000000000000000000001682ae6375c4e4a97e4b583bc394c861a46d89620000000000000000000000001c2f528e3beeff81bc03cc63e64db131d18be7fa000000000000000000000000833589fcd6edb6e08f4c7c32d4f71b54bda0291300000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000c842c69d54f83170c42c4d556b4f6b2ca53dd3e8000000000000000000000000881e3a65b4d4a04dd529061dd0071cf975f58bcd0000000000000000000000005931822f394babc2aacf4588e98fc77a9f5aa8c90000000000000000000000000000000000000000000000000000000000000000