@owlprotocol/contracts-account-abstraction
Version:
ERC4337 Account Abstraction support for deploying relevant smart contracts and interacting with UserOps.
626 lines (624 loc) • 119 kB
text/typescript
import { Hex, Address } from "viem";
export const _constructor = { inputs: [], stateMutability: "nonpayable", type: "constructor" } as const;
export const DelegateAndRevert = {
inputs: [
{ internalType: "bool", name: "success", type: "bool" },
{ internalType: "bytes", name: "ret", type: "bytes" },
],
name: "DelegateAndRevert",
type: "error",
} as const;
export const FailedOp = {
inputs: [
{ internalType: "uint256", name: "opIndex", type: "uint256" },
{ internalType: "string", name: "reason", type: "string" },
],
name: "FailedOp",
type: "error",
} as const;
export const FailedOpWithRevert = {
inputs: [
{ internalType: "uint256", name: "opIndex", type: "uint256" },
{ internalType: "string", name: "reason", type: "string" },
{ internalType: "bytes", name: "inner", type: "bytes" },
],
name: "FailedOpWithRevert",
type: "error",
} as const;
export const PostOpReverted = {
inputs: [{ internalType: "bytes", name: "returnData", type: "bytes" }],
name: "PostOpReverted",
type: "error",
} as const;
export const ReentrancyGuardReentrantCall = {
inputs: [],
name: "ReentrancyGuardReentrantCall",
type: "error",
} as const;
export const SenderAddressResult = {
inputs: [{ internalType: "address", name: "sender", type: "address" }],
name: "SenderAddressResult",
type: "error",
} as const;
export const SignatureValidationFailed = {
inputs: [{ internalType: "address", name: "aggregator", type: "address" }],
name: "SignatureValidationFailed",
type: "error",
} as const;
export const AccountDeployed = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" },
{ indexed: true, internalType: "address", name: "sender", type: "address" },
{ indexed: false, internalType: "address", name: "factory", type: "address" },
{ indexed: false, internalType: "address", name: "paymaster", type: "address" },
],
name: "AccountDeployed",
type: "event",
} as const;
export const BeforeExecution = { anonymous: false, inputs: [], name: "BeforeExecution", type: "event" } as const;
export const Deposited = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "address", name: "account", type: "address" },
{ indexed: false, internalType: "uint256", name: "totalDeposit", type: "uint256" },
],
name: "Deposited",
type: "event",
} as const;
export const PostOpRevertReason = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" },
{ indexed: true, internalType: "address", name: "sender", type: "address" },
{ indexed: false, internalType: "uint256", name: "nonce", type: "uint256" },
{ indexed: false, internalType: "bytes", name: "revertReason", type: "bytes" },
],
name: "PostOpRevertReason",
type: "event",
} as const;
export const SignatureAggregatorChanged = {
anonymous: false,
inputs: [{ indexed: true, internalType: "address", name: "aggregator", type: "address" }],
name: "SignatureAggregatorChanged",
type: "event",
} as const;
export const StakeLocked = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "address", name: "account", type: "address" },
{ indexed: false, internalType: "uint256", name: "totalStaked", type: "uint256" },
{ indexed: false, internalType: "uint256", name: "unstakeDelaySec", type: "uint256" },
],
name: "StakeLocked",
type: "event",
} as const;
export const StakeUnlocked = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "address", name: "account", type: "address" },
{ indexed: false, internalType: "uint256", name: "withdrawTime", type: "uint256" },
],
name: "StakeUnlocked",
type: "event",
} as const;
export const StakeWithdrawn = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "address", name: "account", type: "address" },
{ indexed: false, internalType: "address", name: "withdrawAddress", type: "address" },
{ indexed: false, internalType: "uint256", name: "amount", type: "uint256" },
],
name: "StakeWithdrawn",
type: "event",
} as const;
export const UserOperationEvent = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" },
{ indexed: true, internalType: "address", name: "sender", type: "address" },
{ indexed: true, internalType: "address", name: "paymaster", type: "address" },
{ indexed: false, internalType: "uint256", name: "nonce", type: "uint256" },
{ indexed: false, internalType: "bool", name: "success", type: "bool" },
{ indexed: false, internalType: "uint256", name: "actualGasCost", type: "uint256" },
{ indexed: false, internalType: "uint256", name: "actualGasUsed", type: "uint256" },
],
name: "UserOperationEvent",
type: "event",
} as const;
export const UserOperationPrefundTooLow = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" },
{ indexed: true, internalType: "address", name: "sender", type: "address" },
{ indexed: false, internalType: "uint256", name: "nonce", type: "uint256" },
],
name: "UserOperationPrefundTooLow",
type: "event",
} as const;
export const UserOperationRevertReason = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "bytes32", name: "userOpHash", type: "bytes32" },
{ indexed: true, internalType: "address", name: "sender", type: "address" },
{ indexed: false, internalType: "uint256", name: "nonce", type: "uint256" },
{ indexed: false, internalType: "bytes", name: "revertReason", type: "bytes" },
],
name: "UserOperationRevertReason",
type: "event",
} as const;
export const Withdrawn = {
anonymous: false,
inputs: [
{ indexed: true, internalType: "address", name: "account", type: "address" },
{ indexed: false, internalType: "address", name: "withdrawAddress", type: "address" },
{ indexed: false, internalType: "uint256", name: "amount", type: "uint256" },
],
name: "Withdrawn",
type: "event",
} as const;
export const addStake = {
inputs: [{ internalType: "uint32", name: "unstakeDelaySec", type: "uint32" }],
name: "addStake",
outputs: [],
stateMutability: "payable",
type: "function",
} as const;
export const balanceOf = {
inputs: [{ internalType: "address", name: "account", type: "address" }],
name: "balanceOf",
outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
stateMutability: "view",
type: "function",
} as const;
export const delegateAndRevert = {
inputs: [
{ internalType: "address", name: "target", type: "address" },
{ internalType: "bytes", name: "data", type: "bytes" },
],
name: "delegateAndRevert",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const depositTo = {
inputs: [{ internalType: "address", name: "account", type: "address" }],
name: "depositTo",
outputs: [],
stateMutability: "payable",
type: "function",
} as const;
export const deposits = {
inputs: [{ internalType: "address", name: "", type: "address" }],
name: "deposits",
outputs: [
{ internalType: "uint256", name: "deposit", type: "uint256" },
{ internalType: "bool", name: "staked", type: "bool" },
{ internalType: "uint112", name: "stake", type: "uint112" },
{ internalType: "uint32", name: "unstakeDelaySec", type: "uint32" },
{ internalType: "uint48", name: "withdrawTime", type: "uint48" },
],
stateMutability: "view",
type: "function",
} as const;
export const getDepositInfo = {
inputs: [{ internalType: "address", name: "account", type: "address" }],
name: "getDepositInfo",
outputs: [
{
components: [
{ internalType: "uint256", name: "deposit", type: "uint256" },
{ internalType: "bool", name: "staked", type: "bool" },
{ internalType: "uint112", name: "stake", type: "uint112" },
{ internalType: "uint32", name: "unstakeDelaySec", type: "uint32" },
{ internalType: "uint48", name: "withdrawTime", type: "uint48" },
],
internalType: "struct IStakeManager.DepositInfo",
name: "info",
type: "tuple",
},
],
stateMutability: "view",
type: "function",
} as const;
export const getNonce = {
inputs: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint192", name: "key", type: "uint192" },
],
name: "getNonce",
outputs: [{ internalType: "uint256", name: "nonce", type: "uint256" }],
stateMutability: "view",
type: "function",
} as const;
export const getSenderAddress = {
inputs: [{ internalType: "bytes", name: "initCode", type: "bytes" }],
name: "getSenderAddress",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const getUserOpHash = {
inputs: [
{
components: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint256", name: "nonce", type: "uint256" },
{ internalType: "bytes", name: "initCode", type: "bytes" },
{ internalType: "bytes", name: "callData", type: "bytes" },
{ internalType: "bytes32", name: "accountGasLimits", type: "bytes32" },
{ internalType: "uint256", name: "preVerificationGas", type: "uint256" },
{ internalType: "bytes32", name: "gasFees", type: "bytes32" },
{ internalType: "bytes", name: "paymasterAndData", type: "bytes" },
{ internalType: "bytes", name: "signature", type: "bytes" },
],
internalType: "struct PackedUserOperation",
name: "userOp",
type: "tuple",
},
],
name: "getUserOpHash",
outputs: [{ internalType: "bytes32", name: "", type: "bytes32" }],
stateMutability: "view",
type: "function",
} as const;
export const handleAggregatedOps = {
inputs: [
{
components: [
{
components: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint256", name: "nonce", type: "uint256" },
{ internalType: "bytes", name: "initCode", type: "bytes" },
{ internalType: "bytes", name: "callData", type: "bytes" },
{ internalType: "bytes32", name: "accountGasLimits", type: "bytes32" },
{ internalType: "uint256", name: "preVerificationGas", type: "uint256" },
{ internalType: "bytes32", name: "gasFees", type: "bytes32" },
{ internalType: "bytes", name: "paymasterAndData", type: "bytes" },
{ internalType: "bytes", name: "signature", type: "bytes" },
],
internalType: "struct PackedUserOperation[]",
name: "userOps",
type: "tuple[]",
},
{ internalType: "contract IAggregator", name: "aggregator", type: "address" },
{ internalType: "bytes", name: "signature", type: "bytes" },
],
internalType: "struct IEntryPoint.UserOpsPerAggregator[]",
name: "opsPerAggregator",
type: "tuple[]",
},
{ internalType: "address payable", name: "beneficiary", type: "address" },
],
name: "handleAggregatedOps",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const handleOps = {
inputs: [
{
components: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint256", name: "nonce", type: "uint256" },
{ internalType: "bytes", name: "initCode", type: "bytes" },
{ internalType: "bytes", name: "callData", type: "bytes" },
{ internalType: "bytes32", name: "accountGasLimits", type: "bytes32" },
{ internalType: "uint256", name: "preVerificationGas", type: "uint256" },
{ internalType: "bytes32", name: "gasFees", type: "bytes32" },
{ internalType: "bytes", name: "paymasterAndData", type: "bytes" },
{ internalType: "bytes", name: "signature", type: "bytes" },
],
internalType: "struct PackedUserOperation[]",
name: "ops",
type: "tuple[]",
},
{ internalType: "address payable", name: "beneficiary", type: "address" },
],
name: "handleOps",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const incrementNonce = {
inputs: [{ internalType: "uint192", name: "key", type: "uint192" }],
name: "incrementNonce",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const innerHandleOp = {
inputs: [
{ internalType: "bytes", name: "callData", type: "bytes" },
{
components: [
{
components: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint256", name: "nonce", type: "uint256" },
{ internalType: "uint256", name: "verificationGasLimit", type: "uint256" },
{ internalType: "uint256", name: "callGasLimit", type: "uint256" },
{ internalType: "uint256", name: "paymasterVerificationGasLimit", type: "uint256" },
{ internalType: "uint256", name: "paymasterPostOpGasLimit", type: "uint256" },
{ internalType: "uint256", name: "preVerificationGas", type: "uint256" },
{ internalType: "address", name: "paymaster", type: "address" },
{ internalType: "uint256", name: "maxFeePerGas", type: "uint256" },
{ internalType: "uint256", name: "maxPriorityFeePerGas", type: "uint256" },
],
internalType: "struct EntryPoint.MemoryUserOp",
name: "mUserOp",
type: "tuple",
},
{ internalType: "bytes32", name: "userOpHash", type: "bytes32" },
{ internalType: "uint256", name: "prefund", type: "uint256" },
{ internalType: "uint256", name: "contextOffset", type: "uint256" },
{ internalType: "uint256", name: "preOpGas", type: "uint256" },
],
internalType: "struct EntryPoint.UserOpInfo",
name: "opInfo",
type: "tuple",
},
{ internalType: "bytes", name: "context", type: "bytes" },
],
name: "innerHandleOp",
outputs: [{ internalType: "uint256", name: "actualGasCost", type: "uint256" }],
stateMutability: "nonpayable",
type: "function",
} as const;
export const nonceSequenceNumber = {
inputs: [
{ internalType: "address", name: "", type: "address" },
{ internalType: "uint192", name: "", type: "uint192" },
],
name: "nonceSequenceNumber",
outputs: [{ internalType: "uint256", name: "", type: "uint256" }],
stateMutability: "view",
type: "function",
} as const;
export const simulateCallData = {
inputs: [
{
components: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint256", name: "nonce", type: "uint256" },
{ internalType: "bytes", name: "initCode", type: "bytes" },
{ internalType: "bytes", name: "callData", type: "bytes" },
{ internalType: "bytes32", name: "accountGasLimits", type: "bytes32" },
{ internalType: "uint256", name: "preVerificationGas", type: "uint256" },
{ internalType: "bytes32", name: "gasFees", type: "bytes32" },
{ internalType: "bytes", name: "paymasterAndData", type: "bytes" },
{ internalType: "bytes", name: "signature", type: "bytes" },
],
internalType: "struct PackedUserOperation",
name: "op",
type: "tuple",
},
{ internalType: "address", name: "target", type: "address" },
{ internalType: "bytes", name: "targetCallData", type: "bytes" },
],
name: "simulateCallData",
outputs: [
{
components: [
{ internalType: "uint256", name: "gasUsed", type: "uint256" },
{ internalType: "bool", name: "success", type: "bool" },
{ internalType: "bytes", name: "returnData", type: "bytes" },
],
internalType: "struct IEntryPointSimulations.TargetCallResult",
name: "",
type: "tuple",
},
],
stateMutability: "nonpayable",
type: "function",
} as const;
export const simulateHandleOp = {
inputs: [
{
components: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint256", name: "nonce", type: "uint256" },
{ internalType: "bytes", name: "initCode", type: "bytes" },
{ internalType: "bytes", name: "callData", type: "bytes" },
{ internalType: "bytes32", name: "accountGasLimits", type: "bytes32" },
{ internalType: "uint256", name: "preVerificationGas", type: "uint256" },
{ internalType: "bytes32", name: "gasFees", type: "bytes32" },
{ internalType: "bytes", name: "paymasterAndData", type: "bytes" },
{ internalType: "bytes", name: "signature", type: "bytes" },
],
internalType: "struct PackedUserOperation",
name: "op",
type: "tuple",
},
],
name: "simulateHandleOp",
outputs: [
{
components: [
{ internalType: "uint256", name: "preOpGas", type: "uint256" },
{ internalType: "uint256", name: "paid", type: "uint256" },
{ internalType: "uint256", name: "accountValidationData", type: "uint256" },
{ internalType: "uint256", name: "paymasterValidationData", type: "uint256" },
{ internalType: "bool", name: "targetSuccess", type: "bool" },
{ internalType: "bytes", name: "targetResult", type: "bytes" },
],
internalType: "struct IEntryPointSimulations.ExecutionResult",
name: "",
type: "tuple",
},
],
stateMutability: "nonpayable",
type: "function",
} as const;
export const simulateValidation = {
inputs: [
{
components: [
{ internalType: "address", name: "sender", type: "address" },
{ internalType: "uint256", name: "nonce", type: "uint256" },
{ internalType: "bytes", name: "initCode", type: "bytes" },
{ internalType: "bytes", name: "callData", type: "bytes" },
{ internalType: "bytes32", name: "accountGasLimits", type: "bytes32" },
{ internalType: "uint256", name: "preVerificationGas", type: "uint256" },
{ internalType: "bytes32", name: "gasFees", type: "bytes32" },
{ internalType: "bytes", name: "paymasterAndData", type: "bytes" },
{ internalType: "bytes", name: "signature", type: "bytes" },
],
internalType: "struct PackedUserOperation",
name: "userOp",
type: "tuple",
},
],
name: "simulateValidation",
outputs: [
{
components: [
{
components: [
{ internalType: "uint256", name: "preOpGas", type: "uint256" },
{ internalType: "uint256", name: "prefund", type: "uint256" },
{ internalType: "uint256", name: "accountValidationData", type: "uint256" },
{ internalType: "uint256", name: "paymasterValidationData", type: "uint256" },
{ internalType: "bytes", name: "paymasterContext", type: "bytes" },
],
internalType: "struct IEntryPoint.ReturnInfo",
name: "returnInfo",
type: "tuple",
},
{
components: [
{ internalType: "uint256", name: "stake", type: "uint256" },
{ internalType: "uint256", name: "unstakeDelaySec", type: "uint256" },
],
internalType: "struct IStakeManager.StakeInfo",
name: "senderInfo",
type: "tuple",
},
{
components: [
{ internalType: "uint256", name: "stake", type: "uint256" },
{ internalType: "uint256", name: "unstakeDelaySec", type: "uint256" },
],
internalType: "struct IStakeManager.StakeInfo",
name: "factoryInfo",
type: "tuple",
},
{
components: [
{ internalType: "uint256", name: "stake", type: "uint256" },
{ internalType: "uint256", name: "unstakeDelaySec", type: "uint256" },
],
internalType: "struct IStakeManager.StakeInfo",
name: "paymasterInfo",
type: "tuple",
},
{
components: [
{ internalType: "address", name: "aggregator", type: "address" },
{
components: [
{ internalType: "uint256", name: "stake", type: "uint256" },
{ internalType: "uint256", name: "unstakeDelaySec", type: "uint256" },
],
internalType: "struct IStakeManager.StakeInfo",
name: "stakeInfo",
type: "tuple",
},
],
internalType: "struct IEntryPoint.AggregatorStakeInfo",
name: "aggregatorInfo",
type: "tuple",
},
],
internalType: "struct IEntryPointSimulations.ValidationResult",
name: "",
type: "tuple",
},
],
stateMutability: "nonpayable",
type: "function",
} as const;
export const supportsInterface = {
inputs: [{ internalType: "bytes4", name: "interfaceId", type: "bytes4" }],
name: "supportsInterface",
outputs: [{ internalType: "bool", name: "", type: "bool" }],
stateMutability: "view",
type: "function",
} as const;
export const unlockStake = {
inputs: [],
name: "unlockStake",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const withdrawStake = {
inputs: [{ internalType: "address payable", name: "withdrawAddress", type: "address" }],
name: "withdrawStake",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const withdrawTo = {
inputs: [
{ internalType: "address payable", name: "withdrawAddress", type: "address" },
{ internalType: "uint256", name: "withdrawAmount", type: "uint256" },
],
name: "withdrawTo",
outputs: [],
stateMutability: "nonpayable",
type: "function",
} as const;
export const receive = { stateMutability: "payable", type: "receive" } as const;
export const functions = [
_constructor,
addStake,
balanceOf,
delegateAndRevert,
depositTo,
deposits,
getDepositInfo,
getNonce,
getSenderAddress,
getUserOpHash,
handleAggregatedOps,
handleOps,
incrementNonce,
innerHandleOp,
nonceSequenceNumber,
simulateCallData,
simulateHandleOp,
simulateValidation,
supportsInterface,
unlockStake,
withdrawStake,
withdrawTo,
receive,
] as const;
export const events = [
AccountDeployed,
BeforeExecution,
Deposited,
PostOpRevertReason,
SignatureAggregatorChanged,
StakeLocked,
StakeUnlocked,
StakeWithdrawn,
UserOperationEvent,
UserOperationPrefundTooLow,
UserOperationRevertReason,
Withdrawn,
] as const;
export const errors = [
DelegateAndRevert,
FailedOp,
FailedOpWithRevert,
PostOpReverted,
ReentrancyGuardReentrantCall,
SenderAddressResult,
SignatureValidationFailed,
] as const;
export const abi = [...functions, ...events, ...errors] as const;
export const bytecode =
"0x60a08060405234620000ba5760016002556101df8181016001600160401b03811183821017620000a457829162005aff833903906000f0801562000098576080526200004a620000bf565b6000815260208101906000825280602062000064620000bf565b600081520152600380546001600160a01b03191690555160045551600555604051615a1f9081620000e08239608051815050f35b6040513d6000823e3d90fd5b634e487b7160e01b600052604160045260246000fd5b600080fd5b60408051919082016001600160401b03811183821017620000a45760405256fe60806040526004361015610024575b361561001957600080fd5b610022336143a4565b005b60003560e01c806242dc531461385057806301ffc9a71461371c5780630396cb601461346a5780630bd28e3b1461340c5780631b2e01b8146133a3578063205c28781461327a57806322cdde4c1461325a57806335567e1a146131cd5780635287ce12146130ea5780635895273b146124c757806370a082311461248d578063765e827f14612240578063850aaf62146121a35780639b249f69146120b7578063b760faf91461209b578063bb9fe6bf14611f1b578063c23a5cea14611d17578063c3bce00914611223578063c5f996e6146106f7578063dbed18e0146101975763fc7e286d0361000e5734610192576020600319360112610192576001600160a01b03610130613f68565b16600052600060205260a0604060002065ffffffffffff6001825492015460405192835260ff8116151560208401526dffffffffffffffffffffffffffff8160081c16604084015263ffffffff8160781c16606084015260981c166080820152f35b600080fd5b34610192576101a53661404e565b906101ae614700565b60009160005b8281106104e757506101c68493614292565b6000805b8481106102e55750507fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000809360005b81811061023d57610236868660007f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d8180a2615668565b6001600255005b61028b61024b82848a61444b565b6001600160a01b0361025f602083016144df565b167f575ff3acadd5ab348fe1855e217e0f3678f8d767d7494c9f9fefbee2e17cca4d600080a28061448b565b906000915b8083106102a2575050506001016101ff565b909194976102dc6102d66001926102d08c8b6102c9826102c38e8b8d614324565b926142e1565b51916151ac565b906140af565b996140bc565b95019190610290565b60206102f282878961444b565b6103086102ff828061448b565b939092016144df565b916000926001600160a01b038091165b82851061032c5750505050506001016101ca565b909192939561035b83610354610342848c6142e1565b5161034e8b898b614324565b8561483c565b9290615960565b9116840361049b5761044f576103718491615960565b911661040357610391576103866001916140bc565b960193929190610318565b60a48760405190631101335b60e11b8252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b60848860405190631101335b60e11b8252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b60848860405190631101335b60e11b8252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b60848960405190631101335b60e11b8252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b6104f281848761444b565b936104fd858061448b565b91909560206001600160a01b036105158284016144df565b1697600192838a146106b35789610545575b50505050600192939495509061053c916140af565b939291016101b4565b8060406105539201906143fa565b918a3b1561019257929391906040519485937f2dd8113300000000000000000000000000000000000000000000000000000000855288604486016040600488015252606490818601918a60051b8701019680936000915b8c8310610633575050505050508383926105d1926003198560009803016024860152614383565b03818a5afa9081610624575b5061061357602486604051907f86a9f7500000000000000000000000000000000000000000000000000000000082526004820152fd5b939450849361053c60018980610527565b61062d90613ec8565b886105dd565b91939596977fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c908a9294969a0301865288357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffee18336030181121561019257836106a0879385839401614543565b9a019601930190918997969594926105aa565b6064836040519062461bcd60e51b82526004820152601760248201527f4141393620696e76616c69642061676772656761746f720000000000000000006044820152fd5b34610192576003196060813601126101925767ffffffffffffffff6004351161019257610120906004353603011261019257610731613f52565b60443567ffffffffffffffff811161019257610751903690600401613f7e565b909160606040805161076281613eac565b60008152600060208201520152610777614209565b610785600435600401614739565b5a8151906001600160a01b0361079f6004356004016144df565b168252600480356024810135602085015260848101356fffffffffffffffffffffffffffffffff8181166060870152608091821c604087015260a483013560c087015260c4830135908116610100870152901c6101208501526108079160e4820191016143fa565b801561120757603481106111c3578060141161019257806024116101925760341161019257602481013560801c60a0840152601481013560801c60808401523560601c60e08301525b61085e600435600401614126565b60208401526040820151916effffffffffffffffffffffffffffff8360c08301511760608301511760808301511760a08301511761010083015117610120830151171161117f57604081015160608201510160808201510160a08201510160c082015101610100820151029284516001600160a01b03815116906108ec6044600435016004356004016143fa565b80610f31575b505060e001516001600160a01b031660008115610ef9575b602061094e91818a015160405193849283927f19822f7c0000000000000000000000000000000000000000000000000000000084526004356004016004850161593e565b038160008789f19081610ece575b50610a09576109fd3d610800808211610a01575b50604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b0390fd5b905082610970565b15610e61575b506001600160a01b03825116602083015190600052600160205260406000208160401c60005260205267ffffffffffffffff604060002091825492610a53846140bc565b90551603610e15575a830311610dc9576001600160a01b0360e0606092015116610b3f575b6080926040850152606084015260a46004350135905a9003019101526000926060916000936001600160a01b038216610aff575b505050610afb9060405192610ac084613eac565b835260208301931515845260408301908152604051938493602085525160208501525115156040840152516060808401526080830190614029565b0390f35b9091945060008094508093505a95826040519384928337810182815203925af1610afb610b36610b2d6140f6565b92935a906140e9565b91908480610aac565b505a9183516001600160a01b0360e08201511690816000526000602052604060002090815491848310610d7d576080600092869283610bbf960390550151936020890151836040518096819582947f52b7512c0000000000000000000000000000000000000000000000000000000084526004356004016004850161593e565b039287f160009181610cf6575b50610c75576109fd3d610800808211610c6d575b50604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b905082610be0565b935a900311610c845791610a78565b60a4604051631101335b60e11b81526000600482015260406024820152602760448201527f41413336206f766572207061796d6173746572566572696669636174696f6e4760648201527f61734c696d6974000000000000000000000000000000000000000000000000006084820152fd5b9091503d90816000823e610d0a8282613edc565b60408183810103126101925780519067ffffffffffffffff821161019257828101601f838301011215610192578181015190610d4582613eff565b93610d536040519586613edc565b8285528101602083858401010111610192576020610d7693818601920101614006565b908a610bcc565b6084604051631101335b60e11b81526000600482015260406024820152601e60448201527f41413331207061796d6173746572206465706f73697420746f6f206c6f7700006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601e60448201527f41413236206f76657220766572696669636174696f6e4761734c696d697400006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601a60448201527f4141323520696e76616c6964206163636f756e74206e6f6e63650000000000006064820152fd5b600052600060205260406000208054808611610e8257859003905588610a0f565b6084604051631101335b60e11b81526000600482015260406024820152601760448201527f41413231206469646e2774207061792070726566756e640000000000000000006064820152fd5b602090813d8311610ef2575b610ee48183613edc565b81010312610192578b61095c565b503d610eda565b50816000526000602052604060002054868111600014610f24575061094e602060005b91505061090a565b602061094e918803610f1c565b833b61113357600060206001600160a01b036006541660408c510151604051809481937f570e1a3600000000000000000000000000000000000000000000000000000000835285600484015282610f8c602482018a8c614383565b0393f1908115611127576000916110f8575b506001600160a01b03811680156110ac578503611060573b1561101457601411610192576001600160a01b039183897fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d604060e0958787602086015195510151168251913560601c82526020820152a3916108f2565b6084604051631101335b60e11b81526000600482015260406024820152602060448201527f4141313520696e6974436f6465206d757374206372656174652073656e6465726064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152602060448201527f4141313420696e6974436f6465206d7573742072657475726e2073656e6465726064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601b60448201527f4141313320696e6974436f6465206661696c6564206f72204f4f4700000000006064820152fd5b61111a915060203d602011611120575b6111128183613edc565b810190614364565b8d610f9e565b503d611108565b6040513d6000823e3d90fd5b6084604051631101335b60e11b81526000600482015260406024820152601f60448201527f414131302073656e64657220616c726561647920636f6e7374727563746564006064820152fd5b606460405162461bcd60e51b815260206004820152601860248201527f41413934206761732076616c756573206f766572666c6f7700000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152601d60248201527f4141393320696e76616c6964207061796d6173746572416e64446174610000006044820152fd5b5050600060e083015260006080830152600060a0830152610850565b346101925761123136613fd3565b60405161123d81613e0c565b60405161124981613e0c565b6000815260006020820152600060408201526000606082015260606080820152815260405161127781613e90565b6000815260006020820152602082015260405161129381613e90565b600081526000602082015260408201526040516112af81613e90565b600081526000602082015260608201526080604051916112ce83613e90565b600083526040516112de81613e90565b6000815260006020820152602084015201526112f8614209565b9061130281614739565b6000905a928051936001600160a01b0361131b846144df565b168552602083013560208601526fffffffffffffffffffffffffffffffff6080840135166060860152608083013560801c604086015260a083013560c08601526fffffffffffffffffffffffffffffffff60c08401351661010086015260c083013560801c61012086015261139360e08401846143fa565b8015611cfb57603481106111c3578060141161019257806024116101925760341161019257602481013560801c60a0870152601481013560801c60808701523560601c60e08601525b6113e583614126565b60208301526040850151946effffffffffffffffffffffffffffff8660c08301511760608301511760808301511760a08301511761010083015117610120830151171161117f57604081015160608201510160808201510160a08201510160c082015101610100820151028351966001600160a01b038851169761146c60408801886143fa565b80611bf9575b505060e001516001600160a01b03169760008915611bc1575b60206114ca918189015160405193849283927f19822f7c0000000000000000000000000000000000000000000000000000000084528d6004850161593e565b038160008688f160009181611b8d575b5061157a576109fd3d610800808211610a015750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b9815611b6c575b506001600160a01b03835116602084015190600052600160205260406000208160401c60005260205267ffffffffffffffff6040600020918254926115c5846140bc565b90551603610e15575a840311610dc9576001600160a01b0360e060609301511661199f575b6040840152606083015260a0830135905a90030160808201526001600160a01b0361161485615960565b911661195357611907576001600160a01b0361162f84615960565b91166118bb57611849576116506001600160a01b0360e08351015116615718565b916116886116686001600160a01b0384515116615718565b916000602060405161167981613e90565b828152015260408101906143fa565b6014811061183d57601411610192576116a4903560601c615718565b916001600160a01b038616946080820151966060604084015193015192604051986116ce8a613e0c565b895260208901526040880152606087015260808601526040516116f081613e90565b6001600160a01b0360035416815260405161170a81613e90565b6004548152600554602082015260208201529380151580611832575b61180b575b506040519461173986613e0c565b8552602085015260408401526060830152608082015260405180916020825260208060806117a78185516101408589015280516101608901528481015161018089015260408101516101a089015260608101516101c0890152015160a06101e0880152610200870190614029565b9382808201518051604089015201516060870152826040820151805184890152015160a0870152826060820151805160c0890152015160e087015201516001600160a01b038151166101008601520151805161012085015201516101408301520390f35b90935061181781615718565b6040519161182483613e90565b82526020820152928561172b565b506001811415611726565b50506116a46000615718565b60a4604051631101335b60e11b81526000600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b6084604051631101335b60e11b81526000600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b9450505a938251946001600160a01b0360e087015116806000526000602052604060002096875497848910610d7d576080600092869283611a1d9c0390550151926020880151838a6040519c8d95869485937f52b7512c0000000000000000000000000000000000000000000000000000000085526004850161593e565b039286f19687600091600099611adf575b50611ace576109fd3d610800808211610c6d5750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b96915a900311610c845794906115ea565b915097503d90816000823e611af48282613edc565b60408183810103126101925780519067ffffffffffffffff821161019257828101601f838301011215610192578181015191611b2f83613eff565b93611b3d6040519586613edc565b838552820160208483850101011161019257602092611b63918480870191850101614006565b0151978a611a2e565b600052600060205260406000208054808411610e8257839003905588611581565b9091506020813d602011611bb9575b81611ba960209383613edc565b810103126101925751908b6114da565b3d9150611b9c565b50806000526000602052604060002054838111600014611bec57506114ca602060005b91505061148b565b60206114ca918503611be4565b8a3b61113357600060206001600160a01b036006541660408b510151604051809481937f570e1a3600000000000000000000000000000000000000000000000000000000835285600484015282611c54602482018a8c614383565b0393f190811561112757600091611cdc575b506001600160a01b03811680156110ac578c03611060573b1561101457601411610192576001600160a01b03918a887fd51a9c61267aa6196961883ecf5ff2da6619c37dac0fa92122513fb32c032d2d604060e0958787602086015195510151168251913560601c82526020820152a391611472565b611cf5915060203d602011611120576111128183613edc565b8c611c66565b5050600060e086015260006080860152600060a08601526113dc565b346101925760208060031936011261019257611d31613f68565b33600052600082526001604060002001908154916dffffffffffffffffffffffffffff8360081c16928315611ed75765ffffffffffff8160981c168015611e93574210611e4f576000936001600160a01b03859485947fffffffffffffff000000000000000000000000000000000000000000000000ff86951690556040517fb7c918e0e249f999e965cafeb6c664271b3f4317d296461500e71da39f0cbda3339180611df5878683602090939291936001600160a01b0360408201951681520152565b0390a2165af1611e036140f6565b5015611e0b57005b6064906040519062461bcd60e51b82526004820152601860248201527f6661696c656420746f207769746864726177207374616b6500000000000000006044820152fd5b6064856040519062461bcd60e51b82526004820152601b60248201527f5374616b65207769746864726177616c206973206e6f742064756500000000006044820152fd5b6064866040519062461bcd60e51b82526004820152601d60248201527f6d7573742063616c6c20756e6c6f636b5374616b6528292066697273740000006044820152fd5b6064856040519062461bcd60e51b82526004820152601460248201527f4e6f207374616b6520746f2077697468647261770000000000000000000000006044820152fd5b34610192576000600319360112610192573360005260006020526001604060002001805463ffffffff8160781c169081156120575760ff16156120135765ffffffffffff908142160191818311611fe45780547fffffffffffffff000000000000ffffffffffffffffffffffffffffffffffff001678ffffffffffff00000000000000000000000000000000000000609885901b161790556040519116815233907ffa9b3c14cc825c412c9ed81b3ba365a5b459439403f18829e572ed53a4180f0a90602090a2005b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b606460405162461bcd60e51b815260206004820152601160248201527f616c726561647920756e7374616b696e670000000000000000000000000000006044820152fd5b606460405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6564000000000000000000000000000000000000000000006044820152fd5b6020600319360112610192576100226120b2613f68565b6143a4565b346101925760206003193601126101925760043567ffffffffffffffff81116101925760206120ed61213c923690600401613f7e565b91906001600160a01b039283600654169060006040518097819582947f570e1a360000000000000000000000000000000000000000000000000000000084528860048501526024840191614383565b03925af190811561112757602492600092612182575b50604051917f6ca7b806000000000000000000000000000000000000000000000000000000008352166004820152fd5b61219c91925060203d602011611120576111128183613edc565b9083612152565b34610192576040600319360112610192576121bc613f68565b60243567ffffffffffffffff8111610192576000916121e083923690600401613f7e565b90816040519283928337810184815203915af46121fb6140f6565b906109fd6040519283927f9941055400000000000000000000000000000000000000000000000000000000845215156004840152604060248401526044830190614029565b346101925761224e3661404e565b612259929192614700565b61226283614292565b60005b8481106122da57506000927fbb47ee3e183a558b1a2ff0874b079f3fc5478b7454eacf2bfc5af2ff5878f972600080a16000915b8583106122aa576102368585615668565b9091936001906122d06122be878987614324565b6122c888866142e1565b5190886151ac565b0194019190612299565b6123056122fe6122ec838597956142e1565b516122f8848987614324565b8461483c565b9190615960565b6001600160a01b0392918316612441576123f55761232290615960565b91166123a95761233757600101929092612265565b60a49060405190631101335b60e11b8252600482015260406024820152602160448201527f41413332207061796d61737465722065787069726564206f72206e6f7420647560648201527f65000000000000000000000000000000000000000000000000000000000000006084820152fd5b60848260405190631101335b60e11b8252600482015260406024820152601460448201527f41413334207369676e6174757265206572726f720000000000000000000000006064820152fd5b60848360405190631101335b60e11b8252600482015260406024820152601760448201527f414132322065787069726564206f72206e6f74206475650000000000000000006064820152fd5b60848460405190631101335b60e11b8252600482015260406024820152601460448201527f41413234207369676e6174757265206572726f720000000000000000000000006064820152fd5b34610192576020600319360112610192576001600160a01b036124ae613f68565b1660005260006020526020604060002054604051908152f35b34610192576124d536613fd3565b606060a06040516124e581613e74565b60008152600060208201526000604082015260008382015260006080820152015261250e614700565b612516614209565b61251f82614739565b6000905a9080516001600160a01b03612537866144df565b1681526020850135602082015260808501356fffffffffffffffffffffffffffffffff90818116606084015260801c604083015260a086013560c083015260c086013590811661010083015260801c61012082015261259960e08601866143fa565b80156130ce57603481106111c3578060141161019257806024116101925760341161019257602481013560801c60a0830152601481013560801c60808301523560601c60e08201525b6125eb85614126565b60208301526040810151926effffffffffffffffffffffffffffff8460c08401511760608401511760808401511760a08401511761010084015117610120840151171161117f57604082015160608301510160808301510160a08301510160c083015101610100830151028351946001600160a01b038651169561267260408a018a6143fa565b80612fcc575b505060e001516001600160a01b03169560008715612fa3575b6020808801518b6126cf60405194859384937f19822f7c0000000000000000000000000000000000000000000000000000000085526004850161593e565b038160008688f160009181612f6f575b5061277f576109fd3d610800808211610a015750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141323320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b9615612f4e575b506001600160a01b03845116602085015190600052600160205260406000208160401c60005260205267ffffffffffffffff6040600020918254926127ca846140bc565b90551603610e15575a830311610dc9576001600160a01b0360e0606094015116612d8a575b604084015281606084015260a0860135905a90030160808301525a604051957fffffffff000000000000000000000000000000000000000000000000000000008761283d60608401846143fa565b600060038211612d82575b7f8dd7712f0000000000000000000000000000000000000000000000000000000094168403612c50575050506128fc6129da602093600093858901516128a260405193849389850152604060248501526064840190614543565b90604483015203906128bc601f1992838101835282613edc565b6129ce6040519485927e42dc5300000000000000000000000000000000000000000000000000000000898501526102006024850152610224840190614029565b61299d604484018c60806101a09180516001600160a01b03808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8382030161020484015289614029565b03908101835282613edc565b828151910182305af16000519660405215612aa6575b50506080015160405192610afb9291612a0885613e74565b845260208401948552604084019182526060840190815260808401906000825260405192612a3584613e90565b600284527f3078000000000000000000000000000000000000000000000000000000000000602085015260a0860193845260016002556040519687966020885251602088015251604087015251606086015251608085015251151560a08401525160c08084015260e0830190614029565b90929194506000903d602014612c3f575b7fdeaddead000000000000000000000000000000000000000000000000000000008203612b2a576084604051631101335b60e11b81526000600482015260406024820152600f60448201527f41413935206f7574206f662067617300000000000000000000000000000000006064820152fd5b610afb936080927fdeadaa510000000000000000000000000000000000000000000000000000000003612b925750612b66612b70915a906140e9565b82870151906140af565b612b89604087015191612b8288615825565b82886157c3565b945b91926129f0565b612c2a612c20612c319360208a01518a51907ff62676f440ff169a3a9afdbf812e89e7f95975ee8e5c31214ffdef631c5f479260206001600160a01b038451169301513d90610800808311612c37575b50604051916020818401016040528083526000602084013e612c166040519283928352604060208401526040830190614029565b0390a35a906140e9565b84890151906140af565b9087614607565b94612b8b565b91508f612be2565b905060206000803e60005190612ab7565b612d78945082935090612c98917e42dc53000000000000000000000000000000000000000000000000000000006020612d6a9501526102006024860152610224850191614383565b612d39604484018860806101a09180516001600160a01b03808251168652602082015160208701526040820151604087015260608201516060870152838201518487015260a082015160a087015260c082015160c087015260e08201511660e0860152610100808201519086015261012080910151908501526020810151610140850152604081015161016085015260608101516101808501520151910152565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc8382030161020484015285614029565b03601f198101885287613edc565b60206000876129da565b508135612848565b915093505a938251946001600160a01b0360e087015116806000526000602052604060002096875497858910610d7d576080600092879283612e099c0390550151926020880151838c6040519c8d95869485937f52b7512c0000000000000000000000000000000000000000000000000000000085526004850161593e565b039286f19687600091600099612ecb575b50612eba576109fd3d610800808211610c6d5750604051906020818301016040528082526000602083013e6040519182917f65c8fd4d0000000000000000000000000000000000000000000000000000000083526000600484015260606024840152600d60648401527f4141333320726576657274656400000000000000000000000000000000000000608484015260a0604484015260a4830190614029565b96915a900311610c845794916127ef565b915097503d806000833e612edf8183613edc565b81019060408183031261019257805167ffffffffffffffff81116101925781019082601f8