From 385bd8b8551c046ad9823b1579d58e38cfc27895 Mon Sep 17 00:00:00 2001 From: Sam Goldman Date: Sat, 2 Sep 2023 00:32:23 -0400 Subject: [PATCH] fix(ct): remove the address field from the raw Sphinx actions --- .changeset/tasty-cougars-melt.md | 8 ++ .../contracts/contracts/SphinxDataTypes.sol | 2 - .../contracts/contracts/SphinxManager.sol | 40 +++++----- packages/core/src/actions/bundle.ts | 75 +++++++++++-------- packages/core/src/actions/types.ts | 10 +-- packages/core/src/fund.ts | 9 ++- packages/core/src/utils.ts | 2 +- packages/executor/src/utils/execute.ts | 4 +- .../contracts/foundry/SphinxConstants.sol | 4 +- .../plugins/script/display-bundle-info.ts | 2 +- 10 files changed, 93 insertions(+), 63 deletions(-) create mode 100644 .changeset/tasty-cougars-melt.md diff --git a/.changeset/tasty-cougars-melt.md b/.changeset/tasty-cougars-melt.md new file mode 100644 index 000000000..6f22aa055 --- /dev/null +++ b/.changeset/tasty-cougars-melt.md @@ -0,0 +1,8 @@ +--- +'@sphinx-labs/contracts': patch +'@sphinx-labs/executor': patch +'@sphinx-labs/plugins': patch +'@sphinx-labs/core': patch +--- + +Remove the address field from the raw Sphinx actions diff --git a/packages/contracts/contracts/SphinxDataTypes.sol b/packages/contracts/contracts/SphinxDataTypes.sol index 94208d778..fb2da4fb8 100644 --- a/packages/contracts/contracts/SphinxDataTypes.sol +++ b/packages/contracts/contracts/SphinxDataTypes.sol @@ -45,13 +45,11 @@ struct DeploymentState { * @custom:field index The unique index of the action in the deployment. Actions must be executed in ascending order according to their index. * @custom:field data The ABI-encoded data associated with the action. - * @custom:field addr The address to which the action applies. */ struct RawSphinxAction { SphinxActionType actionType; uint256 index; bytes data; - address payable addr; } /** diff --git a/packages/contracts/contracts/SphinxManager.sol b/packages/contracts/contracts/SphinxManager.sol index c79ab7f1d..83f6adf21 100644 --- a/packages/contracts/contracts/SphinxManager.sol +++ b/packages/contracts/contracts/SphinxManager.sol @@ -556,7 +556,7 @@ contract SphinxManager is if ( !MerkleTree.verify( deployment.actionRoot, - keccak256(abi.encode(action.addr, action.actionType, action.data)), + keccak256(abi.encode(action.actionType, action.data)), action.index, proof, numTotalActions @@ -568,14 +568,17 @@ contract SphinxManager is deployment.actionsExecuted++; if (action.actionType == SphinxActionType.CALL) { - (uint256 nonce, bytes memory data) = abi.decode(action.data, (uint256, bytes)); - bytes32 callHash = keccak256(abi.encode(action.addr, data)); + (uint256 nonce, address to, bytes memory data) = abi.decode( + action.data, + (uint256, address, bytes) + ); + bytes32 callHash = keccak256(abi.encode(to, data)); uint256 currentNonce = callNonces[callHash]; if (nonce != currentNonce) { emit CallSkipped(activeDeploymentId, action.index); registry.announce("CallSkipped"); } else { - (bool success, ) = action.addr.call(data); + (bool success, ) = to.call(data); if (success) { callNonces[callHash] = currentNonce + 1; emit CallExecuted(activeDeploymentId, action.index); @@ -592,7 +595,10 @@ contract SphinxManager is (bytes32, bytes) ); - address expectedAddress = action.addr; + address expectedAddress = ICreate3(create3).getAddressFromDeployer( + salt, + address(this) + ); // Check if the contract has already been deployed. if (expectedAddress.code.length > 0) { @@ -611,16 +617,13 @@ contract SphinxManager is // Create3 contract instead of delegatecalling it, it'd be possible for an // attacker to deploy a malicious contract at the expected address by calling // the `deploy` function on the Create3 contract directly. - (bool deploySuccess, bytes memory actualAddressBytes) = create3.delegatecall( + (bool deploySuccess, ) = create3.delegatecall( abi.encodeCall(ICreate3.deploy, (salt, creationCodeWithConstructorArgs, 0)) ); if (deploySuccess) { - // Contract was deployed successfully. - address actualAddress = abi.decode(actualAddressBytes, (address)); - emit ContractDeployed( - actualAddress, + expectedAddress, activeDeploymentId, keccak256(creationCodeWithConstructorArgs) ); @@ -771,7 +774,7 @@ contract SphinxManager is if ( !MerkleTree.verify( deployment.actionRoot, - keccak256(abi.encode(action.addr, action.actionType, action.data)), + keccak256(abi.encode(action.actionType, action.data)), action.index, proof, numTotalActions @@ -782,10 +785,13 @@ contract SphinxManager is deployment.actionsExecuted++; - (bytes32 contractKindHash, bytes32 key, uint8 offset, bytes memory val) = abi.decode( - action.data, - (bytes32, bytes32, uint8, bytes) - ); + ( + bytes32 contractKindHash, + address to, + bytes32 key, + uint8 offset, + bytes memory val + ) = abi.decode(action.data, (bytes32, address, bytes32, uint8, bytes)); if ( contractKindHash == IMMUTABLE_CONTRACT_KIND_HASH || @@ -800,13 +806,13 @@ contract SphinxManager is // Delegatecall the adapter to call `setStorage` on the proxy. // slither-disable-next-line controlled-delegatecall (bool success, ) = adapter.delegatecall( - abi.encodeCall(IProxyAdapter.setStorage, (action.addr, key, offset, val)) + abi.encodeCall(IProxyAdapter.setStorage, (payable(to), key, offset, val)) ); if (!success) { revert SetStorageFailed(); } - emit SetProxyStorage(activeDeploymentId, action.addr, msg.sender, action.index); + emit SetProxyStorage(activeDeploymentId, to, msg.sender, action.index); registry.announce("SetProxyStorage"); } diff --git a/packages/core/src/actions/bundle.ts b/packages/core/src/actions/bundle.ts index 3c2b64a25..5dfa688ae 100644 --- a/packages/core/src/actions/bundle.ts +++ b/packages/core/src/actions/bundle.ts @@ -51,7 +51,6 @@ import { HumanReadableActions, } from './types' import { getStorageLayout } from './artifacts' -import { getCreate3Address } from '../config/utils' import { getProjectBundleInfo } from '../tasks' import { getDeployContractCosts, getEstDeployContractCost } from '../estimate' import { SupportedChainId } from '../networks' @@ -67,6 +66,8 @@ export const isSetStorageAction = ( action: SphinxAction ): action is SetStorageAction => { return ( + (action as SetStorageAction).contractKindHash !== undefined && + (action as SetStorageAction).to !== undefined && (action as SetStorageAction).key !== undefined && (action as SetStorageAction).value !== undefined && (action as SetStorageAction).offset !== undefined @@ -82,11 +83,15 @@ export const isSetStorageAction = ( export const isDeployContractAction = ( action: SphinxAction ): action is DeployContractAction => { - return (action as DeployContractAction).code !== undefined + return ( + (action as DeployContractAction).creationCodeWithConstructorArgs !== + undefined && (action as DeployContractAction).salt !== undefined + ) } export const isCallAction = (action: SphinxAction): action is CallAction => { return ( + (action as CallAction).to !== undefined && (action as CallAction).data !== undefined && (action as CallAction).nonce !== undefined ) @@ -130,26 +135,35 @@ export const toRawSphinxAction = (action: SphinxAction): RawSphinxAction => { if (isSetStorageAction(action)) { return { actionType: SphinxActionType.SET_STORAGE, - addr: action.addr, index: action.index, data: coder.encode( - ['bytes32', 'bytes32', 'uint8', 'bytes'], - [action.contractKindHash, action.key, action.offset, action.value] + ['bytes32', 'address', 'bytes32', 'uint8', 'bytes'], + [ + action.contractKindHash, + action.to, + action.key, + action.offset, + action.value, + ] ), } } else if (isDeployContractAction(action)) { return { actionType: SphinxActionType.DEPLOY_CONTRACT, - addr: action.addr, index: action.index, - data: coder.encode(['bytes32', 'bytes'], [action.salt, action.code]), + data: coder.encode( + ['bytes32', 'bytes'], + [action.salt, action.creationCodeWithConstructorArgs] + ), } } else if (isCallAction(action)) { return { actionType: SphinxActionType.CALL, - addr: action.addr, index: action.index, - data: coder.encode(['uint256', 'bytes'], [action.nonce, action.data]), + data: coder.encode( + ['uint256', 'address', 'bytes'], + [action.nonce, action.to, action.data] + ), } } else { throw new Error(`unknown action type`) @@ -167,12 +181,12 @@ export const fromRawSphinxAction = ( ): SphinxAction => { const coder = ethers.AbiCoder.defaultAbiCoder() if (rawAction.actionType === SphinxActionType.SET_STORAGE) { - const [contractKindHash, key, offset, value] = coder.decode( - ['bytes32', 'bytes32', 'uint8', 'bytes'], + const [contractKindHash, to, key, offset, value] = coder.decode( + ['bytes32', 'address', 'bytes32', 'uint8', 'bytes'], rawAction.data ) return { - addr: rawAction.addr, + to, contractKindHash, index: rawAction.index, key, @@ -180,17 +194,22 @@ export const fromRawSphinxAction = ( value, } } else if (rawAction.actionType === SphinxActionType.DEPLOY_CONTRACT) { - const [salt, code] = coder.decode(['bytes32', 'bytes'], rawAction.data) + const [salt, creationCodeWithConstructorArgs] = coder.decode( + ['bytes32', 'bytes'], + rawAction.data + ) return { - addr: rawAction.addr, index: rawAction.index, salt, - code, + creationCodeWithConstructorArgs, } } else if (rawAction.actionType === SphinxActionType.CALL) { - const [nonce, data] = coder.decode(['uint256', 'bytes'], rawAction.data) + const [nonce, to, data] = coder.decode( + ['uint256', 'address', 'bytes'], + rawAction.data + ) return { - addr: rawAction.addr, + to, index: rawAction.index, data, nonce, @@ -209,10 +228,7 @@ export const fromRawSphinxAction = ( export const getActionHash = (action: RawSphinxAction): string => { const coder = ethers.AbiCoder.defaultAbiCoder() return ethers.keccak256( - coder.encode( - ['address', 'uint8', 'bytes'], - [action.addr, action.actionType, action.data] - ) + coder.encode(['uint8', 'bytes'], [action.actionType, action.data]) ) } @@ -517,7 +533,7 @@ export const makeActionBundleFromConfig = ( const { artifact, buildInfo } = configArtifacts[referenceName] const { abi, bytecode, sourceName, contractName } = artifact const { isTargetDeployed } = configCache.contractConfigCache[referenceName] - const { kind, address, salt, constructorArgs } = contractConfig + const { kind, salt, constructorArgs } = contractConfig const deployContractCost = getEstDeployContractCost( buildInfo.output.contracts[sourceName][contractName].evm.gasEstimates @@ -527,10 +543,9 @@ export const makeActionBundleFromConfig = ( if (kind === 'immutable') { // Add a DEPLOY_CONTRACT action for the unproxied contract. actions.push({ - addr: address, index: actionIndex, salt, - code: getCreationCodeWithConstructorArgs( + creationCodeWithConstructorArgs: getCreationCodeWithConstructorArgs( bytecode, constructorArgs[configCache.chainId], abi @@ -541,10 +556,10 @@ export const makeActionBundleFromConfig = ( } else if (kind === 'proxy') { // Add a DEPLOY_CONTRACT action for the default proxy. actions.push({ - addr: address, index: actionIndex, salt, - code: getDefaultProxyInitCode(managerAddress), + creationCodeWithConstructorArgs: + getDefaultProxyInitCode(managerAddress), }) costs.push(deployContractCost) } else { @@ -579,13 +594,11 @@ export const makeActionBundleFromConfig = ( // has a one-to-one mapping with its init code. This allows us to skip deploying implementation // contracts that have already been deployed. const implSalt = ethers.keccak256(implInitCode) - const implAddress = getCreate3Address(managerAddress, implSalt) actions.push({ - addr: implAddress, index: actionIndex, salt: implSalt, - code: implInitCode, + creationCodeWithConstructorArgs: implInitCode, }) costs.push(deployContractCost) @@ -609,7 +622,7 @@ export const makeActionBundleFromConfig = ( const currentNonce = configCache.callNonces[callHash] if (nonce >= currentNonce) { actions.push({ - addr: to, + to, index: actionIndex, data, nonce, @@ -652,7 +665,7 @@ export const makeActionBundleFromConfig = ( // Add SET_STORAGE actions for each storage slot that we want to modify. for (const segment of segments) { actions.push({ - addr: address, + to: address, contractKindHash: contractKindHashes[kind], index: actionIndex, key: segment.key, diff --git a/packages/core/src/actions/types.ts b/packages/core/src/actions/types.ts index 7ac464f26..ac976c813 100644 --- a/packages/core/src/actions/types.ts +++ b/packages/core/src/actions/types.ts @@ -31,7 +31,6 @@ export interface RawSphinxAction { actionType: SphinxActionType index: number data: string - addr: string } export interface SphinxTarget { @@ -44,9 +43,9 @@ export interface SphinxTarget { * SetStorage action data. */ export interface SetStorageAction { - addr: string - contractKindHash: string index: number + to: string + contractKindHash: string key: string offset: number value: string @@ -56,15 +55,14 @@ export interface SetStorageAction { * DeployContract action data. */ export interface DeployContractAction { - addr: string index: number salt: string - code: string + creationCodeWithConstructorArgs: string } export interface CallAction { - addr: string index: number + to: string data: string nonce: number } diff --git a/packages/core/src/fund.ts b/packages/core/src/fund.ts index ced5e007c..9c843673f 100644 --- a/packages/core/src/fund.ts +++ b/packages/core/src/fund.ts @@ -8,8 +8,10 @@ import { isSetStorageAction, isCallAction, } from './actions' +import { getCreate3Address } from './config' export const estimateExecutionGas = async ( + managerAddress: string, provider: SphinxJsonRpcProvider, bundles: SphinxBundles, actionsExecuted: number @@ -29,13 +31,14 @@ export const estimateExecutionGas = async ( const deployedContractPromises = actions .filter((action) => isDeployContractAction(action)) .map(async (action: DeployContractAction) => { - if (await isContractDeployed(action.addr, provider)) { + const addr = getCreate3Address(managerAddress, action.salt) + if (await isContractDeployed(addr, provider)) { return BigInt(0) } else { try { // We estimate the gas for the contract deployment by calling `estimateGas` on the provider. return await provider.estimateGas({ - data: action.code, + data: action.creationCodeWithConstructorArgs, }) } catch (e) { // If the estimate fails, we return a default value of 500k gas which is plenty since the actual @@ -66,11 +69,13 @@ export const estimateExecutionGas = async ( } export const estimateExecutionCost = async ( + managerAddress: string, provider: SphinxJsonRpcProvider, bundles: SphinxBundles, actionsExecuted: number ): Promise => { const estExecutionGas = await estimateExecutionGas( + managerAddress, provider, bundles, actionsExecuted diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index fdbbc94de..08fff841a 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -1056,7 +1056,7 @@ export const deploymentDoesRevert = async ( deployContractActions.map(async (action) => provider.estimateGas({ from: managerAddress, - data: action.code, + data: action.creationCodeWithConstructorArgs, }) ) ) diff --git a/packages/executor/src/utils/execute.ts b/packages/executor/src/utils/execute.ts index 43e814686..f0bb9f1ca 100644 --- a/packages/executor/src/utils/execute.ts +++ b/packages/executor/src/utils/execute.ts @@ -243,7 +243,9 @@ export const handleExecution = async (data: ExecutorMessage) => { // Get estimated cost + 50% buffer and withdraw from balance contract if below that cost const estimatedCost = - ((await estimateExecutionCost(rpcProvider, bundles, 0)) * 15n) / 10n + ((await estimateExecutionCost(managerAddress, rpcProvider, bundles, 0)) * + 15n) / + 10n const balance = await rpcProvider.getBalance(wallet.address) if (balance < estimatedCost) { logger.info( diff --git a/packages/plugins/contracts/foundry/SphinxConstants.sol b/packages/plugins/contracts/foundry/SphinxConstants.sol index 36d47fbeb..c46d74f88 100644 --- a/packages/plugins/contracts/foundry/SphinxConstants.sol +++ b/packages/plugins/contracts/foundry/SphinxConstants.sol @@ -17,7 +17,7 @@ contract SphinxConstants { bytes32 public constant ozUUPSOwnableProxyTypeHash = 0x449ff20099d041c42fe19798275484d3a5e1603a748082b78b39101f99874a6d; bytes32 public constant ozUUPSAccessControlProxyTypeHash = 0x1c5f131e15ecec1d947abdce4f5a027d0e80aec46dd702783e0bdddb954d2b5f; bytes32 public constant externalTransparentProxyTypeHash = 0x7138a168ac6b86b6fcccbf21c6c4131a5e180eb9213a05933a5df6c402693c2b; - address public constant managerImplementationAddress = 0xab58b9B4359D4be027Cd1405CAFa85d9850D822B; + address public constant managerImplementationAddress = 0x6430B98583346685B1C7e4696bAA701fc82BD26C; address public constant ozTransparentAdapterAddr = 0xfA62329AE55b6e7465571AC761f6150e28Adc5cd; address public constant ozUUPSOwnableAdapterAddr = 0x80F33f57348e892fcbf7Df0Bc1e6B7Dac3fA2a23; address public constant ozUUPSAccessControlAdapterAddr = 0x3E95A9D41413f3CF06DeFC51Eed59f3f488f3251; @@ -28,7 +28,7 @@ contract SphinxConstants { function getSphinxContractInfo() public pure returns (SphinxContractInfo[] memory) { SphinxContractInfo[] memory contracts = new SphinxContractInfo[](15); contracts[0] = SphinxContractInfo(hex"608060405234801561001057600080fd5b5060405161203d38038061203d83398101604081905261002f91610097565b61003833610047565b61004181610047565b506100c7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100a957600080fd5b81516001600160a01b03811681146100c057600080fd5b9392505050565b611f67806100d66000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638da5cb5b11610097578063f2fde38b11610066578063f2fde38b14610250578063f52cc7fd14610263578063fdfcd53714610276578063ff35ef341461029957600080fd5b80638da5cb5b146101df578063a662229f146101f0578063e91204de14610203578063ea0a52371461023d57600080fd5b806354676f2c116100d357806354676f2c1461015a578063580867751461019b578063715018a6146101ae57806372c6838f146101b657600080fd5b806311cdf27a146100fa578063204bbec71461010f5780634b67f1a814610147575b600080fd5b61010d610108366004610d94565b6102ac565b005b61013261011d366004610d94565b60046020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b61010d610155366004610db6565b610457565b610183610168366004610de2565b6001602052600090815260409020546001600160a01b031681565b6040516001600160a01b03909116815260200161013e565b6101836101a9366004610ed9565b610550565b61010d610977565b6101836101c4366004610de2565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b0316610183565b61010d6101fe366004610d94565b61098b565b610183610211366004610f4d565b60056020908152600093845260408085208252928452828420905282529020546001600160a01b031681565b61010d61024b366004610f79565b610a6b565b61010d61025e366004610d94565b610b42565b61010d610271366004610fb6565b610bd2565b610132610284366004610d94565b60026020526000908152604090205460ff1681565b600654610183906001600160a01b031681565b6102b4610cc1565b6000816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401606060405180830381865afa1580156102f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610318919061101a565b8051602080830151604080850151600085815260058552828120848252855282812082825290945292205493945091926001600160a01b0316156103c95760405162461bcd60e51b815260206004820152602360248201527f537068696e7852656769737472793a2076657273696f6e20616c72656164792060448201527f736574000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6001600160a01b0385166000818152600460209081526040808320805460ff1916600117905586835260058252808320868452825280832085845282529182902080546001600160a01b0319168417905590519182528291849186917fad4f648400b850e9d053dbbd943dc1f16f1dd948913439a82886d60b875fa961910160405180910390a45050505050565b61045f610cc1565b6000828152600360205260409020546001600160a01b0316156104ea5760405162461bcd60e51b815260206004820152603560248201527f537068696e7852656769737472793a20636f6e7472616374206b696e6420686160448201527f7320616e206578697374696e672061646170746572000000000000000000000060648201526084016103c0565b60008281526003602090815260409182902080546001600160a01b0319166001600160a01b0385169081179091558251858152918201527fb2ae55a73412ceef617c2ecead73f8d660a4904740fa33d050ae5d8b517d7b47910160405180910390a15050565b6006546000906001600160a01b03166105d15760405162461bcd60e51b815260206004820152602960248201527f537068696e7852656769737472793a206e6f206d616e6167657220696d706c6560448201527f6d656e746174696f6e000000000000000000000000000000000000000000000060648201526084016103c0565b60008484846040516020016105e8939291906110d2565b60408051601f198184030181529181528151602092830120600081815260019093529120549091506001600160a01b03161561068c5760405162461bcd60e51b815260206004820152602260248201527f537068696e7852656769737472793a20616c726561647920726567697374657260448201527f656400000000000000000000000000000000000000000000000000000000000060648201526084016103c0565b600081303060405161069d90610d6b565b6001600160a01b039283168152911660208201526040018190604051809103906000f59050801580156106d4573d6000803e3d6000fd5b5090506001600160a01b0381166107535760405162461bcd60e51b815260206004820152602e60248201527f537068696e7852656769737472793a206661696c656420746f206465706c6f7960448201527f206d616e616765722070726f787900000000000000000000000000000000000060648201526084016103c0565b600082815260016020818152604080842080546001600160a01b0319166001600160a01b038781169182179092558086526002909352818520805460ff191690941790935560065490519192634f1ef286929116906107ba908b908b908b906024016110d2565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0eb624be00000000000000000000000000000000000000000000000000000000179052517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815261084a929190600401611110565b6000604051808303816000875af1158015610869573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108919190810190611132565b6040517f8f2839700000000000000000000000000000000000000000000000000000000081526001600160a01b03898116600483015291925090831690638f28397090602401600060405180830381600087803b1580156108f157600080fd5b505af1158015610905573d6000803e3d6000fd5b50506006546040516001600160a01b0390911692508591506109289089906111a9565b60405180910390207f970aab13db2efa2a1a57b83471f63462447de5996c63127ea48d28c785d16f2f898b338760405161096594939291906111c5565b60405180910390a45095945050505050565b61097f610cc1565b6109896000610d1b565b565b610993610cc1565b6001600160a01b03811660009081526004602052604090205460ff16610a215760405162461bcd60e51b815260206004820152602e60248201527f537068696e7852656769737472793a20696e76616c6964206d616e616765722060448201527f696d706c656d656e746174696f6e00000000000000000000000000000000000060648201526084016103c0565b600680546001600160a01b0319166001600160a01b0383169081179091556040517f927c05c4cc0d695810daaf681b40262157851ec948490a0c8fe611c1839fd48690600090a250565b3360009081526002602052604090205460ff16610af05760405162461bcd60e51b815260206004820152603860248201527f537068696e7852656769737472793a206576656e74732063616e206f6e6c792060448201527f626520616e6e6f756e636564206279206d616e6167657273000000000000000060648201526084016103c0565b6040513390610b009083906111a9565b60405180910390207f795f66a5da2addfeb09f1b32396ff2be31a38ebe0f85fae32133a226dbe065b383604051610b37919061120c565b60405180910390a350565b610b4a610cc1565b6001600160a01b038116610bc65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103c0565b610bcf81610d1b565b50565b3360009081526002602052604090205460ff16610c575760405162461bcd60e51b815260206004820152603860248201527f537068696e7852656769737472793a206576656e74732063616e206f6e6c792060448201527f626520616e6e6f756e636564206279206d616e6167657273000000000000000060648201526084016103c0565b80604051610c6591906111a9565b604051908190038120903390610c7c9085906111a9565b60405180910390207f524ccd226c22cefbc337f02a4ec771a77e2df0925309645b4e79d650f11e2aa08585604051610cb592919061121f565b60405180910390a45050565b6000546001600160a01b031633146109895760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103c0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610d168061124583390190565b80356001600160a01b0381168114610d8f57600080fd5b919050565b600060208284031215610da657600080fd5b610daf82610d78565b9392505050565b60008060408385031215610dc957600080fd5b82359150610dd960208401610d78565b90509250929050565b600060208284031215610df457600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715610e5357610e53610dfb565b604052919050565b600067ffffffffffffffff821115610e7557610e75610dfb565b50601f01601f191660200190565b600082601f830112610e9457600080fd5b8135610ea7610ea282610e5b565b610e2a565b818152846020838601011115610ebc57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215610eee57600080fd5b610ef784610d78565b9250602084013567ffffffffffffffff80821115610f1457600080fd5b610f2087838801610e83565b93506040860135915080821115610f3657600080fd5b50610f4386828701610e83565b9150509250925092565b600080600060608486031215610f6257600080fd5b505081359360208301359350604090920135919050565b600060208284031215610f8b57600080fd5b813567ffffffffffffffff811115610fa257600080fd5b610fae84828501610e83565b949350505050565b60008060408385031215610fc957600080fd5b823567ffffffffffffffff80821115610fe157600080fd5b610fed86838701610e83565b9350602085013591508082111561100357600080fd5b5061101085828601610e83565b9150509250929050565b60006060828403121561102c57600080fd5b6040516060810181811067ffffffffffffffff8211171561104f5761104f610dfb565b80604052508251815260208301516020820152604083015160408201528091505092915050565b60005b83811015611091578181015183820152602001611079565b838111156110a0576000848401525b50505050565b600081518084526110be816020860160208601611076565b601f01601f19169290920160200192915050565b6001600160a01b03841681526060602082015260006110f460608301856110a6565b828103604084015261110681856110a6565b9695505050505050565b6001600160a01b0383168152604060208201526000610fae60408301846110a6565b60006020828403121561114457600080fd5b815167ffffffffffffffff81111561115b57600080fd5b8201601f8101841361116c57600080fd5b805161117a610ea282610e5b565b81815285602083850101111561118f57600080fd5b6111a0826020830160208601611076565b95945050505050565b600082516111bb818460208701611076565b9190910192915050565b6080815260006111d860808301876110a6565b6001600160a01b03868116602085015285166040840152828103606084015261120181856110a6565b979650505050505050565b602081526000610daf60208301846110a6565b60408152600061123260408301856110a6565b82810360208401526111a081856110a656fe60a0604052604051610d16380380610d16833981016040819052610022916100cb565b8061002c8161003f565b50506001600160a01b0316608052610105565b6000610057600080516020610cf68339815191525490565b600080516020610cf6833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6001600160a01b03811681146100c857600080fd5b50565b600080604083850312156100de57600080fd5b82516100e9816100b3565b60208401519092506100fa816100b3565b809150509250929050565b608051610bc861012e600039600081816101080152818161039301526105e00152610bc86000f3fe6080604052600436106100695760003560e01c80637b103999116100435780637b103999146100f65780638f2839701461012a578063f851a4401461014a57610078565b80633659cfe6146100805780634f1ef286146100a05780635c60da1b146100c957610078565b366100785761007661015f565b005b61007661015f565b34801561008c57600080fd5b5061007661009b366004610a96565b61022f565b6100b36100ae366004610ab1565b610474565b6040516100c09190610b34565b60405180910390f35b3480156100d557600080fd5b506100de6106cb565b6040516001600160a01b0390911681526020016100c0565b34801561010257600080fd5b506100de7f000000000000000000000000000000000000000000000000000000000000000081565b34801561013657600080fd5b50610076610145366004610a96565b610748565b34801561015657600080fd5b506100de610795565b60006101897f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90506001600160a01b03811661020c5760405162461bcd60e51b815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a656400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3660008037600080366000845af43d6000803e80610229573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103546001600160a01b0316336001600160a01b0316148061026e575033155b1561046957600061029d7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90506001600160a01b03811615806103145750806001600160a01b031663e8ea2d086040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103129190610b89565b155b6103725760405162461bcd60e51b815260206004820152602960248201527f537068696e784d616e6167657250726f78793a20657865637574696f6e20696e6044820152682070726f677265737360b81b6064820152608401610203565b60405163204bbec760e01b81526001600160a01b03808416600483015283917f00000000000000000000000000000000000000000000000000000000000000009091169063204bbec790602401602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104009190610b89565b61045b5760405162461bcd60e51b815260206004820152602660248201527f537068696e784d616e6167657250726f78793a20756e617070726f766564206d60448201526530b730b3b2b960d11b6064820152608401610203565b61046483610807565b505050565b61047161015f565b50565b606061049e7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6001600160a01b0316336001600160a01b031614806104bb575033155b156106bc5760006104ea7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b90506001600160a01b03811615806105615750806001600160a01b031663e8ea2d086040518163ffffffff1660e01b8152600401602060405180830381865afa15801561053b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055f9190610b89565b155b6105bf5760405162461bcd60e51b815260206004820152602960248201527f537068696e784d616e6167657250726f78793a20657865637574696f6e20696e6044820152682070726f677265737360b81b6064820152608401610203565b60405163204bbec760e01b81526001600160a01b03808716600483015286917f00000000000000000000000000000000000000000000000000000000000000009091169063204bbec790602401602060405180830381865afa158015610629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061064d9190610b89565b6106a85760405162461bcd60e51b815260206004820152602660248201527f537068696e784d616e6167657250726f78793a20756e617070726f766564206d60448201526530b730b3b2b960d11b6064820152608401610203565b6106b3868686610854565b925050506106c4565b6106c461015f565b9392505050565b60006106f57fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6001600160a01b0316336001600160a01b03161480610712575033155b1561073d57507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b61074561015f565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103546001600160a01b0316336001600160a01b03161480610787575033155b156104695761047181610987565b60006107bf7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6001600160a01b0316336001600160a01b031614806107dc575033155b1561073d57507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103546001600160a01b0316336001600160a01b03161480610846575033155b156104695761047181610a1f565b606061087e7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b6001600160a01b0316336001600160a01b0316148061089b575033155b156106bc576108a984610a1f565b600080856001600160a01b031685856040516108c6929190610bab565b600060405180830381855af49150503d8060008114610901576040519150601f19603f3d011682016040523d82523d6000602084013e610906565b606091505b50915091508161097e5760405162461bcd60e51b815260206004820152603960248201527f50726f78793a2064656c656761746563616c6c20746f206e657720696d706c6560448201527f6d656e746174696f6e20636f6e7472616374206661696c6564000000000000006064820152608401610203565b91506106c49050565b60006109b17fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8190556040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b80356001600160a01b0381168114610a9157600080fd5b919050565b600060208284031215610aa857600080fd5b6106c482610a7a565b600080600060408486031215610ac657600080fd5b610acf84610a7a565b9250602084013567ffffffffffffffff80821115610aec57600080fd5b818601915086601f830112610b0057600080fd5b813581811115610b0f57600080fd5b876020828501011115610b2157600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b81811015610b6157858101830151858201604001528201610b45565b81811115610b73576000604083870101525b50601f01601f1916929092016040019392505050565b600060208284031215610b9b57600080fd5b815180151581146106c457600080fd5b818382376000910190815291905056fea164736f6c634300080f000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103a164736f6c634300080f000a000000000000000000000000226f14c3e19788934ff37c653cf5e24cad198341", 0x1132793DCc6AF3827CcB92FE9699Bc1C62Ba3eE2); - contracts[1] = SphinxContractInfo(hex"6101606040523480156200001257600080fd5b50604051620044203803806200442083398101604081905262000035916200015d565b80516020820151604083015160809290925260a05260c0526001600160a01b0380861660e052848116610100528316610120526101408290526200007862000083565b505050505062000227565b600054610100900460ff1615620000f05760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000142576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200015a57600080fd5b50565b600080600080600085870360e08112156200017757600080fd5b8651620001848162000144565b6020880151909650620001978162000144565b6040880151909550620001aa8162000144565b606088810151919550909350607f1982011215620001c757600080fd5b50604051606081016001600160401b0381118282101715620001f957634e487b7160e01b600052604160045260246000fd5b80604052506080870151815260a0870151602082015260c08701516040820152809150509295509295909350565b60805160a05160c05160e05161010051610120516101405161411962000307600039600061114e0152600061102d01526000611a2101526000818161029e015281816104390152818161084e01528181610ad001528181610ca10152818161124d01528181611395015281816116cd01528181611845015281816119b301528181611ba001528181611d1201528181611f220152818161220b0152818161240b015281816127400152818161295b01528181612a5a0152818161304201526130ed015260006113320152600061130c015260006112e601526141196000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806375cd65e1116100d8578063dfba66f01161008c578063f22bd7fd11610066578063f22bd7fd14610329578063f2fde38b1461033c578063f8050b041461034f57600080fd5b8063dfba66f0146102ec578063dfc6cb2714610303578063e8ea2d081461031657600080fd5b8063800ab12a116100bd578063800ab12a146102c05780638da5cb5b146102d35780639a33e300146102e457600080fd5b806375cd65e1146102865780637b1039991461029957600080fd5b80634731d48c1161012f57806361f5499f1161011457806361f5499f14610227578063715018a61461026b57806374d8a1f41461027357600080fd5b80634731d48c146101f557806354fd4d50146101fd57600080fd5b806328d6ec601161016057806328d6ec60146101af5780633731e1ce146101c257806337404017146101d557600080fd5b80630e128b5d1461017c5780630eb624be14610186575b600080fd5b61018461036f565b005b61019961019436600461348a565b6104a1565b6040516101a69190613558565b60405180910390f35b6101846101bd366004613579565b610639565b6101846101d0366004613799565b6108c8565b6101e86101e33660046137fd565b610d89565b6040516101a6919061387d565b610184610fd9565b6102056112b5565b60408051825181526020808401519082015291810151908201526060016101a6565b6102536102353660046137fd565b6000908152609860205260409020600801546001600160a01b031690565b6040516001600160a01b0390911681526020016101a6565b610184611359565b610184610281366004613a5a565b611405565b610184610294366004613a91565b611c8c565b6102537f000000000000000000000000000000000000000000000000000000000000000081565b6101846102ce366004613a5a565b611f8d565b6033546001600160a01b0316610253565b6101996124a7565b6102f560995481565b6040519081526020016101a6565b610184610311366004613ad3565b612535565b60995460405190151581526020016101a6565b610184610337366004613799565b61255a565b61018461034a366004613b80565b6129cd565b6102f561035d3660046137fd565b609a6020526000908152604090205481565b610377612a96565b609954610397576040516302f8412d60e51b815260040160405180910390fd5b60998054600081815260986020908152604080832092909455815460ff19166004178255600682015493519384529092339183917ff064e73ea31e266b1818a55d845fb77f88b9658b4ffa0ae8743a284624695ea5910160405180910390a360405163ea0a523760e01b815260206004820152601960248201527f537068696e784465706c6f796d656e7443616e63656c6c65640000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b15801561048557600080fd5b505af1158015610499573d6000803e3d6000fd5b505050505050565b600054606090610100900460ff16158080156104c45750600054600160ff909116105b806104de5750303b1580156104de575060005460ff166001145b6105555760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff191660011790558015610578576000805461ff0019166101001790555b83516000036105b3576040517f6754d56f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60976105bf8582613c22565b506105c8612af2565b6105d0612b65565b6105d985612bd8565b6040518060200160405280600081525091508015610631576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b509392505050565b610641612a96565b60995415610662576040516330c2ab6360e11b815260040160405180910390fd5b600087878787878760405160200161067f96959493929190613ce2565b60408051601f1981840301815291815281516020928301206000818152609890935290822080549193509160ff909116908160078111156106c2576106c2613816565b141580156106e2575060038160078111156106df576106df613816565b14155b8015610700575060048160078111156106fd576106fd613816565b14155b801561071e5750600581600781111561071b5761071b613816565b14155b15610755576040517f9ba64d5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6099839055815460ff19166001178255600382018a905560048201899055600a8201889055600b820187905560028201869055600882018054851515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909116179055600982016107cc8682613c22565b50827f12495da240bbbda7722fa0f48d8605c92d5b7439111cf999f43a0c19e04442c58b8b8b8b8b8b8b3360405161080b989796959493929190613d1f565b60405180910390a2604080513360601b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263f52cc7fd60e01b9092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163f52cc7fd9161088a9190603801613d77565b600060405180830381600087803b1580156108a457600080fd5b505af11580156108b8573d6000803e3d6000fd5b5050505050505050505050505050565b6108d0612c37565b609954600090815260986020526040902060088101546108f990600160a01b900460ff16612c90565b6007815460ff16600781111561091157610911613816565b1461092f57604051636264a22560e11b815260040160405180910390fd5b825160028201548114610955576040516313e0e3df60e21b815260040160405180910390fd5b6040805160608101825260008082526020820181905291810191909152606060005b83811015610d6d5786818151811061099157610991613dbe565b602002602001015192508581815181106109ad576109ad613dbe565b602002602001015191507f1579d012ead512dcb248c91571fa46aaa0f3399f8d3e1098fac22575db2ed69383604001511480610a0c57507f8ba0ed1f62da1d3048614c2c1feb566f041c8467eb00fb8294776a9179dc16438360400151145b15610a2a57604051630181cde760e71b815260040160405180910390fd5b610a948560040154846000015185602001518660400151604051602001610a72939291906001600160a01b039384168152919092166020820152604081019190915260600190565b6040516020818303038152906040528051906020012083858960020154612d58565b610ab15760405163582f497d60e11b815260040160405180910390fd5b60408084015190516372c6838f60e01b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916372c6838f91610b079160040190815260200190565b602060405180830381865afa158015610b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b489190613dd4565b90506001600160a01b038116610b715760405163330108ad60e11b815260040160405180910390fd5b835160208501516040516001600160a01b039283166024820152908216604482015260009183169060640160408051601f198184030181529181526020820180516001600160e01b03167f192957c80000000000000000000000000000000000000000000000000000000017905251610bea9190613df1565b600060405180830381855af49150503d8060008114610c25576040519150601f19603f3d011682016040523d82523d6000602084013e610c2a565b606091505b5050905080610c65576040517fd764f04e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516099546040516001600160a01b03909216917f74240b374b537a2cd20f9938c604e31312322ed54a06d58b3b4553cec637e08290600090a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52cc7fd8660000151604051602001610cfb919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401610d269190613e0d565b600060405180830381600087803b158015610d4057600080fd5b505af1158015610d54573d6000803e3d6000fd5b5050505050508080610d6590613e6a565b915050610977565b50610d7784612fc5565b50505050610d856001606555565b5050565b610e06604080516101a0810190915280600081526020016060815260200160008152602001600080191681526020016000801916815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581526020016060815260200160008152602001600081525090565b6000828152609860205260409081902081516101a081019092528054829060ff166007811115610e3857610e38613816565b6007811115610e4957610e49613816565b815260200160018201805480602002602001604051908101604052809291908181526020018280548015610ebc57602002820191906000526020600020906000905b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411610e8b5790505b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a0820152600782015460c082015260088201546001600160a01b03811660e0830152600160a01b900460ff16151561010082015260098201805461012090920191610f3c90613b9d565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6890613b9d565b8015610fb55780601f10610f8a57610100808354040283529160200191610fb5565b820191906000526020600020905b815481529060010190602001808311610f9857829003601f168201915b50505050508152602001600a8201548152602001600b820154815250509050919050565b6040517f91d148540000000000000000000000000000000000000000000000000000000081527f9e982efbc2164e40fcd14da9a0408a971e4224cb50a113d83b1c90cd8c1434dd60048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa15801561107c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a09190613e83565b6110d6576040517f6696fa8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6099546110f6576040516302f8412d60e51b815260040160405180910390fd5b60995460009081526098602052604090206008810154600160a01b900460ff1661114c576040517f0bb3291200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000816007015461117c9190613ea0565b42116111b4576040517f7ea3c87d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600782015560088101805473ffffffffffffffffffffffffffffffffffffffff1916339081179091556099546040517fbda18c0a01c67a81828bf10feaa1668f60afa2aed27903490f3f8dc6377c36ba90600090a360405163ea0a523760e01b815260206004820152601760248201527f537068696e784465706c6f796d656e74436c61696d656400000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a5237906064015b600060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b5050505050565b6112d960405180606001604052806000815260200160008152602001600081525090565b60405180606001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000815250905090565b611361612a96565b61136b6000612bd8565b604080516000602082015281516014818303018152603482019283905263f52cc7fd60e01b9092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163f52cc7fd916113d19190603801613eb8565b600060405180830381600087803b1580156113eb57600080fd5b505af11580156113ff573d6000803e3d6000fd5b50505050565b61140d612c37565b60995460009081526098602052604090206001815460ff16600781111561143657611436613816565b1461145457604051636264a22560e11b815260040160405180910390fd5b600881015461146c90600160a01b900460ff16612c90565b8251600b820154600a83015460009161148491613ea0565b9050816000036114a757604051630192876d60e11b815260040160405180910390fd5b6114dc60408051608081019091528060008152602001600081526020016060815260200160006001600160a01b031681525090565b606060005b84811015611c3d578781815181106114fb576114fb613dbe565b6020026020010151925086818151811061151757611517613dbe565b60200260200101519150826020015186600601541461154957604051632dc651e960e01b815260040160405180910390fd5b611594866003015484606001518560000151866040015160405160200161157293929190613eff565b6040516020818303038152906040528051906020012085602001518588612d58565b6115b15760405163582f497d60e11b815260040160405180910390fd5b6006860180549060006115c383613e6a565b9091555060029050835160028111156115de576115de613816565b036118d75760008084604001518060200190518101906115fe9190613f8d565b91509150600085606001518260405160200161161b929190613fca565b60408051601f1981840301815291815281516020928301206000818152609a909352912054909150838114611736576099547f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b886020015160405161168291815260200190565b60405180910390a260405163ea0a523760e01b815260206004820152600b60248201527f43616c6c536b697070656400000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b15801561171957600080fd5b505af115801561172d573d6000803e3d6000fd5b505050506118ce565b600087606001516001600160a01b0316846040516117549190613df1565b6000604051808303816000865af19150503d8060008114611791576040519150601f19603f3d011682016040523d82523d6000602084013e611796565b606091505b5050905080156118ae576117ab826001613ea0565b609a6000858152602001908152602001600020819055506099547f15fd19bd308d4be1d41b618f08936a1d9abde3037f2e24459759f1ef8f1b680589602001516040516117fa91815260200190565b60405180910390a260405163ea0a523760e01b815260206004820152600c60248201527f43616c6c4578656375746564000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b15801561189157600080fd5b505af11580156118a5573d6000803e3d6000fd5b505050506118cc565b6118bc8b89602001516130b5565b5050505050505050505050611c82565b505b50505050611c2b565b6001835160028111156118ec576118ec613816565b03611c1257600080846040015180602001905181019061190c9190613f8d565b606087015191935091506001600160a01b0381163b15611a1c57609954816001600160a01b03167f923ae433395607de530cdb746994ff3311417df3ec52a79bd1487c44dae64381886020015160405161196891815260200190565b60405180910390a360405163ea0a523760e01b815260206004820152601960248201527f436f6e74726163744465706c6f796d656e74536b69707065640000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b1580156119ff57600080fd5b505af1158015611a13573d6000803e3d6000fd5b50505050611c0a565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000604051602401611a5f93929190613fec565b60408051601f198184030181529181526020820180516001600160e01b03167fc7aeef0f0000000000000000000000000000000000000000000000000000000017905251611aad9190613df1565b600060405180830381855af49150503d8060008114611ae8576040519150601f19603f3d011682016040523d82523d6000602084013e611aed565b606091505b509150915081156118ae57600081806020019051810190611b0e9190613dd4565b9050609954816001600160a01b03167fc6943b85ca2f2d073ca2d4d6bef45aa866ac65fbda8428e8e85eb738e8881bc48780519060200120604051611b5591815260200190565b60405180910390a360405163ea0a523760e01b815260206004820152601060248201527f436f6e74726163744465706c6f7965640000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b158015611bec57600080fd5b505af1158015611c00573d6000803e3d6000fd5b50505050506118cc565b505050611c2b565b604051632237483560e21b815260040160405180910390fd5b80611c3581613e6a565b9150506114e1565b5084600a0154856006015403611c7c578460020154600003611c6757611c6285612fc5565b611c7c565b8454600690869060ff19166001835b02179055505b50505050505b610d856001606555565b611c94612a96565b826001600160a01b03163b600003611cd8576040517f58796ea800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60995415611cf9576040516330c2ab6360e11b815260040160405180910390fd5b6040516372c6838f60e01b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906372c6838f90602401602060405180830381865afa158015611d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d859190613dd4565b90506001600160a01b038116611dae5760405163330108ad60e11b815260040160405180910390fd5b6040516001600160a01b0383811682528491908616907f6828050ff1390d9c84304db69d7669bdc13a1df9715cedf6fe1eeb0bec3843ea9060200160405180910390a36040516001600160a01b03858116602483015283811660448301526000919083169060640160408051601f198184030181529181526020820180516001600160e01b03167f7eff275e0000000000000000000000000000000000000000000000000000000017905251611e649190613df1565b600060405180830381855af49150503d8060008114611e9f576040519150601f19603f3d011682016040523d82523d6000602084013e611ea4565b606091505b5050905080611edf576040517fed9af69100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405163ea0a523760e01b815260206004820152600d60248201527f50726f78794578706f727465640000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b158015611f6e57600080fd5b505af1158015611f82573d6000803e3d6000fd5b505050505050505050565b611f95612c37565b60995460009081526098602052604090206002815460ff166007811115611fbe57611fbe613816565b14611fdc57604051636264a22560e11b815260040160405180910390fd5b6008810154611ff490600160a01b900460ff16612c90565b8251600b820154600a83015460009161200c91613ea0565b90508160000361202f57604051630192876d60e11b815260040160405180910390fd5b61206460408051608081019091528060008152602001600081526020016060815260200160006001600160a01b031681525090565b606060005b848110156124885787818151811061208357612083613dbe565b6020026020010151925086818151811061209f5761209f613dbe565b6020026020010151915082602001518660060154146120d157604051632dc651e960e01b815260040160405180910390fd5b6000835160028111156120e6576120e6613816565b1461210457604051632237483560e21b815260040160405180910390fd5b61212d866003015484606001518560000151866040015160405160200161157293929190613eff565b61214a5760405163582f497d60e11b815260040160405180910390fd5b60068601805490600061215c83613e6a565b9190505550600080600080866040015180602001905181019061217f9190614015565b93509350935093507f1579d012ead512dcb248c91571fa46aaa0f3399f8d3e1098fac22575db2ed6938414806121d457507f8ba0ed1f62da1d3048614c2c1feb566f041c8467eb00fb8294776a9179dc164384145b156121f257604051630181cde760e71b815260040160405180910390fd5b6040516372c6838f60e01b8152600481018590526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906372c6838f90602401602060405180830381865afa15801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e9190613dd4565b90506000816001600160a01b031689606001518686866040516024016122a79493929190614073565b60408051601f198184030181529181526020820180516001600160e01b03167f9bc6ee9a00000000000000000000000000000000000000000000000000000000179052516122f59190613df1565b600060405180830381855af49150503d8060008114612330576040519150601f19603f3d011682016040523d82523d6000602084013e612335565b606091505b5050905080612370576040517fac5785a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b031689606001516001600160a01b03166099547f572ca77d05d5995d2382e9e3b5f4819a396a2b7914dd3cb9a81070b9dbe1e2f58c602001516040516123c091815260200190565b60405180910390a460405163ea0a523760e01b815260206004820152600f60248201527f53657450726f787953746f72616765000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b15801561245757600080fd5b505af115801561246b573d6000803e3d6000fd5b50505050505050505050808061248090613e6a565b915050612069565b5082856006015403611c7c578454600790869060ff1916600183611c76565b609780546124b490613b9d565b80601f01602080910402602001604051908101604052809291908181526020018280546124e090613b9d565b801561252d5780601f106125025761010080835404028352916020019161252d565b820191906000526020600020905b81548152906001019060200180831161251057829003601f168201915b505050505081565b61253f848461255a565b815115612550576125508282611f8d565b6113ff84846108c8565b612562612c37565b6099546000908152609860205260409020600881015461258b90600160a01b900460ff16612c90565b6006815460ff1660078111156125a3576125a3613816565b146125c157604051636264a22560e11b815260040160405180910390fd5b8251600282015481146125e7576040516313e0e3df60e21b815260040160405180910390fd5b6040805160608101825260008082526020820181905291810191909152606060005b838110156128dd5786818151811061262357612623613dbe565b6020026020010151925085818151811061263f5761263f613dbe565b602002602001015191507f1579d012ead512dcb248c91571fa46aaa0f3399f8d3e1098fac22575db2ed6938360400151148061269e57507f8ba0ed1f62da1d3048614c2c1feb566f041c8467eb00fb8294776a9179dc16438360400151145b156126bc57604051630181cde760e71b815260040160405180910390fd5b6127048560040154846000015185602001518660400151604051602001610a72939291906001600160a01b039384168152919092166020820152604081019190915260600190565b6127215760405163582f497d60e11b815260040160405180910390fd5b60408084015190516372c6838f60e01b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916372c6838f916127779160040190815260200190565b602060405180830381865afa158015612794573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127b89190613dd4565b90506001600160a01b0381166127e15760405163330108ad60e11b815260040160405180910390fd5b83516040516001600160a01b03918216602482015260009183169060440160408051601f198184030181529181526020820180516001600160e01b03167f479aa927000000000000000000000000000000000000000000000000000000001790525161284d9190613df1565b600060405180830381855af49150503d8060008114612888576040519150601f19603f3d011682016040523d82523d6000602084013e61288d565b606091505b50509050806128c8576040517f3fb523ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505080806128d590613e6a565b915050612609565b50835460ff191660021784556099546040513391907fbfea78bd2c6eb373d1bf039c60bc8b42be83b67fb39c2a2bc60b18d5883897d990600090a360405163ea0a523760e01b815260206004820152601060248201527f50726f78696573496e697469617465640000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b1580156129a757600080fd5b505af11580156129bb573d6000803e3d6000fd5b5050505050505050610d856001606555565b6129d5612a96565b6001600160a01b038116612a15576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a1e81612bd8565b60408051606083901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263f52cc7fd60e01b9092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163f52cc7fd916112809190603801613eb8565b6033546001600160a01b03163314612af05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161054c565b565b600054610100900460ff16612b5d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161054c565b612af06131a0565b600054610100900460ff16612bd05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161054c565b612af061320b565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600260655403612c895760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161054c565b6002606555565b6001811515148015612cbf57506099546000908152609860205260409020600801546001600160a01b03163314155b15612cf6576040517f06ee429500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80158015612d1e575033612d126033546001600160a01b031690565b6001600160a01b031614155b15612d55576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000808211612dcf5760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e000000000000000000606482015260840161054c565b818410612e435760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e00000000000000000000000000000000000000000000000000000000606482015260840161054c565b612e4c8261327f565b835114612ee75760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a40161054c565b8460005b8451811015612fb85785600116600103612f5157848181518110612f1157612f11613dbe565b602002602001015182604051602001612f34929190918252602082015260400190565b604051602081830303815290604052805190602001209150612f9f565b81858281518110612f6457612f64613dbe565b6020026020010151604051602001612f86929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480612fb081613e6a565b915050612eeb565b5090951495945050505050565b805460ff191660031781556099546040513391907fb49a12ea158d6a4bc6870a0b8d6f165565b02d7b8cd6637695bf76bdb923a1b790600090a360405163ea0a523760e01b815260206004820152601960248201527f537068696e784465706c6f796d656e74436f6d706c657465640000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b15801561308e57600080fd5b505af11580156130a2573d6000803e3d6000fd5b50506000609955505050565b6001606555565b6099546040518281527fd2cf0a63a528200cb9ca54a01d91104b4b5a8b87c47de16c7a7f2dd3bd09d54c9060200160405180910390a27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52cc7fd60995460405160200161312f91815260200190565b6040516020818303038152906040526040518263ffffffff1660e01b815260040161315a91906140ae565b600060405180830381600087803b15801561317457600080fd5b505af1158015613188573d6000803e3d6000fd5b505060006099555050815460ff191660051790915550565b600054610100900460ff166130ae5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161054c565b600054610100900460ff166132765760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b606482015260840161054c565b612af033612bd8565b60008082116132f65760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e00000000000000000000000000000000606482015260840161054c565b8160010361330657506000919050565b81600060805b600181106133445780613322600180831b6140f5565b901b83161561333c576133358183613ea0565b92811c9291505b60011c61330c565b506001811b841461335d5761335a600182613ea0565b90505b9392505050565b6001600160a01b0381168114612d5557600080fd5b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff811182821017156133b2576133b2613379565b60405290565b6040516080810167ffffffffffffffff811182821017156133b2576133b2613379565b604051601f8201601f1916810167ffffffffffffffff8111828210171561340457613404613379565b604052919050565b600067ffffffffffffffff82111561342657613426613379565b50601f01601f191660200190565b600082601f83011261344557600080fd5b81356134586134538261340c565b6133db565b81815284602083860101111561346d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561349f57600080fd5b83356134aa81613364565b9250602084013567ffffffffffffffff808211156134c757600080fd5b6134d387838801613434565b935060408601359150808211156134e957600080fd5b506134f686828701613434565b9150509250925092565b60005b8381101561351b578181015183820152602001613503565b838111156113ff5750506000910152565b60008151808452613544816020860160208601613500565b601f01601f19169290920160200192915050565b60208152600061335d602083018461352c565b8015158114612d5557600080fd5b600080600080600080600060e0888a03121561359457600080fd5b873596506020880135955060408801359450606088013593506080880135925060a088013567ffffffffffffffff8111156135ce57600080fd5b6135da8a828b01613434565b92505060c08801356135eb8161356b565b8091505092959891949750929550565b600067ffffffffffffffff82111561361557613615613379565b5060051b60200190565b600082601f83011261363057600080fd5b81356020613640613453836135fb565b8281526060928302850182019282820191908785111561365f57600080fd5b8387015b858110156136b85781818a03121561367b5760008081fd5b61368361338f565b813561368e81613364565b81528186013561369d81613364565b81870152604082810135908201528452928401928101613663565b5090979650505050505050565b600082601f8301126136d657600080fd5b813560206136e6613453836135fb565b828152600592831b850182019282820191908785111561370557600080fd5b8387015b858110156136b857803567ffffffffffffffff8111156137295760008081fd5b8801603f81018a1361373b5760008081fd5b85810135604061374d613453836135fb565b82815291851b8301810191888101908d84111561376a5760008081fd5b938201935b838510156137885784358252938901939089019061376f565b885250505093850193508401613709565b600080604083850312156137ac57600080fd5b823567ffffffffffffffff808211156137c457600080fd5b6137d08683870161361f565b935060208501359150808211156137e657600080fd5b506137f3858286016136c5565b9150509250929050565b60006020828403121561380f57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6008811061383c5761383c613816565b9052565b600081518084526020808501945080840160005b83811015613872578151151587529582019590820190600101613854565b509495945050505050565b6020815261388f60208201835161382c565b600060208301516101a08060408501526138ad6101c0850183613840565b91506040850151606085015260608501516080850152608085015160a085015260a085015160c085015260c085015160e085015260e085015161010081818701528087015191505061012061390c818701836001600160a01b03169052565b86015190506101406139218682018315159052565b80870151915050610160601f198685030181870152613940848361352c565b9087015161018087810191909152909601519190940152509192915050565b600082601f83011261397057600080fd5b81356020613980613453836135fb565b82815260059290921b8401810191818101908684111561399f57600080fd5b8286015b84811015613a4f57803567ffffffffffffffff808211156139c45760008081fd5b908801906080828b03601f19018113156139de5760008081fd5b6139e66133b8565b87840135600381106139f85760008081fd5b81526040848101358983015260608086013585811115613a185760008081fd5b613a268f8c838a0101613434565b84840152509483013594613a3986613364565b82019490945286525050509183019183016139a3565b509695505050505050565b60008060408385031215613a6d57600080fd5b823567ffffffffffffffff80821115613a8557600080fd5b6137d08683870161395f565b600080600060608486031215613aa657600080fd5b8335613ab181613364565b9250602084013591506040840135613ac881613364565b809150509250925092565b60008060008060808587031215613ae957600080fd5b843567ffffffffffffffff80821115613b0157600080fd5b613b0d8883890161361f565b95506020870135915080821115613b2357600080fd5b613b2f888389016136c5565b94506040870135915080821115613b4557600080fd5b613b518883890161395f565b93506060870135915080821115613b6757600080fd5b50613b74878288016136c5565b91505092959194509250565b600060208284031215613b9257600080fd5b813561335d81613364565b600181811c90821680613bb157607f821691505b602082108103613bd157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115613c1d57600081815260208120601f850160051c81016020861015613bfe5750805b601f850160051c820191505b8181101561049957828155600101613c0a565b505050565b815167ffffffffffffffff811115613c3c57613c3c613379565b613c5081613c4a8454613b9d565b84613bd7565b602080601f831160018114613c855760008415613c6d5750858301515b600019600386901b1c1916600185901b178555610499565b600085815260208120601f198616915b82811015613cb457888601518255948401946001909101908401613c95565b5085821015613cd25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b86815285602082015284604082015283606082015282608082015260c060a08201526000613d1360c083018461352c565b98975050505050505050565b60006101008a83528960208401528860408401528760608401528660808401528060a0840152613d518184018761352c565b94151560c084015250506001600160a01b039190911660e0909101529695505050505050565b60408152601860408201527f537068696e784465706c6f796d656e74417070726f7665640000000000000000606082015260806020820152600061335d608083018461352c565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613de657600080fd5b815161335d81613364565b60008251613e03818460208701613500565b9190910192915050565b60408152600d60408201527f50726f7879557067726164656400000000000000000000000000000000000000606082015260806020820152600061335d608083018461352c565b634e487b7160e01b600052601160045260246000fd5b600060018201613e7c57613e7c613e54565b5060010190565b600060208284031215613e9557600080fd5b815161335d8161356b565b60008219821115613eb357613eb3613e54565b500190565b60408152601460408201527f4f776e6572736869705472616e73666572726564000000000000000000000000606082015260806020820152600061335d608083018461352c565b6001600160a01b0384168152600060038410613f1d57613f1d613816565b83602083015260606040830152613f37606083018461352c565b95945050505050565b600082601f830112613f5157600080fd5b8151613f5f6134538261340c565b818152846020838601011115613f7457600080fd5b613f85826020830160208701613500565b949350505050565b60008060408385031215613fa057600080fd5b82519150602083015167ffffffffffffffff811115613fbe57600080fd5b6137f385828601613f40565b6001600160a01b0383168152604060208201526000613f85604083018461352c565b838152606060208201526000614005606083018561352c565b9050826040830152949350505050565b6000806000806080858703121561402b57600080fd5b8451935060208501519250604085015160ff8116811461404a57600080fd5b606086015190925067ffffffffffffffff81111561406757600080fd5b613b7487828801613f40565b6001600160a01b038516815283602082015260ff831660408201526080606082015260006140a4608083018461352c565b9695505050505050565b60408152601060408201527f4465706c6f796d656e744661696c656400000000000000000000000000000000606082015260806020820152600061335d608083018461352c565b60008282101561410757614107613e54565b50039056fea164736f6c634300080f000a0000000000000000000000001132793dcc6af3827ccb92fe9699bc1c62ba3ee200000000000000000000000095297da4a0c2aa88b9bad37389dbfbca25ab46ae0000000000000000000000007053c7c41848a7774333c0ce73ea809f6f10fe700000000000000000000000000000000000000000000000000000000000000384000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000", 0xab58b9B4359D4be027Cd1405CAFa85d9850D822B); + contracts[1] = SphinxContractInfo(hex"6101606040523480156200001257600080fd5b50604051620044b8380380620044b883398101604081905262000035916200015d565b80516020820151604083015160809290925260a05260c0526001600160a01b0380861660e052848116610100528316610120526101408290526200007862000083565b505050505062000227565b600054610100900460ff1615620000f05760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161462000142576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b03811681146200015a57600080fd5b50565b600080600080600085870360e08112156200017757600080fd5b8651620001848162000144565b6020880151909650620001978162000144565b6040880151909550620001aa8162000144565b606088810151919550909350607f1982011215620001c757600080fd5b50604051606081016001600160401b0381118282101715620001f957634e487b7160e01b600052604160045260246000fd5b80604052506080870151815260a0870151602082015260c08701516040820152809150509295509295909350565b60805160a05160c05160e0516101005161012051610140516141aa6200030e600039600061167901526000611558015260008181611d8d0152611f040152600081816102b1015281816105f4015281816107ec0152818161096801528181610d7d01528181610fff015281816111d00152818161177801528181611b0b01528181611c7f01528181611e970152818161206a015281816121a80152818161229e015281816124ae0152818161278d015281816129a801528181612aa7015281816130bb015261315f0152600061185d015260006118370152600061181101526141aa6000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c8063715018a6116100d8578063dfba66f01161008c578063f2fde38b11610066578063f2fde38b14610329578063f4d7d1311461033c578063f8050b041461034f57600080fd5b8063dfba66f0146102ec578063e8ea2d0814610303578063f22bd7fd1461031657600080fd5b80637b103999116100bd5780637b103999146102ac5780638da5cb5b146102d35780639a33e300146102e457600080fd5b8063715018a61461029157806375cd65e11461029957600080fd5b8063374040171161012f57806354fd4d501161011457806354fd4d501461021057806361f5499f1461023a5780636dcfd4661461027e57600080fd5b806337404017146101e85780634731d48c1461020857600080fd5b80630eb624be116101605780630eb624be1461019957806328d6ec60146101c25780633731e1ce146101d557600080fd5b8063047a1e5a1461017c5780630e128b5d14610191575b600080fd5b61018f61018a3660046136ae565b61036f565b005b61018f61089e565b6101ac6101a7366004613727565b6109d0565b6040516101b991906137f5565b60405180910390f35b61018f6101d0366004613816565b610b68565b61018f6101e3366004613931565b610df7565b6101fb6101f6366004613968565b6112b4565b6040516101b991906139e8565b61018f611504565b6102186117e0565b60408051825181526020808401519082015291810151908201526060016101b9565b610266610248366004613968565b6000908152609860205260409020600801546001600160a01b031690565b6040516001600160a01b0390911681526020016101b9565b61018f61028c3660046136ae565b611884565b61018f61216c565b61018f6102a7366004613aca565b612218565b6102667f000000000000000000000000000000000000000000000000000000000000000081565b6033546001600160a01b0316610266565b6101ac612519565b6102f560995481565b6040519081526020016101b9565b60995460405190151581526020016101b9565b61018f610324366004613931565b6125a7565b61018f610337366004613b0c565b612a1a565b61018f61034a366004613b29565b612ae3565b6102f561035d366004613968565b609a6020526000908152604090205481565b610377612b08565b60995460009081526098602052604090206002815460ff1660078111156103a0576103a0613981565b146103be57604051636264a22560e11b815260040160405180910390fd5b60088101546103d690600160a01b900460ff16612b61565b8251600b820154600a8301546000916103ee91613bec565b90508160000361041157604051630192876d60e11b815260040160405180910390fd5b60408051606080820183526000808352602083015291810191909152606060005b8481101561086a5787818151811061044c5761044c613c04565b6020026020010151925086818151811061046857610468613c04565b60200260200101519150826020015186600601541461049a57604051632dc651e960e01b815260040160405180910390fd5b6000835160028111156104af576104af613981565b146104cd57604051632237483560e21b815260040160405180910390fd5b6105128660030154846000015185604001516040516020016104f0929190613c1a565b6040516020818303038152906040528051906020012085602001518588612c29565b61052f5760405163582f497d60e11b815260040160405180910390fd5b60068601805490600061054183613c4b565b9190505550600080600080600087604001518060200190518101906105669190613ca9565b945094509450945094507f1579d012ead512dcb248c91571fa46aaa0f3399f8d3e1098fac22575db2ed6938514806105bd57507f8ba0ed1f62da1d3048614c2c1feb566f041c8467eb00fb8294776a9179dc164385145b156105db57604051630181cde760e71b815260040160405180910390fd5b6040516372c6838f60e01b8152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906372c6838f90602401602060405180830381865afa158015610643573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106679190613d27565b90506000816001600160a01b03168686868660405160240161068c9493929190613d44565b60408051601f198184030181529181526020820180516001600160e01b03167f9bc6ee9a00000000000000000000000000000000000000000000000000000000179052516106da9190613d7f565b600060405180830381855af49150503d8060008114610715576040519150601f19603f3d011682016040523d82523d6000602084013e61071a565b606091505b5050905080610755576040517fac5785a500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b0316866001600160a01b03166099547f572ca77d05d5995d2382e9e3b5f4819a396a2b7914dd3cb9a81070b9dbe1e2f58d602001516040516107a191815260200190565b60405180910390a460405163ea0a523760e01b815260206004820152600f60248201527f53657450726f787953746f72616765000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b15801561083857600080fd5b505af115801561084c573d6000803e3d6000fd5b5050505050505050505050808061086290613c4b565b915050610432565b508285600601540361088b578454600790869060ff19166001835b02179055505b505050505061089a6001606555565b5050565b6108a6612e9d565b6099546108c6576040516302f8412d60e51b815260040160405180910390fd5b60998054600081815260986020908152604080832092909455815460ff19166004178255600682015493519384529092339183917ff064e73ea31e266b1818a55d845fb77f88b9658b4ffa0ae8743a284624695ea5910160405180910390a360405163ea0a523760e01b815260206004820152601960248201527f537068696e784465706c6f796d656e7443616e63656c6c65640000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b1580156109b457600080fd5b505af11580156109c8573d6000803e3d6000fd5b505050505050565b600054606090610100900460ff16158080156109f35750600054600160ff909116105b80610a0d5750303b158015610a0d575060005460ff166001145b610a845760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b6000805460ff191660011790558015610aa7576000805461ff0019166101001790555b8351600003610ae2576040517f6754d56f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6097610aee8582613e20565b50610af7612ef9565b610aff612f6c565b610b0885612fdf565b6040518060200160405280600081525091508015610b60576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b509392505050565b610b70612e9d565b60995415610b91576040516330c2ab6360e11b815260040160405180910390fd5b6000878787878787604051602001610bae96959493929190613ee0565b60408051601f1981840301815291815281516020928301206000818152609890935290822080549193509160ff90911690816007811115610bf157610bf1613981565b14158015610c1157506003816007811115610c0e57610c0e613981565b14155b8015610c2f57506004816007811115610c2c57610c2c613981565b14155b8015610c4d57506005816007811115610c4a57610c4a613981565b14155b15610c84576040517f9ba64d5400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6099839055815460ff19166001178255600382018a905560048201899055600a8201889055600b820187905560028201869055600882018054851515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90911617905560098201610cfb8682613e20565b50827f12495da240bbbda7722fa0f48d8605c92d5b7439111cf999f43a0c19e04442c58b8b8b8b8b8b8b33604051610d3a989796959493929190613f1d565b60405180910390a2604080513360601b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263f52cc7fd60e01b9092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163f52cc7fd91610db99190603801613f75565b600060405180830381600087803b158015610dd357600080fd5b505af1158015610de7573d6000803e3d6000fd5b5050505050505050505050505050565b610dff612b08565b60995460009081526098602052604090206008810154610e2890600160a01b900460ff16612b61565b6007815460ff166007811115610e4057610e40613981565b14610e5e57604051636264a22560e11b815260040160405180910390fd5b825160028201548114610e84576040516313e0e3df60e21b815260040160405180910390fd5b6040805160608101825260008082526020820181905291810191909152606060005b8381101561129c57868181518110610ec057610ec0613c04565b60200260200101519250858181518110610edc57610edc613c04565b602002602001015191507f1579d012ead512dcb248c91571fa46aaa0f3399f8d3e1098fac22575db2ed69383604001511480610f3b57507f8ba0ed1f62da1d3048614c2c1feb566f041c8467eb00fb8294776a9179dc16438360400151145b15610f5957604051630181cde760e71b815260040160405180910390fd5b610fc38560040154846000015185602001518660400151604051602001610fa1939291906001600160a01b039384168152919092166020820152604081019190915260600190565b6040516020818303038152906040528051906020012083858960020154612c29565b610fe05760405163582f497d60e11b815260040160405180910390fd5b60408084015190516372c6838f60e01b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916372c6838f916110369160040190815260200190565b602060405180830381865afa158015611053573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110779190613d27565b90506001600160a01b0381166110a05760405163330108ad60e11b815260040160405180910390fd5b835160208501516040516001600160a01b039283166024820152908216604482015260009183169060640160408051601f198184030181529181526020820180516001600160e01b03167f192957c800000000000000000000000000000000000000000000000000000000179052516111199190613d7f565b600060405180830381855af49150503d8060008114611154576040519150601f19603f3d011682016040523d82523d6000602084013e611159565b606091505b5050905080611194576040517fd764f04e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516099546040516001600160a01b03909216917f74240b374b537a2cd20f9938c604e31312322ed54a06d58b3b4553cec637e08290600090a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52cc7fd866000015160405160200161122a919060609190911b6bffffffffffffffffffffffff1916815260140190565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016112559190613fbc565b600060405180830381600087803b15801561126f57600080fd5b505af1158015611283573d6000803e3d6000fd5b505050505050808061129490613c4b565b915050610ea6565b506112a68461303e565b5050505061089a6001606555565b611331604080516101a0810190915280600081526020016060815260200160008152602001600080191681526020016000801916815260200160008152602001600081526020016000815260200160006001600160a01b031681526020016000151581526020016060815260200160008152602001600081525090565b6000828152609860205260409081902081516101a081019092528054829060ff16600781111561136357611363613981565b600781111561137457611374613981565b8152602001600182018054806020026020016040519081016040528092919081815260200182805480156113e757602002820191906000526020600020906000905b825461010083900a900460ff1615158152602060019283018181049485019490930390920291018084116113b65790505b505050918352505060028201546020820152600382015460408201526004820154606082015260058201546080820152600682015460a0820152600782015460c082015260088201546001600160a01b03811660e0830152600160a01b900460ff1615156101008201526009820180546101209092019161146790613d9b565b80601f016020809104026020016040519081016040528092919081815260200182805461149390613d9b565b80156114e05780601f106114b5576101008083540402835291602001916114e0565b820191906000526020600020905b8154815290600101906020018083116114c357829003601f168201915b50505050508152602001600a8201548152602001600b820154815250509050919050565b6040517f91d148540000000000000000000000000000000000000000000000000000000081527f9e982efbc2164e40fcd14da9a0408a971e4224cb50a113d83b1c90cd8c1434dd60048201523360248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906391d1485490604401602060405180830381865afa1580156115a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cb9190614003565b611601576040517f6696fa8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609954611621576040516302f8412d60e51b815260040160405180910390fd5b60995460009081526098602052604090206008810154600160a01b900460ff16611677576040517f0bb3291200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081600701546116a79190613bec565b42116116df576040517f7ea3c87d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600782015560088101805473ffffffffffffffffffffffffffffffffffffffff1916339081179091556099546040517fbda18c0a01c67a81828bf10feaa1668f60afa2aed27903490f3f8dc6377c36ba90600090a360405163ea0a523760e01b815260206004820152601760248201527f537068696e784465706c6f796d656e74436c61696d656400000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a5237906064015b600060405180830381600087803b1580156117c557600080fd5b505af11580156117d9573d6000803e3d6000fd5b5050505050565b61180460405180606001604052806000815260200160008152602001600081525090565b60405180606001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f0000000000000000000000000000000000000000000000000000000000000000815250905090565b61188c612b08565b60995460009081526098602052604090206001815460ff1660078111156118b5576118b5613981565b146118d357604051636264a22560e11b815260040160405180910390fd5b60088101546118eb90600160a01b900460ff16612b61565b8251600b820154600a83015460009161190391613bec565b90508160000361192657604051630192876d60e11b815260040160405180910390fd5b60408051606080820183526000808352602083015291810191909152606060005b848110156121255787818151811061196157611961613c04565b6020026020010151925086818151811061197d5761197d613c04565b6020026020010151915082602001518660060154146119af57604051632dc651e960e01b815260040160405180910390fd5b6119d28660030154846000015185604001516040516020016104f0929190613c1a565b6119ef5760405163582f497d60e11b815260040160405180910390fd5b600686018054906000611a0183613c4b565b909155506002905083516002811115611a1c57611a1c613981565b03611d135760008060008560400151806020019051810190611a3e9190614020565b92509250925060008282604051602001611a59929190614070565b60408051601f1981840301815291815281516020928301206000818152609a909352912054909150848114611b74576099547f9ae934bf8a986157c889a24c3b3fa85e74b7e4ee4b1f8fc6e7362cb4c1d19d8b8960200151604051611ac091815260200190565b60405180910390a260405163ea0a523760e01b815260206004820152600b60248201527f43616c6c536b697070656400000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b158015611b5757600080fd5b505af1158015611b6b573d6000803e3d6000fd5b50505050611d09565b6000846001600160a01b031684604051611b8e9190613d7f565b6000604051808303816000865af19150503d8060008114611bcb576040519150601f19603f3d011682016040523d82523d6000602084013e611bd0565b606091505b505090508015611ce857611be5826001613bec565b609a6000858152602001908152602001600020819055506099547f15fd19bd308d4be1d41b618f08936a1d9abde3037f2e24459759f1ef8f1b68058a60200151604051611c3491815260200190565b60405180910390a260405163ea0a523760e01b815260206004820152600c60248201527f43616c6c4578656375746564000000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b158015611ccb57600080fd5b505af1158015611cdf573d6000803e3d6000fd5b50505050611d07565b611cf68c8a60200151613127565b505050505050505050505050612162565b505b5050505050612113565b600183516002811115611d2857611d28613981565b036120fa576000808460400151806020019051810190611d489190614092565b6040517fe4e131400000000000000000000000000000000000000000000000000000000081526004810183905230602482015291935091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e4e1314090604401602060405180830381865afa158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df89190613d27565b90506001600160a01b0381163b15611f0057609954816001600160a01b03167f923ae433395607de530cdb746994ff3311417df3ec52a79bd1487c44dae643818860200151604051611e4c91815260200190565b60405180910390a360405163ea0a523760e01b815260206004820152601960248201527f436f6e74726163744465706c6f796d656e74536b69707065640000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b158015611ee357600080fd5b505af1158015611ef7573d6000803e3d6000fd5b505050506120f2565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031684846000604051602401611f42939291906140cf565b60408051601f198184030181529181526020820180516001600160e01b03167fc7aeef0f0000000000000000000000000000000000000000000000000000000017905251611f909190613d7f565b600060405180830381855af49150503d8060008114611fcb576040519150601f19603f3d011682016040523d82523d6000602084013e611fd0565b606091505b5050905080156120d357609954826001600160a01b03167fc6943b85ca2f2d073ca2d4d6bef45aa866ac65fbda8428e8e85eb738e8881bc4858051906020012060405161201f91815260200190565b60405180910390a360405163ea0a523760e01b815260206004820152601060248201527f436f6e74726163744465706c6f7965640000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b1580156120b657600080fd5b505af11580156120ca573d6000803e3d6000fd5b505050506120f0565b6120e18a8860200151613127565b50505050505050505050612162565b505b505050612113565b604051632237483560e21b815260040160405180910390fd5b8061211d81613c4b565b915050611947565b5084600a015485600601540361088b57846002015460000361214f5761214a8561303e565b61088b565b8454600690869060ff1916600183610885565b61089a6001606555565b612174612e9d565b61217e6000612fdf565b604080516000602082015281516014818303018152603482019283905263f52cc7fd60e01b9092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163f52cc7fd916121e491906038016140f8565b600060405180830381600087803b1580156121fe57600080fd5b505af1158015612212573d6000803e3d6000fd5b50505050565b612220612e9d565b826001600160a01b03163b600003612264576040517f58796ea800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60995415612285576040516330c2ab6360e11b815260040160405180910390fd5b6040516372c6838f60e01b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906372c6838f90602401602060405180830381865afa1580156122ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123119190613d27565b90506001600160a01b03811661233a5760405163330108ad60e11b815260040160405180910390fd5b6040516001600160a01b0383811682528491908616907f6828050ff1390d9c84304db69d7669bdc13a1df9715cedf6fe1eeb0bec3843ea9060200160405180910390a36040516001600160a01b03858116602483015283811660448301526000919083169060640160408051601f198184030181529181526020820180516001600160e01b03167f7eff275e00000000000000000000000000000000000000000000000000000000179052516123f09190613d7f565b600060405180830381855af49150503d806000811461242b576040519150601f19603f3d011682016040523d82523d6000602084013e612430565b606091505b505090508061246b576040517fed9af69100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405163ea0a523760e01b815260206004820152600d60248201527f50726f78794578706f727465640000000000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b1580156124fa57600080fd5b505af115801561250e573d6000803e3d6000fd5b505050505050505050565b6097805461252690613d9b565b80601f016020809104026020016040519081016040528092919081815260200182805461255290613d9b565b801561259f5780601f106125745761010080835404028352916020019161259f565b820191906000526020600020905b81548152906001019060200180831161258257829003601f168201915b505050505081565b6125af612b08565b609954600090815260986020526040902060088101546125d890600160a01b900460ff16612b61565b6006815460ff1660078111156125f0576125f0613981565b1461260e57604051636264a22560e11b815260040160405180910390fd5b825160028201548114612634576040516313e0e3df60e21b815260040160405180910390fd5b6040805160608101825260008082526020820181905291810191909152606060005b8381101561292a5786818151811061267057612670613c04565b6020026020010151925085818151811061268c5761268c613c04565b602002602001015191507f1579d012ead512dcb248c91571fa46aaa0f3399f8d3e1098fac22575db2ed693836040015114806126eb57507f8ba0ed1f62da1d3048614c2c1feb566f041c8467eb00fb8294776a9179dc16438360400151145b1561270957604051630181cde760e71b815260040160405180910390fd5b6127518560040154846000015185602001518660400151604051602001610fa1939291906001600160a01b039384168152919092166020820152604081019190915260600190565b61276e5760405163582f497d60e11b815260040160405180910390fd5b60408084015190516372c6838f60e01b81526000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916372c6838f916127c49160040190815260200190565b602060405180830381865afa1580156127e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128059190613d27565b90506001600160a01b03811661282e5760405163330108ad60e11b815260040160405180910390fd5b83516040516001600160a01b03918216602482015260009183169060440160408051601f198184030181529181526020820180516001600160e01b03167f479aa927000000000000000000000000000000000000000000000000000000001790525161289a9190613d7f565b600060405180830381855af49150503d80600081146128d5576040519150601f19603f3d011682016040523d82523d6000602084013e6128da565b606091505b5050905080612915576040517f3fb523ca00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050808061292290613c4b565b915050612656565b50835460ff191660021784556099546040513391907fbfea78bd2c6eb373d1bf039c60bc8b42be83b67fb39c2a2bc60b18d5883897d990600090a360405163ea0a523760e01b815260206004820152601060248201527f50726f78696573496e697469617465640000000000000000000000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b1580156129f457600080fd5b505af1158015612a08573d6000803e3d6000fd5b505050505050505061089a6001606555565b612a22612e9d565b6001600160a01b038116612a62576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a6b81612fdf565b60408051606083901b6bffffffffffffffffffffffff1916602082015281516014818303018152603482019283905263f52cc7fd60e01b9092527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169163f52cc7fd916117ab91906038016140f8565b612aed84846125a7565b815115612afe57612afe828261036f565b6122128484610df7565b600260655403612b5a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a7b565b6002606555565b6001811515148015612b9057506099546000908152609860205260409020600801546001600160a01b03163314155b15612bc7576040517f06ee429500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80158015612bef575033612be36033546001600160a01b031690565b6001600160a01b031614155b15612c26576040517f6db2465f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b6000808211612ca05760405162461bcd60e51b815260206004820152603760248201527f4c69625f4d65726b6c65547265653a20546f74616c206c6561766573206d757360448201527f742062652067726561746572207468616e207a65726f2e0000000000000000006064820152608401610a7b565b818410612d145760405162461bcd60e51b8152602060048201526024808201527f4c69625f4d65726b6c65547265653a20496e646578206f7574206f6620626f7560448201527f6e64732e000000000000000000000000000000000000000000000000000000006064820152608401610a7b565b612d1d82613212565b835114612db85760405162461bcd60e51b815260206004820152604d60248201527f4c69625f4d65726b6c65547265653a20546f74616c207369626c696e6773206460448201527f6f6573206e6f7420636f72726563746c7920636f72726573706f6e6420746f2060648201527f746f74616c206c65617665732e00000000000000000000000000000000000000608482015260a401610a7b565b8460005b8451811015612e895785600116600103612e2257848181518110612de257612de2613c04565b602002602001015182604051602001612e05929190918252602082015260400190565b604051602081830303815290604052805190602001209150612e70565b81858281518110612e3557612e35613c04565b6020026020010151604051602001612e57929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60019590951c9480612e8181613c4b565b915050612dbc565b5090951495945050505050565b6001606555565b6033546001600160a01b03163314612ef75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a7b565b565b600054610100900460ff16612f645760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a7b565b612ef76132f7565b600054610100900460ff16612fd75760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a7b565b612ef7613362565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b805460ff191660031781556099546040513391907fb49a12ea158d6a4bc6870a0b8d6f165565b02d7b8cd6637695bf76bdb923a1b790600090a360405163ea0a523760e01b815260206004820152601960248201527f537068696e784465706c6f796d656e74436f6d706c657465640000000000000060448201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ea0a523790606401600060405180830381600087803b15801561310757600080fd5b505af115801561311b573d6000803e3d6000fd5b50506000609955505050565b6099546040518281527fd2cf0a63a528200cb9ca54a01d91104b4b5a8b87c47de16c7a7f2dd3bd09d54c9060200160405180910390a27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52cc7fd6099546040516020016131a191815260200190565b6040516020818303038152906040526040518263ffffffff1660e01b81526004016131cc919061413f565b600060405180830381600087803b1580156131e657600080fd5b505af11580156131fa573d6000803e3d6000fd5b505060006099555050815460ff191660051790915550565b60008082116132895760405162461bcd60e51b815260206004820152603060248201527f4c69625f4d65726b6c65547265653a2043616e6e6f7420636f6d70757465206360448201527f65696c286c6f675f3229206f6620302e000000000000000000000000000000006064820152608401610a7b565b8160010361329957506000919050565b81600060805b600181106132d757806132b5600180831b614186565b901b8316156132cf576132c88183613bec565b92811c9291505b60011c61329f565b506001811b84146132f0576132ed600182613bec565b90505b9392505050565b600054610100900460ff16612e965760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a7b565b600054610100900460ff166133cd5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b6064820152608401610a7b565b612ef733612fdf565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff8111828210171561340f5761340f6133d6565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561343e5761343e6133d6565b604052919050565b600067ffffffffffffffff821115613460576134606133d6565b5060051b60200190565b600067ffffffffffffffff821115613484576134846133d6565b50601f01601f191660200190565b600082601f8301126134a357600080fd5b81356134b66134b18261346a565b613415565b8181528460208386010111156134cb57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126134f957600080fd5b813560206135096134b183613446565b82815260059290921b8401810191818101908684111561352857600080fd5b8286015b848110156135c257803567ffffffffffffffff8082111561354d5760008081fd5b908801906060828b03601f19018113156135675760008081fd5b61356f6133ec565b87840135600381106135815760008081fd5b8152604084810135898301529184013591838311156135a05760008081fd5b6135ae8d8a85880101613492565b90820152865250505091830191830161352c565b509695505050505050565b600082601f8301126135de57600080fd5b813560206135ee6134b183613446565b828152600592831b850182019282820191908785111561360d57600080fd5b8387015b858110156136a157803567ffffffffffffffff8111156136315760008081fd5b8801603f81018a136136435760008081fd5b8581013560406136556134b183613446565b82815291851b8301810191888101908d8411156136725760008081fd5b938201935b8385101561369057843582529389019390890190613677565b885250505093850193508401613611565b5090979650505050505050565b600080604083850312156136c157600080fd5b823567ffffffffffffffff808211156136d957600080fd5b6136e5868387016134e8565b935060208501359150808211156136fb57600080fd5b50613708858286016135cd565b9150509250929050565b6001600160a01b0381168114612c2657600080fd5b60008060006060848603121561373c57600080fd5b833561374781613712565b9250602084013567ffffffffffffffff8082111561376457600080fd5b61377087838801613492565b9350604086013591508082111561378657600080fd5b5061379386828701613492565b9150509250925092565b60005b838110156137b85781810151838201526020016137a0565b838111156122125750506000910152565b600081518084526137e181602086016020860161379d565b601f01601f19169290920160200192915050565b6020815260006132f060208301846137c9565b8015158114612c2657600080fd5b600080600080600080600060e0888a03121561383157600080fd5b873596506020880135955060408801359450606088013593506080880135925060a088013567ffffffffffffffff81111561386b57600080fd5b6138778a828b01613492565b92505060c088013561388881613808565b8091505092959891949750929550565b600082601f8301126138a957600080fd5b813560206138b96134b183613446565b828152606092830285018201928282019190878511156138d857600080fd5b8387015b858110156136a15781818a0312156138f45760008081fd5b6138fc6133ec565b813561390781613712565b81528186013561391681613712565b818701526040828101359082015284529284019281016138dc565b6000806040838503121561394457600080fd5b823567ffffffffffffffff8082111561395c57600080fd5b6136e586838701613898565b60006020828403121561397a57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600881106139a7576139a7613981565b9052565b600081518084526020808501945080840160005b838110156139dd5781511515875295820195908201906001016139bf565b509495945050505050565b602081526139fa602082018351613997565b600060208301516101a0806040850152613a186101c08501836139ab565b91506040850151606085015260608501516080850152608085015160a085015260a085015160c085015260c085015160e085015260e0850151610100818187015280870151915050610120613a77818701836001600160a01b03169052565b8601519050610140613a8c8682018315159052565b80870151915050610160601f198685030181870152613aab84836137c9565b9087015161018087810191909152909601519190940152509192915050565b600080600060608486031215613adf57600080fd5b8335613aea81613712565b9250602084013591506040840135613b0181613712565b809150509250925092565b600060208284031215613b1e57600080fd5b81356132f081613712565b60008060008060808587031215613b3f57600080fd5b843567ffffffffffffffff80821115613b5757600080fd5b613b6388838901613898565b95506020870135915080821115613b7957600080fd5b613b85888389016135cd565b94506040870135915080821115613b9b57600080fd5b613ba7888389016134e8565b93506060870135915080821115613bbd57600080fd5b50613bca878288016135cd565b91505092959194509250565b634e487b7160e01b600052601160045260246000fd5b60008219821115613bff57613bff613bd6565b500190565b634e487b7160e01b600052603260045260246000fd5b600060038410613c2c57613c2c613981565b83825260406020830152613c4360408301846137c9565b949350505050565b600060018201613c5d57613c5d613bd6565b5060010190565b600082601f830112613c7557600080fd5b8151613c836134b18261346a565b818152846020838601011115613c9857600080fd5b613c4382602083016020870161379d565b600080600080600060a08688031215613cc157600080fd5b855194506020860151613cd381613712565b60408701516060880151919550935060ff81168114613cf157600080fd5b608087015190925067ffffffffffffffff811115613d0e57600080fd5b613d1a88828901613c64565b9150509295509295909350565b600060208284031215613d3957600080fd5b81516132f081613712565b6001600160a01b038516815283602082015260ff83166040820152608060608201526000613d7560808301846137c9565b9695505050505050565b60008251613d9181846020870161379d565b9190910192915050565b600181811c90821680613daf57607f821691505b602082108103613dcf57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115613e1b57600081815260208120601f850160051c81016020861015613dfc5750805b601f850160051c820191505b818110156109c857828155600101613e08565b505050565b815167ffffffffffffffff811115613e3a57613e3a6133d6565b613e4e81613e488454613d9b565b84613dd5565b602080601f831160018114613e835760008415613e6b5750858301515b600019600386901b1c1916600185901b1785556109c8565b600085815260208120601f198616915b82811015613eb257888601518255948401946001909101908401613e93565b5085821015613ed05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b86815285602082015284604082015283606082015282608082015260c060a08201526000613f1160c08301846137c9565b98975050505050505050565b60006101008a83528960208401528860408401528760608401528660808401528060a0840152613f4f818401876137c9565b94151560c084015250506001600160a01b039190911660e0909101529695505050505050565b60408152601860408201527f537068696e784465706c6f796d656e74417070726f766564000000000000000060608201526080602082015260006132f060808301846137c9565b60408152600d60408201527f50726f787955706772616465640000000000000000000000000000000000000060608201526080602082015260006132f060808301846137c9565b60006020828403121561401557600080fd5b81516132f081613808565b60008060006060848603121561403557600080fd5b83519250602084015161404781613712565b604085015190925067ffffffffffffffff81111561406457600080fd5b61379386828701613c64565b6001600160a01b0383168152604060208201526000613c4360408301846137c9565b600080604083850312156140a557600080fd5b82519150602083015167ffffffffffffffff8111156140c357600080fd5b61370885828601613c64565b8381526060602082015260006140e860608301856137c9565b9050826040830152949350505050565b60408152601460408201527f4f776e6572736869705472616e7366657272656400000000000000000000000060608201526080602082015260006132f060808301846137c9565b60408152601060408201527f4465706c6f796d656e744661696c65640000000000000000000000000000000060608201526080602082015260006132f060808301846137c9565b60008282101561419857614198613bd6565b50039056fea164736f6c634300080f000a0000000000000000000000001132793dcc6af3827ccb92fe9699bc1c62ba3ee200000000000000000000000095297da4a0c2aa88b9bad37389dbfbca25ab46ae0000000000000000000000007053c7c41848a7774333c0ce73ea809f6f10fe700000000000000000000000000000000000000000000000000000000000000384000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000", 0x6430B98583346685B1C7e4696bAA701fc82BD26C); contracts[2] = SphinxContractInfo(hex"60a060405234801561001057600080fd5b506040516105a13803806105a183398101604081905261002f916100af565b6001600160a01b03811661009e5760405162461bcd60e51b815260206004820152602c60248201527f44656661756c74416461707465723a20757064617465722063616e6e6f74206260448201526b65206164647265737328302960a01b606482015260840160405180910390fd5b6001600160a01b03166080526100df565b6000602082840312156100c157600080fd5b81516001600160a01b03811681146100d857600080fd5b9392505050565b6080516104a1610100600039600081816099015261017401526104a16000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80637bafa3c7116100505780637bafa3c7146100945780637eff275e146100d75780639bc6ee9a146100ea57600080fd5b8063192957c81461006c578063479aa92714610081575b600080fd5b61007f61007a3660046102bb565b6100fd565b005b61007f61008f3660046102f4565b61015d565b6100bb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61007f6100e53660046102bb565b6101db565b61007f6100f8366004610347565b610222565b604051631b2ce7f360e11b81526001600160a01b038281166004830152831690633659cfe6906024015b600060405180830381600087803b15801561014157600080fd5b505af1158015610155573d6000803e3d6000fd5b505050505050565b604051631b2ce7f360e11b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152821690633659cfe690602401600060405180830381600087803b1580156101c057600080fd5b505af11580156101d4573d6000803e3d6000fd5b5050505050565b6040517f8f2839700000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152831690638f28397090602401610127565b6040517f1ea947020000000000000000000000000000000000000000000000000000000081526001600160a01b03851690631ea947029061026b9086908690869060040161042d565b600060405180830381600087803b15801561028557600080fd5b505af1158015610299573d6000803e3d6000fd5b5050505050505050565b6001600160a01b03811681146102b857600080fd5b50565b600080604083850312156102ce57600080fd5b82356102d9816102a3565b915060208301356102e9816102a3565b809150509250929050565b60006020828403121561030657600080fd5b8135610311816102a3565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561035d57600080fd5b8435610368816102a3565b935060208501359250604085013560ff8116811461038557600080fd5b9150606085013567ffffffffffffffff808211156103a257600080fd5b818701915087601f8301126103b657600080fd5b8135818111156103c8576103c8610318565b604051601f8201601f19908116603f011681019083821181831017156103f0576103f0610318565b816040528281528a602084870101111561040957600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8381526000602060ff85168184015260606040840152835180606085015260005b8181101561046a5785810183015185820160800152820161044e565b8181111561047c576000608083870101525b50601f01601f1916929092016080019594505050505056fea164736f6c634300080f000a000000000000000000000000581c7a489c15a7b4ca216f43aff5987685f9d648", 0xbee0057e5B4c89B80013ECA818E5A8dBF0A131D3); contracts[3] = SphinxContractInfo(hex"60a060405234801561001057600080fd5b5060405161062b38038061062b83398101604081905261002f916100b4565b806001600160a01b0381166100a25760405162461bcd60e51b815260206004820152602f60248201527f4f5a5555505342617365416461707465723a20757064617465722063616e6e6f60448201526e74206265206164647265737328302960881b606482015260840160405180910390fd5b6001600160a01b0316608052506100e4565b6000602082840312156100c657600080fd5b81516001600160a01b03811681146100dd57600080fd5b9392505050565b60805161052661010560003960008181609901526101a601526105266000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80637bafa3c7116100505780637bafa3c7146100945780637eff275e146100d75780639bc6ee9a146100ea57600080fd5b8063192957c81461006c578063479aa92714610081575b600080fd5b61007f61007a366004610340565b6100fd565b005b61007f61008f366004610379565b610176565b6100bb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61007f6100e5366004610340565b610260565b61007f6100f83660046103cc565b6102a7565b6040517f93af02920000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906393af0292906024015b600060405180830381600087803b15801561015a57600080fd5b505af115801561016e573d6000803e3d6000fd5b505050505050565b6040517f3659cfe60000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152821690633659cfe690602401600060405180830381600087803b1580156101f257600080fd5b505af1158015610206573d6000803e3d6000fd5b50505050806001600160a01b03166366aa56c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561024557600080fd5b505af1158015610259573d6000803e3d6000fd5b5050505050565b6040517ff2fde38b0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015283169063f2fde38b90602401610140565b6040517f1ea947020000000000000000000000000000000000000000000000000000000081526001600160a01b03851690631ea94702906102f0908690869086906004016104b2565b600060405180830381600087803b15801561030a57600080fd5b505af115801561031e573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038116811461033d57600080fd5b50565b6000806040838503121561035357600080fd5b823561035e81610328565b9150602083013561036e81610328565b809150509250929050565b60006020828403121561038b57600080fd5b813561039681610328565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600080608085870312156103e257600080fd5b84356103ed81610328565b935060208501359250604085013560ff8116811461040a57600080fd5b9150606085013567ffffffffffffffff8082111561042757600080fd5b818701915087601f83011261043b57600080fd5b81358181111561044d5761044d61039d565b604051601f8201601f19908116603f011681019083821181831017156104755761047561039d565b816040528281528a602084870101111561048e57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8381526000602060ff85168184015260606040840152835180606085015260005b818110156104ef578581018301518582016080015282016104d3565b81811115610501576000608083870101525b50601f01601f1916929092016080019594505050505056fea164736f6c634300080f000a00000000000000000000000070f0498ed74322e01ac99ed4a27903eb8b5718c7", 0x80F33f57348e892fcbf7Df0Bc1e6B7Dac3fA2a23); contracts[4] = SphinxContractInfo(hex"60a060405234801561001057600080fd5b5060405161063238038061063283398101604081905261002f916100b4565b806001600160a01b0381166100a25760405162461bcd60e51b815260206004820152602f60248201527f4f5a5555505342617365416461707465723a20757064617465722063616e6e6f60448201526e74206265206164647265737328302960881b606482015260840160405180910390fd5b6001600160a01b0316608052506100e4565b6000602082840312156100c657600080fd5b81516001600160a01b03811681146100dd57600080fd5b9392505050565b60805161052d61010560003960008181609901526101a6015261052d6000f3fe608060405234801561001057600080fd5b50600436106100675760003560e01c80637bafa3c7116100505780637bafa3c7146100945780637eff275e146100d75780639bc6ee9a146100ea57600080fd5b8063192957c81461006c578063479aa92714610081575b600080fd5b61007f61007a366004610347565b6100fd565b005b61007f61008f366004610380565b610176565b6100bb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61007f6100e5366004610347565b610260565b61007f6100f83660046103d3565b6102ae565b6040517f93af02920000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906393af0292906024015b600060405180830381600087803b15801561015a57600080fd5b505af115801561016e573d6000803e3d6000fd5b505050505050565b6040517f3659cfe60000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152821690633659cfe690602401600060405180830381600087803b1580156101f257600080fd5b505af1158015610206573d6000803e3d6000fd5b50505050806001600160a01b03166366aa56c56040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561024557600080fd5b505af1158015610259573d6000803e3d6000fd5b5050505050565b6040517f2f2ff15d000000000000000000000000000000000000000000000000000000008152600060048201526001600160a01b038281166024830152831690632f2ff15d90604401610140565b6040517f1ea947020000000000000000000000000000000000000000000000000000000081526001600160a01b03851690631ea94702906102f7908690869086906004016104b9565b600060405180830381600087803b15801561031157600080fd5b505af1158015610325573d6000803e3d6000fd5b5050505050505050565b6001600160a01b038116811461034457600080fd5b50565b6000806040838503121561035a57600080fd5b82356103658161032f565b915060208301356103758161032f565b809150509250929050565b60006020828403121561039257600080fd5b813561039d8161032f565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080600080608085870312156103e957600080fd5b84356103f48161032f565b935060208501359250604085013560ff8116811461041157600080fd5b9150606085013567ffffffffffffffff8082111561042e57600080fd5b818701915087601f83011261044257600080fd5b813581811115610454576104546103a4565b604051601f8201601f19908116603f0116810190838211818310171561047c5761047c6103a4565b816040528281528a602084870101111561049557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b8381526000602060ff85168184015260606040840152835180606085015260005b818110156104f6578581018301518582016080015282016104da565b81811115610508576000608083870101525b50601f01601f1916929092016080019594505050505056fea164736f6c634300080f000a00000000000000000000000070f0498ed74322e01ac99ed4a27903eb8b5718c7", 0x3E95A9D41413f3CF06DeFC51Eed59f3f488f3251); diff --git a/packages/plugins/script/display-bundle-info.ts b/packages/plugins/script/display-bundle-info.ts index 71ae62c97..77cf32b29 100644 --- a/packages/plugins/script/display-bundle-info.ts +++ b/packages/plugins/script/display-bundle-info.ts @@ -19,7 +19,7 @@ if (typeof configPath !== 'string') { /** * Display a Sphinx bundle. The purpose of this script is to easily generate bundles in a format - * that can be used alongside the `vm.readJson` cheatcode in order to test the Sphinx contracts + * that can be used alongside the `vm.parseJson` cheatcode in order to test the Sphinx contracts * with Forge. This script is NOT meant to be called via FFI in the Foundry plugin. * * This script can be called by running: