0 txs
24 calls
constructor
constructor()
functions
ADMIN_ROLE
viewfunction ADMIN_ROLE() view returns (bytes32)
contractAddressManager
viewfunction contractAddressManager() view returns (address)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
DEFAULT_PRICE
viewfunction DEFAULT_PRICE() view returns (uint256)
donationBasisPoints
viewfunction donationBasisPoints() view returns (uint256)
donationEscrow
viewfunction donationEscrow(address) view returns (uint256)
donationRecipient
viewfunction donationRecipient(uint256) view returns (address)
entryProtocolFeeBasisPoints
viewfunction entryProtocolFeeBasisPoints() view returns (uint256)
exitProtocolFeeBasisPoints
viewfunction exitProtocolFeeBasisPoints() view returns (uint256)
expectedSigner
viewfunction expectedSigner() view returns (address)
getMarket
viewfunction getMarket(uint256 profileId) view returns (tuple)
getMarketConfigCount
viewfunction getMarketConfigCount() view returns (uint256)
getParticipantCount
viewfunction getParticipantCount(uint256 profileId) view returns (uint256)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getRoleMember
viewfunction getRoleMember(bytes32 role, uint256 index) view returns (address)
getRoleMemberCount
viewfunction getRoleMemberCount(bytes32 role) view returns (uint256)
getRoleMembers
viewfunction getRoleMembers(bytes32 role) view returns (address[])
getUserVotes
viewfunction getUserVotes(address user, uint256 profileId) view returns (tuple)
getVotePrice
viewfunction getVotePrice(uint256 profileId, bool isPositive) view returns (uint256)
graduatedMarkets
viewfunction graduatedMarkets(uint256) view returns (bool)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isAllowedToCreateMarket
viewfunction isAllowedToCreateMarket(uint256 profileId) view returns (bool)
isParticipant
viewfunction isParticipant(uint256, address) view returns (bool)
lastMarketUpdates
viewfunction lastMarketUpdates(uint256) view returns (uint256 voteTrust, uint256 voteDistrust, uint256 positivePrice, uint256 negativePrice, uint256 lastUpdateBlock)
marketConfigs
viewfunction marketConfigs(uint256) view returns (uint256 liquidity, uint256 basePrice, uint256 creationCost)
marketFunds
viewfunction marketFunds(uint256) view returns (uint256)
MINIMUM_BASE_PRICE
viewfunction MINIMUM_BASE_PRICE() view returns (uint256)
OWNER_ROLE
viewfunction OWNER_ROLE() view returns (bytes32)
participants
viewfunction participants(uint256, uint256) view returns (address)
paused
viewfunction paused() view returns (bool)
protocolFeeAddress
viewfunction protocolFeeAddress() view returns (address)
proxiableUUID
viewfunction proxiableUUID() view returns (bytes32)
signatureUsed
viewfunction signatureUsed(bytes) view returns (bool)
signatureVerifier
viewfunction signatureVerifier() view returns (address)
simulateBuy
viewfunction simulateBuy(uint256 profileId, bool isPositive, uint256 votesToBuy) view returns (uint256 purchaseCostBeforeFees, uint256 protocolFee, uint256 donation, uint256 totalCostIncludingFees, uint256 newVotePrice)
simulateSell
viewfunction simulateSell(uint256 profileId, bool isPositive, uint256 votesToSell) view returns (uint256 proceedsBeforeFees, uint256 protocolFee, uint256 proceedsAfterFees, uint256 newVotePrice)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
targetExistsAndAllowedForId
viewfunction targetExistsAndAllowedForId(uint256 targetId) view returns (bool exists, bool allowed)
UPGRADE_INTERFACE_VERSION
viewfunction UPGRADE_INTERFACE_VERSION() view returns (string)
addAdmin
nonpayablefunction addAdmin(address admin)
addMarketConfig
nonpayablefunction addMarketConfig(uint256 liquidity, uint256 basePrice, uint256 creationCost) returns (uint256)
buyVotes
payablefunction buyVotes(uint256 profileId, bool isPositive, uint256 maxVotesToBuy, uint256 minVotesToBuy) payable
createMarket
payablefunction createMarket() payable
createMarketWithConfig
payablefunction createMarketWithConfig(uint256 marketConfigIndex) payable
createMarketWithConfigAdmin
payablefunction createMarketWithConfigAdmin(address marketOwner, uint256 marketConfigIndex) payable
graduateMarket
nonpayablefunction graduateMarket(uint256 profileId)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
initialize
nonpayablefunction initialize(address owner, address admin, address expectedSigner, address signatureVerifier, address contractAddressManagerAddr)
pause
nonpayablefunction pause()
removeAdmin
nonpayablefunction removeAdmin(address admin)
removeMarketConfig
nonpayablefunction removeMarketConfig(uint256 configIndex)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
sellVotes
nonpayablefunction sellVotes(uint256 profileId, bool isPositive, uint256 votesToSell, uint256 minimumVotePrice)
setAllowListEnforcement
nonpayablefunction setAllowListEnforcement(bool value)
setDonationBasisPoints
nonpayablefunction setDonationBasisPoints(uint256 basisPoints)
setEntryProtocolFeeBasisPoints
nonpayablefunction setEntryProtocolFeeBasisPoints(uint256 basisPoints)
setExitProtocolFeeBasisPoints
nonpayablefunction setExitProtocolFeeBasisPoints(uint256 basisPoints)
setProtocolFeeAddress
nonpayablefunction setProtocolFeeAddress(address newProtocolFeeAddress)
setUserAllowedToCreateMarket
nonpayablefunction setUserAllowedToCreateMarket(uint256 profileId, bool value)
unpause
nonpayablefunction unpause()
updateContractAddressManager
nonpayablefunction updateContractAddressManager(address contractAddressesAddr)
updateDonationRecipient
nonpayablefunction updateDonationRecipient(uint256 profileId, address newRecipient)
updateExpectedSigner
nonpayablefunction updateExpectedSigner(address signer)
updateOwner
nonpayablefunction updateOwner(address owner)
updateSignatureVerifier
nonpayablefunction updateSignatureVerifier(address sinatureVerifier)
upgradeToAndCall
payablefunction upgradeToAndCall(address newImplementation, bytes data) payable
withdrawDonations
nonpayablefunction withdrawDonations() returns (uint256)
withdrawGraduatedMarketFunds
nonpayablefunction withdrawGraduatedMarketFunds(uint256 profileId)
events
DonationRecipientUpdated
event DonationRecipientUpdated(uint256 indexed profileId, address indexed oldRecipient, address indexed newRecipient)
DonationWithdrawn
event DonationWithdrawn(address indexed recipient, uint256 amount)
Initialized
event Initialized(uint64 version)
MarketConfigAdded
event MarketConfigAdded(uint256 indexed configIndex, (uint256 liquidity, uint256 basePrice, uint256 creationCost) config)
MarketConfigRemoved
event MarketConfigRemoved(uint256 indexed configIndex, (uint256 liquidity, uint256 basePrice, uint256 creationCost) config)
MarketCreated
event MarketCreated(uint256 indexed profileId, address indexed creator, (uint256 liquidity, uint256 basePrice, uint256 creationCost) config)
MarketFundsWithdrawn
event MarketFundsWithdrawn(uint256 indexed profileId, address indexed withdrawer, uint256 amount)
MarketGraduated
event MarketGraduated(uint256 indexed profileId)
MarketUpdated
event MarketUpdated(uint256 indexed profileId, uint256 indexed voteTrust, uint256 indexed voteDistrust, uint256 trustPrice, uint256 distrustPrice, int256 deltaVoteTrust, int256 deltaVoteDistrust, int256 deltaTrustPrice, int256 deltaDistrustPrice, uint256 blockNumber, uint256 updatedAt)
Paused
event Paused(address account)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
Unpaused
event Unpaused(address account)
Upgraded
event Upgraded(address indexed implementation)
VotesBought
event VotesBought(uint256 indexed profileId, address indexed buyer, bool indexed isPositive, uint256 amount, uint256 funds, uint256 boughtAt)
VotesSold
event VotesSold(uint256 indexed profileId, address indexed seller, bool indexed isPositive, uint256 amount, uint256 funds, uint256 soldAt)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AddressEmptyCode
error AddressEmptyCode(address target)
BuySlippageLimitExceeded
error BuySlippageLimitExceeded(uint256 requiredAmount, uint256 providedAmount)
EnforcedPause
error EnforcedPause()
ERC1967InvalidImplementation
error ERC1967InvalidImplementation(address implementation)
ERC1967NonPayable
error ERC1967NonPayable()
ExpectedPause
error ExpectedPause()
FailedCall
error FailedCall()
FeeTransferFailed
error FeeTransferFailed(string message)
InactiveMarket
error InactiveMarket(uint256 profileId)
InsufficientFunds
error InsufficientFunds()
InsufficientLiquidity
error InsufficientLiquidity(uint256 creationCost)
InsufficientVotesOwned
error InsufficientVotesOwned(uint256 profileId, address addressStr)
InsufficientVotesToSell
error InsufficientVotesToSell(uint256 profileId)
InvalidInitialization
error InvalidInitialization()
InvalidMarketConfigOption
error InvalidMarketConfigOption(string message)
InvalidProfileId
error InvalidProfileId()
InvalidSignature
error InvalidSignature()
MarketAlreadyExists
error MarketAlreadyExists(uint256 profileId)
MarketCreationUnauthorized
error MarketCreationUnauthorized(uint8 code, address addressStr, uint256 profileId)
MarketDoesNotExist
error MarketDoesNotExist(uint256 profileId)
MarketNotGraduated
error MarketNotGraduated()
NotInitializing
error NotInitializing()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SellSlippageLimitExceeded
error SellSlippageLimitExceeded(uint256 minimumPricePerVote, uint256 actualPricePerVote)
SignatureWasUsed
error SignatureWasUsed()
UnauthorizedGraduation
error UnauthorizedGraduation()
UnauthorizedWithdrawal
error UnauthorizedWithdrawal()
UUPSUnauthorizedCallContext
error UUPSUnauthorizedCallContext()
UUPSUnsupportedProxiableUUID
error UUPSUnsupportedProxiableUUID(bytes32 slot)
ZeroAddress
error ZeroAddress()
ZeroAddressNotAllowed
error ZeroAddressNotAllowed()
creation bytecode
0x60a06040523461003257610011610037565b60405161532361021b8239608051818181613e7f0152613ffa015261532390f35b600080fd5b61003f610049565b61004761016c565b565b610047610096565b61005e61005e61005e9290565b90565b61005e6001610051565b90600019905b9181191691161790565b9061008b61005e61009292610051565b825461006b565b9055565b61009e6100e2565b6100476100a9610061565b603661007b565b61005e906100c4906001600160a01b031682565b6001600160a01b031690565b61005e906100b0565b61005e906100d0565b6100ea6100f8565b6100f3306100d9565b608052565b61004761003f565b61005e9060401c60ff1690565b61005e9054610100565b61005e905b6001600160401b031690565b61005e9054610117565b906001600160401b0390610071565b61005e9061011c906001600160401b031682565b9061016561005e61009292610141565b8254610132565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a006101968161010d565b610208576101a381610128565b6001600160401b03919082908116036101ba575050565b816101e97fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29361020393610155565b604051918291826001600160401b03909116815260200190565b0390a1565b63f92ee8a960e01b6000908152600490fdfe6080604052600436101561001257600080fd5b60003560e01c806301ffc9a71461046257806308473f641461045d5780631459457a146104585780631785f53c146104535780631b2628db1461044e5780631b6c743b14610449578063248a9ca3146104445780632a67ef191461043f5780632bdd87ff1461043a5780632cb3e494146104355780632f2ff15d1461043057806331c551f81461042b5780633479e5491461042657806334a7fe061461042157806336568abe1461041c5780633a5edec5146104175780633d5a8a89146104125780633ea686e51461040d5780633f4ba83a146104085780634496fda214610403578063451fb954146103fe578063463ed22f146103f95780634f1ef286146103f457806350de8bb8146103ef57806352d1902d146103ea5780635667981b146103e55780635c597526146103e05780635c975abb146103db578063606d9be0146103d6578063626f78f2146103d1578063668739cd146103cc5780636b7b9112146103c75780636bc83161146103c257806370480275146103bd578063758d9b89146103b857806375b238fc146103b357806377166067146103ae57806377e414ef146103a957806381fb1fb4146103a45780638456cb591461039f57806386ae5fec1461039a578063880cdc31146103955780639010d07c1461039057806391d148541461038b578063955113f514610386578063a12c64b514610381578063a217fddf1461037c578063a3246ad314610377578063ad3cb1cc14610372578063ade9ae971461036d578063aea0e35f14610368578063b16f005514610363578063b36fed5f1461035e578063b481768214610359578063bb10c82914610354578063bf0a78711461034f578063c08487af1461034a578063c1f779f214610345578063c53c78ec14610340578063ca15c8731461033b578063cce516b714610336578063ce1b088a14610331578063d547741f1461032c578063e4cfcc2314610327578063e58378bb14610322578063eb44fdd31461031d578063f4e1c7e414610318578063f56bb7a7146103135763fde919f60361047a576114aa565b611486565b61146b565b611440565b611419565b6113ef565b611368565b61134d565b611332565b61130b565b6112f4565b6112d8565b6112c0565b6112a8565b61128d565b6111e7565b6111cc565b6111a5565b61117b565b611154565b611108565b611034565b610fa9565b610f69565b610f32565b610f16565b610efa565b610ee2565b610ec7565b610eaf565b610e93565b610df6565b610d99565b610d20565b610d04565b610ca3565b610c88565b610c64565b610c4c565b610c34565b610c1c565b610c01565b610bcf565b610b61565b610b46565b610b32565b610b02565b6109eb565b6109cf565b610984565b610960565b610945565b610907565b6108eb565b6108af565b610897565b610855565b61083a565b6107f2565b6107bb565b610798565b610767565b6106b7565b61068b565b610633565b61059b565b61057f565b610516565b6104a9565b6001600160e01b031981165b0361047a57565b600080fd5b9050359061048c82610467565b565b9060208282031261047a576104a29161047f565b90565b9052565b3461047a576104d66104c46104bf36600461048e565b6114c5565b60405191829182901515815260200190565b0390f35b6001600160a01b031690565b6001600160a01b038116610473565b9050359061048c826104e6565b9060208282031261047a576104a2916104f5565b3461047a5761052e610529366004610502565b611556565b604051005b919060a08382031261047a5761054981846104f5565b9261055782602083016104f5565b926104a261056884604085016104f5565b93608061057882606087016104f5565b94016104f5565b3461047a5761052e610592366004610533565b9392909261194d565b3461047a5761052e6105ae366004610502565b611990565b80610473565b9050359061048c826105b3565b9060208282031261047a576104a2916105b9565b6104a26104a26104a29290565b906105f1906105da565b600052602052604060002090565b6104a2916008021c6001600160a01b031690565b906104a291546105ff565b600061062e6104a29260446105e7565b610613565b3461047a576104d661064e6106493660046105c6565b61061e565b604051918291826001600160a01b03909116815260200190565b600091031261047a57565b6104a2662386f26fc100006105da565b6104a2610673565b3461047a5761069b366004610668565b6104d66106a6610683565b6040515b9182918290815260200190565b3461047a576104d66106a66106cd3660046105c6565b61199f565b6104a29081565b6104a290546106d2565b6106ee90603f6105e7565b6106f7816106d9565b91610704600183016106d9565b91610711600282016106d9565b916104a26004610723600385016106d9565b93016106d9565b9095949261048c9461075c6107639261075560809661074e60a088019c6000890152565b6020870152565b6040850152565b6060830152565b0152565b3461047a576104d661078261077d3660046105c6565b6106e3565b9161078f95939560405190565b9586958661072a565b3461047a5761052e6107ab366004610502565b6119f3565b6104a2600080610613565b3461047a576107cb366004610668565b6104d661064e6107b0565b919060408382031261047a576104a290602061057882866105b9565b3461047a5761052e6108053660046107d6565b90611a17565b6104a2916008021c5b60ff1690565b906104a2915461080b565b60006108356104a292603e6105e7565b61081a565b3461047a576104d66104c46108503660046105c6565b610825565b3461047a5761052e6108683660046107d6565b90611cbd565b801515610473565b9050359061048c8261086e565b9060208282031261047a576104a291610876565b3461047a5761052e6108aa366004610883565b611cf9565b3461047a5761052e6108c23660046107d6565b90611d02565b919060408382031261047a576104a29060206108e482866105b9565b9401610876565b3461047a576104d66106a66109013660046108c8565b90611df1565b61052e6109153660046105c6565b611f16565b6104a2916008021c81565b906104a2915461091a565b60006109406104a292603d6105e7565b610925565b3461047a576104d66106a661095b3660046105c6565b610930565b3461047a57610970366004610668565b61052e612081565b6104a26000603a610925565b3461047a57610994366004610668565b6104d66106a6610978565b909160608284031261047a576104a26109b884846105b9565b9360406109c882602087016105b9565b94016105b9565b3461047a576104d66106a66109e536600461099f565b91612252565b3461047a5761052e6109fe3660046108c8565b9061229c565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff821117610a3c57604052565b610a04565b9061048c610a4e60405190565b9283610a1a565b67ffffffffffffffff8111610a3c57602090601f01601f19160190565b0190565b90826000939282370152565b90929192610a97610a9282610a55565b610a41565b938185528183011161047a5761048c916020850190610a76565b9080601f8301121561047a578160206104a293359101610a82565b91909160408184031261047a57610ae383826104f5565b92602082013567ffffffffffffffff811161047a576104a29201610ab1565b61052e610b10366004610acc565b906122c6565b919060408382031261047a576104a29060206109c882866104f5565b61052e610b40366004610b16565b9061230c565b3461047a57610b56366004610668565b6104d66106a6612359565b3461047a5761052e610b74366004610502565b612387565b909160608284031261047a576104a2610b9284846105b9565b9360406109c88260208701610876565b61076361048c94610bc8606094989795610bc1608086019a6000870152565b6020850152565b6040830152565b3461047a576104d6610beb610be5366004610b79565b91612474565b90610bf894929460405190565b94859485610ba2565b3461047a57610c11366004610668565b6104d66104c4612484565b3461047a5761052e610c2f3660046105c6565b6125d2565b3461047a5761052e610c473660046105c6565b61268c565b3461047a5761052e610c5f3660046105c6565b61271e565b3461047a5761052e610c77366004610502565b612777565b6104a260006038610925565b3461047a57610c98366004610668565b6104d66106a6610c7c565b3461047a5761052e610cb6366004610502565b6127b3565b6104a2906104da906001600160a01b031682565b6104a290610cbb565b6104a290610ccf565b906105f190610cd8565b6108356104a292610cff60009360426105e7565b610ce1565b3461047a576104d66104c4610d1a3660046107d6565b90610ceb565b3461047a57610d30366004610668565b6104d66000805160206152ce8339815191526106a6565b8051825261048c91906080908190610d6460208201516020860152565b610d7360408201516040860152565b610d8260608201516060860152565b0151910152565b60a08101929161048c9190610d47565b3461047a576104d6610db5610daf366004610b16565b9061280a565b60405191829182610d89565b60808183031261047a57610dd582826105b9565b926104a2610de68460208501610876565b9360606109c882604087016105b9565b3461047a5761052e610e09366004610dc1565b92919091612ade565b919060408382031261047a576104a29060206109c882866105b9565b634e487b7160e01b600052603260045260246000fd5b8054821015610e6757610e5e600191600052602060002090565b91020190600090565b610e2e565b610e779060416105e7565b805482101561047a576104a291610e8d91610e44565b90610613565b3461047a576104d661064e610ea9366004610e12565b90610e6c565b3461047a57610ebf366004610668565b61052e612b4d565b3461047a576104d66106a6610edd3660046105c6565b612b55565b3461047a5761052e610ef5366004610502565b612bc9565b3461047a576104d661064e610f10366004610e12565b90612bd2565b3461047a576104d66104c4610f2c3660046107d6565b90612c13565b3461047a576104d6610782610f48366004610b79565b91612ce0565b901515815260408101929161048c916020905b019015159052565b3461047a57610f81610f7c3660046105c6565b612cf1565b906104d6610f8e60405190565b92839283610f4e565b6104a260006105da565b6104a2610f97565b3461047a57610fb9366004610668565b6104d66106a6610fa1565b90610fe4610fdd610fd3845190565b8084529260200190565b9260200190565b9060005b818110610ff55750505090565b90919261101b61101460019286516001600160a01b0316815260200190565b9460200190565b929101610fe8565b60208082526104a292910190610fc4565b3461047a576104d661104f61104a3660046105c6565b612d61565b60405191829182611023565b90611068610a9283610a55565b918252565b611077600561105b565b640352e302e360dc1b602082015290565b6104a261106d565b6104a2611088565b6104a2611090565b60005b8381106110b35750506000910152565b81810151838201526020016110a3565b6110e46110ed602093610a72936110d8815190565b80835293849260200190565b958691016110a0565b601f01601f191690565b60208082526104a2929101906110c3565b3461047a57611118366004610668565b6104d6611123611098565b604051918291826110f7565b6104a260006003610613565b6104a590610cd8565b60208101929161048c919061113b565b3461047a57611164366004610668565b6104d661116f61112f565b60405191829182611144565b611186366004610668565b61052e612d90565b6104a2655af3107a40006105da565b6104a261118e565b3461047a576111b5366004610668565b6104d66106a661119d565b6104a260006037610925565b3461047a576111dc366004610668565b6104d66106a66111c0565b3461047a576104d66104c46111fd3660046105c6565b612d98565b9060208282031261047a57813567ffffffffffffffff811161047a576104a29201610ab1565b610a726112409260209261123a815190565b94859290565b938491016110a0565b611068610a729160209493611228565b61126e61126560405190565b92839283611249565b03902090565b6104a291611259565b60006108356104a2926002611274565b3461047a576104d66104c46112a3366004611202565b61127d565b3461047a5761052e6112bb3660046105c6565b612f35565b3461047a5761052e6112d33660046105c6565b612fa3565b3461047a576112e8366004610668565b6104d66106a6603b5490565b61052e611302366004610dc1565b92919091613244565b3461047a576104d66106a66113213660046105c6565b613250565b6104a260006039610613565b3461047a57611342366004610668565b6104d661064e611326565b3461047a5761135d366004610668565b6104d66106a661339e565b3461047a5761052e61137b3660046107d6565b906133c3565b8054821015610e6757610e5e600391600052602060002090565b603b906113a6825490565b81101561047a576113b691611381565b506113c0816106d9565b916104a26002610723600185016106d9565b90815260608101939261048c929091604091610763906020830152565b3461047a576104d661140a6114053660046105c6565b61139b565b604051919391938493846113d2565b3461047a57611429366004610668565b6104d660008051602061528e8339815191526106a6565b3461047a576104d6610db56114563660046105c6565b6133cd565b60006109406104a2926043610ce1565b3461047a576104d66106a6611481366004610502565b61145b565b3461047a5761052e6114993660046105c6565b613658565b6104a260006001610613565b3461047a576114ba366004610668565b6104d661064e61149e565b635a05180f60e01b6001600160e01b03198216149081156114e4575090565b6104a29150613661565b61048c9061150e6000805160206152ce83398151915261369b565b61369b565b611543565b906001600160a01b03905b9181191691161790565b906115386104a261153f92610cd8565b8254611513565b9055565b61154f61048c91610cd8565b6003611528565b61048c906114ee565b6104a29060401c610814565b6104a2905461155f565b6104a2905b67ffffffffffffffff1690565b6104a29054611575565b61157a6104a26104a29290565b9067ffffffffffffffff9061151e565b61157a6104a26104a29267ffffffffffffffff1690565b906115d56104a261153f926115ae565b825461159e565b9068ff00000000000000009060401b61151e565b906116006104a261153f92151590565b82546115dc565b6104a590611591565b60208101929161048c9190611607565b92939091907ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0094859261166261165c6116588661156b565b1590565b94611587565b9460009661166f88611591565b67ffffffffffffffff88161480611777575b60019761169e6116908a611591565b9167ffffffffffffffff1690565b14908161174f575b155b9081611746575b5061173357906116dc94939291866116d38a6116ca8b611591565b9c019b8c6115c5565b6117245761185e565b6116e557505050565b61171361171f927fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2946115f0565b60405191829182611610565b0390a1565b61172e888b6115f0565b61185e565b63f92ee8a960e01b8852600488fd5b0390fd5b159050386116af565b90506116a861175d30610cd8565b3b61176e61176a8c6105da565b9190565b149190506116a6565b5085611681565b9060ff9061151e565b906117976104a261153f92151590565b825461177e565b6104a26060610a41565b634e487b7160e01b600052600060045260246000fd5b906000199061151e565b906117d86104a261153f926105da565b82546117be565b600261181a604061048c946117fe6117f8600083015190565b866117c8565b61181561180c602083015190565b600187016117c8565b015190565b91016117c8565b91906118305761048c916117df565b6117a8565b90815491600160401b831015610a3c578261185891600161048c95018155611381565b90611821565b9061186b9493929161376a565b61187361377f565b61187f60016046611787565b61048c603b61188c610673565b906118cf61189861179e565b6118aa6118a66103e86105da565b8252565b6118b5846020830152565b6118c9610bc86702c68af0bb1400006105da565b82611835565b6119076118da61179e565b6118e86118a66127106105da565b6118f3846020830152565b6118c9610bc86706f05b59d3b200006105da565b61192d61191261179e565b92611926611922620186a06105da565b8552565b6020840152565b611948611941670de0b6b3a76400006105da565b6040840152565b611835565b9061048c94939291611620565b61048c9061197560008051602061528e83398151915261369b565b61198d906000805160206152ce833981519152613787565b50565b61048c9061195a565b906105f1565b60016119c96104a2926119b0600090565b5060006000805160206152ae8339815191525b01611999565b016106d9565b61048c906119ea6000805160206152ce83398151915261369b565b61048c906137f8565b61048c906119cf565b9061048c91611a0d6115098261199f565b9061198d91613801565b9061048c916119fc565b9061048c91611a2e613850565b90611a4091611a3b61387a565b611ac6565b61048c6138b0565b6104da6104a26104a29290565b6104a290611a48565b6104a2906104da565b6104a29054611a5e565b9050519061048c826105b3565b9060208282031261047a576104a291611a71565b6040513d6000823e3d90fd5b634e487b7160e01b600052601160045260246000fd5b91908201809211611ac157565b611a9e565b6000611ad46104da82611a55565b6001600160a01b03841614611cae57604390611af8611af38584610ce1565b6106d9565b611b0461176a836105da565b03611c6857611b1f6104da611b1a8560446105e7565b611a67565b3303611c2557611b35611b306138f5565b610cd8565b6020611b4060405190565b63b8861c2360e01b81526001600160a01b038716600482015291829060249082905afa908115611c6357600091611c34575b50839003611c25578291611bdc611bd4611bcf93611b9d88611b98611be19960446105e7565b611528565b611bcf611bad611af33387610ce1565b611bc9611bba8b88610ce1565b91611bc4836106d9565b611ab4565b906117c8565b6105da565b913390610ce1565b6117c8565b90611bf4611bee33610cd8565b91610cd8565b917ffb15575860585f4d6abcf80b6e152cec3b2fca33520fefee464267ac915c109b611c1f60405190565b600090a4565b6303b925cf60e31b8152600490fd5b611c56915060203d602011611c5c575b611c4e8183610a1a565b810190611a7e565b38611b72565b503d611c44565b611a92565b6040516326b4a1e160e01b815260206004820152601e60248201527f446f6e6174696f6e20726563697069656e74206861732062616c616e636500006044820152606490fd5b63d92e233d60e01b8152600490fd5b9061048c91611a21565b61048c90611ce26000805160206152ce83398151915261369b565b61048c90611cee613850565b61048c906046611787565b61048c90611cc7565b90611d0c336104da565b6001600160a01b03821603611d245761198d91613787565b63334bd91960e11b6000908152600490fd5b036000fd5b611d4761176a60029390565b6000915b838310611d585750505050565b611d79611d72600192611d6a856106d9565b815260200190565b9260010190565b92019190611d4b565b90610a7281604093611d3b565b9061048c611da992611da060405190565b93848092611d82565b0383610a1a565b9061048c6119416003611dc161179e565b94611dd2611dce82611d8f565b8752565b6119c9611de1600283016106d9565b6020880152565b6104a290611db0565b90611e1a611e156104a293611e04600090565b50611e0e8161394a565b603c6105e7565b611de8565b6139d4565b61048c90611e2b613850565b611eb4565b6104a290610814565b6104a29054611e30565b634e487b7160e01b600052602160045260246000fd5b60021115611e6357565b611e43565b9061048c82611e59565b6104a290611e68565b6104a590611e72565b60409061076361048c9496959396611ea460608401986000850190611e7b565b6001600160a01b03166020830152565b90611ebe33613ab0565b91611ec96046611e39565b80611efa575b611edf5761048c91923390613dfe565b631698611760e01b6000908152806117428533836004611e84565b50611f11611658611f0c8560456105e7565b611e39565b611ecf565b61048c90611e1f565b611f29601961105b565b7f4554484f535f494e544552414354494f4e5f434f4e54524f4c00000000000000602082015290565b6104a2611f1f565b6104a2611f52565b9050519061048c826104e6565b9060208282031261047a576104a291611f62565b6001600160a01b03909116815260408101929161048c9160200152565b611fde6020611fb2611b306003611a67565b611fba611f5a565b90611fc460405190565b9384928391829163d57f7aa360e01b8352600483016110f7565b03915afa908115611c635760009161204a575b50612004335b916001600160a01b031690565b036120115761048c612079565b63e2517d3f60e01b6000908152611d367f261fea28325784de45eba41a3fbb84c4196fbab02ee802566edfe26616ba5afb336004611f83565b61206c915060203d602011612072575b6120648183610a1a565b810190611f6f565b38611ff1565b503d61205a565b61048c613e6c565b61048c611fa0565b6104a2939291906120a76000805160206152ce83398151915261369b565b906104a29392916120b6613850565b612114565b91908203918211611ac157565b9060406120ff600261048c946120e86120e460008301546106d2565b8652565b6120f861074e60018301546106d2565b01546106d2565b910152565b60608101929161048c91906120c8565b5061211f60646105da565b8110612214576121306104a261118e565b82106121ce5761216291611948603b9461194161214a8790565b9361215b61215661179e565b968752565b6020860152565b612187612180612170835490565b61217a60016105da565b906120bb565b8092611381565b507fda28879299d445916d616634b69d4b83d49de267b7be35bc91e7358a8f0c1f996121c86121b5846105da565b926121bf60405190565b91829182612104565b0390a290565b6040516326b4a1e160e01b815260206004820152601760248201527f496e73756666696369656e7420626173652070726963650000000000000000006044820152606490fd5b6040516326b4a1e160e01b8152602060048201526015602482015274135a5b881b1a5c5d5a591a5d1e481b9bdd081b595d605a1b6044820152606490fd5b6104a29291906000612089565b61048c919061227b6000805160206152ce83398151915261369b565b9061048c91612288613850565b9061229761048c9260456105e7565b611787565b9061048c9161225f565b9061048c916122b3613e74565b9061048c916122c181613f1c565b613f25565b9061048c916122a6565b9061048c916122dd613850565b61048c91906122f96000805160206152ce83398151915261369b565b9061048c9161230781613ab0565b613dfe565b9061048c916122d0565b6104a290612322613fe4565b612350565b6104a27f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6105da565b506104a2612327565b6104a26000612316565b61048c9061237e6000805160206152ce83398151915261369b565b61048c9061403e565b61048c90612363565b969594939291906123a5611f0c85603e6105e7565b6123b9576123b396976123eb565b90919293565b631b3b82ab60e21b60009081526004859052602490fd5b6104a260016105da565b906002811015610e67576020020190565b509495929450611e1a936104a2925090506124058561394a565b61241f8682612418611e1589603c6105e7565b9788614047565b96919695909697612460600084015191856000146124635761245a6124426123d0565b915b61245561245184876123da565b5190565b6120bb565b926123da565b52565b61245a61246e610f97565b91612444565b6123b39291906000808080612390565b6104a26140ef565b61048c90612498613850565b6124a6611f0c82603e6105e7565b6124b35761048c906124cb565b631b3b82ab60e21b6000908152600491909152602490fd5b611a40906124d761387a565b6124e4611b306003611a67565b60206124ef60405190565b63d57f7aa360e01b815260206004820152601560248201527411d490511550551253d397d5d2551211149055d053605a1b604482015291829060649082905afa8015611c635761254e916000916125b3575b506001600160a01b031690565b33036125a157806125616125719261394a565b611bcf600161229783603e6105e7565b7fc64432ddbf1c9080f50761798ca21775e2f22b3a364b325fc193447426ae543d61259b60405190565b600090a2565b6344cbf27b60e11b6000908152600490fd5b6125cc915060203d602011612072576120648183610a1a565b38612541565b61048c9061248c565b61048c906125f66000805160206152ce83398151915261369b565b61048c90612602613850565b612612565b6104a26101f46105da565b61261c6039611a67565b60009061262e611ff76104da84611a55565b14611cae575061263f6104a2612607565b81116126505761048c9060376117c8565b6040516326b4a1e160e01b81526020600482015260136024820152724665652065786365656473206d6178696d756d60681b6044820152606490fd5b61048c906125db565b61048c906126b06000805160206152ce83398151915261369b565b61048c906126bc613850565b6126c76104a2612607565b81116126d85761048c90603a6117c8565b6040516326b4a1e160e01b815260206004820152601860248201527f446f6e6174696f6e2065786365656473206d6178696d756d00000000000000006044820152606490fd5b61048c90612695565b61048c906127426000805160206152ce83398151915261369b565b61048c9061274e613850565b600061275c6104da82611a55565b6001600160a01b03831614611cae575061048c906039611528565b61048c90612727565b61048c9061279b60008051602061528e83398151915261369b565b61198d906000805160206152ce833981519152613801565b61048c90612780565b6104a260a0610a41565b6127ce6127bc565b906000825260208080808086016000815201600081520160008152016000905250565b6104a26127c6565b6002821015610e6757600190610e5e565b6104a2906128166127f1565b506128b160406128aa61286961285360006128608961283f612859858561284485858f8e610ce1565b6105e7565b0161284d6123d0565b906127f9565b90610925565b9988610ce1565b0161284d610f97565b61287960026119c989603c6105e7565b926128a561288d60036119c98b603c6105e7565b9661289e6128996127bc565b9a8b52565b60208a0152565b870152565b6060850152565b6080830152565b9061048c9392916128c7613850565b939291906128d9611f0c86603e6105e7565b6128e75761048c93946128fe565b631b3b82ab60e21b60009081526004869052602490fd5b90611a4093929161290d61387a565b612977565b634e487b7160e01b600052601260045260246000fd5b8115612932570490565b612912565b90815260408101929161048c9160200152565b9160001960089290920291821b911b61151e565b919061296f6104a261153f936105da565b90835461294a565b91909392936129858361394a565b61299e828285612999611e1582603c6105e7565b614047565b93916000976129ac896105da565b600090851115612acf57506129c18483612928565b905b808210612ab5575050612a4691612a4089611bcf8994612a126129fe61048c9d9e6129ef89603c6105e7565b018b15612aad5761284d6123d0565b612a0c8b6124558385610925565b9161295e565b612a286129fe846129ef8961283f336040610ce1565b611bc9612a3687603d6105e7565b91612455836106d9565b90614118565b50612a50836141d2565b7f6ff107c1bb6ab7da6f8a9d94ec83a6e4da26b767fce6471fbae30a6384d70fe6612a7a856105da565b91612a8d612a8733610cd8565b94151590565b94612aa5612a9a60405190565b9283924291846113d2565b0390a46142b4565b61284d610f97565b6117428a928392632bcaac5d60e11b845260048401612937565b612ad8906105da565b906129c3565b9061048c9392916128b8565b612afc6020611fb2611b306003611a67565b03915afa908115611c6357600091612b26575b50612b1933611ff7565b036120115761048c612b45565b612b3f915060203d602011612072576120648183610a1a565b38612b0f565b61048c614582565b61048c612aea565b612b756104a291612b64600090565b50612b6e8161394a565b60416105e7565b5490565b61048c90612b9460008051602061528e83398151915261369b565b61198d9060008051602061528e833981519152612bc3612bbd612bb760006105da565b83612bd2565b82613787565b50613801565b61048c90612b79565b90612c0e6104a26104a293612be5600090565b5060007fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320006119c3565b614593565b6104a2916000612c3e611f0c93612c28600090565b50826000805160206152ae8339815191526119c3565b01610ce1565b9796959493929190612c5a611f0c86603e6105e7565b6128e757612c689798612c6f565b9091929394565b509596949550611e1a93612c8e9350611e1592509050611e0e8161394a565b916104a2612c9d8686866145c7565b8751939992989197909691939092612460908515612ccf5761245a612cc06123d0565b915b611bc461245184876123da565b61245a612cda610f97565b91612cc2565b612c68929190600080808080612c44565b90612d05612853600061284485603c6105e7565b612d1261176a60006105da565b14158015612d39575b809281612d26575090565b6104a29150611f0c61165891603e6105e7565b50612d4d612853600061286085603c6105e7565b612d5a61176a60006105da565b1415612d1b565b612d736104a26104a292612be5606090565b6145e5565b612d80613850565b61048c61048c61091560006105da565b61048c612d78565b611f0c6104a291612da7600090565b5060456105e7565b61048c90612dbb613850565b611a4090612dc761387a565b90612dd5611b306003611a67565b6020612de060405190565b63d57f7aa360e01b815260206004820152601560248201527411d490511550551253d397d5d2551211149055d053605a1b604482015291829060649082905afa8015611c6357612e3e916000916125b357506001600160a01b031690565b3303612f2357612e4d8261394a565b612e5e611658611f0c84603e6105e7565b612f1157603d612e71611af384836105e7565b92600093612e8161176a866105da565b14612f025780612efc61048c9495612ea7612ea2611af3611bdc96886105e7565b6141d2565b612eb4611af384876105e7565b612ebd846105da565b7fc513e2f25032def6fadc6ba9ec688cc5ac433480c1da4db9ea2c6a065ff15c14612ef4612eea33610cd8565b936106aa60405190565b0390a36105da565b926105e7565b63356680b760e01b8452600484fd5b630522bdf560e31b6000908152600490fd5b6360b39bc560e01b6000908152600490fd5b61048c90612daf565b61048c90612f596000805160206152ce83398151915261369b565b61048c90612f65613850565b612f6f6039611a67565b600090612f81611ff76104da84611a55565b14611cae5750612f926104a2612607565b81116126505761048c9060386117c8565b61048c90612f3e565b9061048c939291612fbb613850565b93929190612fcd611f0c86603e6105e7565b6128e75761048c939490611a40939291612fe561387a565b613045565b916001600160a01b0360089290920291821b911b61151e565b91906130146104a261153f93610cd8565b908354612fea565b90815491600160401b831015610a3c578261303f91600161048c95018155610e44565b90613003565b919392906130528361394a565b603c9461306c8183613067611e15888b6105e7565b6145c7565b9198919590929190849034881161318d575b50509161048c979861310288936130bd6130af60006130a0886131079a6105e7565b018a15612aad5761284d6123d0565b612a0c8a611bc48385610925565b6130d46130af60006130a08861283f336040610ce1565b6130ef611658611f0c6130e88860426105e7565b3390610ce1565b61315d575b611bc9611bba86603d6105e7565b614118565b5061311283346120bb565b61311c60006105da565b811161314e575b507f127b56e5a89bb21afd71f9e357b1b6f1249e073579cefeda91e8d4fe76b0270b612a7a856105da565b613157906141d2565b38613123565b61317561316e6104a28760416105e7565b339061301c565b61318860016122976130e88860426105e7565b6130f4565b94509498509450505061319d8190565b8214613232576131b58187613067611e1588886105e7565b925050506131c03490565b811161321757509161310784806130a061310260006130bd6131f88d996130af9b61048c9e9f6131f3611e158a8e6105e7565b6145f6565b9d939592979198909897959b989a5050505050509350819a995061307e565b6320d2fbdd60e01b600090815290611d369034906004612937565b63356680b760e01b6000908152600490fd5b9061048c939291612fac565b6132626104a26104a292612be5600090565b6146b1565b6104a290613273613850565b6132849061327f61387a565b6132ac565b9061048c6138b0565b3d156132a75761329c3d61105b565b903d6000602084013e565b606090565b506132bb611af3336043610ce1565b60006132c6816105da565b821461338f57806132e76132dc613305936105da565b611bdc336043610ce1565b806132f160405190565b60009085335af161330061328d565b501590565b6133495761331233610cd8565b7f84be5dad61c795759fa50da4da9ff0ffc28c522295c26854247b7d22728d8c0161333c60405190565b83815280602081016121c8565b60405163123cc24f60e31b815260206004820152601a60248201527f446f6e6174696f6e207769746864726177616c206661696c65640000000000006044820152606490fd5b63356680b760e01b8152600490fd5b6104a26000613267565b9061048c916133b96115098261199f565b9061198d91613787565b9061048c916133a8565b6133d56127f1565b506104a2603c6128b16133f0612853600061284487866105e7565b916128aa613406612853600061286089866105e7565b61343f61342760036119c98a61342160026119c9838b6105e7565b976105e7565b956134386134336127bc565b998a52565b6020890152565b6040870152565b61048c906134616000805160206152ce83398151915261369b565b61048c9061346d613850565b613535565b81810361347d575050565b600261181a81846134966117f8600061048c98016106d9565b6119c961180c600183016106d9565b91906118305761048c91613472565b634e487b7160e01b600052603160045260246000fd5b61048c916000612a0c565b6000600261048c926134e9838083016134ca565b6134f683600183016134ca565b016134ca565b906000036118305761048c906134d5565b8054801561353057600019019061352d6135278383611381565b906134fc565b55565b6134b4565b603b90613540825490565b61354d61176a60016105da565b111561361b5761355e6104a2835490565b8110156135e35781816135776135c09361048c95611381565b507f087555afdfef1529b3b03cf9188e43c437739621c8ba62c7f582d72868a128896135a56121b5846105da565b0390a26135b3612170835490565b908181036135c557505090565b61350d565b6135dd6135d56104a29385611381565b509184611381565b906134a5565b6040516326b4a1e160e01b815260206004820152600f60248201526e1a5b99195e081b9bdd08199bdd5b99608a1b6044820152606490fd5b6040516326b4a1e160e01b81526020600482015260146024820152734d757374206b656570206f6e6520636f6e66696760601b6044820152606490fd5b61048c90613446565b637965db0b60e01b6001600160e01b0319821614908115613680575090565b6104a291506001600160e01b0319166301ffc9a760e01b1490565b61048c9033906146cb565b9061048c949392916136b66146fa565b9290939160006136c581611a55565b6001600160a01b0381166001600160a01b0387161490811561374d575b8115613731575b50611cae575061154f61371c93611b3061198d9796946137089461473c565b60008051602061528e833981519152613801565b506000805160206152ce833981519152613801565b6001600160a01b031690506001600160a01b03851614386136e9565b90506001600160a01b0381166001600160a01b03881614906136e2565b9061048c949392916136a6565b61048c6146fa565b61048c613777565b907fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e82371705932000906137b48184614746565b92836137c1575b50505090565b6137d7926137d2916104a291611999565b6147dc565b503880806137bb565b61048c906137ed81614809565b61048c906000611528565b61048c906137e0565b907fc1f6fe24621ce81ec5827caf0253cadb74709b061630e6b55e823717059320009061382e8184614823565b928361383a5750505090565b6137d79261384b916104a291611999565b614894565b613858612484565b61385e57565b63d93c066560e01b6000908152600490fd5b6104a260026105da565b61388460366106d9565b61388c613870565b90811461389e5761048c9060366117c8565b633ee5aeb560e01b6000908152600490fd5b61048c6138bb6123d0565b60366117c8565b6138cc600d61105b565b6c4554484f535f50524f46494c4560981b602082015290565b6104a26138c2565b6104a26138e5565b61390f6020613907611b306003611a67565b611fba6138ed565b03915afa8015611c63576104a29160009161392b575b50610cd8565b613944915060203d602011612072576120648183610a1a565b38613925565b61395d612853600061284484603c6105e7565b9060009161396d61176a846105da565b1480613990575b61397c575050565b630fff01a760e31b82526004820152602490fd5b506139a36128538361286084603c6105e7565b6139af61176a846105da565b14613974565b610f6161048c94610bc8606094989795610bc1608086019a6000870152565b81906020731a574edc919ddb2ceb192f3623b68ff1c5d63b116000830190613a18612451613a0e6124518551613a086123d0565b906123da565b9351613a08610f97565b604085015192613a44613a2a60405190565b98899586948594632d7a0e7560e11b8652600486016139b5565b03915af4908115611c63576104a293600092613a8a575b50602001515b9115613a82576000915b613a7c670de0b6b3a76400006105da565b916148b4565b600191613a6b565b613a61919250613aa8602091823d8411611c5c57611c4e8183610a1a565b929150613a5b565b600090613abf6104da83611a55565b6001600160a01b03821614613b5357906020613b0b92613ae0611b306138f5565b6040519485928391829163b8861c2360e01b8352600483016001600160a01b03909116815260200190565b03915afa918215611c6357600092613b32575b50613b28816105da565b8214611c25575090565b613b4c91925060203d602011611c5c57611c4e8183610a1a565b9038613b1e565b506342bcdf7f60e11b8152600490fd5b90611a409291613b7161387a565b909291603c936000613b8384876105e7565b0190613b9a612853613b936123d0565b80946127f9565b9560008097613bab61176a836105da565b14158015613dd9575b613dc35750603b92613bc76104a2855490565b851015613d8657613be46002613bdd8787611381565b50016106d9565b613bff611658336000805160206152ce833981519152612c13565b15613d2b57803410613d1757826003613c9a89613caa8d613ca061048c9e9f6001613bdd613cbb9f9e9d9b8f908f90613c899f613c83613cb09f976128608d613c839461283f613c89978d613c5c613c8e9f611bdc87603d6105e7565b803411613d04575b505b613c6f8d6105da565b97889187613c7d87876105e7565b016127f9565b9061295e565b611381565b6002613c9a868a6105e7565b016117c8565b613bdd8b8b611381565b936105e7565b611b988660446105e7565b50613cc5826105da565b7f3ad3277bf8dd109a480fc999867b6e02a6c352dd8aee06330693349cbb5f3a6f613cfc613cf233610cd8565b936121bf60405190565b0390a36142b4565b612ea2613d1191346120bb565b38613c64565b63c730333f60e01b89526004890152602488fd5b5091613cb0826003613c9a89613caa8d613ca061048c9e9f6001613bdd613cbb9f9e9d8f908f90613c899f613c83613c8e976128608d613c839461283f613c8997613d81613d7a85603d6105e7565b34906117c8565b613c66565b6040516326b4a1e160e01b8152602060048201526014602482015273092dcecc2d8d2c840c6dedcccd2ce40d2dcc8caf60631b6044820152606490fd5b6311453d1960e31b815260048101869052602490fd5b50613deb6128538261286089866105e7565b613df761176a836105da565b1415613bb4565b9061048c9291613b63565b613e1161490c565b61048c613e426000807fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005b01611787565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61171f3361064e565b61048c613e09565b613e7d30610cd8565b7f000000000000000000000000000000000000000000000000000000000000000090613eb16001600160a01b038316611ff7565b14908115613ed3575b50613ec157565b63703e46dd60e11b6000908152600490fd5b9050613ef0611ff7613ee361492f565b926001600160a01b031690565b141538613eba565b61048c90613f1360008051602061528e83398151915261369b565b61048c90614809565b61048c90613ef8565b90613f32611b3083610cd8565b906020613f3e60405190565b6352d1902d60e01b815292839060049082905afa60009281613fc3575b50613f8d5750506001613f6b5750565b634c9c8ce360e01b60009081526001600160a01b039091166004526024036000fd5b909291613f9b6104a2612327565b8403613fac5761048c929350614945565b632a87526960e21b60009081526004859052602490fd5b613fdd91935060203d602011611c5c57611c4e8183610a1a565b9138613f5b565b613fed30610cd8565b61401f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016611ff7565b03613ec157565b61048c9061403381614809565b61048c906001611528565b61048c90614026565b90939291906140756104a261285360006140668961283f336040610ce1565b018515612aad5761284d6123d0565b83116140d4578051614093906124519084156140cc57613a086123d0565b83116140b5576140a893945090600091614a38565b906140b282614c9d565b91565b6334b07dbb60e01b60009081526004869052602490fd5b613a08610f97565b63ecf1248b60e01b6000908152600486905233602452604490fd5b6104a27fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300611e39565b9161413d614136611b1a61414a9361412e600090565b5060446105e7565b6043610ce1565b611bc983611bc4836106d9565b61415460006105da565b8211614164575b6104a291611ab4565b6141876000806141746039611a67565b6040518681805b03925af161330061328d565b1561415b5760405163123cc24f60e31b815260206004820152601b60248201527f50726f746f636f6c20666565206465706f736974206661696c656400000000006044820152606490fd5b6000806141f7926141e5611b3033610cd8565b906141ef60405190565b90818061417b565b6141fd57565b60405163123cc24f60e31b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606490fd5b91908083039260009091128015828513169184121617611ac157565b600461181a608061048c9461426e6117f8600083015190565b61427c61180c602083015190565b61429361428a604083015190565b600287016117c8565b6118156142a1606083015190565b600387016117c8565b9061048c91614255565b6142bd8161394a565b6142c8600182611df1565b906000916142d68383611df1565b90826142e66104a282603f6105e7565b6142f2600482016106d9565b6142fe61176a886105da565b146144dc578561433061431c611bcf6128538461284488603c6105e7565b61432a611bcf8486016106d9565b90614239565b614357614348611bcf6128538561286089603c6105e7565b61432a611bcf600187016106d9565b92614388614376614367886105da565b61432a611bcf600286016106d9565b9161432a611bcf60036107238c6105da565b603c928461439688866105e7565b01926143a06123d0565b93846143ab916127f9565b6143b491610925565b90866143c08a886105e7565b01978a6143cb610f97565b998a6143d6916127f9565b6143df91610925565b948d6143ea8d6105da565b956143f4906105da565b966143fe906105da565b9761440860405190565b938452602084019190915260408301919091526060820192909252608081019290925260a08201524360c08201524260e08201527f7848c3bf7c98a684210c7cfd1e092dd69365793507a165aa2c49c76ec2924d9d9061010090a48261446e86846105e7565b0190614479916127f9565b61448291610925565b9361448c916105e7565b0190614497916127f9565b6144a091610925565b906144a96127bc565b958601526020850152604084015260608301526144c7436080840152565b6144d290603f6105e7565b9061048c916142aa565b506144f2611bcf6128538761284485603c6105e7565b85614508611bcf6128538361286087603c6105e7565b91614512856105da565b61451b876105da565b614388565b614528613850565b61048c614558600160007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300613e3c565b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861171f3361064e565b61048c614520565b6104a2906105da565b6145bd6145b86104a2936145b360006145c2956145ae600090565b500190565b614cc5565b61458a565b611a48565b610ccf565b6145d49291600191614a38565b906145de82614cde565b9092909190565b6060906145f190614daf565b905090565b9293600093915b8584116146a1576146216146118786611ab4565b61461b60026105da565b90612928565b9061462d8282866145c7565b9692999198909761463b3490565b880361464d5750505050509493929190565b939950939497509490955061466261176a3490565b101561468a57505061467e8161467860016105da565b90611ab4565b905b93909291946145fd565b9161469b91935061217a60016105da565b91614680565b909394506123b3925084916145c7565b6146c260006104a2926145ae600090565b614dc4565b1490565b906146d96116588284612c13565b6146e1575050565b63e2517d3f60e01b600090815291611d36916004611f83565b614705611658614dd8565b61470b57565b631afcd79f60e31b6000908152600490fd5b9061048c9161472a6146fa565b9061473761048c926137f8565b61403e565b9061048c9161471d565b6000805160206152ae83398151915261475f8383612c13565b156147c25760006122978482612c3e868261477a9701611999565b61478e611bee614788339390565b93610cd8565b917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b6147b960405190565b600090a4600190565b505050600090565b6104a29081906001600160a01b031681565b9061480461176a611bcf6147ff60006104a2966147f7600090565b500194610ccf565b6147ca565b614e3c565b60009061481b611ff76104da84611a55565b14611cae5750565b6000805160206152ae83398151915261483f6116588484612c13565b156147c2576001612297846000612c3e868261485b9701611999565b614869611bee614788339390565b917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d6147b960405190565b906148af61176a611bcf6147ff60006104a2966147f7600090565b614f10565b92916148ca6148c4828487614f61565b936150e0565b93846148e0575b5050506146786104a292151590565b90809294501561293257614904614678926104a2956148ff60006105da565b930990565b1192386148d1565b614917611658612484565b61491d57565b638dfc202b60e01b6000908152600490fd5b6104a2600061493f6104a2612327565b01611a67565b9061494f82615112565b61495882610cd8565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b61498260405190565b600090a2805161499561176a60006105da565b11156149a45761198d91615180565b505061048c61515d565b67ffffffffffffffff8111610a3c5760208091020190565b90611068610a92836149ae565b369037565b9061048c6149ee6149e8846149c6565b936149ae565b601f1901602084016149d3565b90614a04825190565b811015610e67576020809102010190565b8181029291600160ff1b81146000831216611ac1578184051490151715611ac157565b9092614a4c614a4760026105da565b6149d8565b938315614c1a5715614bd257614a72614a8591611bc46124516000860151613a086123d0565b612460614a7f60006105da565b866149fb565b614aa8614a9b6124516000840151613a08610f97565b612460614a7f60016105da565b6020731a574edc919ddb2ceb192f3623b68ff1c5d63b11936000830194614ae5612451614adb6124518951613a086123d0565b9751613a08610f97565b614b12612451614b01612451614afb60006105da565b876149fb565b94614b0c60016105da565b906149fb565b96614b3e614b21604088015190565b604051998a968795869563da805cd360e01b87526004870161072a565b03915af4928315611c6357614b7f60206104a295614b8493600091614bb5575b50614b6960006105da565b811315614b9d57614b79906105da565b93015190565b921590565b15613a8257600091613a7c670de0b6b3a76400006105da565b611bcf614b7991614baf6000196105da565b90614a15565b614bcc9150823d8411611c5c57611c4e8183610a1a565b38614b5e565b614a9b614c1591614c02614bef6124516000870151613a086123d0565b612460614bfc60006105da565b896149fb565b611bc46124516000860151613a08610f97565b614aa8565b15614c4f57614a72614c39916124556124516000860151613a086123d0565b614c15614a9b6124516000840151613a08610f97565b614a9b614c1591614c6c614bef6124516000870151613a086123d0565b6124556124516000860151613a08610f97565b81810292918115918404141715611ac157565b6104a26127106105da565b6140b2614cbe614cb6614cb060386106d9565b84614c7f565b61461b614c92565b80926120bb565b6104a291600061285392614cd7600090565b5001610e44565b614cf1614ceb60376106d9565b82614c7f565b90614d2f614d07614d00614c92565b8094612928565b611bc4614d278295614d22614d1c603a6106d9565b87614c7f565b612928565b918294611ab4565b92565b90614d4d614d41610fd3845490565b92600052602060002090565b9060005b818110614d5e5750505090565b909192614d7a614d73600192611d6a876106d9565b9460010190565b929101614d51565b906104a291614d32565b9061048c611da992614d9d60405190565b93848092614d82565b6104a290614d8c565b60006104a291614dbd606090565b5001614da6565b60006104a291614dd2600090565b50015490565b6104a27ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0061156b565b919061296f6104a261153f9390565b61048c91600091614e01565b8054801561353057600019019061352d614e368383610e44565b90614e10565b90614e4d611af38260018501611999565b614e5760006105da565b81146147c257614eaf6104a292600092614eaa956119c36001978893614e85614e7f866105da565b826120bb565b88850191614e9d614e94845490565b61217a896105da565b808303614eb45750505090565b614e1c565b6134ca565b614ed7614edd614ee594614ece612853611bdc9589610e44565b92839188610e44565b90614e01565b888801611999565b3880806137bb565b90815491600160401b831015610a3c5782614ed791600161048c95018155610e44565b614f1d61165883836151a7565b15614f4657614f4191611bdc906001614f3a84612b758482614eed565b9301611999565b600190565b5050600090565b6104a260126105da565b6104a260116105da565b60009190818102916000198183098380821091030391600094614f83866105da565b841461508d5783871115615061578695936104a297614fd194614fe497946001945009908382119003920395614fc081614fbc876105da565b0390565b811680808093049804950304010290565b1791614fe4614fe882614fe460036105da565b0290565b614fbc61505b615055615046615037615028615019600297615009896105da565b18614fe48b8202614fbc8b6105da565b614fe48a8202614fbc8a6105da565b614fe4898202614fbc896105da565b614fe4888202614fbc886105da565b614fe4878202614fbc876105da565b80950290565b916105da565b6150888761507161176a896105da565b1461507a614f4d565b615082614f57565b916151d2565b6151ee565b505050506104a2929150612928565b60041115611e6357565b9061048c8261509c565b6104a2906150a6565b6108146104a26104a29290565b6150d59060ff165b9160ff1690565b908115612932570690565b6150f5615105916150ef600090565b506150b0565b6150ff60026150b9565b906150c6565b6146c76150ce60016150b9565b6000813b61512261176a836105da565b1461513d579061048c916151376104a2612327565b01611528565b634c9c8ce360e01b81526001600160a01b03919091166004820152602490fd5b6000615168816105da565b34116151715750565b63b398979f60e01b8152600490fd5b6000806104a29361518f606090565b50602081519101845af46151a161328d565b916151ff565b6151c0916001611af3926151b9600090565b5001611999565b6151cd61176a60006105da565b141590565b614fe4836151ea936151e2600090565b501891151590565b1890565b634e487b716000526020526024601cfd5b9061520a575061525e565b81519060009161521c61176a846105da565b1480615249575b61522c57505090565b639996b31560e01b82526001600160a01b03166004820152602490fd5b50803b61525861176a846105da565b14615223565b805160009061526f61176a836105da565b111561527e5750805190602001fd5b63d6bda27560e01b8152600490fdfeb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220cb674f255b6eee7d1301955c78d50b7d8c3214ed4ff01ec1d9c9891471f6f19164736f6c634300081a0033