From e58e64e2c42c76c8b534f293b76db99a11eb5b07 Mon Sep 17 00:00:00 2001 From: gabrielstoica Date: Thu, 28 Nov 2024 09:37:00 +0200 Subject: [PATCH 1/6] style: forge fmt --- src/ModuleKeeper.sol | 2 +- src/Space.sol | 75 +++++++++++-------- test/mocks/MockBadSpace.sol | 71 +++++++++++------- test/mocks/MockNFTDescriptor.sol | 18 ++++- test/mocks/MockOwnable.sol | 2 +- .../concrete/space/fallback/fallback.t.sol | 2 +- .../unit/concrete/space/receive/receive.t.sol | 2 +- .../updateModuleKeeper.t.sol | 4 +- 8 files changed, 108 insertions(+), 68 deletions(-) diff --git a/src/ModuleKeeper.sol b/src/ModuleKeeper.sol index fda2c708..a794e6d9 100644 --- a/src/ModuleKeeper.sol +++ b/src/ModuleKeeper.sol @@ -20,7 +20,7 @@ contract ModuleKeeper is IModuleKeeper, Ownable { //////////////////////////////////////////////////////////////////////////*/ /// @dev Initializes the initial owner of the {ModuleKeeper} - constructor(address _initialOwner) Ownable(_initialOwner) {} + constructor(address _initialOwner) Ownable(_initialOwner) { } /*////////////////////////////////////////////////////////////////////////// NON-CONSTANT FUNCTIONS diff --git a/src/Space.sol b/src/Space.sol index 16aaa566..f110196c 100644 --- a/src/Space.sol +++ b/src/Space.sol @@ -37,11 +37,11 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { //////////////////////////////////////////////////////////////////////////*/ /// @dev Initializes the address of the EIP 4337 factory and EntryPoint contract - constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) {} + constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) { } /// @notice Initializes the {ModuleKeeper}, enables initial modules and configures the {Space} smart account function initialize(address _defaultAdmin, bytes calldata _data) public override { - (, , address[] memory initialModules) = abi.decode(_data, (uint256, uint256, address[])); + (,, address[] memory initialModules) = abi.decode(_data, (uint256, uint256, address[])); // Enable the initial module(s) ModuleKeeper moduleKeeper = StationRegistry(factory).moduleKeeper(); @@ -87,7 +87,11 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { address module, uint256 value, bytes calldata data - ) public onlyAdminOrEntrypoint returns (bool success) { + ) + public + onlyAdminOrEntrypoint + returns (bool success) + { // Checks: the `module` module is enabled on the smart account _checkIfModuleIsEnabled(module); @@ -100,7 +104,10 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { address[] calldata modules, uint256[] calldata values, bytes[] calldata data - ) external onlyAdminOrEntrypoint { + ) + external + onlyAdminOrEntrypoint + { // Cache the length of the modules array uint256 modulesLength = modules.length; @@ -146,28 +153,19 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { IERC1155 collection, uint256[] memory ids, uint256[] memory amounts - ) public onlyAdminOrEntrypoint { + ) + public + onlyAdminOrEntrypoint + { // Checks, Effects, Interactions: withdraw by transferring the tokens to the space owner // Notes: // - we're using `safeTransferFrom` as the owner can be an ERC-4337 smart account // therefore the `onERC1155Received` hook must be implemented // - depending on the length of the `ids` array, we're using `safeBatchTransferFrom` or `safeTransferFrom` if (ids.length > 1) { - collection.safeBatchTransferFrom({ - from: address(this), - to: msg.sender, - ids: ids, - values: amounts, - data: "" - }); + collection.safeBatchTransferFrom({ from: address(this), to: msg.sender, ids: ids, values: amounts, data: "" }); } else { - collection.safeTransferFrom({ - from: address(this), - to: msg.sender, - id: ids[0], - value: amounts[0], - data: "" - }); + collection.safeTransferFrom({ from: address(this), to: msg.sender, id: ids[0], value: amounts[0], data: "" }); } // Log the successful ERC-1155 token withdrawal @@ -176,11 +174,11 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { /// @inheritdoc ISpace function withdrawNative(uint256 amount) public onlyAdminOrEntrypoint { - // Checks: the native balance of the space minus the amount locked for operations is greater than the requested amount + // Checks: the native balance of the space is greater enough to support the withdrawal if (amount > address(this).balance) revert Errors.InsufficientNativeToWithdraw(); // Interactions: withdraw by transferring the amount to the sender - (bool success, ) = msg.sender.call{ value: amount }(""); + (bool success,) = msg.sender.call{ value: amount }(""); // Revert if the call failed if (!success) revert Errors.NativeWithdrawFailed(); @@ -208,7 +206,15 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { //////////////////////////////////////////////////////////////////////////*/ /// @inheritdoc ERC1271 - function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4 magicValue) { + function isValidSignature( + bytes32 _hash, + bytes memory _signature + ) + public + view + override + returns (bytes4 magicValue) + { // Compute the hash of message the should be signed bytes32 targetDigest = getMessageHash(_hash); @@ -241,11 +247,8 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public pure returns (bool) { - return - interfaceId == type(ISpace).interfaceId || - interfaceId == type(IERC1155Receiver).interfaceId || - interfaceId == type(IERC721Receiver).interfaceId || - interfaceId == type(IERC165).interfaceId; + return interfaceId == type(ISpace).interfaceId || interfaceId == type(IERC1155Receiver).interfaceId + || interfaceId == type(IERC721Receiver).interfaceId || interfaceId == type(IERC165).interfaceId; } /// @inheritdoc IERC721Receiver @@ -254,7 +257,11 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { address from, uint256 tokenId, bytes memory - ) public override returns (bytes4) { + ) + public + override + returns (bytes4) + { // Silence unused variable warning operator = operator; @@ -271,7 +278,11 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { uint256 id, uint256 value, bytes memory - ) public override returns (bytes4) { + ) + public + override + returns (bytes4) + { // Silence unused variable warning operator = operator; @@ -288,7 +299,11 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { uint256[] memory ids, uint256[] memory values, bytes memory - ) public override returns (bytes4) { + ) + public + override + returns (bytes4) + { for (uint256 i; i < ids.length; ++i) { // Log the successful ERC-1155 token receipt emit ERC1155Received(from, ids[i], values[i]); diff --git a/test/mocks/MockBadSpace.sol b/test/mocks/MockBadSpace.sol index c0d3973a..811cbe9d 100644 --- a/test/mocks/MockBadSpace.sol +++ b/test/mocks/MockBadSpace.sol @@ -37,7 +37,7 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { //////////////////////////////////////////////////////////////////////////*/ /// @dev Initializes the address of the {Space} owner, {ModuleKeeper} and enables the initial module(s) - constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) {} + constructor(IEntryPoint _entrypoint, address _factory) AccountCore(_entrypoint, _factory) { } /*////////////////////////////////////////////////////////////////////////// RECEIVE & FALLBACK @@ -73,7 +73,11 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { address module, uint256 value, bytes calldata data - ) public onlyAdminOrEntrypoint returns (bool success) { + ) + public + onlyAdminOrEntrypoint + returns (bool success) + { // Check and register the smart account on the {StationRegistry} factory if it is not registered yet _registerOnFactory(); @@ -89,7 +93,10 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { address[] calldata modules, uint256[] calldata values, bytes[] calldata data - ) external onlyAdminOrEntrypoint { + ) + external + onlyAdminOrEntrypoint + { // Check and register the smart account on the {StationRegistry} factory if it is not registered yet _registerOnFactory(); @@ -138,28 +145,19 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { IERC1155 collection, uint256[] memory ids, uint256[] memory amounts - ) public onlyAdminOrEntrypoint { + ) + public + onlyAdminOrEntrypoint + { // Checks, Effects, Interactions: withdraw by transferring the tokens to the space owner // Notes: // - we're using `safeTransferFrom` as the owner can be an ERC-4337 smart account // therefore the `onERC1155Received` hook must be implemented // - depending on the length of the `ids` array, we're using `safeBatchTransferFrom` or `safeTransferFrom` if (ids.length > 1) { - collection.safeBatchTransferFrom({ - from: address(this), - to: msg.sender, - ids: ids, - values: amounts, - data: "" - }); + collection.safeBatchTransferFrom({ from: address(this), to: msg.sender, ids: ids, values: amounts, data: "" }); } else { - collection.safeTransferFrom({ - from: address(this), - to: msg.sender, - id: ids[0], - value: amounts[0], - data: "" - }); + collection.safeTransferFrom({ from: address(this), to: msg.sender, id: ids[0], value: amounts[0], data: "" }); } // Log the successful ERC-1155 token withdrawal @@ -172,7 +170,7 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { if (amount > address(this).balance) revert Errors.InsufficientNativeToWithdraw(); // Interactions: withdraw by transferring the amount to the sender - (bool success, ) = msg.sender.call{ value: amount }(""); + (bool success,) = msg.sender.call{ value: amount }(""); // Revert if the call failed if (!success) revert Errors.NativeWithdrawFailed(); @@ -197,7 +195,15 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { //////////////////////////////////////////////////////////////////////////*/ /// @inheritdoc ERC1271 - function isValidSignature(bytes32 _hash, bytes memory _signature) public view override returns (bytes4 magicValue) { + function isValidSignature( + bytes32 _hash, + bytes memory _signature + ) + public + view + override + returns (bytes4 magicValue) + { // Compute the hash of message the should be signed bytes32 targetDigest = getMessageHash(_hash); @@ -230,11 +236,8 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public pure returns (bool) { - return - interfaceId == type(ISpace).interfaceId || - interfaceId == type(IERC1155Receiver).interfaceId || - interfaceId == type(IERC721Receiver).interfaceId || - interfaceId == type(IERC165).interfaceId; + return interfaceId == type(ISpace).interfaceId || interfaceId == type(IERC1155Receiver).interfaceId + || interfaceId == type(IERC721Receiver).interfaceId || interfaceId == type(IERC165).interfaceId; } /// @inheritdoc IERC721Receiver @@ -243,7 +246,11 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { address from, uint256 tokenId, bytes memory - ) public override returns (bytes4) { + ) + public + override + returns (bytes4) + { // Silence unused variable warning operator = operator; @@ -260,7 +267,11 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { uint256 id, uint256 value, bytes memory - ) public override returns (bytes4) { + ) + public + override + returns (bytes4) + { // Silence unused variable warning operator = operator; @@ -277,7 +288,11 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { uint256[] memory ids, uint256[] memory values, bytes memory - ) public override returns (bytes4) { + ) + public + override + returns (bytes4) + { for (uint256 i; i < ids.length; ++i) { // Log the successful ERC-1155 token receipt emit ERC1155Received(from, ids[i], values[i]); diff --git a/test/mocks/MockNFTDescriptor.sol b/test/mocks/MockNFTDescriptor.sol index a09f5568..60c80b4b 100644 --- a/test/mocks/MockNFTDescriptor.sol +++ b/test/mocks/MockNFTDescriptor.sol @@ -27,7 +27,11 @@ contract MockNFTDescriptor is SablierV2NFTDescriptor { function calculateStreamedPercentage_( uint128 streamedAmount, uint128 depositedAmount - ) external pure returns (uint256) { + ) + external + pure + returns (uint256) + { return calculateStreamedPercentage(streamedAmount, depositedAmount); } @@ -39,7 +43,11 @@ contract MockNFTDescriptor is SablierV2NFTDescriptor { string memory assetSymbol, string memory sender, string memory status - ) external pure returns (string memory) { + ) + external + pure + returns (string memory) + { return generateAttributes(assetSymbol, sender, status); } @@ -50,7 +58,11 @@ contract MockNFTDescriptor is SablierV2NFTDescriptor { string memory assetAddress, string memory streamId, bool isTransferable - ) external pure returns (string memory) { + ) + external + pure + returns (string memory) + { return generateDescription(sablierModel, assetSymbol, sablierAddress, assetAddress, streamId, isTransferable); } diff --git a/test/mocks/MockOwnable.sol b/test/mocks/MockOwnable.sol index 53e8dc6d..e9db589a 100644 --- a/test/mocks/MockOwnable.sol +++ b/test/mocks/MockOwnable.sol @@ -6,5 +6,5 @@ import { Ownable } from "./../../src/abstracts/Ownable.sol"; /// @title MockOwnable /// @notice A mock implementation that uses the `onlyOwner` auth mechanism contract MockOwnable is Ownable { - constructor(address _owner) Ownable(_owner) {} + constructor(address _owner) Ownable(_owner) { } } diff --git a/test/unit/concrete/space/fallback/fallback.t.sol b/test/unit/concrete/space/fallback/fallback.t.sol index 2b676c89..49d321f0 100644 --- a/test/unit/concrete/space/fallback/fallback.t.sol +++ b/test/unit/concrete/space/fallback/fallback.t.sol @@ -18,7 +18,7 @@ contract Fallback_Unit_Concrete_Test is Space_Unit_Concrete_Test { emit Events.NativeReceived({ from: users.bob, amount: 1 ether }); // Run the test - (bool success, ) = address(space).call{ value: 1 ether }("test"); + (bool success,) = address(space).call{ value: 1 ether }("test"); if (!success) revert(); // Assert the {Space} contract balance diff --git a/test/unit/concrete/space/receive/receive.t.sol b/test/unit/concrete/space/receive/receive.t.sol index 7a73912f..9d74f390 100644 --- a/test/unit/concrete/space/receive/receive.t.sol +++ b/test/unit/concrete/space/receive/receive.t.sol @@ -18,7 +18,7 @@ contract Receive_Unit_Concrete_Test is Space_Unit_Concrete_Test { emit Events.NativeReceived({ from: users.bob, amount: 1 ether }); // Run the test - (bool success, ) = address(space).call{ value: 1 ether }(""); + (bool success,) = address(space).call{ value: 1 ether }(""); if (!success) revert(); // Assert the {Space} contract balance diff --git a/test/unit/concrete/station-registry/update-module-keeper/updateModuleKeeper.t.sol b/test/unit/concrete/station-registry/update-module-keeper/updateModuleKeeper.t.sol index 8bcd2818..75ab7f58 100644 --- a/test/unit/concrete/station-registry/update-module-keeper/updateModuleKeeper.t.sol +++ b/test/unit/concrete/station-registry/update-module-keeper/updateModuleKeeper.t.sol @@ -19,9 +19,7 @@ contract UpdateModuleKeeper_Unit_Concrete_Test is StationRegistry_Unit_Concrete_ // Expect the next call to revert with the {PermissionsUnauthorizedAccount} error vm.expectRevert( abi.encodeWithSelector( - Errors.PermissionsUnauthorizedAccount.selector, - users.bob, - Constants.DEFAULT_ADMIN_ROLE + Errors.PermissionsUnauthorizedAccount.selector, users.bob, Constants.DEFAULT_ADMIN_ROLE ) ); From 897e26b81f5f00186a395fd177b3f5da39f706a2 Mon Sep 17 00:00:00 2001 From: gabrielstoica Date: Thu, 28 Nov 2024 09:48:47 +0200 Subject: [PATCH 2/6] fix(Space): add 'to' address on withdrawal methods --- src/Space.sol | 33 +++++++++++++++++---------------- src/interfaces/ISpace.sol | 18 ++++++++++++++---- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/Space.sol b/src/Space.sol index f110196c..7bfc8114 100644 --- a/src/Space.sol +++ b/src/Space.sol @@ -125,31 +125,32 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { } /// @inheritdoc ISpace - function withdrawERC20(IERC20 asset, uint256 amount) public onlyAdminOrEntrypoint { + function withdrawERC20(address to, IERC20 asset, uint256 amount) public onlyAdminOrEntrypoint { // Checks: the available ERC20 balance of the space is greater enough to support the withdrawal if (amount > asset.balanceOf(address(this))) revert Errors.InsufficientERC20ToWithdraw(); - // Interactions: withdraw by transferring the amount to the sender - asset.safeTransfer({ to: msg.sender, value: amount }); + // Interactions: withdraw by transferring the `amount` to the `to` address + asset.safeTransfer({ to: to, value: amount }); // Log the successful ERC-20 token withdrawal - emit AssetWithdrawn({ to: msg.sender, asset: address(asset), amount: amount }); + emit AssetWithdrawn({ to: to, asset: address(asset), amount: amount }); } /// @inheritdoc ISpace - function withdrawERC721(IERC721 collection, uint256 tokenId) public onlyAdminOrEntrypoint { - // Checks, Effects, Interactions: withdraw by transferring the token to the space owner + function withdrawERC721(address to, IERC721 collection, uint256 tokenId) public onlyAdminOrEntrypoint { + // Checks, Effects, Interactions: withdraw by transferring the `tokenId` token to the `to` address // Notes: - // - we're using `safeTransferFrom` as the owner can be an ERC-4337 smart account + // - we're using `safeTransferFrom` as the owner can be a smart contract // therefore the `onERC721Received` hook must be implemented - collection.safeTransferFrom(address(this), msg.sender, tokenId); + collection.safeTransferFrom({ from: address(this), to: to, tokenId: tokenId }); // Log the successful ERC-721 token withdrawal - emit ERC721Withdrawn({ to: msg.sender, collection: address(collection), tokenId: tokenId }); + emit ERC721Withdrawn({ to: to, collection: address(collection), tokenId: tokenId }); } /// @inheritdoc ISpace function withdrawERC1155( + address to, IERC1155 collection, uint256[] memory ids, uint256[] memory amounts @@ -157,9 +158,9 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { public onlyAdminOrEntrypoint { - // Checks, Effects, Interactions: withdraw by transferring the tokens to the space owner + // Checks, Effects, Interactions: withdraw by transferring the tokens to the `to` address // Notes: - // - we're using `safeTransferFrom` as the owner can be an ERC-4337 smart account + // - we're using `safeTransferFrom` as the owner can be a smart contract // therefore the `onERC1155Received` hook must be implemented // - depending on the length of the `ids` array, we're using `safeBatchTransferFrom` or `safeTransferFrom` if (ids.length > 1) { @@ -169,21 +170,21 @@ contract Space is ISpace, AccountCore, ERC1271, ModuleManager { } // Log the successful ERC-1155 token withdrawal - emit ERC1155Withdrawn(msg.sender, address(collection), ids, amounts); + emit ERC1155Withdrawn({ to: to, collection: address(collection), ids: ids, values: amounts }); } /// @inheritdoc ISpace - function withdrawNative(uint256 amount) public onlyAdminOrEntrypoint { + function withdrawNative(address to, uint256 amount) public onlyAdminOrEntrypoint { // Checks: the native balance of the space is greater enough to support the withdrawal if (amount > address(this).balance) revert Errors.InsufficientNativeToWithdraw(); - // Interactions: withdraw by transferring the amount to the sender - (bool success,) = msg.sender.call{ value: amount }(""); + // Interactions: withdraw by transferring the `amount` to the `to` address + (bool success,) = to.call{ value: amount }(""); // Revert if the call failed if (!success) revert Errors.NativeWithdrawFailed(); // Log the successful native token withdrawal - emit AssetWithdrawn({ to: msg.sender, asset: address(0), amount: amount }); + emit AssetWithdrawn({ to: to, asset: address(0), amount: amount }); } /// @inheritdoc IModuleManager diff --git a/src/interfaces/ISpace.sol b/src/interfaces/ISpace.sol index c2ff98fa..72e247a3 100644 --- a/src/interfaces/ISpace.sol +++ b/src/interfaces/ISpace.sol @@ -87,34 +87,44 @@ interface ISpace is IERC165, IERC721Receiver, IERC1155Receiver { /// Requirements: /// - `msg.sender` must be the owner of the space /// + /// @param to The address to which the ERC-20 token will be transferred /// @param asset The address of the ERC-20 token to withdraw /// @param amount The amount of the ERC-20 token to withdraw - function withdrawERC20(IERC20 asset, uint256 amount) external; + function withdrawERC20(address to, IERC20 asset, uint256 amount) external; /// @notice Withdraws the `tokenId` token of the ERC-721 `collection` collection /// /// Requirements: /// - `msg.sender` must be the owner of the space /// + /// @param to The address to which the ERC-721 token will be transferred /// @param collection The address of the ERC-721 collection /// @param tokenId The ID of the token to withdraw - function withdrawERC721(IERC721 collection, uint256 tokenId) external; + function withdrawERC721(address to, IERC721 collection, uint256 tokenId) external; /// @notice Withdraws an `amount` amount of the ERC-1155 `id` token /// /// Requirements: /// - `msg.sender` must be the owner of the space /// + /// @param to The address to which the ERC-1155 tokens will be transferred /// @param collection The address of the ERC-1155 collection /// @param ids The IDs of tokens to withdraw /// @param amounts The amounts of tokens to withdraw - function withdrawERC1155(IERC1155 collection, uint256[] memory ids, uint256[] memory amounts) external; + function withdrawERC1155( + address to, + IERC1155 collection, + uint256[] memory ids, + uint256[] memory amounts + ) + external; /// @notice Withdraws an `amount` amount of native token (ETH) /// /// Requirements: /// - `msg.sender` must be the owner of the space /// + /// @param to The address to which the native token will be transferred /// @param amount The amount of the native token to withdraw - function withdrawNative(uint256 amount) external; + function withdrawNative(address to, uint256 amount) external; } From 849a55c155d4e7697545e0a77d6131ab8593df9d Mon Sep 17 00:00:00 2001 From: gabrielstoica Date: Thu, 28 Nov 2024 09:49:14 +0200 Subject: [PATCH 3/6] test: fix 'Space' withdraw-related tests --- test/mocks/MockBadSpace.sol | 35 ++++++++++--------- .../withdraw-erc1155/withdrawERC1155.t.sol | 8 ++--- .../space/withdraw-erc20/withdrawERC20.t.sol | 6 ++-- .../withdraw-erc721/withdrawERC721.t.sol | 6 ++-- .../withdraw-native/withdrawNative.t.sol | 8 ++--- 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/test/mocks/MockBadSpace.sol b/test/mocks/MockBadSpace.sol index 811cbe9d..7c73c9f5 100644 --- a/test/mocks/MockBadSpace.sol +++ b/test/mocks/MockBadSpace.sol @@ -117,31 +117,32 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { } /// @inheritdoc ISpace - function withdrawERC20(IERC20 asset, uint256 amount) public onlyAdminOrEntrypoint { + function withdrawERC20(address to, IERC20 asset, uint256 amount) public onlyAdminOrEntrypoint { // Checks: the available ERC20 balance of the space is greater enough to support the withdrawal if (amount > asset.balanceOf(address(this))) revert Errors.InsufficientERC20ToWithdraw(); - // Interactions: withdraw by transferring the amount to the sender - asset.safeTransfer({ to: msg.sender, value: amount }); + // Interactions: withdraw by transferring the `amount` to the `to` address + asset.safeTransfer({ to: to, value: amount }); // Log the successful ERC-20 token withdrawal - emit AssetWithdrawn({ to: msg.sender, asset: address(asset), amount: amount }); + emit AssetWithdrawn({ to: to, asset: address(asset), amount: amount }); } /// @inheritdoc ISpace - function withdrawERC721(IERC721 collection, uint256 tokenId) public onlyAdminOrEntrypoint { - // Checks, Effects, Interactions: withdraw by transferring the token to the space owner + function withdrawERC721(address to, IERC721 collection, uint256 tokenId) public onlyAdminOrEntrypoint { + // Checks, Effects, Interactions: withdraw by transferring the `tokenId` token to the `to` address // Notes: - // - we're using `safeTransferFrom` as the owner can be an ERC-4337 smart account + // - we're using `safeTransferFrom` as the owner can be a smart contract // therefore the `onERC721Received` hook must be implemented - collection.safeTransferFrom(address(this), msg.sender, tokenId); + collection.safeTransferFrom({ from: address(this), to: to, tokenId: tokenId }); // Log the successful ERC-721 token withdrawal - emit ERC721Withdrawn({ to: msg.sender, collection: address(collection), tokenId: tokenId }); + emit ERC721Withdrawn({ to: to, collection: address(collection), tokenId: tokenId }); } /// @inheritdoc ISpace function withdrawERC1155( + address to, IERC1155 collection, uint256[] memory ids, uint256[] memory amounts @@ -149,9 +150,9 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { public onlyAdminOrEntrypoint { - // Checks, Effects, Interactions: withdraw by transferring the tokens to the space owner + // Checks, Effects, Interactions: withdraw by transferring the tokens to the `to` address // Notes: - // - we're using `safeTransferFrom` as the owner can be an ERC-4337 smart account + // - we're using `safeTransferFrom` as the owner can be a smart contract // therefore the `onERC1155Received` hook must be implemented // - depending on the length of the `ids` array, we're using `safeBatchTransferFrom` or `safeTransferFrom` if (ids.length > 1) { @@ -161,21 +162,21 @@ contract MockBadSpace is ISpace, AccountCore, ERC1271, ModuleManager { } // Log the successful ERC-1155 token withdrawal - emit ERC1155Withdrawn(msg.sender, address(collection), ids, amounts); + emit ERC1155Withdrawn({ to: to, collection: address(collection), ids: ids, values: amounts }); } /// @inheritdoc ISpace - function withdrawNative(uint256 amount) public onlyAdminOrEntrypoint { - // Checks: the native balance of the space minus the amount locked for operations is greater than the requested amount + function withdrawNative(address to, uint256 amount) public onlyAdminOrEntrypoint { + // Checks: the native balance of the space is greater enough to support the withdrawal if (amount > address(this).balance) revert Errors.InsufficientNativeToWithdraw(); - // Interactions: withdraw by transferring the amount to the sender - (bool success,) = msg.sender.call{ value: amount }(""); + // Interactions: withdraw by transferring the `amount` to the `to` address + (bool success,) = to.call{ value: amount }(""); // Revert if the call failed if (!success) revert Errors.NativeWithdrawFailed(); // Log the successful native token withdrawal - emit AssetWithdrawn({ to: msg.sender, asset: address(0), amount: amount }); + emit AssetWithdrawn({ to: to, asset: address(0), amount: amount }); } /// @inheritdoc IModuleManager diff --git a/test/unit/concrete/space/withdraw-erc1155/withdrawERC1155.t.sol b/test/unit/concrete/space/withdraw-erc1155/withdrawERC1155.t.sol index 5b718169..9e7c800f 100644 --- a/test/unit/concrete/space/withdraw-erc1155/withdrawERC1155.t.sol +++ b/test/unit/concrete/space/withdraw-erc1155/withdrawERC1155.t.sol @@ -30,7 +30,7 @@ contract WithdrawERC1155_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert("Account: not admin or EntryPoint."); // Run the test - space.withdrawERC1155({ collection: IERC1155(address(0x0)), ids: ids, amounts: amounts }); + space.withdrawERC1155({ to: users.bob, collection: IERC1155(address(0x0)), ids: ids, amounts: amounts }); } modifier whenCallerOwner() { @@ -46,7 +46,7 @@ contract WithdrawERC1155_Unit_Concrete_Test is Space_Unit_Concrete_Test { ); // Run the test by attempting to withdraw a nonexistent ERC1155 token - space.withdrawERC1155({ collection: mockERC1155, ids: ids, amounts: amounts }); + space.withdrawERC1155({ to: users.eve, collection: mockERC1155, ids: ids, amounts: amounts }); } modifier whenExistingERC1155Token() { @@ -71,7 +71,7 @@ contract WithdrawERC1155_Unit_Concrete_Test is Space_Unit_Concrete_Test { }); // Run the test - space.withdrawERC1155({ collection: mockERC1155, ids: idsToWithdraw, amounts: amountsToWithdraw }); + space.withdrawERC1155({ to: users.eve, collection: mockERC1155, ids: idsToWithdraw, amounts: amountsToWithdraw }); // Assert the actual and expected token type 1 ERC1155 balance of Eve uint256 actualBalanceOfEve = mockERC1155.balanceOf(users.eve, idsToWithdraw[0]); @@ -84,7 +84,7 @@ contract WithdrawERC1155_Unit_Concrete_Test is Space_Unit_Concrete_Test { emit Events.ERC1155Withdrawn({ to: users.eve, collection: address(mockERC1155), ids: ids, amounts: amounts }); // Run the test - space.withdrawERC1155({ collection: mockERC1155, ids: ids, amounts: amounts }); + space.withdrawERC1155({ to: users.eve, collection: mockERC1155, ids: ids, amounts: amounts }); // Assert the actual and expected balance of any ERC1155 tokens uint256 numberOfTokens = ids.length; diff --git a/test/unit/concrete/space/withdraw-erc20/withdrawERC20.t.sol b/test/unit/concrete/space/withdraw-erc20/withdrawERC20.t.sol index e94a2df3..aa745183 100644 --- a/test/unit/concrete/space/withdraw-erc20/withdrawERC20.t.sol +++ b/test/unit/concrete/space/withdraw-erc20/withdrawERC20.t.sol @@ -19,7 +19,7 @@ contract WithdrawERC20_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert("Account: not admin or EntryPoint."); // Run the test - space.withdrawERC20({ asset: IERC20(address(0x0)), amount: 100e6 }); + space.withdrawERC20({ to: users.bob, asset: IERC20(address(0x0)), amount: 100e6 }); } modifier whenCallerOwner() { @@ -33,7 +33,7 @@ contract WithdrawERC20_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert(Errors.InsufficientERC20ToWithdraw.selector); // Run the test - space.withdrawERC20({ asset: IERC20(address(usdt)), amount: 100e6 }); + space.withdrawERC20({ to: users.eve, asset: IERC20(address(usdt)), amount: 100e6 }); } modifier whenSufficientERC20ToWithdraw() { @@ -54,7 +54,7 @@ contract WithdrawERC20_Unit_Concrete_Test is Space_Unit_Concrete_Test { emit Events.AssetWithdrawn({ to: users.eve, asset: address(usdt), amount: 10e6 }); // Run the test - space.withdrawERC20({ asset: IERC20(address(usdt)), amount: 10e6 }); + space.withdrawERC20({ to: users.eve, asset: IERC20(address(usdt)), amount: 10e6 }); // Assert the USDT balance of the {Space} contract uint256 actualBalanceOfSpace = usdt.balanceOf(address(space)); diff --git a/test/unit/concrete/space/withdraw-erc721/withdrawERC721.t.sol b/test/unit/concrete/space/withdraw-erc721/withdrawERC721.t.sol index 80849b4d..30818d54 100644 --- a/test/unit/concrete/space/withdraw-erc721/withdrawERC721.t.sol +++ b/test/unit/concrete/space/withdraw-erc721/withdrawERC721.t.sol @@ -19,7 +19,7 @@ contract WithdrawERC721_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert("Account: not admin or EntryPoint."); // Run the test - space.withdrawERC721({ collection: IERC721(address(0x0)), tokenId: 1 }); + space.withdrawERC721({ to: users.bob, collection: IERC721(address(0x0)), tokenId: 1 }); } modifier whenCallerOwner() { @@ -33,7 +33,7 @@ contract WithdrawERC721_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert(abi.encodeWithSelector(Errors.ERC721NonexistentToken.selector, 1)); // Run the test by attempting to withdraw a nonexistent ERC721 token - space.withdrawERC721({ collection: mockERC721, tokenId: 1 }); + space.withdrawERC721({ to: users.eve, collection: mockERC721, tokenId: 1 }); } modifier whenExistingERC721Token() { @@ -48,7 +48,7 @@ contract WithdrawERC721_Unit_Concrete_Test is Space_Unit_Concrete_Test { emit Events.ERC721Withdrawn({ to: users.eve, collection: address(mockERC721), tokenId: 1 }); // Run the test - space.withdrawERC721({ collection: mockERC721, tokenId: 1 }); + space.withdrawERC721({ to: users.eve, collection: mockERC721, tokenId: 1 }); // Assert the actual and expected owner of the ERC721 token address actualOwner = mockERC721.ownerOf(1); diff --git a/test/unit/concrete/space/withdraw-native/withdrawNative.t.sol b/test/unit/concrete/space/withdraw-native/withdrawNative.t.sol index d1eff621..5ba400c6 100644 --- a/test/unit/concrete/space/withdraw-native/withdrawNative.t.sol +++ b/test/unit/concrete/space/withdraw-native/withdrawNative.t.sol @@ -32,7 +32,7 @@ contract WithdrawNative_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert("Account: not admin or EntryPoint."); // Run the test - space.withdrawNative({ amount: 2 ether }); + space.withdrawNative({ to: users.bob, amount: 2 ether }); } modifier whenCallerOwner(address caller) { @@ -46,7 +46,7 @@ contract WithdrawNative_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert(Errors.InsufficientNativeToWithdraw.selector); // Run the test - space.withdrawNative({ amount: 2 ether }); + space.withdrawNative({ to: users.eve, amount: 2 ether }); } modifier whenSufficientNativeToWithdraw(Space space) { @@ -65,7 +65,7 @@ contract WithdrawNative_Unit_Concrete_Test is Space_Unit_Concrete_Test { vm.expectRevert(Errors.NativeWithdrawFailed.selector); // Run the test - badSpace.withdrawNative({ amount: 1 ether }); + badSpace.withdrawNative({ to: badReceiver, amount: 1 ether }); } modifier whenNativeWithdrawSucceeds() { @@ -88,7 +88,7 @@ contract WithdrawNative_Unit_Concrete_Test is Space_Unit_Concrete_Test { emit Events.AssetWithdrawn({ to: users.eve, asset: address(0x0), amount: ethToWithdraw }); // Run the test - space.withdrawNative({ amount: ethToWithdraw }); + space.withdrawNative({ to: users.eve, amount: ethToWithdraw }); // Assert the ETH balance of the {Space} contract uint256 actualBalanceOfSpace = address(space).balance; From e3039c0d022f7b79bb35512e6f75e7c92af68607 Mon Sep 17 00:00:00 2001 From: gabrielstoica Date: Thu, 28 Nov 2024 10:10:11 +0200 Subject: [PATCH 4/6] chore: refine .env.example --- .env.example | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.env.example b/.env.example index f50df2d5..d6043a7e 100644 --- a/.env.example +++ b/.env.example @@ -2,7 +2,4 @@ MAINNET_RPC_URL="" SEPOLIA_RPC_URL="https://rpc.sepolia.org" BASE_SEPOLIA_RPC_URL="https://sepolia.base.org" ETHERSCAN_API_KEY="" -CREATE2SALT=""" -DEPLOYER="" -PRIVATE_KEY="0x{YOUR_PRIVATE_KEY}" -MNEMONIC="" \ No newline at end of file +CREATE2SALT=""" \ No newline at end of file From 8341adf27c35621a71b1f312947ededfc6745e18 Mon Sep 17 00:00:00 2001 From: gabrielstoica Date: Thu, 28 Nov 2024 10:18:51 +0200 Subject: [PATCH 5/6] chore: update Makefile --- Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 51879bd7..17ae6d1a 100644 --- a/Makefile +++ b/Makefile @@ -43,12 +43,12 @@ deploy-deterministic-module-keeper: # - {ENTRYPOINT} with the address of the {Entrypoint} contract (currently v6) # - {MODULE_KEEPER} with the address of the {ModuleKeeper} deployment # - {RPC_URL} with the network RPC used for deployment -deploy-deterministic-dock-registry: +deploy-deterministic-station-registry: forge script script/DeployDeterministicStationRegistry.s.sol:DeployDeterministicStationRegistry \ $(CREATE2SALT) {INITIAL_OWNER} {ENTRYPOINT} {MODULE_KEEPER} \ - --sig "run(string,address,address)" --rpc-url {RPC_URL} \ + --sig "run(string,address,address,address)" --rpc-url {RPC_URL} \ --account dev --etherscan-api-key $(ETHERSCAN_API_KEY) \ - --broadcast --verify + --broadcast --verify --ffi # Deploys the {PaymentModule} contract deterministically # @@ -77,6 +77,6 @@ deploy-payment-module: # - {RPC_URL} with the network RPC used for deployment deploy-core: forge script script/DeployDeterministicCore.s.sol:DeployDeterministicCore \ - $(CREATE2SALT) "0xfe7fc0bbde84c239c0ab89111d617dc7cc58049f" "0xb8c724df3ec8f2bf8fa808df2cb5dbab22f3e68c" "0x85E094B259718Be1AF0D8CbBD41dd7409c2200aa" "0x85E094B259718Be1AF0D8CbBD41dd7409c2200aa" "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789" \ - --sig "run(string,address,address,address,address,address)" --rpc-url https://sepolia.base.org --account dev \ + $(CREATE2SALT) {SABLIER_LOCKUP_LINEAR} {SABLIER_LOCKUP_TRANCHED} {INITIAL_OWNER} {BROKER_ACCOUNT} {ENTRYPOINT} \ + --sig "run(string,address,address,address,address,address)" --rpc-url {RPC_URL} --account dev \ --broadcast --verify --etherscan-api-key $(ETHERSCAN_API_KEY) --ffi \ No newline at end of file From 118ab1f6822fd26e9e228e394f840da0f4d73f55 Mon Sep 17 00:00:00 2001 From: gabrielstoica Date: Thu, 28 Nov 2024 10:19:11 +0200 Subject: [PATCH 6/6] chore: re-deploy 'StationRegistry' to base sepolia --- .../84532/run-1732780840.json | 98 +++++++++++++++++++ .../84532/run-latest.json | 98 +++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-1732780840.json create mode 100644 broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-latest.json diff --git a/broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-1732780840.json b/broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-1732780840.json new file mode 100644 index 00000000..faa581d2 --- /dev/null +++ b/broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-1732780840.json @@ -0,0 +1,98 @@ +{ + "transactions": [ + { + "hash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionType": "CREATE2", + "contractName": "StationRegistry", + "contractAddress": "0x1df41979e30f247ba4e3338c6461ab542dea3d0b", + "function": null, + "arguments": [ + "0x85E094B259718Be1AF0D8CbBD41dd7409c2200aa", + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "0x2bb0c07966fE5ce342E7768f276F0e43A93BAe32" + ], + "transaction": { + "from": "0x85e094b259718be1af0d8cbbd41dd7409c2200aa", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x88a37f", + "value": "0x0", + "input": "0x7765726b2d73616c74000000000000000000000000000000000000000000000060c060405234801561001057600080fd5b5060405161766a38038061766a83398101604081905261002f916101c1565b813060405161003d9061019c565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610070573d6000803e3d6000fd5b506001600160a01b03908116608052821660a05261008f6000846100bc565b6001600955600680546001600160a01b0319166001600160a01b0392909216919091179055506102359050565b6100c682826100d4565b6100d0828261012f565b5050565b60008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60008281526005602052604081208054916001919061014e838561020e565b9091555050600092835260056020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6155a2806120c883390190565b6001600160a01b03811681146101be57600080fd5b50565b6000806000606084860312156101d657600080fd5b83516101e1816101a9565b60208501519093506101f2816101a9565b6040850151909250610203816101a9565b809150509250925092565b8082018082111561022f57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a051611e52610276600039600081816103ce01526112610152600081816102140152818161084d01528181610f9501526111bd0152611e526000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806391d14854116100f9578063c3c5a54711610097578063d547741f11610071578063d547741f14610449578063d8fd8f441461045c578063e68a7c3b1461046f578063e6e1c5f81461048257600080fd5b8063c3c5a54714610410578063ca15c87314610423578063d0b3b66d1461043657600080fd5b8063a217fddf116100d3578063a217fddf146103ae578063a32fa5b3146103b6578063a65d69d4146103c9578063ac9650d8146103f057600080fd5b806391d148541461033f5780639387a380146103885780639efb95f71461039b57600080fd5b806340e0df2c116101665780637e5ef8a5116101405780637e5ef8a5146102e657806383a03f8c146103065780638878ed33146103195780639010d07c1461032c57600080fd5b806340e0df2c146102a257806358451f97146102b55780636424ea02146102bd57600080fd5b806311464fbe116101a257806311464fbe1461020f578063248a9ca31461024e5780632f2ff15d1461027c57806336568abe1461028f57600080fd5b806308e93d0a146101c95780630b61e12b146101e75780630e6254fd146101fc575b600080fd5b6101d1610495565b6040516101de91906118ca565b60405180910390f35b6101fa6101f5366004611905565b6104a6565b005b6101d161020a366004611931565b610573565b6102367f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101de565b61026e61025c36600461194e565b60009081526004602052604090205490565b6040519081526020016101de565b6101fa61028a366004611967565b61059d565b6101fa61029d366004611967565b610633565b6101fa6102b0366004611967565b610690565b61026e610736565b6102366102cb36600461194e565b6007602052600090815260409020546001600160a01b031681565b61026e6102f4366004611931565b60086020526000908152604090205481565b6101fa61031436600461194e565b610742565b610236610327366004611997565b610803565b61023661033a366004611a1e565b61087d565b61037861034d366004611967565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60405190151581526020016101de565b6101fa610396366004611905565b61097d565b600654610236906001600160a01b031681565b61026e600081565b6103786103c4366004611967565b610a44565b6102367f000000000000000000000000000000000000000000000000000000000000000081565b6104036103fe366004611a40565b610a9a565b6040516101de9190611b07565b61037861041e366004611931565b610bf7565b61026e61043136600461194e565b610c03565b61026e610444366004611931565b610c9e565b6101fa610457366004611967565b610cbf565b61023661046a366004611997565b610cd8565b6101d161047d366004611a1e565b610dd3565b6101fa610490366004611931565b610f1f565b60606104a16000610f80565b905090565b336104b18183610f8d565b6105025760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e0060448201526064015b60405180910390fd5b6001600160a01b03831660009081526002602052604081206105249083610fd1565b9050801561056d57836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b6001600160a01b038116600090815260026020526040902060609061059790610f80565b92915050565b6000828152600460205260409020546105b69033610fe6565b60008281526003602090815260408083206001600160a01b038516845290915290205460ff1615610625576040517fd49c166a0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016104f9565b61062f8282611054565b5050565b336001600160a01b03821614610686576040517f4169c6220000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201526044016104f9565b61062f8282611068565b6000828152600760205260409020546001600160a01b03163381146106c8576040516393d3ad0560e01b815260040160405180910390fd5b60008381526007602090815260409182902080546001600160a01b0319166001600160a01b03868116918217909255835191851682529181019190915284917ee234973d1c05a2bee786e3b7f12d0cfeb868b28869411adea70677d8817089910160405180910390a2505050565b60006104a160006110bf565b3361074d8183610f8d565b6107995760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e0060448201526064016104f9565b6107a4600082610fd1565b61062f5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206044820152691c9959da5cdd195c995960b21b60648201526084016104f9565b6000806108468585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110c992505050565b90506108727f0000000000000000000000000000000000000000000000000000000000000000826110fc565b9150505b9392505050565b60008281526005602052604081205481805b828110156109745760008681526005602090815260408083208484526001019091529020546001600160a01b03161561090b578482036108f95760008681526005602090815260408083209383526001909301905220546001600160a01b03169250610597915050565b610904600183611b82565b9150610962565b600086815260036020908152604080832083805290915290205460ff16801561094f5750600086815260056020908152604080832083805260020190915290205481145b156109625761095f600183611b82565b91505b61096d600182611b82565b905061088f565b50505092915050565b336109888183610f8d565b6109d45760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e0060448201526064016104f9565b6001600160a01b03831660009081526002602052604081206109f6908361115c565b9050801561056d57836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b600082815260036020908152604080832083805290915281205460ff16610a91575060008281526003602090815260408083206001600160a01b038516845290915290205460ff16610597565b50600192915050565b60608167ffffffffffffffff811115610ab557610ab5611b95565b604051908082528060200260200182016040528015610ae857816020015b6060815260200190600190039081610ad35790505b509050336000805b84811015610974578115610b6f57610b4d30878784818110610b1457610b14611bab565b9050602002810190610b269190611bc1565b86604051602001610b3993929190611c0f565b604051602081830303815290604052611171565b848281518110610b5f57610b5f611bab565b6020026020010181905250610bef565b610bd130878784818110610b8557610b85611bab565b9050602002810190610b979190611bc1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061117192505050565b848281518110610be357610be3611bab565b60200260200101819052505b600101610af0565b60006105978183611196565b600081815260056020526040812054815b81811015610c675760008481526005602090815260408083208484526001019091529020546001600160a01b031615610c5557610c52600184611b82565b92505b610c60600182611b82565b9050610c14565b50600083815260036020908152604080832083805290915290205460ff1615610c9857610c95600183611b82565b91505b50919050565b6001600160a01b0381166000908152600260205260408120610597906110bf565b6000828152600460205260409020546106869033610fe6565b60008080610ce884860186611c35565b925092505081600003610d265760098054600081815260076020526040902080546001600160a01b0319163317905581546001019091559150610d5d565b6000828152600760205260409020546001600160a01b03163314610d5d576040516393d3ad0560e01b815260040160405180910390fd5b6000610d6a8787876111b8565b6001600160a01b0380821660009081526008602052604090819020869055519192508491908916907f3903d8288d7344aa44289047c6bed49db2c60352f049fe106a40bd65c17d870790610dc19085908790611d1a565b60405180910390a39695505050505050565b60608183108015610ded5750610de960006110bf565b8211155b610e5f5760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201527f636573000000000000000000000000000000000000000000000000000000000060648201526084016104f9565b6000610e6b8484611d3c565b9050610e778484611d3c565b67ffffffffffffffff811115610e8f57610e8f611b95565b604051908082528060200260200182016040528015610eb8578160200160208202803683370190505b50915060005b81811015610f1757610edb610ed38683611b82565b600090611346565b838281518110610eed57610eed611bab565b6001600160a01b0390921660209283029190910190910152610f10600182611b82565b9050610ebe565b505092915050565b6000610f2b8133610fe6565b600680546001600160a01b0319166001600160a01b0384169081179091556040519081527fe42f11c76713655cf0556d673fadbfff81330af747a8a1871cfbac889f8ea8f39060200160405180910390a15050565b6060600061087683611352565b600080610fba7f0000000000000000000000000000000000000000000000000000000000000000846110fc565b6001600160a01b0385811691161491505092915050565b6000610876836001600160a01b0384166113ae565b60008281526003602090815260408083206001600160a01b038516845290915290205460ff1661062f576040517f0878b1060000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016104f9565b61105e82826113fd565b61062f8282611458565b61107282826114c5565b60008281526005602090815260408083206001600160a01b03851680855260028201808552838620805487526001909301855292852080546001600160a01b031916905584529152555050565b6000610597825490565b600082826040516020016110de929190611d4f565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610876565b6000610876836001600160a01b038416611527565b60606108768383604051806060016040528060278152602001611df66027913961161a565b6001600160a01b03811660009081526001830160205260408120541515610876565b6000807f0000000000000000000000000000000000000000000000000000000000000000905060006112208686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110c992505050565b9050600061122e83836110fc565b90506001600160a01b0381163b1561124a579250610876915050565b6112548383611692565b9050336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112f057611291600082610fd1565b6112f05760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206044820152691c9959da5cdd195c995960b21b60648201526084016104f9565b6112fc8188888861172f565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b600061087683836117b0565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113a257602002820191906000526020600020905b81548152602001906001019080831161138e575b50505050509050919050565b60008181526001830160205260408120546113f557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610597565b506000610597565b60008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600560205260408120805491600191906114778385611b82565b9091555050600092835260056020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6114cf8282610fe6565b60008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000818152600183016020526040812054801561161057600061154b600183611d3c565b855490915060009061155f90600190611d3c565b90508181146115c457600086600001828154811061157f5761157f611bab565b90600052602060002001549050808760000184815481106115a2576115a2611bab565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806115d5576115d5611d71565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610597565b6000915050610597565b6060600080856001600160a01b0316856040516116379190611d87565b600060405180830381855af49150503d8060008114611672576040519150601f19603f3d011682016040523d82523d6000602084013e611677565b606091505b5091509150611688868383876117da565b9695505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166105975760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016104f9565b6040517fd1f578940000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063d1f578949061177890869086908690600401611da3565b600060405180830381600087803b15801561179257600080fd5b505af11580156117a6573d6000803e3d6000fd5b5050505050505050565b60008260000182815481106117c7576117c7611bab565b9060005260206000200154905092915050565b60608315611849578251600003611842576001600160a01b0385163b6118425760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104f9565b5081611853565b611853838361185b565b949350505050565b81511561186b5781518083602001fd5b8060405162461bcd60e51b81526004016104f99190611de2565b600081518084526020840193506020830160005b828110156118c05781516001600160a01b0316865260209586019590910190600101611899565b5093949350505050565b6020815260006108766020830184611885565b6001600160a01b03811681146118f257600080fd5b50565b8035611900816118dd565b919050565b6000806040838503121561191857600080fd5b8235611923816118dd565b946020939093013593505050565b60006020828403121561194357600080fd5b8135610876816118dd565b60006020828403121561196057600080fd5b5035919050565b6000806040838503121561197a57600080fd5b82359150602083013561198c816118dd565b809150509250929050565b6000806000604084860312156119ac57600080fd5b83356119b7816118dd565b9250602084013567ffffffffffffffff8111156119d357600080fd5b8401601f810186136119e457600080fd5b803567ffffffffffffffff8111156119fb57600080fd5b866020828401011115611a0d57600080fd5b939660209190910195509293505050565b60008060408385031215611a3157600080fd5b50508035926020909101359150565b60008060208385031215611a5357600080fd5b823567ffffffffffffffff811115611a6a57600080fd5b8301601f81018513611a7b57600080fd5b803567ffffffffffffffff811115611a9257600080fd5b8560208260051b8401011115611aa757600080fd5b6020919091019590945092505050565b60005b83811015611ad2578181015183820152602001611aba565b50506000910152565b60008151808452611af3816020860160208601611ab7565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015611b6057603f19878603018452611b4b858351611adb565b94506020938401939190910190600101611b2f565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561059757610597611b6c565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611bd857600080fd5b83018035915067ffffffffffffffff821115611bf357600080fd5b602001915036819003821315611c0857600080fd5b9250929050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600080600060608486031215611c4a57600080fd5b8335925060208401359150604084013567ffffffffffffffff811115611c6f57600080fd5b8401601f81018613611c8057600080fd5b803567ffffffffffffffff811115611c9a57611c9a611b95565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715611cc757611cc7611b95565b604052918252602081840181019290810189841115611ce557600080fd5b6020850194505b83851015611d0b57611cfd856118f5565b815260209485019401611cec565b50809450505050509250925092565b6001600160a01b03831681526040602082015260006118536040830184611885565b8181038181111561059757610597611b6c565b6001600160a01b03831681526040602082015260006118536040830184611adb565b634e487b7160e01b600052603160045260246000fd5b60008251611d99818460208701611ab7565b9190910192915050565b6001600160a01b038416815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b6020815260006108766020830184611adb56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206aaeb3b3c37412e249f9180734759a11f3e62131baa41a8b17446b957d32f72164736f6c634300081a003361018060405234801561001157600080fd5b506040516155a23803806155a283398101604081905261003091610245565b60408051808201825260078152661058d8dbdd5b9d60ca1b60208083019182528351808501855260018152603160f81b908201529151902060e08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c0938401909652805194019390932090925291905261012052818161011061012c565b6001600160a01b039081166101405216610160525061027f9050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680156101bc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60ff8281161015610229577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff191660ff90811790915560408051918252517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a15b5050565b6001600160a01b038116811461024257600080fd5b50565b6000806040838503121561025857600080fd5b82516102638161022d565b60208401519092506102748161022d565b809150509250929050565b60805160a05160c05160e0516101005161012051610140516101605161528661031c6000396000611f210152600081816105ec01528181611867015281816121c601528181612e9a01528181612ed001528181612f88015281816130150152818161304501526136ab01526000612a1401526000612a6301526000612a3e01526000612997015260006129c1015260006129eb01526152866000f3fe6080604052600436106101dc5760003560e01c80638b52d72311610102578063c45a015511610095578063d8cb0d6611610064578063d8cb0d6614610658578063e9523c9714610678578063f15d424e1461069a578063f23a6e61146106c757610219565b8063c45a0155146105da578063d087d2881461060e578063d1f5789414610623578063d42f2f351461064357610219565b8063b0d691fe116100d1578063b0d691fe1461054d578063b61d27f61461057a578063b76464d51461059a578063bc197c81146105ba57610219565b80638b52d7231461049f578063a9082d84146104c1578063a95f524614610500578063ac9650d81461052057610219565b8063399b77da1161017a57806347e1da2a1161014957806347e1da2a1461041f5780635892e2361461043f578063610b59251461045f5780637dff5a791461047f57610219565b8063399b77da146103915780633a871cdd146103bf5780634025feb2146103df57806344004cc1146103ff57610219565b80631626ba7e116101b65780631626ba7e146102db5780631dd756c5146102fb57806324d7806c1461031b5780632d9ad53d1461036157610219565b806301ffc9a71461024b57806307b18bde14610280578063150b7a02146102a257610219565b366102195760405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee7660906020015b60405180910390a2005b60405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee76609060200161020f565b34801561025757600080fd5b5061026b61026636600461410b565b6106e7565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b36600461415a565b61079f565b005b3480156102ae57600080fd5b506102c26102bd36600461423d565b61094b565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f63660046142a9565b610996565b34801561030757600080fd5b5061026b610316366004614309565b610ac1565b34801561032757600080fd5b5061026b61033636600461434f565b6001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b34801561036d57600080fd5b5061026b61037c36600461434f565b60006020819052908152604090205460ff1681565b34801561039d57600080fd5b506103b16103ac36600461436c565b610db7565b604051908152602001610277565b3480156103cb57600080fd5b506103b16103da366004614385565b610e82565b3480156103eb57600080fd5b506102a06103fa3660046143d3565b610ea8565b34801561040b57600080fd5b506102a061041a3660046143d3565b611007565b34801561042b57600080fd5b506102a061043a366004614459565b6111b3565b34801561044b57600080fd5b506102a061045a366004614541565b61134a565b34801561046b57600080fd5b506102a061047a36600461434f565b6117ca565b34801561048b57600080fd5b5061026b61049a36600461434f565b6118f7565b3480156104ab57600080fd5b506104b46119cf565b604051610277919061465a565b3480156104cd57600080fd5b506104e16104dc366004614541565b611c58565b6040805192151583526001600160a01b03909116602083015201610277565b34801561050c57600080fd5b506102a061051b36600461434f565b611ce4565b34801561052c57600080fd5b5061054061053b3660046146bf565b611d89565b6040516102779190614751565b34801561055957600080fd5b50610562611ee6565b6040516001600160a01b039091168152602001610277565b34801561058657600080fd5b5061026b6105953660046147aa565b611f46565b3480156105a657600080fd5b506102a06105b536600461434f565b611fff565b3480156105c657600080fd5b506102c26105d5366004614897565b612060565b3480156105e657600080fd5b506105627f000000000000000000000000000000000000000000000000000000000000000081565b34801561061a57600080fd5b506103b1612117565b34801561062f57600080fd5b506102a061063e366004614951565b6121b0565b34801561064f57600080fd5b506104b461226c565b34801561066457600080fd5b506102a0610673366004614971565b612423565b34801561068457600080fd5b5061068d612660565b60405161027791906149f3565b3480156106a657600080fd5b506106ba6106b536600461434f565b612679565b6040516102779190614a3f565b3480156106d357600080fd5b506102c26106e2366004614a52565b612783565b60006001600160e01b031982167f1338becd00000000000000000000000000000000000000000000000000000000148061074a57506001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061076557506001600160e01b03198216630a85bd0160e11b145b8061079957506001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6107a7611ee6565b6001600160a01b0316336001600160a01b031614806107e257503360009081526000805160206151ea833981519152602052604090205460ff165b61083d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b60648201526084015b60405180910390fd5b47811115610877576040517f433bcf7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146108c4576040519150601f19603f3d011682016040523d82523d6000602084013e6108c9565b606091505b5050905080610904576040517f8103725c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518281526000906001600160a01b038516907f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e76906020015b60405180910390a3505050565b600082846001600160a01b03167f35a641d6803b18b3c2a97b78c27d31dab914e9626b63b48fb9c5747c93a3f96d60405160405180910390a350630a85bd0160e11b5b949350505050565b6000806109a284610db7565b905060006109b082856127f4565b90506109e1816001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b156109f85750630b135d3f60e11b91506107999050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0660205260409020610a39813361281e565b80610a695750610a4881612840565b6001148015610a6957506000610a5e828261284a565b6001600160a01b0316145b610a9f576040517f81799bfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa8826118f7565b15610ab857630b135d3f60e11b93505b50505092915050565b6001600160a01b03821660009081526000805160206151ea833981519152602052604081205460ff1615610af757506001610799565b6001600160a01b03831660008181527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216838601908152600160801b9092048116838501529585527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0690935292209051919290914291161180610bad575081604001516001600160801b03164210155b80610bbe5750610bbc81612840565b155b15610bce57600092505050610799565b6000610be5610be06060870187614aaf565b612856565b90506000610bf283612840565b6001148015610c1357506000610c08848261284a565b6001600160a01b0316145b90507f49e2d80a000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610ca357600080610c5e610c5960608a018a614aaf565b6128a8565b9150915082610c8457610c71858361281e565b610c845760009650505050505050610799565b8551811115610c9c5760009650505050505050610799565b5050610daa565b7fb81e25d6000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610d9d57600080610cec610ce760608a018a614aaf565b612925565b509150915082610d4c5760005b8251811015610d4a57610d2e838281518110610d1757610d17614af6565b60200260200101518761281e90919063ffffffff16565b610d42576000975050505050505050610799565b600101610cf9565b505b60005b8251811015610d9557818181518110610d6a57610d6a614af6565b602002602001015187600001511015610d8d576000975050505050505050610799565b600101610d4f565b505050610daa565b6000945050505050610799565b5060019695505050505050565b60008082604051602001610dcd91815260200190565b60405160208183030381529060405280519060200120905060007f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28482604051602001610e23929190918252602082015260400190565b604051602081830303815290604052805190602001209050610e4361298a565b60405161190160f01b60208201526022810191909152604281018290526062016040516020818303038152906040528051906020012092505050919050565b6000610e8c612ab1565b610e968484612b1b565b9050610ea182612c95565b9392505050565b610eb0611ee6565b6001600160a01b0316336001600160a01b03161480610eeb57503360009081526000805160206151ea833981519152602052604090205460ff165b610f415760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f42842e0e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018390528316906342842e0e90606401600060405180830381600087803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b03167feea167c0d54572a80626f5fd092a7c1f7b5d8e309533747e7e7d77b0558d6cf18360405161093e91815260200190565b61100f611ee6565b6001600160a01b0316336001600160a01b0316148061104a57503360009081526000805160206151ea833981519152602052604090205460ff165b6110a05760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156110fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111219190614b0c565b81111561115a576040517fb5a0380d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e6001600160a01b0383168483612ce2565b816001600160a01b0316836001600160a01b03167f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e768360405161093e91815260200190565b6111bb611ee6565b6001600160a01b0316336001600160a01b031614806111f657503360009081526000805160206151ea833981519152602052604090205460ff165b61124c5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b84818114801561125b57508084145b611291576040517f9e63483b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611340576112cb8888838181106112b1576112b1614af6565b90506020020160208101906112c6919061434f565b612d67565b6113378888838181106112e0576112e0614af6565b90506020020160208101906112f5919061434f565b87878481811061130757611307614af6565b9050602002013586868581811061132057611320614af6565b90506020028101906113329190614aaf565b612dc4565b50600101611294565b5050505050505050565b6000611359602085018561434f565b90504261136c60e0860160c08701614b3c565b6001600160801b03161115801561139b575061138f610100850160e08601614b3c565b6001600160801b031642105b6113e75760405162461bcd60e51b815260206004820152600760248201527f21706572696f64000000000000000000000000000000000000000000000000006044820152606401610834565b6000806113f5868686611c58565b91509150816114485760405162461bcd60e51b81526004016108349060208082526004908201527f2173696700000000000000000000000000000000000000000000000000000000604082015260600190565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0760209081526040808320805460ff1916600117905561149891908901908901614b68565b60ff1611156114ce5760006114b36040880160208901614b68565b60ff1660011490506114c58482612e86565b50505050505050565b6001600160a01b03831660009081526000805160206151ea833981519152602052604090205460ff16156115445760405162461bcd60e51b815260206004820152600560248201527f61646d696e0000000000000000000000000000000000000000000000000000006044820152606401610834565b61156e7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0284612fd4565b506040518060600160405280876060013581526020018760800160208101906115979190614b3c565b6001600160801b031681526020016115b560c0890160a08a01614b3c565b6001600160801b031690526000805160206152318339815191526001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b0293169290921760019092019190915561165261163160008051602061523183398151915290565b6001600160a01b038616600090815260069190910160205260409020612fe9565b805190915060005b818110156116c9576116b683828151811061167757611677614af6565b602002602001015161169460008051602061523183398151915290565b6001600160a01b03891660009081526006919091016020526040902090612ff6565b506116c2600182614b99565b905061165a565b506116d76040890189614bac565b9050905060005b8181101561176b576117586116f660408b018b614bac565b8381811061170657611706614af6565b905060200201602081019061171b919061434f565b6001600160a01b03881660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def066020526040902090612fd4565b50611764600182614b99565b90506116de565b506117758861300b565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516117b89190614c89565b60405180910390a35050505050505050565b6117d2611ee6565b6001600160a01b0316336001600160a01b0316148061180d57503360009081526000805160206151ea833981519152602052604090205460ff165b6118635760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190614d81565b90506118f381836130f5565b5050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216948301859052600160801b9091041691810191909152904210801590611980575080604001516001600160801b031642105b8015610ea157506001600160a01b03831660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06602052604081206119c790612840565b119392505050565b606060006119ee6000805160206152318339815191525b600201612fe9565b80519091506000805b82811015611a7f57611a21848281518110611a1457611a14614af6565b60200260200101516118f7565b15611a385781611a3081614d9e565b925050611a6d565b6000848281518110611a4c57611a4c614af6565b60200260200101906001600160a01b031690816001600160a01b0316815250505b611a78600182614b99565b90506119f7565b508067ffffffffffffffff811115611a9957611a99614186565b604051908082528060200260200182016040528015611af257816020015b6040805160a081018252600080825260606020808401829052938301829052820181905260808201528252600019909201910181611ab75790505b5093506000805b83811015611c505760006001600160a01b0316858281518110611b1e57611b1e614af6565b60200260200101516001600160a01b031614611c3e576000858281518110611b4857611b48614af6565b602002602001015190506000611b6960008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611bdf600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250888580611c1e90614d9e565b965081518110611c3057611c30614af6565b602002602001018190525050505b611c49600182614b99565b9050611af9565b505050505090565b600080611c6e611c67866131fd565b8585613341565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def07602052604090205490915060ff16158015611cda57506001600160a01b03811660009081526000805160206151ea833981519152602052604090205460ff165b9150935093915050565b611cec611ee6565b6001600160a01b0316336001600160a01b03161480611d2757503360009081526000805160206151ea833981519152602052604090205460ff165b611d7d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611d8681613393565b50565b60608167ffffffffffffffff811115611da457611da4614186565b604051908082528060200260200182016040528015611dd757816020015b6060815260200190600190039081611dc25790505b509050336000805b84811015610ab8578115611e5e57611e3c30878784818110611e0357611e03614af6565b9050602002810190611e159190614aaf565b86604051602001611e2893929190614db7565b6040516020818303038152906040526133de565b848281518110611e4e57611e4e614af6565b6020026020010181905250611ede565b611ec030878784818110611e7457611e74614af6565b9050602002810190611e869190614aaf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133de92505050565b848281518110611ed257611ed2614af6565b60200260200101819052505b600101611ddf565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300546000906001600160a01b03168015611f1f57919050565b7f000000000000000000000000000000000000000000000000000000000000000091505090565b6000611f50611ee6565b6001600160a01b0316336001600160a01b03161480611f8b57503360009081526000805160206151ea833981519152602052604090205460ff165b611fe15760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611fea85612d67565b611ff685858585612dc4565b95945050505050565b612007613403565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000805b84518110156120eb5784818151811061207f5761207f614af6565b6020026020010151866001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b5338684815181106120c4576120c4614af6565b60200260200101516040516120db91815260200190565b60405180910390a3600101612064565b507fbc197c81000000000000000000000000000000000000000000000000000000009695505050505050565b6000612121611ee6565b6040517f35567e1a000000000000000000000000000000000000000000000000000000008152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015612187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ab9190614b0c565b905090565b60006121be82840184614e44565b9250505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190614d81565b9050612252818361346f565b61225d858585613479565b61226561367d565b5050505050565b606060006122876000805160206152318339815191526119e6565b80519091508067ffffffffffffffff8111156122a5576122a5614186565b6040519080825280602002602001820160405280156122fe57816020015b6040805160a0810182526000808252606060208084018290529383018290528201819052608082015282526000199092019101816122c35790505b50925060005b8181101561241d57600083828151811061232057612320614af6565b60200260200101519050600061234160008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016123b7600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106123fc576123fc614af6565b602002602001018190525050506001816124169190614b99565b9050612304565b50505090565b61242b611ee6565b6001600160a01b0316336001600160a01b0316148061246657503360009081526000805160206151ea833981519152602052604090205460ff165b6124bc5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b600182511115612548576040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b03841690632eb2c2d690612511903090339087908790600401614ec6565b600060405180830381600087803b15801561252b57600080fd5b505af115801561253f573d6000803e3d6000fd5b5050505061260d565b826001600160a01b031663f242432a30338560008151811061256c5761256c614af6565b60200260200101518560008151811061258757612587614af6565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156125f457600080fd5b505af1158015612608573d6000803e3d6000fd5b505050505b826001600160a01b0316846001600160a01b03167f910db9ce6f750316c5cbc1d9a16b0d05a718599b12f03354ed7354889c3e24958484604051612652929190614f26565b60405180910390a350505050565b60606121ab600080516020615231833981519152612fe9565b6040805160a08082018352600080835260606020808501829052848601839052818501839052608085018390526001600160a01b0387168084527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0582528684208751938401885280548452600101546001600160801b0380821685850152600160801b90910416838801528651948501875280855283527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06815294909120929390929082019061274890612fe9565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b600083856001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b533856040516127c191815260200190565b60405180910390a3507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b600080600080612804868661378d565b92509250925061281482826137da565b5090949350505050565b6001600160a01b03811660009081526001830160205260408120541515610ea1565b6000610799825490565b6000610ea183836138de565b600060048210156128915760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61289f600460008486614f4b565b610ea191614f75565b60008060448310156128e45760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b6128f2602460048587614f4b565b8101906128ff919061434f565b915061290f604460248587614f4b565b81019061291c919061436c565b90509250929050565b6060808060648410156129625760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61296f8460048188614f4b565b81019061297c9190614faa565b919790965090945092505050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156129e357507f000000000000000000000000000000000000000000000000000000000000000046145b15612a0d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b612ab9611ee6565b6001600160a01b0316336001600160a01b031614612b195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610834565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81206000612b9a612b5d610140870187614aaf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506139089050565b9050612ba68186610ac1565b612bb557600192505050610799565b6001600160a01b031660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0560209081526040808320815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845294825265ffffffffffff8086169483019490945292831691015260d09190911b7fffffffffffff00000000000000000000000000000000000000000000000000001660a09190911b79ffffffffffff00000000000000000000000000000000000000001617949350505050565b8015611d8657604051600090339060001990849084818181858888f193505050503d8060008114612265576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612d6290849061392c565b505050565b6001600160a01b03811660009081526020819052604090205460ff16611d86576040517f21ac7c5f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610834565b60006060856001600160a01b0316858585604051612de39291906150ba565b60006040518083038185875af1925050503d8060008114612e20576040519150601f19603f3d011682016040523d82523d6000602084013e612e25565b606091505b50909250905081612e3857805160208201fd5b856001600160a01b03167fbd580b8dbdf0089f9c3c255442bbef5c4ae91e268f64a237e8fef2b898806276868686604051612e75939291906150ca565b60405180910390a250949350505050565b612e9082826139bc565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b156118f3578015612f7e576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483005b600101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6257600080fd5b505af1158015612f76573d6000803e3d6000fd5b505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639387a380837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300612f18565b6000610ea1836001600160a01b038416613a77565b60606000610ea183613ac6565b6000610ea1836001600160a01b038416613b22565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b15611d86576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b613077602084018461434f565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483015460405160e084901b6001600160e01b03191681526001600160a01b0392909216600483015260248201526044015b600060405180830381600087803b1580156130e157600080fd5b505af1158015612265573d6000803e3d6000fd5b6040517f05a3b8090000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906305a3b80990602401602060405180830381865afa158015613154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131789190615100565b6131ae576040517f967bcfbf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040808220805460ff19166001179055513392917fa05fd23fb8e1c138e73b916ea82ed8f5a77a80a4aefb217defddec7508f6502291a35050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e961322d602084018461434f565b61323d6040850160208601614b68565b61324a6040860186614bac565b60405160200161325b929190615122565b60408051601f198184030181529190528051602090910120606086013561328860a0880160808901614b3c565b61329860c0890160a08a01614b3c565b6132a860e08a0160c08b01614b3c565b6132b96101008b0160e08c01614b3c565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061098e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061338d92509050613c1c565b90613908565b6001600160a01b038116600081815260208190526040808220805460ff19169055513392917f857479d213c45c7f46523c3e64420c84d4dd0b6ec4d904484a2657a08ac6928c91a350565b6060610ea1838360405180606001604052806027815260200161520a60279139613c49565b3360009081526000805160206151ea833981519152602052604090205460ff16612b195760405162461bcd60e51b815260206004820152600660248201527f2161646d696e00000000000000000000000000000000000000000000000000006044820152606401610834565b6118f38282613cc1565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680158080156134b9575060018360ff16105b806134d15750303b1580156134d157508260ff166001145b6135435760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610834565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff1916600117905580156135a4577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019166101001790555b6135e48686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613cf892505050565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830155613611866001612e86565b8015612f76577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019169055604080516001815290517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a1505050505050565b6040517fc3c5a5470000000000000000000000000000000000000000000000000000000081523060048201527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382169063c3c5a54790602401602060405180830381865afa1580156136fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137209190615100565b611d86577f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548301546040517f83a03f8c00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906383a03f8c906024016130c7565b600080600083516041036137c75760208401516040850151606086015160001a6137b988828585613d2b565b9550955095505050506137d3565b50508151600091506002905b9250925092565b60008260038111156137ee576137ee615159565b036137f7575050565b600182600381111561380b5761380b615159565b03613842576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600381111561385657613856615159565b03613890576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60038260038111156138a4576138a4615159565b036118f3576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60008260000182815481106138f5576138f5614af6565b9060005260206000200154905092915050565b60008060006139178585613dfa565b9150915061392481613e3f565b509392505050565b600080602060008451602086016000885af18061394f576040513d6000823e3d81fd5b50506000513d91508115613967578060011415613974565b6001600160a01b0384163b155b156139b6576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610834565b50505050565b6001600160a01b03821660009081526000805160206151ea83398151915260205260409020805460ff19168215801591909117909155613a1457613a0e60008051602061523183398151915283612fd4565b50613a2e565b613a2c60008051602061523183398151915283612ff6565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051613a6b911515815260200190565b60405180910390a25050565b6000818152600183016020526040812054613abe57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610799565b506000610799565b606081600001805480602002602001604051908101604052809291908181526020018280548015613b1657602002820191906000526020600020905b815481526020019060010190808311613b02575b50505050509050919050565b60008181526001830160205260408120548015613c0b576000613b4660018361516f565b8554909150600090613b5a9060019061516f565b9050818114613bbf576000866000018281548110613b7a57613b7a614af6565b9060005260206000200154905080876000018481548110613b9d57613b9d614af6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613bd057613bd0615182565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610799565b6000915050610799565b5092915050565b6000610799613c2961298a565b8360405161190160f01b8152600281019290925260228201526042902090565b6060600080856001600160a01b031685604051613c669190615198565b600060405180830381855af49150503d8060008114613ca1576040519150601f19603f3d011682016040523d82523d6000602084013e613ca6565b606091505b5091509150613cb786838387613fa4565b9695505050505050565b60005b8151811015612d6257613cf083838381518110613ce357613ce3614af6565b60200260200101516130f5565b600101613cc4565b60008282604051602001613d0d9291906151b4565b60405160208183030381529060405280519060200120905092915050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115613d665750600091506003905082613df0565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015613dba573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613de657506000925060019150829050613df0565b9250600091508190505b9450945094915050565b6000808251604103613e305760208301516040840151606085015160001a613e248782858561401d565b94509450505050613e38565b506000905060025b9250929050565b6000816004811115613e5357613e53615159565b03613e5b5750565b6001816004811115613e6f57613e6f615159565b03613ebc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610834565b6002816004811115613ed057613ed0615159565b03613f1d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610834565b6003816004811115613f3157613f31615159565b03611d865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610834565b6060831561401357825160000361400c576001600160a01b0385163b61400c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610834565b508161098e565b61098e83836140e1565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561405457506000905060036140d8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156140a8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166140d1576000600192509250506140d8565b9150600090505b94509492505050565b8151156140f15781518083602001fd5b8060405162461bcd60e51b815260040161083491906151d6565b60006020828403121561411d57600080fd5b81356001600160e01b031981168114610ea157600080fd5b6001600160a01b0381168114611d8657600080fd5b803561415581614135565b919050565b6000806040838503121561416d57600080fd5b823561417881614135565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141c5576141c5614186565b604052919050565b600082601f8301126141de57600080fd5b813567ffffffffffffffff8111156141f8576141f8614186565b61420b601f8201601f191660200161419c565b81815284602083860101111561422057600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561425357600080fd5b843561425e81614135565b9350602085013561426e81614135565b925060408501359150606085013567ffffffffffffffff81111561429157600080fd5b61429d878288016141cd565b91505092959194509250565b600080604083850312156142bc57600080fd5b82359150602083013567ffffffffffffffff8111156142da57600080fd5b6142e6858286016141cd565b9150509250929050565b6000610160828403121561430357600080fd5b50919050565b6000806040838503121561431c57600080fd5b823561432781614135565b9150602083013567ffffffffffffffff81111561434357600080fd5b6142e6858286016142f0565b60006020828403121561436157600080fd5b8135610ea181614135565b60006020828403121561437e57600080fd5b5035919050565b60008060006060848603121561439a57600080fd5b833567ffffffffffffffff8111156143b157600080fd5b6143bd868287016142f0565b9660208601359650604090950135949350505050565b6000806000606084860312156143e857600080fd5b83356143f381614135565b9250602084013561440381614135565b929592945050506040919091013590565b60008083601f84011261442657600080fd5b50813567ffffffffffffffff81111561443e57600080fd5b6020830191508360208260051b8501011115613e3857600080fd5b6000806000806000806060878903121561447257600080fd5b863567ffffffffffffffff81111561448957600080fd5b61449589828a01614414565b909750955050602087013567ffffffffffffffff8111156144b557600080fd5b6144c189828a01614414565b909550935050604087013567ffffffffffffffff8111156144e157600080fd5b6144ed89828a01614414565b979a9699509497509295939492505050565b60008083601f84011261451157600080fd5b50813567ffffffffffffffff81111561452957600080fd5b602083019150836020828501011115613e3857600080fd5b60008060006040848603121561455657600080fd5b833567ffffffffffffffff81111561456d57600080fd5b8401610120818703121561458057600080fd5b9250602084013567ffffffffffffffff81111561459c57600080fd5b6145a8868287016144ff565b9497909650939450505050565b600060a083016001600160a01b038351168452602083015160a0602086015281815180845260c087019150602083019350600092505b80831015614617576001600160a01b0384511682526020820191506020840193506001830192506145eb565b50604085015160408701526060850151925061463e60608701846001600160801b03169052565b60808501519250611ff660808701846001600160801b03169052565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f1987860301845261469e8583516145b5565b94506020938401939190910190600101614682565b50929695505050505050565b600080602083850312156146d257600080fd5b823567ffffffffffffffff8111156146e957600080fd5b6146f585828601614414565b90969095509350505050565b60005b8381101561471c578181015183820152602001614704565b50506000910152565b6000815180845261473d816020860160208601614701565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f19878603018452614795858351614725565b94506020938401939190910190600101614779565b600080600080606085870312156147c057600080fd5b84356147cb81614135565b935060208501359250604085013567ffffffffffffffff8111156147ee57600080fd5b6147fa878288016144ff565b95989497509550505050565b600067ffffffffffffffff82111561482057614820614186565b5060051b60200190565b600082601f83011261483b57600080fd5b813561484e61484982614806565b61419c565b8082825260208201915060208360051b86010192508583111561487057600080fd5b602085015b8381101561488d578035835260209283019201614875565b5095945050505050565b600080600080600060a086880312156148af57600080fd5b85356148ba81614135565b945060208601356148ca81614135565b9350604086013567ffffffffffffffff8111156148e657600080fd5b6148f28882890161482a565b935050606086013567ffffffffffffffff81111561490f57600080fd5b61491b8882890161482a565b925050608086013567ffffffffffffffff81111561493857600080fd5b614944888289016141cd565b9150509295509295909350565b60008060006040848603121561496657600080fd5b833561458081614135565b6000806000806080858703121561498757600080fd5b843561499281614135565b935060208501356149a281614135565b9250604085013567ffffffffffffffff8111156149be57600080fd5b6149ca8782880161482a565b925050606085013567ffffffffffffffff8111156149e757600080fd5b61429d8782880161482a565b602080825282518282018190526000918401906040840190835b81811015614a345783516001600160a01b0316835260209384019390920191600101614a0d565b509095945050505050565b602081526000610ea160208301846145b5565b600080600080600060a08688031215614a6a57600080fd5b8535614a7581614135565b94506020860135614a8581614135565b93506040860135925060608601359150608086013567ffffffffffffffff81111561493857600080fd5b6000808335601e19843603018112614ac657600080fd5b83018035915067ffffffffffffffff821115614ae157600080fd5b602001915036819003821315613e3857600080fd5b634e487b7160e01b600052603260045260246000fd5b600060208284031215614b1e57600080fd5b5051919050565b80356001600160801b038116811461415557600080fd5b600060208284031215614b4e57600080fd5b610ea182614b25565b803560ff8116811461415557600080fd5b600060208284031215614b7a57600080fd5b610ea182614b57565b634e487b7160e01b600052601160045260246000fd5b8082018082111561079957610799614b83565b6000808335601e19843603018112614bc357600080fd5b83018035915067ffffffffffffffff821115614bde57600080fd5b6020019150600581901b3603821315613e3857600080fd5b6000808335601e19843603018112614c0d57600080fd5b830160208101925035905067ffffffffffffffff811115614c2d57600080fd5b8060051b3603821315613e3857600080fd5b81835260208301925060008160005b84811015614c7f578135614c6181614135565b6001600160a01b031686526020958601959190910190600101614c4e565b5093949350505050565b60208152614caa60208201614c9d8461414a565b6001600160a01b03169052565b6000614cb860208401614b57565b60ff8116604084015250614ccf6040840184614bf6565b6101206060850152614ce661014085018284614c3f565b91505060006060850135905080608085015250614d0560808501614b25565b6001600160801b03811660a085015250614d2160a08501614b25565b6001600160801b03811660c085015250614d3d60c08501614b25565b6001600160801b03811660e085015250614d5960e08501614b25565b6001600160801b03811661010085015250610100939093013561012092909201919091525090565b600060208284031215614d9357600080fd5b8151610ea181614135565b600060018201614db057614db0614b83565b5060010190565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600082601f830112614dee57600080fd5b8135614dfc61484982614806565b8082825260208201915060208360051b860101925085831115614e1e57600080fd5b602085015b8381101561488d578035614e3681614135565b835260209283019201614e23565b600080600060608486031215614e5957600080fd5b8335925060208401359150604084013567ffffffffffffffff811115614e7e57600080fd5b614e8a86828701614ddd565b9150509250925092565b600081518084526020840193506020830160005b82811015614c7f578151865260209586019590910190600101614ea8565b6001600160a01b03851681526001600160a01b038416602082015260a060408201526000614ef760a0830185614e94565b8281036060840152614f098185614e94565b838103608090940193909352505060008152602001949350505050565b604081526000614f396040830185614e94565b8281036020840152611ff68185614e94565b60008085851115614f5b57600080fd5b83861115614f6857600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015613c15576001600160e01b0319808560040360031b1b82161691505092915050565b600080600060608486031215614fbf57600080fd5b833567ffffffffffffffff811115614fd657600080fd5b614fe286828701614ddd565b935050602084013567ffffffffffffffff811115614fff57600080fd5b61500b8682870161482a565b925050604084013567ffffffffffffffff81111561502857600080fd5b8401601f8101861361503957600080fd5b803561504761484982614806565b8082825260208201915060208360051b85010192508883111561506957600080fd5b602084015b838110156150ab57803567ffffffffffffffff81111561508d57600080fd5b61509c8b6020838901016141cd565b8452506020928301920161506e565b50809450505050509250925092565b8183823760009101908152919050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561511257600080fd5b81518015158114610ea157600080fd5b60008184825b85811015614a3457813561513b81614135565b6001600160a01b031683526020928301929190910190600101615128565b634e487b7160e01b600052602160045260246000fd5b8181038181111561079957610799614b83565b634e487b7160e01b600052603160045260246000fd5b600082516151aa818460208701614701565b9190910192915050565b6001600160a01b038316815260406020820152600061098e6040830184614725565b602081526000610ea1602083018461472556fe3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def04416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65643181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def00a264697066735822122095ddbc5358a3c2fa3bc6e31fe801d0fc0b535683cdb75d0cb98e52f9195cf37464736f6c634300081a003300000000000000000000000085e094b259718be1af0d8cbbd41dd7409c2200aa0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000002bb0c07966fe5ce342e7768f276f0e43a93bae32", + "nonce": "0x16", + "chainId": "0x14a34" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xb98bb7d458c6d29769513c8a073cb94328c14490", + "initCode": "0x61018060405234801561001157600080fd5b506040516155a23803806155a283398101604081905261003091610245565b60408051808201825260078152661058d8dbdd5b9d60ca1b60208083019182528351808501855260018152603160f81b908201529151902060e08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c0938401909652805194019390932090925291905261012052818161011061012c565b6001600160a01b039081166101405216610160525061027f9050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680156101bc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60ff8281161015610229577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff191660ff90811790915560408051918252517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a15b5050565b6001600160a01b038116811461024257600080fd5b50565b6000806040838503121561025857600080fd5b82516102638161022d565b60208401519092506102748161022d565b809150509250929050565b60805160a05160c05160e0516101005161012051610140516101605161528661031c6000396000611f210152600081816105ec01528181611867015281816121c601528181612e9a01528181612ed001528181612f88015281816130150152818161304501526136ab01526000612a1401526000612a6301526000612a3e01526000612997015260006129c1015260006129eb01526152866000f3fe6080604052600436106101dc5760003560e01c80638b52d72311610102578063c45a015511610095578063d8cb0d6611610064578063d8cb0d6614610658578063e9523c9714610678578063f15d424e1461069a578063f23a6e61146106c757610219565b8063c45a0155146105da578063d087d2881461060e578063d1f5789414610623578063d42f2f351461064357610219565b8063b0d691fe116100d1578063b0d691fe1461054d578063b61d27f61461057a578063b76464d51461059a578063bc197c81146105ba57610219565b80638b52d7231461049f578063a9082d84146104c1578063a95f524614610500578063ac9650d81461052057610219565b8063399b77da1161017a57806347e1da2a1161014957806347e1da2a1461041f5780635892e2361461043f578063610b59251461045f5780637dff5a791461047f57610219565b8063399b77da146103915780633a871cdd146103bf5780634025feb2146103df57806344004cc1146103ff57610219565b80631626ba7e116101b65780631626ba7e146102db5780631dd756c5146102fb57806324d7806c1461031b5780632d9ad53d1461036157610219565b806301ffc9a71461024b57806307b18bde14610280578063150b7a02146102a257610219565b366102195760405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee7660906020015b60405180910390a2005b60405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee76609060200161020f565b34801561025757600080fd5b5061026b61026636600461410b565b6106e7565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b36600461415a565b61079f565b005b3480156102ae57600080fd5b506102c26102bd36600461423d565b61094b565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f63660046142a9565b610996565b34801561030757600080fd5b5061026b610316366004614309565b610ac1565b34801561032757600080fd5b5061026b61033636600461434f565b6001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b34801561036d57600080fd5b5061026b61037c36600461434f565b60006020819052908152604090205460ff1681565b34801561039d57600080fd5b506103b16103ac36600461436c565b610db7565b604051908152602001610277565b3480156103cb57600080fd5b506103b16103da366004614385565b610e82565b3480156103eb57600080fd5b506102a06103fa3660046143d3565b610ea8565b34801561040b57600080fd5b506102a061041a3660046143d3565b611007565b34801561042b57600080fd5b506102a061043a366004614459565b6111b3565b34801561044b57600080fd5b506102a061045a366004614541565b61134a565b34801561046b57600080fd5b506102a061047a36600461434f565b6117ca565b34801561048b57600080fd5b5061026b61049a36600461434f565b6118f7565b3480156104ab57600080fd5b506104b46119cf565b604051610277919061465a565b3480156104cd57600080fd5b506104e16104dc366004614541565b611c58565b6040805192151583526001600160a01b03909116602083015201610277565b34801561050c57600080fd5b506102a061051b36600461434f565b611ce4565b34801561052c57600080fd5b5061054061053b3660046146bf565b611d89565b6040516102779190614751565b34801561055957600080fd5b50610562611ee6565b6040516001600160a01b039091168152602001610277565b34801561058657600080fd5b5061026b6105953660046147aa565b611f46565b3480156105a657600080fd5b506102a06105b536600461434f565b611fff565b3480156105c657600080fd5b506102c26105d5366004614897565b612060565b3480156105e657600080fd5b506105627f000000000000000000000000000000000000000000000000000000000000000081565b34801561061a57600080fd5b506103b1612117565b34801561062f57600080fd5b506102a061063e366004614951565b6121b0565b34801561064f57600080fd5b506104b461226c565b34801561066457600080fd5b506102a0610673366004614971565b612423565b34801561068457600080fd5b5061068d612660565b60405161027791906149f3565b3480156106a657600080fd5b506106ba6106b536600461434f565b612679565b6040516102779190614a3f565b3480156106d357600080fd5b506102c26106e2366004614a52565b612783565b60006001600160e01b031982167f1338becd00000000000000000000000000000000000000000000000000000000148061074a57506001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061076557506001600160e01b03198216630a85bd0160e11b145b8061079957506001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6107a7611ee6565b6001600160a01b0316336001600160a01b031614806107e257503360009081526000805160206151ea833981519152602052604090205460ff165b61083d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b60648201526084015b60405180910390fd5b47811115610877576040517f433bcf7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146108c4576040519150601f19603f3d011682016040523d82523d6000602084013e6108c9565b606091505b5050905080610904576040517f8103725c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518281526000906001600160a01b038516907f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e76906020015b60405180910390a3505050565b600082846001600160a01b03167f35a641d6803b18b3c2a97b78c27d31dab914e9626b63b48fb9c5747c93a3f96d60405160405180910390a350630a85bd0160e11b5b949350505050565b6000806109a284610db7565b905060006109b082856127f4565b90506109e1816001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b156109f85750630b135d3f60e11b91506107999050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0660205260409020610a39813361281e565b80610a695750610a4881612840565b6001148015610a6957506000610a5e828261284a565b6001600160a01b0316145b610a9f576040517f81799bfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa8826118f7565b15610ab857630b135d3f60e11b93505b50505092915050565b6001600160a01b03821660009081526000805160206151ea833981519152602052604081205460ff1615610af757506001610799565b6001600160a01b03831660008181527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216838601908152600160801b9092048116838501529585527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0690935292209051919290914291161180610bad575081604001516001600160801b03164210155b80610bbe5750610bbc81612840565b155b15610bce57600092505050610799565b6000610be5610be06060870187614aaf565b612856565b90506000610bf283612840565b6001148015610c1357506000610c08848261284a565b6001600160a01b0316145b90507f49e2d80a000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610ca357600080610c5e610c5960608a018a614aaf565b6128a8565b9150915082610c8457610c71858361281e565b610c845760009650505050505050610799565b8551811115610c9c5760009650505050505050610799565b5050610daa565b7fb81e25d6000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610d9d57600080610cec610ce760608a018a614aaf565b612925565b509150915082610d4c5760005b8251811015610d4a57610d2e838281518110610d1757610d17614af6565b60200260200101518761281e90919063ffffffff16565b610d42576000975050505050505050610799565b600101610cf9565b505b60005b8251811015610d9557818181518110610d6a57610d6a614af6565b602002602001015187600001511015610d8d576000975050505050505050610799565b600101610d4f565b505050610daa565b6000945050505050610799565b5060019695505050505050565b60008082604051602001610dcd91815260200190565b60405160208183030381529060405280519060200120905060007f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28482604051602001610e23929190918252602082015260400190565b604051602081830303815290604052805190602001209050610e4361298a565b60405161190160f01b60208201526022810191909152604281018290526062016040516020818303038152906040528051906020012092505050919050565b6000610e8c612ab1565b610e968484612b1b565b9050610ea182612c95565b9392505050565b610eb0611ee6565b6001600160a01b0316336001600160a01b03161480610eeb57503360009081526000805160206151ea833981519152602052604090205460ff165b610f415760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f42842e0e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018390528316906342842e0e90606401600060405180830381600087803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b03167feea167c0d54572a80626f5fd092a7c1f7b5d8e309533747e7e7d77b0558d6cf18360405161093e91815260200190565b61100f611ee6565b6001600160a01b0316336001600160a01b0316148061104a57503360009081526000805160206151ea833981519152602052604090205460ff165b6110a05760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156110fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111219190614b0c565b81111561115a576040517fb5a0380d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e6001600160a01b0383168483612ce2565b816001600160a01b0316836001600160a01b03167f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e768360405161093e91815260200190565b6111bb611ee6565b6001600160a01b0316336001600160a01b031614806111f657503360009081526000805160206151ea833981519152602052604090205460ff165b61124c5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b84818114801561125b57508084145b611291576040517f9e63483b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611340576112cb8888838181106112b1576112b1614af6565b90506020020160208101906112c6919061434f565b612d67565b6113378888838181106112e0576112e0614af6565b90506020020160208101906112f5919061434f565b87878481811061130757611307614af6565b9050602002013586868581811061132057611320614af6565b90506020028101906113329190614aaf565b612dc4565b50600101611294565b5050505050505050565b6000611359602085018561434f565b90504261136c60e0860160c08701614b3c565b6001600160801b03161115801561139b575061138f610100850160e08601614b3c565b6001600160801b031642105b6113e75760405162461bcd60e51b815260206004820152600760248201527f21706572696f64000000000000000000000000000000000000000000000000006044820152606401610834565b6000806113f5868686611c58565b91509150816114485760405162461bcd60e51b81526004016108349060208082526004908201527f2173696700000000000000000000000000000000000000000000000000000000604082015260600190565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0760209081526040808320805460ff1916600117905561149891908901908901614b68565b60ff1611156114ce5760006114b36040880160208901614b68565b60ff1660011490506114c58482612e86565b50505050505050565b6001600160a01b03831660009081526000805160206151ea833981519152602052604090205460ff16156115445760405162461bcd60e51b815260206004820152600560248201527f61646d696e0000000000000000000000000000000000000000000000000000006044820152606401610834565b61156e7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0284612fd4565b506040518060600160405280876060013581526020018760800160208101906115979190614b3c565b6001600160801b031681526020016115b560c0890160a08a01614b3c565b6001600160801b031690526000805160206152318339815191526001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b0293169290921760019092019190915561165261163160008051602061523183398151915290565b6001600160a01b038616600090815260069190910160205260409020612fe9565b805190915060005b818110156116c9576116b683828151811061167757611677614af6565b602002602001015161169460008051602061523183398151915290565b6001600160a01b03891660009081526006919091016020526040902090612ff6565b506116c2600182614b99565b905061165a565b506116d76040890189614bac565b9050905060005b8181101561176b576117586116f660408b018b614bac565b8381811061170657611706614af6565b905060200201602081019061171b919061434f565b6001600160a01b03881660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def066020526040902090612fd4565b50611764600182614b99565b90506116de565b506117758861300b565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516117b89190614c89565b60405180910390a35050505050505050565b6117d2611ee6565b6001600160a01b0316336001600160a01b0316148061180d57503360009081526000805160206151ea833981519152602052604090205460ff165b6118635760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190614d81565b90506118f381836130f5565b5050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216948301859052600160801b9091041691810191909152904210801590611980575080604001516001600160801b031642105b8015610ea157506001600160a01b03831660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06602052604081206119c790612840565b119392505050565b606060006119ee6000805160206152318339815191525b600201612fe9565b80519091506000805b82811015611a7f57611a21848281518110611a1457611a14614af6565b60200260200101516118f7565b15611a385781611a3081614d9e565b925050611a6d565b6000848281518110611a4c57611a4c614af6565b60200260200101906001600160a01b031690816001600160a01b0316815250505b611a78600182614b99565b90506119f7565b508067ffffffffffffffff811115611a9957611a99614186565b604051908082528060200260200182016040528015611af257816020015b6040805160a081018252600080825260606020808401829052938301829052820181905260808201528252600019909201910181611ab75790505b5093506000805b83811015611c505760006001600160a01b0316858281518110611b1e57611b1e614af6565b60200260200101516001600160a01b031614611c3e576000858281518110611b4857611b48614af6565b602002602001015190506000611b6960008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611bdf600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250888580611c1e90614d9e565b965081518110611c3057611c30614af6565b602002602001018190525050505b611c49600182614b99565b9050611af9565b505050505090565b600080611c6e611c67866131fd565b8585613341565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def07602052604090205490915060ff16158015611cda57506001600160a01b03811660009081526000805160206151ea833981519152602052604090205460ff165b9150935093915050565b611cec611ee6565b6001600160a01b0316336001600160a01b03161480611d2757503360009081526000805160206151ea833981519152602052604090205460ff165b611d7d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611d8681613393565b50565b60608167ffffffffffffffff811115611da457611da4614186565b604051908082528060200260200182016040528015611dd757816020015b6060815260200190600190039081611dc25790505b509050336000805b84811015610ab8578115611e5e57611e3c30878784818110611e0357611e03614af6565b9050602002810190611e159190614aaf565b86604051602001611e2893929190614db7565b6040516020818303038152906040526133de565b848281518110611e4e57611e4e614af6565b6020026020010181905250611ede565b611ec030878784818110611e7457611e74614af6565b9050602002810190611e869190614aaf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133de92505050565b848281518110611ed257611ed2614af6565b60200260200101819052505b600101611ddf565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300546000906001600160a01b03168015611f1f57919050565b7f000000000000000000000000000000000000000000000000000000000000000091505090565b6000611f50611ee6565b6001600160a01b0316336001600160a01b03161480611f8b57503360009081526000805160206151ea833981519152602052604090205460ff165b611fe15760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611fea85612d67565b611ff685858585612dc4565b95945050505050565b612007613403565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000805b84518110156120eb5784818151811061207f5761207f614af6565b6020026020010151866001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b5338684815181106120c4576120c4614af6565b60200260200101516040516120db91815260200190565b60405180910390a3600101612064565b507fbc197c81000000000000000000000000000000000000000000000000000000009695505050505050565b6000612121611ee6565b6040517f35567e1a000000000000000000000000000000000000000000000000000000008152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015612187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ab9190614b0c565b905090565b60006121be82840184614e44565b9250505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190614d81565b9050612252818361346f565b61225d858585613479565b61226561367d565b5050505050565b606060006122876000805160206152318339815191526119e6565b80519091508067ffffffffffffffff8111156122a5576122a5614186565b6040519080825280602002602001820160405280156122fe57816020015b6040805160a0810182526000808252606060208084018290529383018290528201819052608082015282526000199092019101816122c35790505b50925060005b8181101561241d57600083828151811061232057612320614af6565b60200260200101519050600061234160008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016123b7600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106123fc576123fc614af6565b602002602001018190525050506001816124169190614b99565b9050612304565b50505090565b61242b611ee6565b6001600160a01b0316336001600160a01b0316148061246657503360009081526000805160206151ea833981519152602052604090205460ff165b6124bc5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b600182511115612548576040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b03841690632eb2c2d690612511903090339087908790600401614ec6565b600060405180830381600087803b15801561252b57600080fd5b505af115801561253f573d6000803e3d6000fd5b5050505061260d565b826001600160a01b031663f242432a30338560008151811061256c5761256c614af6565b60200260200101518560008151811061258757612587614af6565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156125f457600080fd5b505af1158015612608573d6000803e3d6000fd5b505050505b826001600160a01b0316846001600160a01b03167f910db9ce6f750316c5cbc1d9a16b0d05a718599b12f03354ed7354889c3e24958484604051612652929190614f26565b60405180910390a350505050565b60606121ab600080516020615231833981519152612fe9565b6040805160a08082018352600080835260606020808501829052848601839052818501839052608085018390526001600160a01b0387168084527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0582528684208751938401885280548452600101546001600160801b0380821685850152600160801b90910416838801528651948501875280855283527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06815294909120929390929082019061274890612fe9565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b600083856001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b533856040516127c191815260200190565b60405180910390a3507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b600080600080612804868661378d565b92509250925061281482826137da565b5090949350505050565b6001600160a01b03811660009081526001830160205260408120541515610ea1565b6000610799825490565b6000610ea183836138de565b600060048210156128915760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61289f600460008486614f4b565b610ea191614f75565b60008060448310156128e45760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b6128f2602460048587614f4b565b8101906128ff919061434f565b915061290f604460248587614f4b565b81019061291c919061436c565b90509250929050565b6060808060648410156129625760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61296f8460048188614f4b565b81019061297c9190614faa565b919790965090945092505050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156129e357507f000000000000000000000000000000000000000000000000000000000000000046145b15612a0d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b612ab9611ee6565b6001600160a01b0316336001600160a01b031614612b195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610834565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81206000612b9a612b5d610140870187614aaf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506139089050565b9050612ba68186610ac1565b612bb557600192505050610799565b6001600160a01b031660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0560209081526040808320815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845294825265ffffffffffff8086169483019490945292831691015260d09190911b7fffffffffffff00000000000000000000000000000000000000000000000000001660a09190911b79ffffffffffff00000000000000000000000000000000000000001617949350505050565b8015611d8657604051600090339060001990849084818181858888f193505050503d8060008114612265576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612d6290849061392c565b505050565b6001600160a01b03811660009081526020819052604090205460ff16611d86576040517f21ac7c5f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610834565b60006060856001600160a01b0316858585604051612de39291906150ba565b60006040518083038185875af1925050503d8060008114612e20576040519150601f19603f3d011682016040523d82523d6000602084013e612e25565b606091505b50909250905081612e3857805160208201fd5b856001600160a01b03167fbd580b8dbdf0089f9c3c255442bbef5c4ae91e268f64a237e8fef2b898806276868686604051612e75939291906150ca565b60405180910390a250949350505050565b612e9082826139bc565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b156118f3578015612f7e576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483005b600101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6257600080fd5b505af1158015612f76573d6000803e3d6000fd5b505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639387a380837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300612f18565b6000610ea1836001600160a01b038416613a77565b60606000610ea183613ac6565b6000610ea1836001600160a01b038416613b22565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b15611d86576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b613077602084018461434f565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483015460405160e084901b6001600160e01b03191681526001600160a01b0392909216600483015260248201526044015b600060405180830381600087803b1580156130e157600080fd5b505af1158015612265573d6000803e3d6000fd5b6040517f05a3b8090000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906305a3b80990602401602060405180830381865afa158015613154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131789190615100565b6131ae576040517f967bcfbf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040808220805460ff19166001179055513392917fa05fd23fb8e1c138e73b916ea82ed8f5a77a80a4aefb217defddec7508f6502291a35050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e961322d602084018461434f565b61323d6040850160208601614b68565b61324a6040860186614bac565b60405160200161325b929190615122565b60408051601f198184030181529190528051602090910120606086013561328860a0880160808901614b3c565b61329860c0890160a08a01614b3c565b6132a860e08a0160c08b01614b3c565b6132b96101008b0160e08c01614b3c565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061098e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061338d92509050613c1c565b90613908565b6001600160a01b038116600081815260208190526040808220805460ff19169055513392917f857479d213c45c7f46523c3e64420c84d4dd0b6ec4d904484a2657a08ac6928c91a350565b6060610ea1838360405180606001604052806027815260200161520a60279139613c49565b3360009081526000805160206151ea833981519152602052604090205460ff16612b195760405162461bcd60e51b815260206004820152600660248201527f2161646d696e00000000000000000000000000000000000000000000000000006044820152606401610834565b6118f38282613cc1565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680158080156134b9575060018360ff16105b806134d15750303b1580156134d157508260ff166001145b6135435760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610834565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff1916600117905580156135a4577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019166101001790555b6135e48686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613cf892505050565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830155613611866001612e86565b8015612f76577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019169055604080516001815290517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a1505050505050565b6040517fc3c5a5470000000000000000000000000000000000000000000000000000000081523060048201527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382169063c3c5a54790602401602060405180830381865afa1580156136fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137209190615100565b611d86577f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548301546040517f83a03f8c00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906383a03f8c906024016130c7565b600080600083516041036137c75760208401516040850151606086015160001a6137b988828585613d2b565b9550955095505050506137d3565b50508151600091506002905b9250925092565b60008260038111156137ee576137ee615159565b036137f7575050565b600182600381111561380b5761380b615159565b03613842576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600381111561385657613856615159565b03613890576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60038260038111156138a4576138a4615159565b036118f3576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60008260000182815481106138f5576138f5614af6565b9060005260206000200154905092915050565b60008060006139178585613dfa565b9150915061392481613e3f565b509392505050565b600080602060008451602086016000885af18061394f576040513d6000823e3d81fd5b50506000513d91508115613967578060011415613974565b6001600160a01b0384163b155b156139b6576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610834565b50505050565b6001600160a01b03821660009081526000805160206151ea83398151915260205260409020805460ff19168215801591909117909155613a1457613a0e60008051602061523183398151915283612fd4565b50613a2e565b613a2c60008051602061523183398151915283612ff6565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051613a6b911515815260200190565b60405180910390a25050565b6000818152600183016020526040812054613abe57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610799565b506000610799565b606081600001805480602002602001604051908101604052809291908181526020018280548015613b1657602002820191906000526020600020905b815481526020019060010190808311613b02575b50505050509050919050565b60008181526001830160205260408120548015613c0b576000613b4660018361516f565b8554909150600090613b5a9060019061516f565b9050818114613bbf576000866000018281548110613b7a57613b7a614af6565b9060005260206000200154905080876000018481548110613b9d57613b9d614af6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613bd057613bd0615182565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610799565b6000915050610799565b5092915050565b6000610799613c2961298a565b8360405161190160f01b8152600281019290925260228201526042902090565b6060600080856001600160a01b031685604051613c669190615198565b600060405180830381855af49150503d8060008114613ca1576040519150601f19603f3d011682016040523d82523d6000602084013e613ca6565b606091505b5091509150613cb786838387613fa4565b9695505050505050565b60005b8151811015612d6257613cf083838381518110613ce357613ce3614af6565b60200260200101516130f5565b600101613cc4565b60008282604051602001613d0d9291906151b4565b60405160208183030381529060405280519060200120905092915050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115613d665750600091506003905082613df0565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015613dba573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613de657506000925060019150829050613df0565b9250600091508190505b9450945094915050565b6000808251604103613e305760208301516040840151606085015160001a613e248782858561401d565b94509450505050613e38565b506000905060025b9250929050565b6000816004811115613e5357613e53615159565b03613e5b5750565b6001816004811115613e6f57613e6f615159565b03613ebc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610834565b6002816004811115613ed057613ed0615159565b03613f1d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610834565b6003816004811115613f3157613f31615159565b03611d865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610834565b6060831561401357825160000361400c576001600160a01b0385163b61400c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610834565b508161098e565b61098e83836140e1565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561405457506000905060036140d8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156140a8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166140d1576000600192509250506140d8565b9150600090505b94509492505050565b8151156140f15781518083602001fd5b8060405162461bcd60e51b815260040161083491906151d6565b60006020828403121561411d57600080fd5b81356001600160e01b031981168114610ea157600080fd5b6001600160a01b0381168114611d8657600080fd5b803561415581614135565b919050565b6000806040838503121561416d57600080fd5b823561417881614135565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141c5576141c5614186565b604052919050565b600082601f8301126141de57600080fd5b813567ffffffffffffffff8111156141f8576141f8614186565b61420b601f8201601f191660200161419c565b81815284602083860101111561422057600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561425357600080fd5b843561425e81614135565b9350602085013561426e81614135565b925060408501359150606085013567ffffffffffffffff81111561429157600080fd5b61429d878288016141cd565b91505092959194509250565b600080604083850312156142bc57600080fd5b82359150602083013567ffffffffffffffff8111156142da57600080fd5b6142e6858286016141cd565b9150509250929050565b6000610160828403121561430357600080fd5b50919050565b6000806040838503121561431c57600080fd5b823561432781614135565b9150602083013567ffffffffffffffff81111561434357600080fd5b6142e6858286016142f0565b60006020828403121561436157600080fd5b8135610ea181614135565b60006020828403121561437e57600080fd5b5035919050565b60008060006060848603121561439a57600080fd5b833567ffffffffffffffff8111156143b157600080fd5b6143bd868287016142f0565b9660208601359650604090950135949350505050565b6000806000606084860312156143e857600080fd5b83356143f381614135565b9250602084013561440381614135565b929592945050506040919091013590565b60008083601f84011261442657600080fd5b50813567ffffffffffffffff81111561443e57600080fd5b6020830191508360208260051b8501011115613e3857600080fd5b6000806000806000806060878903121561447257600080fd5b863567ffffffffffffffff81111561448957600080fd5b61449589828a01614414565b909750955050602087013567ffffffffffffffff8111156144b557600080fd5b6144c189828a01614414565b909550935050604087013567ffffffffffffffff8111156144e157600080fd5b6144ed89828a01614414565b979a9699509497509295939492505050565b60008083601f84011261451157600080fd5b50813567ffffffffffffffff81111561452957600080fd5b602083019150836020828501011115613e3857600080fd5b60008060006040848603121561455657600080fd5b833567ffffffffffffffff81111561456d57600080fd5b8401610120818703121561458057600080fd5b9250602084013567ffffffffffffffff81111561459c57600080fd5b6145a8868287016144ff565b9497909650939450505050565b600060a083016001600160a01b038351168452602083015160a0602086015281815180845260c087019150602083019350600092505b80831015614617576001600160a01b0384511682526020820191506020840193506001830192506145eb565b50604085015160408701526060850151925061463e60608701846001600160801b03169052565b60808501519250611ff660808701846001600160801b03169052565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f1987860301845261469e8583516145b5565b94506020938401939190910190600101614682565b50929695505050505050565b600080602083850312156146d257600080fd5b823567ffffffffffffffff8111156146e957600080fd5b6146f585828601614414565b90969095509350505050565b60005b8381101561471c578181015183820152602001614704565b50506000910152565b6000815180845261473d816020860160208601614701565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f19878603018452614795858351614725565b94506020938401939190910190600101614779565b600080600080606085870312156147c057600080fd5b84356147cb81614135565b935060208501359250604085013567ffffffffffffffff8111156147ee57600080fd5b6147fa878288016144ff565b95989497509550505050565b600067ffffffffffffffff82111561482057614820614186565b5060051b60200190565b600082601f83011261483b57600080fd5b813561484e61484982614806565b61419c565b8082825260208201915060208360051b86010192508583111561487057600080fd5b602085015b8381101561488d578035835260209283019201614875565b5095945050505050565b600080600080600060a086880312156148af57600080fd5b85356148ba81614135565b945060208601356148ca81614135565b9350604086013567ffffffffffffffff8111156148e657600080fd5b6148f28882890161482a565b935050606086013567ffffffffffffffff81111561490f57600080fd5b61491b8882890161482a565b925050608086013567ffffffffffffffff81111561493857600080fd5b614944888289016141cd565b9150509295509295909350565b60008060006040848603121561496657600080fd5b833561458081614135565b6000806000806080858703121561498757600080fd5b843561499281614135565b935060208501356149a281614135565b9250604085013567ffffffffffffffff8111156149be57600080fd5b6149ca8782880161482a565b925050606085013567ffffffffffffffff8111156149e757600080fd5b61429d8782880161482a565b602080825282518282018190526000918401906040840190835b81811015614a345783516001600160a01b0316835260209384019390920191600101614a0d565b509095945050505050565b602081526000610ea160208301846145b5565b600080600080600060a08688031215614a6a57600080fd5b8535614a7581614135565b94506020860135614a8581614135565b93506040860135925060608601359150608086013567ffffffffffffffff81111561493857600080fd5b6000808335601e19843603018112614ac657600080fd5b83018035915067ffffffffffffffff821115614ae157600080fd5b602001915036819003821315613e3857600080fd5b634e487b7160e01b600052603260045260246000fd5b600060208284031215614b1e57600080fd5b5051919050565b80356001600160801b038116811461415557600080fd5b600060208284031215614b4e57600080fd5b610ea182614b25565b803560ff8116811461415557600080fd5b600060208284031215614b7a57600080fd5b610ea182614b57565b634e487b7160e01b600052601160045260246000fd5b8082018082111561079957610799614b83565b6000808335601e19843603018112614bc357600080fd5b83018035915067ffffffffffffffff821115614bde57600080fd5b6020019150600581901b3603821315613e3857600080fd5b6000808335601e19843603018112614c0d57600080fd5b830160208101925035905067ffffffffffffffff811115614c2d57600080fd5b8060051b3603821315613e3857600080fd5b81835260208301925060008160005b84811015614c7f578135614c6181614135565b6001600160a01b031686526020958601959190910190600101614c4e565b5093949350505050565b60208152614caa60208201614c9d8461414a565b6001600160a01b03169052565b6000614cb860208401614b57565b60ff8116604084015250614ccf6040840184614bf6565b6101206060850152614ce661014085018284614c3f565b91505060006060850135905080608085015250614d0560808501614b25565b6001600160801b03811660a085015250614d2160a08501614b25565b6001600160801b03811660c085015250614d3d60c08501614b25565b6001600160801b03811660e085015250614d5960e08501614b25565b6001600160801b03811661010085015250610100939093013561012092909201919091525090565b600060208284031215614d9357600080fd5b8151610ea181614135565b600060018201614db057614db0614b83565b5060010190565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600082601f830112614dee57600080fd5b8135614dfc61484982614806565b8082825260208201915060208360051b860101925085831115614e1e57600080fd5b602085015b8381101561488d578035614e3681614135565b835260209283019201614e23565b600080600060608486031215614e5957600080fd5b8335925060208401359150604084013567ffffffffffffffff811115614e7e57600080fd5b614e8a86828701614ddd565b9150509250925092565b600081518084526020840193506020830160005b82811015614c7f578151865260209586019590910190600101614ea8565b6001600160a01b03851681526001600160a01b038416602082015260a060408201526000614ef760a0830185614e94565b8281036060840152614f098185614e94565b838103608090940193909352505060008152602001949350505050565b604081526000614f396040830185614e94565b8281036020840152611ff68185614e94565b60008085851115614f5b57600080fd5b83861115614f6857600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015613c15576001600160e01b0319808560040360031b1b82161691505092915050565b600080600060608486031215614fbf57600080fd5b833567ffffffffffffffff811115614fd657600080fd5b614fe286828701614ddd565b935050602084013567ffffffffffffffff811115614fff57600080fd5b61500b8682870161482a565b925050604084013567ffffffffffffffff81111561502857600080fd5b8401601f8101861361503957600080fd5b803561504761484982614806565b8082825260208201915060208360051b85010192508883111561506957600080fd5b602084015b838110156150ab57803567ffffffffffffffff81111561508d57600080fd5b61509c8b6020838901016141cd565b8452506020928301920161506e565b50809450505050509250925092565b8183823760009101908152919050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561511257600080fd5b81518015158114610ea157600080fd5b60008184825b85811015614a3457813561513b81614135565b6001600160a01b031683526020928301929190910190600101615128565b634e487b7160e01b600052602160045260246000fd5b8181038181111561079957610799614b83565b634e487b7160e01b600052603160045260246000fd5b600082516151aa818460208701614701565b9190910192915050565b6001600160a01b038316815260406020820152600061098e6040830184614725565b602081526000610ea1602083018461472556fe3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def04416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65643181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def00a264697066735822122095ddbc5358a3c2fa3bc6e31fe801d0fc0b535683cdb75d0cb98e52f9195cf37464736f6c634300081a00330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000001df41979e30f247ba4e3338c6461ab542dea3d0b" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x72fa75", + "logs": [ + { + "address": "0xb98bb7d458c6d29769513c8a073cb94328c14490", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0x05c23379305baef91af4439770bfe5808379bfb0103e16aaac93fefe72d5e49d", + "blockNumber": "0x11a6212", + "transactionHash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionIndex": "0xc", + "logIndex": "0x1f", + "removed": false + }, + { + "address": "0x1df41979e30f247ba4e3338c6461ab542dea3d0b", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000085e094b259718be1af0d8cbbd41dd7409c2200aa", + "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c" + ], + "data": "0x", + "blockHash": "0x05c23379305baef91af4439770bfe5808379bfb0103e16aaac93fefe72d5e49d", + "blockNumber": "0x11a6212", + "transactionHash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionIndex": "0xc", + "logIndex": "0x20", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000020000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000010000000000000000010000000000000100010000000000000000020000000000000000000800000000000000000000080000000000000000000000000000000000000000000000000000001080000000100000000000000000000001000000000000000400000000000000000000001000000000000000000000000000000000000000040000000000000000000100000000000020000000000000000000000000000000000080000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionIndex": "0xc", + "blockHash": "0x05c23379305baef91af4439770bfe5808379bfb0103e16aaac93fefe72d5e49d", + "blockNumber": "0x11a6212", + "gasUsed": "0x62f954", + "effectiveGasPrice": "0xb0535", + "from": "0x85e094b259718be1af0d8cbbd41dd7409c2200aa", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x1df41979e30f247ba4e3338c6461ab542dea3d0b", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x11d12fa9ab5", + "l1GasPrice": "0x117cd04ef", + "l1GasUsed": "0x39d62" + } + ], + "libraries": [], + "pending": [], + "returns": { + "stationRegistry": { + "internal_type": "contract StationRegistry", + "value": "0x1DF41979E30F247ba4e3338c6461Ab542DeA3D0b" + } + }, + "timestamp": 1732780840, + "chain": 84532, + "commit": "0d7b5a9" +} \ No newline at end of file diff --git a/broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-latest.json b/broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-latest.json new file mode 100644 index 00000000..faa581d2 --- /dev/null +++ b/broadcast/DeployDeterministicStationRegistry.s.sol/84532/run-latest.json @@ -0,0 +1,98 @@ +{ + "transactions": [ + { + "hash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionType": "CREATE2", + "contractName": "StationRegistry", + "contractAddress": "0x1df41979e30f247ba4e3338c6461ab542dea3d0b", + "function": null, + "arguments": [ + "0x85E094B259718Be1AF0D8CbBD41dd7409c2200aa", + "0x5FF137D4b0FDCD49DcA30c7CF57E578a026d2789", + "0x2bb0c07966fE5ce342E7768f276F0e43A93BAe32" + ], + "transaction": { + "from": "0x85e094b259718be1af0d8cbbd41dd7409c2200aa", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "gas": "0x88a37f", + "value": "0x0", + "input": "0x7765726b2d73616c74000000000000000000000000000000000000000000000060c060405234801561001057600080fd5b5060405161766a38038061766a83398101604081905261002f916101c1565b813060405161003d9061019c565b6001600160a01b03928316815291166020820152604001604051809103906000f080158015610070573d6000803e3d6000fd5b506001600160a01b03908116608052821660a05261008f6000846100bc565b6001600955600680546001600160a01b0319166001600160a01b0392909216919091179055506102359050565b6100c682826100d4565b6100d0828261012f565b5050565b60008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b60008281526005602052604081208054916001919061014e838561020e565b9091555050600092835260056020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6155a2806120c883390190565b6001600160a01b03811681146101be57600080fd5b50565b6000806000606084860312156101d657600080fd5b83516101e1816101a9565b60208501519093506101f2816101a9565b6040850151909250610203816101a9565b809150509250925092565b8082018082111561022f57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a051611e52610276600039600081816103ce01526112610152600081816102140152818161084d01528181610f9501526111bd0152611e526000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806391d14854116100f9578063c3c5a54711610097578063d547741f11610071578063d547741f14610449578063d8fd8f441461045c578063e68a7c3b1461046f578063e6e1c5f81461048257600080fd5b8063c3c5a54714610410578063ca15c87314610423578063d0b3b66d1461043657600080fd5b8063a217fddf116100d3578063a217fddf146103ae578063a32fa5b3146103b6578063a65d69d4146103c9578063ac9650d8146103f057600080fd5b806391d148541461033f5780639387a380146103885780639efb95f71461039b57600080fd5b806340e0df2c116101665780637e5ef8a5116101405780637e5ef8a5146102e657806383a03f8c146103065780638878ed33146103195780639010d07c1461032c57600080fd5b806340e0df2c146102a257806358451f97146102b55780636424ea02146102bd57600080fd5b806311464fbe116101a257806311464fbe1461020f578063248a9ca31461024e5780632f2ff15d1461027c57806336568abe1461028f57600080fd5b806308e93d0a146101c95780630b61e12b146101e75780630e6254fd146101fc575b600080fd5b6101d1610495565b6040516101de91906118ca565b60405180910390f35b6101fa6101f5366004611905565b6104a6565b005b6101d161020a366004611931565b610573565b6102367f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101de565b61026e61025c36600461194e565b60009081526004602052604090205490565b6040519081526020016101de565b6101fa61028a366004611967565b61059d565b6101fa61029d366004611967565b610633565b6101fa6102b0366004611967565b610690565b61026e610736565b6102366102cb36600461194e565b6007602052600090815260409020546001600160a01b031681565b61026e6102f4366004611931565b60086020526000908152604090205481565b6101fa61031436600461194e565b610742565b610236610327366004611997565b610803565b61023661033a366004611a1e565b61087d565b61037861034d366004611967565b60009182526003602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60405190151581526020016101de565b6101fa610396366004611905565b61097d565b600654610236906001600160a01b031681565b61026e600081565b6103786103c4366004611967565b610a44565b6102367f000000000000000000000000000000000000000000000000000000000000000081565b6104036103fe366004611a40565b610a9a565b6040516101de9190611b07565b61037861041e366004611931565b610bf7565b61026e61043136600461194e565b610c03565b61026e610444366004611931565b610c9e565b6101fa610457366004611967565b610cbf565b61023661046a366004611997565b610cd8565b6101d161047d366004611a1e565b610dd3565b6101fa610490366004611931565b610f1f565b60606104a16000610f80565b905090565b336104b18183610f8d565b6105025760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e0060448201526064015b60405180910390fd5b6001600160a01b03831660009081526002602052604081206105249083610fd1565b9050801561056d57836001600160a01b0316826001600160a01b03167f12146497b3b826918ec47f0cac7272a09ed06b30c16c030e99ec48ff5dd60b4760405160405180910390a35b50505050565b6001600160a01b038116600090815260026020526040902060609061059790610f80565b92915050565b6000828152600460205260409020546105b69033610fe6565b60008281526003602090815260408083206001600160a01b038516845290915290205460ff1615610625576040517fd49c166a0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016104f9565b61062f8282611054565b5050565b336001600160a01b03821614610686576040517f4169c6220000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b03821660248201526044016104f9565b61062f8282611068565b6000828152600760205260409020546001600160a01b03163381146106c8576040516393d3ad0560e01b815260040160405180910390fd5b60008381526007602090815260409182902080546001600160a01b0319166001600160a01b03868116918217909255835191851682529181019190915284917ee234973d1c05a2bee786e3b7f12d0cfeb868b28869411adea70677d8817089910160405180910390a2505050565b60006104a160006110bf565b3361074d8183610f8d565b6107995760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e0060448201526064016104f9565b6107a4600082610fd1565b61062f5760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206044820152691c9959da5cdd195c995960b21b60648201526084016104f9565b6000806108468585858080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110c992505050565b90506108727f0000000000000000000000000000000000000000000000000000000000000000826110fc565b9150505b9392505050565b60008281526005602052604081205481805b828110156109745760008681526005602090815260408083208484526001019091529020546001600160a01b03161561090b578482036108f95760008681526005602090815260408083209383526001909301905220546001600160a01b03169250610597915050565b610904600183611b82565b9150610962565b600086815260036020908152604080832083805290915290205460ff16801561094f5750600086815260056020908152604080832083805260020190915290205481145b156109625761095f600183611b82565b91505b61096d600182611b82565b905061088f565b50505092915050565b336109888183610f8d565b6109d45760405162461bcd60e51b815260206004820152601f60248201527f4163636f756e74466163746f72793a206e6f7420616e206163636f756e742e0060448201526064016104f9565b6001600160a01b03831660009081526002602052604081206109f6908361115c565b9050801561056d57836001600160a01b0316826001600160a01b03167f98d1ebbe00ae92a5de96a0f49742a8afa89f42363592bc2e7cfaaed68b45e7a660405160405180910390a350505050565b600082815260036020908152604080832083805290915281205460ff16610a91575060008281526003602090815260408083206001600160a01b038516845290915290205460ff16610597565b50600192915050565b60608167ffffffffffffffff811115610ab557610ab5611b95565b604051908082528060200260200182016040528015610ae857816020015b6060815260200190600190039081610ad35790505b509050336000805b84811015610974578115610b6f57610b4d30878784818110610b1457610b14611bab565b9050602002810190610b269190611bc1565b86604051602001610b3993929190611c0f565b604051602081830303815290604052611171565b848281518110610b5f57610b5f611bab565b6020026020010181905250610bef565b610bd130878784818110610b8557610b85611bab565b9050602002810190610b979190611bc1565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061117192505050565b848281518110610be357610be3611bab565b60200260200101819052505b600101610af0565b60006105978183611196565b600081815260056020526040812054815b81811015610c675760008481526005602090815260408083208484526001019091529020546001600160a01b031615610c5557610c52600184611b82565b92505b610c60600182611b82565b9050610c14565b50600083815260036020908152604080832083805290915290205460ff1615610c9857610c95600183611b82565b91505b50919050565b6001600160a01b0381166000908152600260205260408120610597906110bf565b6000828152600460205260409020546106869033610fe6565b60008080610ce884860186611c35565b925092505081600003610d265760098054600081815260076020526040902080546001600160a01b0319163317905581546001019091559150610d5d565b6000828152600760205260409020546001600160a01b03163314610d5d576040516393d3ad0560e01b815260040160405180910390fd5b6000610d6a8787876111b8565b6001600160a01b0380821660009081526008602052604090819020869055519192508491908916907f3903d8288d7344aa44289047c6bed49db2c60352f049fe106a40bd65c17d870790610dc19085908790611d1a565b60405180910390a39695505050505050565b60608183108015610ded5750610de960006110bf565b8211155b610e5f5760405162461bcd60e51b815260206004820152602360248201527f426173654163636f756e74466163746f72793a20696e76616c696420696e646960448201527f636573000000000000000000000000000000000000000000000000000000000060648201526084016104f9565b6000610e6b8484611d3c565b9050610e778484611d3c565b67ffffffffffffffff811115610e8f57610e8f611b95565b604051908082528060200260200182016040528015610eb8578160200160208202803683370190505b50915060005b81811015610f1757610edb610ed38683611b82565b600090611346565b838281518110610eed57610eed611bab565b6001600160a01b0390921660209283029190910190910152610f10600182611b82565b9050610ebe565b505092915050565b6000610f2b8133610fe6565b600680546001600160a01b0319166001600160a01b0384169081179091556040519081527fe42f11c76713655cf0556d673fadbfff81330af747a8a1871cfbac889f8ea8f39060200160405180910390a15050565b6060600061087683611352565b600080610fba7f0000000000000000000000000000000000000000000000000000000000000000846110fc565b6001600160a01b0385811691161491505092915050565b6000610876836001600160a01b0384166113ae565b60008281526003602090815260408083206001600160a01b038516845290915290205460ff1661062f576040517f0878b1060000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602481018390526044016104f9565b61105e82826113fd565b61062f8282611458565b61107282826114c5565b60008281526005602090815260408083206001600160a01b03851680855260028201808552838620805487526001909301855292852080546001600160a01b031916905584529152555050565b6000610597825490565b600082826040516020016110de929190611d4f565b60405160208183030381529060405280519060200120905092915050565b6040513060388201526f5af43d82803e903d91602b57fd5bf3ff602482015260148101839052733d602d80600a3d3981f3363d3d373d3d3d363d738152605881018290526037600c82012060788201526055604390910120600090610876565b6000610876836001600160a01b038416611527565b60606108768383604051806060016040528060278152602001611df66027913961161a565b6001600160a01b03811660009081526001830160205260408120541515610876565b6000807f0000000000000000000000000000000000000000000000000000000000000000905060006112208686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110c992505050565b9050600061122e83836110fc565b90506001600160a01b0381163b1561124a579250610876915050565b6112548383611692565b9050336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146112f057611291600082610fd1565b6112f05760405162461bcd60e51b815260206004820152602a60248201527f4163636f756e74466163746f72793a206163636f756e7420616c7265616479206044820152691c9959da5cdd195c995960b21b60648201526084016104f9565b6112fc8188888861172f565b866001600160a01b0316816001600160a01b03167fac631f3001b55ea1509cf3d7e74898f85392a61a76e8149181ae1259622dabc860405160405180910390a39695505050505050565b600061087683836117b0565b6060816000018054806020026020016040519081016040528092919081815260200182805480156113a257602002820191906000526020600020905b81548152602001906001019080831161138e575b50505050509050919050565b60008181526001830160205260408120546113f557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610597565b506000610597565b60008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600560205260408120805491600191906114778385611b82565b9091555050600092835260056020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6114cf8282610fe6565b60008281526003602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6000818152600183016020526040812054801561161057600061154b600183611d3c565b855490915060009061155f90600190611d3c565b90508181146115c457600086600001828154811061157f5761157f611bab565b90600052602060002001549050808760000184815481106115a2576115a2611bab565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806115d5576115d5611d71565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610597565b6000915050610597565b6060600080856001600160a01b0316856040516116379190611d87565b600060405180830381855af49150503d8060008114611672576040519150601f19603f3d011682016040523d82523d6000602084013e611677565b606091505b5091509150611688868383876117da565b9695505050505050565b6000763d602d80600a3d3981f3363d3d373d3d3d363d730000008360601b60e81c176000526e5af43d82803e903d91602b57fd5bf38360781b1760205281603760096000f590506001600160a01b0381166105975760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016104f9565b6040517fd1f578940000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063d1f578949061177890869086908690600401611da3565b600060405180830381600087803b15801561179257600080fd5b505af11580156117a6573d6000803e3d6000fd5b5050505050505050565b60008260000182815481106117c7576117c7611bab565b9060005260206000200154905092915050565b60608315611849578251600003611842576001600160a01b0385163b6118425760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104f9565b5081611853565b611853838361185b565b949350505050565b81511561186b5781518083602001fd5b8060405162461bcd60e51b81526004016104f99190611de2565b600081518084526020840193506020830160005b828110156118c05781516001600160a01b0316865260209586019590910190600101611899565b5093949350505050565b6020815260006108766020830184611885565b6001600160a01b03811681146118f257600080fd5b50565b8035611900816118dd565b919050565b6000806040838503121561191857600080fd5b8235611923816118dd565b946020939093013593505050565b60006020828403121561194357600080fd5b8135610876816118dd565b60006020828403121561196057600080fd5b5035919050565b6000806040838503121561197a57600080fd5b82359150602083013561198c816118dd565b809150509250929050565b6000806000604084860312156119ac57600080fd5b83356119b7816118dd565b9250602084013567ffffffffffffffff8111156119d357600080fd5b8401601f810186136119e457600080fd5b803567ffffffffffffffff8111156119fb57600080fd5b866020828401011115611a0d57600080fd5b939660209190910195509293505050565b60008060408385031215611a3157600080fd5b50508035926020909101359150565b60008060208385031215611a5357600080fd5b823567ffffffffffffffff811115611a6a57600080fd5b8301601f81018513611a7b57600080fd5b803567ffffffffffffffff811115611a9257600080fd5b8560208260051b8401011115611aa757600080fd5b6020919091019590945092505050565b60005b83811015611ad2578181015183820152602001611aba565b50506000910152565b60008151808452611af3816020860160208601611ab7565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b82811015611b6057603f19878603018452611b4b858351611adb565b94506020938401939190910190600101611b2f565b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561059757610597611b6c565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112611bd857600080fd5b83018035915067ffffffffffffffff821115611bf357600080fd5b602001915036819003821315611c0857600080fd5b9250929050565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600080600060608486031215611c4a57600080fd5b8335925060208401359150604084013567ffffffffffffffff811115611c6f57600080fd5b8401601f81018613611c8057600080fd5b803567ffffffffffffffff811115611c9a57611c9a611b95565b8060051b604051601f19603f830116810181811067ffffffffffffffff82111715611cc757611cc7611b95565b604052918252602081840181019290810189841115611ce557600080fd5b6020850194505b83851015611d0b57611cfd856118f5565b815260209485019401611cec565b50809450505050509250925092565b6001600160a01b03831681526040602082015260006118536040830184611885565b8181038181111561059757610597611b6c565b6001600160a01b03831681526040602082015260006118536040830184611adb565b634e487b7160e01b600052603160045260246000fd5b60008251611d99818460208701611ab7565b9190910192915050565b6001600160a01b038416815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b6020815260006108766020830184611adb56fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212206aaeb3b3c37412e249f9180734759a11f3e62131baa41a8b17446b957d32f72164736f6c634300081a003361018060405234801561001157600080fd5b506040516155a23803806155a283398101604081905261003091610245565b60408051808201825260078152661058d8dbdd5b9d60ca1b60208083019182528351808501855260018152603160f81b908201529151902060e08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c0938401909652805194019390932090925291905261012052818161011061012c565b6001600160a01b039081166101405216610160525061027f9050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680156101bc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60ff8281161015610229577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff191660ff90811790915560408051918252517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a15b5050565b6001600160a01b038116811461024257600080fd5b50565b6000806040838503121561025857600080fd5b82516102638161022d565b60208401519092506102748161022d565b809150509250929050565b60805160a05160c05160e0516101005161012051610140516101605161528661031c6000396000611f210152600081816105ec01528181611867015281816121c601528181612e9a01528181612ed001528181612f88015281816130150152818161304501526136ab01526000612a1401526000612a6301526000612a3e01526000612997015260006129c1015260006129eb01526152866000f3fe6080604052600436106101dc5760003560e01c80638b52d72311610102578063c45a015511610095578063d8cb0d6611610064578063d8cb0d6614610658578063e9523c9714610678578063f15d424e1461069a578063f23a6e61146106c757610219565b8063c45a0155146105da578063d087d2881461060e578063d1f5789414610623578063d42f2f351461064357610219565b8063b0d691fe116100d1578063b0d691fe1461054d578063b61d27f61461057a578063b76464d51461059a578063bc197c81146105ba57610219565b80638b52d7231461049f578063a9082d84146104c1578063a95f524614610500578063ac9650d81461052057610219565b8063399b77da1161017a57806347e1da2a1161014957806347e1da2a1461041f5780635892e2361461043f578063610b59251461045f5780637dff5a791461047f57610219565b8063399b77da146103915780633a871cdd146103bf5780634025feb2146103df57806344004cc1146103ff57610219565b80631626ba7e116101b65780631626ba7e146102db5780631dd756c5146102fb57806324d7806c1461031b5780632d9ad53d1461036157610219565b806301ffc9a71461024b57806307b18bde14610280578063150b7a02146102a257610219565b366102195760405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee7660906020015b60405180910390a2005b60405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee76609060200161020f565b34801561025757600080fd5b5061026b61026636600461410b565b6106e7565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b36600461415a565b61079f565b005b3480156102ae57600080fd5b506102c26102bd36600461423d565b61094b565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f63660046142a9565b610996565b34801561030757600080fd5b5061026b610316366004614309565b610ac1565b34801561032757600080fd5b5061026b61033636600461434f565b6001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b34801561036d57600080fd5b5061026b61037c36600461434f565b60006020819052908152604090205460ff1681565b34801561039d57600080fd5b506103b16103ac36600461436c565b610db7565b604051908152602001610277565b3480156103cb57600080fd5b506103b16103da366004614385565b610e82565b3480156103eb57600080fd5b506102a06103fa3660046143d3565b610ea8565b34801561040b57600080fd5b506102a061041a3660046143d3565b611007565b34801561042b57600080fd5b506102a061043a366004614459565b6111b3565b34801561044b57600080fd5b506102a061045a366004614541565b61134a565b34801561046b57600080fd5b506102a061047a36600461434f565b6117ca565b34801561048b57600080fd5b5061026b61049a36600461434f565b6118f7565b3480156104ab57600080fd5b506104b46119cf565b604051610277919061465a565b3480156104cd57600080fd5b506104e16104dc366004614541565b611c58565b6040805192151583526001600160a01b03909116602083015201610277565b34801561050c57600080fd5b506102a061051b36600461434f565b611ce4565b34801561052c57600080fd5b5061054061053b3660046146bf565b611d89565b6040516102779190614751565b34801561055957600080fd5b50610562611ee6565b6040516001600160a01b039091168152602001610277565b34801561058657600080fd5b5061026b6105953660046147aa565b611f46565b3480156105a657600080fd5b506102a06105b536600461434f565b611fff565b3480156105c657600080fd5b506102c26105d5366004614897565b612060565b3480156105e657600080fd5b506105627f000000000000000000000000000000000000000000000000000000000000000081565b34801561061a57600080fd5b506103b1612117565b34801561062f57600080fd5b506102a061063e366004614951565b6121b0565b34801561064f57600080fd5b506104b461226c565b34801561066457600080fd5b506102a0610673366004614971565b612423565b34801561068457600080fd5b5061068d612660565b60405161027791906149f3565b3480156106a657600080fd5b506106ba6106b536600461434f565b612679565b6040516102779190614a3f565b3480156106d357600080fd5b506102c26106e2366004614a52565b612783565b60006001600160e01b031982167f1338becd00000000000000000000000000000000000000000000000000000000148061074a57506001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061076557506001600160e01b03198216630a85bd0160e11b145b8061079957506001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6107a7611ee6565b6001600160a01b0316336001600160a01b031614806107e257503360009081526000805160206151ea833981519152602052604090205460ff165b61083d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b60648201526084015b60405180910390fd5b47811115610877576040517f433bcf7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146108c4576040519150601f19603f3d011682016040523d82523d6000602084013e6108c9565b606091505b5050905080610904576040517f8103725c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518281526000906001600160a01b038516907f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e76906020015b60405180910390a3505050565b600082846001600160a01b03167f35a641d6803b18b3c2a97b78c27d31dab914e9626b63b48fb9c5747c93a3f96d60405160405180910390a350630a85bd0160e11b5b949350505050565b6000806109a284610db7565b905060006109b082856127f4565b90506109e1816001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b156109f85750630b135d3f60e11b91506107999050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0660205260409020610a39813361281e565b80610a695750610a4881612840565b6001148015610a6957506000610a5e828261284a565b6001600160a01b0316145b610a9f576040517f81799bfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa8826118f7565b15610ab857630b135d3f60e11b93505b50505092915050565b6001600160a01b03821660009081526000805160206151ea833981519152602052604081205460ff1615610af757506001610799565b6001600160a01b03831660008181527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216838601908152600160801b9092048116838501529585527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0690935292209051919290914291161180610bad575081604001516001600160801b03164210155b80610bbe5750610bbc81612840565b155b15610bce57600092505050610799565b6000610be5610be06060870187614aaf565b612856565b90506000610bf283612840565b6001148015610c1357506000610c08848261284a565b6001600160a01b0316145b90507f49e2d80a000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610ca357600080610c5e610c5960608a018a614aaf565b6128a8565b9150915082610c8457610c71858361281e565b610c845760009650505050505050610799565b8551811115610c9c5760009650505050505050610799565b5050610daa565b7fb81e25d6000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610d9d57600080610cec610ce760608a018a614aaf565b612925565b509150915082610d4c5760005b8251811015610d4a57610d2e838281518110610d1757610d17614af6565b60200260200101518761281e90919063ffffffff16565b610d42576000975050505050505050610799565b600101610cf9565b505b60005b8251811015610d9557818181518110610d6a57610d6a614af6565b602002602001015187600001511015610d8d576000975050505050505050610799565b600101610d4f565b505050610daa565b6000945050505050610799565b5060019695505050505050565b60008082604051602001610dcd91815260200190565b60405160208183030381529060405280519060200120905060007f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28482604051602001610e23929190918252602082015260400190565b604051602081830303815290604052805190602001209050610e4361298a565b60405161190160f01b60208201526022810191909152604281018290526062016040516020818303038152906040528051906020012092505050919050565b6000610e8c612ab1565b610e968484612b1b565b9050610ea182612c95565b9392505050565b610eb0611ee6565b6001600160a01b0316336001600160a01b03161480610eeb57503360009081526000805160206151ea833981519152602052604090205460ff165b610f415760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f42842e0e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018390528316906342842e0e90606401600060405180830381600087803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b03167feea167c0d54572a80626f5fd092a7c1f7b5d8e309533747e7e7d77b0558d6cf18360405161093e91815260200190565b61100f611ee6565b6001600160a01b0316336001600160a01b0316148061104a57503360009081526000805160206151ea833981519152602052604090205460ff165b6110a05760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156110fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111219190614b0c565b81111561115a576040517fb5a0380d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e6001600160a01b0383168483612ce2565b816001600160a01b0316836001600160a01b03167f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e768360405161093e91815260200190565b6111bb611ee6565b6001600160a01b0316336001600160a01b031614806111f657503360009081526000805160206151ea833981519152602052604090205460ff165b61124c5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b84818114801561125b57508084145b611291576040517f9e63483b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611340576112cb8888838181106112b1576112b1614af6565b90506020020160208101906112c6919061434f565b612d67565b6113378888838181106112e0576112e0614af6565b90506020020160208101906112f5919061434f565b87878481811061130757611307614af6565b9050602002013586868581811061132057611320614af6565b90506020028101906113329190614aaf565b612dc4565b50600101611294565b5050505050505050565b6000611359602085018561434f565b90504261136c60e0860160c08701614b3c565b6001600160801b03161115801561139b575061138f610100850160e08601614b3c565b6001600160801b031642105b6113e75760405162461bcd60e51b815260206004820152600760248201527f21706572696f64000000000000000000000000000000000000000000000000006044820152606401610834565b6000806113f5868686611c58565b91509150816114485760405162461bcd60e51b81526004016108349060208082526004908201527f2173696700000000000000000000000000000000000000000000000000000000604082015260600190565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0760209081526040808320805460ff1916600117905561149891908901908901614b68565b60ff1611156114ce5760006114b36040880160208901614b68565b60ff1660011490506114c58482612e86565b50505050505050565b6001600160a01b03831660009081526000805160206151ea833981519152602052604090205460ff16156115445760405162461bcd60e51b815260206004820152600560248201527f61646d696e0000000000000000000000000000000000000000000000000000006044820152606401610834565b61156e7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0284612fd4565b506040518060600160405280876060013581526020018760800160208101906115979190614b3c565b6001600160801b031681526020016115b560c0890160a08a01614b3c565b6001600160801b031690526000805160206152318339815191526001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b0293169290921760019092019190915561165261163160008051602061523183398151915290565b6001600160a01b038616600090815260069190910160205260409020612fe9565b805190915060005b818110156116c9576116b683828151811061167757611677614af6565b602002602001015161169460008051602061523183398151915290565b6001600160a01b03891660009081526006919091016020526040902090612ff6565b506116c2600182614b99565b905061165a565b506116d76040890189614bac565b9050905060005b8181101561176b576117586116f660408b018b614bac565b8381811061170657611706614af6565b905060200201602081019061171b919061434f565b6001600160a01b03881660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def066020526040902090612fd4565b50611764600182614b99565b90506116de565b506117758861300b565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516117b89190614c89565b60405180910390a35050505050505050565b6117d2611ee6565b6001600160a01b0316336001600160a01b0316148061180d57503360009081526000805160206151ea833981519152602052604090205460ff165b6118635760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190614d81565b90506118f381836130f5565b5050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216948301859052600160801b9091041691810191909152904210801590611980575080604001516001600160801b031642105b8015610ea157506001600160a01b03831660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06602052604081206119c790612840565b119392505050565b606060006119ee6000805160206152318339815191525b600201612fe9565b80519091506000805b82811015611a7f57611a21848281518110611a1457611a14614af6565b60200260200101516118f7565b15611a385781611a3081614d9e565b925050611a6d565b6000848281518110611a4c57611a4c614af6565b60200260200101906001600160a01b031690816001600160a01b0316815250505b611a78600182614b99565b90506119f7565b508067ffffffffffffffff811115611a9957611a99614186565b604051908082528060200260200182016040528015611af257816020015b6040805160a081018252600080825260606020808401829052938301829052820181905260808201528252600019909201910181611ab75790505b5093506000805b83811015611c505760006001600160a01b0316858281518110611b1e57611b1e614af6565b60200260200101516001600160a01b031614611c3e576000858281518110611b4857611b48614af6565b602002602001015190506000611b6960008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611bdf600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250888580611c1e90614d9e565b965081518110611c3057611c30614af6565b602002602001018190525050505b611c49600182614b99565b9050611af9565b505050505090565b600080611c6e611c67866131fd565b8585613341565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def07602052604090205490915060ff16158015611cda57506001600160a01b03811660009081526000805160206151ea833981519152602052604090205460ff165b9150935093915050565b611cec611ee6565b6001600160a01b0316336001600160a01b03161480611d2757503360009081526000805160206151ea833981519152602052604090205460ff165b611d7d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611d8681613393565b50565b60608167ffffffffffffffff811115611da457611da4614186565b604051908082528060200260200182016040528015611dd757816020015b6060815260200190600190039081611dc25790505b509050336000805b84811015610ab8578115611e5e57611e3c30878784818110611e0357611e03614af6565b9050602002810190611e159190614aaf565b86604051602001611e2893929190614db7565b6040516020818303038152906040526133de565b848281518110611e4e57611e4e614af6565b6020026020010181905250611ede565b611ec030878784818110611e7457611e74614af6565b9050602002810190611e869190614aaf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133de92505050565b848281518110611ed257611ed2614af6565b60200260200101819052505b600101611ddf565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300546000906001600160a01b03168015611f1f57919050565b7f000000000000000000000000000000000000000000000000000000000000000091505090565b6000611f50611ee6565b6001600160a01b0316336001600160a01b03161480611f8b57503360009081526000805160206151ea833981519152602052604090205460ff165b611fe15760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611fea85612d67565b611ff685858585612dc4565b95945050505050565b612007613403565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000805b84518110156120eb5784818151811061207f5761207f614af6565b6020026020010151866001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b5338684815181106120c4576120c4614af6565b60200260200101516040516120db91815260200190565b60405180910390a3600101612064565b507fbc197c81000000000000000000000000000000000000000000000000000000009695505050505050565b6000612121611ee6565b6040517f35567e1a000000000000000000000000000000000000000000000000000000008152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015612187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ab9190614b0c565b905090565b60006121be82840184614e44565b9250505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190614d81565b9050612252818361346f565b61225d858585613479565b61226561367d565b5050505050565b606060006122876000805160206152318339815191526119e6565b80519091508067ffffffffffffffff8111156122a5576122a5614186565b6040519080825280602002602001820160405280156122fe57816020015b6040805160a0810182526000808252606060208084018290529383018290528201819052608082015282526000199092019101816122c35790505b50925060005b8181101561241d57600083828151811061232057612320614af6565b60200260200101519050600061234160008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016123b7600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106123fc576123fc614af6565b602002602001018190525050506001816124169190614b99565b9050612304565b50505090565b61242b611ee6565b6001600160a01b0316336001600160a01b0316148061246657503360009081526000805160206151ea833981519152602052604090205460ff165b6124bc5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b600182511115612548576040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b03841690632eb2c2d690612511903090339087908790600401614ec6565b600060405180830381600087803b15801561252b57600080fd5b505af115801561253f573d6000803e3d6000fd5b5050505061260d565b826001600160a01b031663f242432a30338560008151811061256c5761256c614af6565b60200260200101518560008151811061258757612587614af6565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156125f457600080fd5b505af1158015612608573d6000803e3d6000fd5b505050505b826001600160a01b0316846001600160a01b03167f910db9ce6f750316c5cbc1d9a16b0d05a718599b12f03354ed7354889c3e24958484604051612652929190614f26565b60405180910390a350505050565b60606121ab600080516020615231833981519152612fe9565b6040805160a08082018352600080835260606020808501829052848601839052818501839052608085018390526001600160a01b0387168084527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0582528684208751938401885280548452600101546001600160801b0380821685850152600160801b90910416838801528651948501875280855283527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06815294909120929390929082019061274890612fe9565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b600083856001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b533856040516127c191815260200190565b60405180910390a3507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b600080600080612804868661378d565b92509250925061281482826137da565b5090949350505050565b6001600160a01b03811660009081526001830160205260408120541515610ea1565b6000610799825490565b6000610ea183836138de565b600060048210156128915760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61289f600460008486614f4b565b610ea191614f75565b60008060448310156128e45760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b6128f2602460048587614f4b565b8101906128ff919061434f565b915061290f604460248587614f4b565b81019061291c919061436c565b90509250929050565b6060808060648410156129625760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61296f8460048188614f4b565b81019061297c9190614faa565b919790965090945092505050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156129e357507f000000000000000000000000000000000000000000000000000000000000000046145b15612a0d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b612ab9611ee6565b6001600160a01b0316336001600160a01b031614612b195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610834565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81206000612b9a612b5d610140870187614aaf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506139089050565b9050612ba68186610ac1565b612bb557600192505050610799565b6001600160a01b031660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0560209081526040808320815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845294825265ffffffffffff8086169483019490945292831691015260d09190911b7fffffffffffff00000000000000000000000000000000000000000000000000001660a09190911b79ffffffffffff00000000000000000000000000000000000000001617949350505050565b8015611d8657604051600090339060001990849084818181858888f193505050503d8060008114612265576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612d6290849061392c565b505050565b6001600160a01b03811660009081526020819052604090205460ff16611d86576040517f21ac7c5f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610834565b60006060856001600160a01b0316858585604051612de39291906150ba565b60006040518083038185875af1925050503d8060008114612e20576040519150601f19603f3d011682016040523d82523d6000602084013e612e25565b606091505b50909250905081612e3857805160208201fd5b856001600160a01b03167fbd580b8dbdf0089f9c3c255442bbef5c4ae91e268f64a237e8fef2b898806276868686604051612e75939291906150ca565b60405180910390a250949350505050565b612e9082826139bc565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b156118f3578015612f7e576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483005b600101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6257600080fd5b505af1158015612f76573d6000803e3d6000fd5b505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639387a380837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300612f18565b6000610ea1836001600160a01b038416613a77565b60606000610ea183613ac6565b6000610ea1836001600160a01b038416613b22565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b15611d86576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b613077602084018461434f565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483015460405160e084901b6001600160e01b03191681526001600160a01b0392909216600483015260248201526044015b600060405180830381600087803b1580156130e157600080fd5b505af1158015612265573d6000803e3d6000fd5b6040517f05a3b8090000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906305a3b80990602401602060405180830381865afa158015613154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131789190615100565b6131ae576040517f967bcfbf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040808220805460ff19166001179055513392917fa05fd23fb8e1c138e73b916ea82ed8f5a77a80a4aefb217defddec7508f6502291a35050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e961322d602084018461434f565b61323d6040850160208601614b68565b61324a6040860186614bac565b60405160200161325b929190615122565b60408051601f198184030181529190528051602090910120606086013561328860a0880160808901614b3c565b61329860c0890160a08a01614b3c565b6132a860e08a0160c08b01614b3c565b6132b96101008b0160e08c01614b3c565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061098e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061338d92509050613c1c565b90613908565b6001600160a01b038116600081815260208190526040808220805460ff19169055513392917f857479d213c45c7f46523c3e64420c84d4dd0b6ec4d904484a2657a08ac6928c91a350565b6060610ea1838360405180606001604052806027815260200161520a60279139613c49565b3360009081526000805160206151ea833981519152602052604090205460ff16612b195760405162461bcd60e51b815260206004820152600660248201527f2161646d696e00000000000000000000000000000000000000000000000000006044820152606401610834565b6118f38282613cc1565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680158080156134b9575060018360ff16105b806134d15750303b1580156134d157508260ff166001145b6135435760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610834565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff1916600117905580156135a4577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019166101001790555b6135e48686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613cf892505050565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830155613611866001612e86565b8015612f76577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019169055604080516001815290517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a1505050505050565b6040517fc3c5a5470000000000000000000000000000000000000000000000000000000081523060048201527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382169063c3c5a54790602401602060405180830381865afa1580156136fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137209190615100565b611d86577f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548301546040517f83a03f8c00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906383a03f8c906024016130c7565b600080600083516041036137c75760208401516040850151606086015160001a6137b988828585613d2b565b9550955095505050506137d3565b50508151600091506002905b9250925092565b60008260038111156137ee576137ee615159565b036137f7575050565b600182600381111561380b5761380b615159565b03613842576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600381111561385657613856615159565b03613890576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60038260038111156138a4576138a4615159565b036118f3576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60008260000182815481106138f5576138f5614af6565b9060005260206000200154905092915050565b60008060006139178585613dfa565b9150915061392481613e3f565b509392505050565b600080602060008451602086016000885af18061394f576040513d6000823e3d81fd5b50506000513d91508115613967578060011415613974565b6001600160a01b0384163b155b156139b6576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610834565b50505050565b6001600160a01b03821660009081526000805160206151ea83398151915260205260409020805460ff19168215801591909117909155613a1457613a0e60008051602061523183398151915283612fd4565b50613a2e565b613a2c60008051602061523183398151915283612ff6565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051613a6b911515815260200190565b60405180910390a25050565b6000818152600183016020526040812054613abe57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610799565b506000610799565b606081600001805480602002602001604051908101604052809291908181526020018280548015613b1657602002820191906000526020600020905b815481526020019060010190808311613b02575b50505050509050919050565b60008181526001830160205260408120548015613c0b576000613b4660018361516f565b8554909150600090613b5a9060019061516f565b9050818114613bbf576000866000018281548110613b7a57613b7a614af6565b9060005260206000200154905080876000018481548110613b9d57613b9d614af6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613bd057613bd0615182565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610799565b6000915050610799565b5092915050565b6000610799613c2961298a565b8360405161190160f01b8152600281019290925260228201526042902090565b6060600080856001600160a01b031685604051613c669190615198565b600060405180830381855af49150503d8060008114613ca1576040519150601f19603f3d011682016040523d82523d6000602084013e613ca6565b606091505b5091509150613cb786838387613fa4565b9695505050505050565b60005b8151811015612d6257613cf083838381518110613ce357613ce3614af6565b60200260200101516130f5565b600101613cc4565b60008282604051602001613d0d9291906151b4565b60405160208183030381529060405280519060200120905092915050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115613d665750600091506003905082613df0565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015613dba573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613de657506000925060019150829050613df0565b9250600091508190505b9450945094915050565b6000808251604103613e305760208301516040840151606085015160001a613e248782858561401d565b94509450505050613e38565b506000905060025b9250929050565b6000816004811115613e5357613e53615159565b03613e5b5750565b6001816004811115613e6f57613e6f615159565b03613ebc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610834565b6002816004811115613ed057613ed0615159565b03613f1d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610834565b6003816004811115613f3157613f31615159565b03611d865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610834565b6060831561401357825160000361400c576001600160a01b0385163b61400c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610834565b508161098e565b61098e83836140e1565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561405457506000905060036140d8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156140a8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166140d1576000600192509250506140d8565b9150600090505b94509492505050565b8151156140f15781518083602001fd5b8060405162461bcd60e51b815260040161083491906151d6565b60006020828403121561411d57600080fd5b81356001600160e01b031981168114610ea157600080fd5b6001600160a01b0381168114611d8657600080fd5b803561415581614135565b919050565b6000806040838503121561416d57600080fd5b823561417881614135565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141c5576141c5614186565b604052919050565b600082601f8301126141de57600080fd5b813567ffffffffffffffff8111156141f8576141f8614186565b61420b601f8201601f191660200161419c565b81815284602083860101111561422057600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561425357600080fd5b843561425e81614135565b9350602085013561426e81614135565b925060408501359150606085013567ffffffffffffffff81111561429157600080fd5b61429d878288016141cd565b91505092959194509250565b600080604083850312156142bc57600080fd5b82359150602083013567ffffffffffffffff8111156142da57600080fd5b6142e6858286016141cd565b9150509250929050565b6000610160828403121561430357600080fd5b50919050565b6000806040838503121561431c57600080fd5b823561432781614135565b9150602083013567ffffffffffffffff81111561434357600080fd5b6142e6858286016142f0565b60006020828403121561436157600080fd5b8135610ea181614135565b60006020828403121561437e57600080fd5b5035919050565b60008060006060848603121561439a57600080fd5b833567ffffffffffffffff8111156143b157600080fd5b6143bd868287016142f0565b9660208601359650604090950135949350505050565b6000806000606084860312156143e857600080fd5b83356143f381614135565b9250602084013561440381614135565b929592945050506040919091013590565b60008083601f84011261442657600080fd5b50813567ffffffffffffffff81111561443e57600080fd5b6020830191508360208260051b8501011115613e3857600080fd5b6000806000806000806060878903121561447257600080fd5b863567ffffffffffffffff81111561448957600080fd5b61449589828a01614414565b909750955050602087013567ffffffffffffffff8111156144b557600080fd5b6144c189828a01614414565b909550935050604087013567ffffffffffffffff8111156144e157600080fd5b6144ed89828a01614414565b979a9699509497509295939492505050565b60008083601f84011261451157600080fd5b50813567ffffffffffffffff81111561452957600080fd5b602083019150836020828501011115613e3857600080fd5b60008060006040848603121561455657600080fd5b833567ffffffffffffffff81111561456d57600080fd5b8401610120818703121561458057600080fd5b9250602084013567ffffffffffffffff81111561459c57600080fd5b6145a8868287016144ff565b9497909650939450505050565b600060a083016001600160a01b038351168452602083015160a0602086015281815180845260c087019150602083019350600092505b80831015614617576001600160a01b0384511682526020820191506020840193506001830192506145eb565b50604085015160408701526060850151925061463e60608701846001600160801b03169052565b60808501519250611ff660808701846001600160801b03169052565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f1987860301845261469e8583516145b5565b94506020938401939190910190600101614682565b50929695505050505050565b600080602083850312156146d257600080fd5b823567ffffffffffffffff8111156146e957600080fd5b6146f585828601614414565b90969095509350505050565b60005b8381101561471c578181015183820152602001614704565b50506000910152565b6000815180845261473d816020860160208601614701565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f19878603018452614795858351614725565b94506020938401939190910190600101614779565b600080600080606085870312156147c057600080fd5b84356147cb81614135565b935060208501359250604085013567ffffffffffffffff8111156147ee57600080fd5b6147fa878288016144ff565b95989497509550505050565b600067ffffffffffffffff82111561482057614820614186565b5060051b60200190565b600082601f83011261483b57600080fd5b813561484e61484982614806565b61419c565b8082825260208201915060208360051b86010192508583111561487057600080fd5b602085015b8381101561488d578035835260209283019201614875565b5095945050505050565b600080600080600060a086880312156148af57600080fd5b85356148ba81614135565b945060208601356148ca81614135565b9350604086013567ffffffffffffffff8111156148e657600080fd5b6148f28882890161482a565b935050606086013567ffffffffffffffff81111561490f57600080fd5b61491b8882890161482a565b925050608086013567ffffffffffffffff81111561493857600080fd5b614944888289016141cd565b9150509295509295909350565b60008060006040848603121561496657600080fd5b833561458081614135565b6000806000806080858703121561498757600080fd5b843561499281614135565b935060208501356149a281614135565b9250604085013567ffffffffffffffff8111156149be57600080fd5b6149ca8782880161482a565b925050606085013567ffffffffffffffff8111156149e757600080fd5b61429d8782880161482a565b602080825282518282018190526000918401906040840190835b81811015614a345783516001600160a01b0316835260209384019390920191600101614a0d565b509095945050505050565b602081526000610ea160208301846145b5565b600080600080600060a08688031215614a6a57600080fd5b8535614a7581614135565b94506020860135614a8581614135565b93506040860135925060608601359150608086013567ffffffffffffffff81111561493857600080fd5b6000808335601e19843603018112614ac657600080fd5b83018035915067ffffffffffffffff821115614ae157600080fd5b602001915036819003821315613e3857600080fd5b634e487b7160e01b600052603260045260246000fd5b600060208284031215614b1e57600080fd5b5051919050565b80356001600160801b038116811461415557600080fd5b600060208284031215614b4e57600080fd5b610ea182614b25565b803560ff8116811461415557600080fd5b600060208284031215614b7a57600080fd5b610ea182614b57565b634e487b7160e01b600052601160045260246000fd5b8082018082111561079957610799614b83565b6000808335601e19843603018112614bc357600080fd5b83018035915067ffffffffffffffff821115614bde57600080fd5b6020019150600581901b3603821315613e3857600080fd5b6000808335601e19843603018112614c0d57600080fd5b830160208101925035905067ffffffffffffffff811115614c2d57600080fd5b8060051b3603821315613e3857600080fd5b81835260208301925060008160005b84811015614c7f578135614c6181614135565b6001600160a01b031686526020958601959190910190600101614c4e565b5093949350505050565b60208152614caa60208201614c9d8461414a565b6001600160a01b03169052565b6000614cb860208401614b57565b60ff8116604084015250614ccf6040840184614bf6565b6101206060850152614ce661014085018284614c3f565b91505060006060850135905080608085015250614d0560808501614b25565b6001600160801b03811660a085015250614d2160a08501614b25565b6001600160801b03811660c085015250614d3d60c08501614b25565b6001600160801b03811660e085015250614d5960e08501614b25565b6001600160801b03811661010085015250610100939093013561012092909201919091525090565b600060208284031215614d9357600080fd5b8151610ea181614135565b600060018201614db057614db0614b83565b5060010190565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600082601f830112614dee57600080fd5b8135614dfc61484982614806565b8082825260208201915060208360051b860101925085831115614e1e57600080fd5b602085015b8381101561488d578035614e3681614135565b835260209283019201614e23565b600080600060608486031215614e5957600080fd5b8335925060208401359150604084013567ffffffffffffffff811115614e7e57600080fd5b614e8a86828701614ddd565b9150509250925092565b600081518084526020840193506020830160005b82811015614c7f578151865260209586019590910190600101614ea8565b6001600160a01b03851681526001600160a01b038416602082015260a060408201526000614ef760a0830185614e94565b8281036060840152614f098185614e94565b838103608090940193909352505060008152602001949350505050565b604081526000614f396040830185614e94565b8281036020840152611ff68185614e94565b60008085851115614f5b57600080fd5b83861115614f6857600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015613c15576001600160e01b0319808560040360031b1b82161691505092915050565b600080600060608486031215614fbf57600080fd5b833567ffffffffffffffff811115614fd657600080fd5b614fe286828701614ddd565b935050602084013567ffffffffffffffff811115614fff57600080fd5b61500b8682870161482a565b925050604084013567ffffffffffffffff81111561502857600080fd5b8401601f8101861361503957600080fd5b803561504761484982614806565b8082825260208201915060208360051b85010192508883111561506957600080fd5b602084015b838110156150ab57803567ffffffffffffffff81111561508d57600080fd5b61509c8b6020838901016141cd565b8452506020928301920161506e565b50809450505050509250925092565b8183823760009101908152919050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561511257600080fd5b81518015158114610ea157600080fd5b60008184825b85811015614a3457813561513b81614135565b6001600160a01b031683526020928301929190910190600101615128565b634e487b7160e01b600052602160045260246000fd5b8181038181111561079957610799614b83565b634e487b7160e01b600052603160045260246000fd5b600082516151aa818460208701614701565b9190910192915050565b6001600160a01b038316815260406020820152600061098e6040830184614725565b602081526000610ea1602083018461472556fe3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def04416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65643181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def00a264697066735822122095ddbc5358a3c2fa3bc6e31fe801d0fc0b535683cdb75d0cb98e52f9195cf37464736f6c634300081a003300000000000000000000000085e094b259718be1af0d8cbbd41dd7409c2200aa0000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000002bb0c07966fe5ce342e7768f276f0e43a93bae32", + "nonce": "0x16", + "chainId": "0x14a34" + }, + "additionalContracts": [ + { + "transactionType": "CREATE", + "address": "0xb98bb7d458c6d29769513c8a073cb94328c14490", + "initCode": "0x61018060405234801561001157600080fd5b506040516155a23803806155a283398101604081905261003091610245565b60408051808201825260078152661058d8dbdd5b9d60ca1b60208083019182528351808501855260018152603160f81b908201529151902060e08190527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66101008190524660a081815285517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818701819052818801959095526060810193909352608080840192909252308382018190528651808503909201825260c0938401909652805194019390932090925291905261012052818161011061012c565b6001600160a01b039081166101405216610160525061027f9050565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680156101bc5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60ff8281161015610229577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff191660ff90811790915560408051918252517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a15b5050565b6001600160a01b038116811461024257600080fd5b50565b6000806040838503121561025857600080fd5b82516102638161022d565b60208401519092506102748161022d565b809150509250929050565b60805160a05160c05160e0516101005161012051610140516101605161528661031c6000396000611f210152600081816105ec01528181611867015281816121c601528181612e9a01528181612ed001528181612f88015281816130150152818161304501526136ab01526000612a1401526000612a6301526000612a3e01526000612997015260006129c1015260006129eb01526152866000f3fe6080604052600436106101dc5760003560e01c80638b52d72311610102578063c45a015511610095578063d8cb0d6611610064578063d8cb0d6614610658578063e9523c9714610678578063f15d424e1461069a578063f23a6e61146106c757610219565b8063c45a0155146105da578063d087d2881461060e578063d1f5789414610623578063d42f2f351461064357610219565b8063b0d691fe116100d1578063b0d691fe1461054d578063b61d27f61461057a578063b76464d51461059a578063bc197c81146105ba57610219565b80638b52d7231461049f578063a9082d84146104c1578063a95f524614610500578063ac9650d81461052057610219565b8063399b77da1161017a57806347e1da2a1161014957806347e1da2a1461041f5780635892e2361461043f578063610b59251461045f5780637dff5a791461047f57610219565b8063399b77da146103915780633a871cdd146103bf5780634025feb2146103df57806344004cc1146103ff57610219565b80631626ba7e116101b65780631626ba7e146102db5780631dd756c5146102fb57806324d7806c1461031b5780632d9ad53d1461036157610219565b806301ffc9a71461024b57806307b18bde14610280578063150b7a02146102a257610219565b366102195760405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee7660906020015b60405180910390a2005b60405134815233907f8ac633e5b094e1150d2a6495df4d0c77f51d293abe99e7733c78870dfbee76609060200161020f565b34801561025757600080fd5b5061026b61026636600461410b565b6106e7565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102a061029b36600461415a565b61079f565b005b3480156102ae57600080fd5b506102c26102bd36600461423d565b61094b565b6040516001600160e01b03199091168152602001610277565b3480156102e757600080fd5b506102c26102f63660046142a9565b610996565b34801561030757600080fd5b5061026b610316366004614309565b610ac1565b34801561032757600080fd5b5061026b61033636600461434f565b6001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b34801561036d57600080fd5b5061026b61037c36600461434f565b60006020819052908152604090205460ff1681565b34801561039d57600080fd5b506103b16103ac36600461436c565b610db7565b604051908152602001610277565b3480156103cb57600080fd5b506103b16103da366004614385565b610e82565b3480156103eb57600080fd5b506102a06103fa3660046143d3565b610ea8565b34801561040b57600080fd5b506102a061041a3660046143d3565b611007565b34801561042b57600080fd5b506102a061043a366004614459565b6111b3565b34801561044b57600080fd5b506102a061045a366004614541565b61134a565b34801561046b57600080fd5b506102a061047a36600461434f565b6117ca565b34801561048b57600080fd5b5061026b61049a36600461434f565b6118f7565b3480156104ab57600080fd5b506104b46119cf565b604051610277919061465a565b3480156104cd57600080fd5b506104e16104dc366004614541565b611c58565b6040805192151583526001600160a01b03909116602083015201610277565b34801561050c57600080fd5b506102a061051b36600461434f565b611ce4565b34801561052c57600080fd5b5061054061053b3660046146bf565b611d89565b6040516102779190614751565b34801561055957600080fd5b50610562611ee6565b6040516001600160a01b039091168152602001610277565b34801561058657600080fd5b5061026b6105953660046147aa565b611f46565b3480156105a657600080fd5b506102a06105b536600461434f565b611fff565b3480156105c657600080fd5b506102c26105d5366004614897565b612060565b3480156105e657600080fd5b506105627f000000000000000000000000000000000000000000000000000000000000000081565b34801561061a57600080fd5b506103b1612117565b34801561062f57600080fd5b506102a061063e366004614951565b6121b0565b34801561064f57600080fd5b506104b461226c565b34801561066457600080fd5b506102a0610673366004614971565b612423565b34801561068457600080fd5b5061068d612660565b60405161027791906149f3565b3480156106a657600080fd5b506106ba6106b536600461434f565b612679565b6040516102779190614a3f565b3480156106d357600080fd5b506102c26106e2366004614a52565b612783565b60006001600160e01b031982167f1338becd00000000000000000000000000000000000000000000000000000000148061074a57506001600160e01b031982167f4e2312e000000000000000000000000000000000000000000000000000000000145b8061076557506001600160e01b03198216630a85bd0160e11b145b8061079957506001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b6107a7611ee6565b6001600160a01b0316336001600160a01b031614806107e257503360009081526000805160206151ea833981519152602052604090205460ff165b61083d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b60648201526084015b60405180910390fd5b47811115610877576040517f433bcf7900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146108c4576040519150601f19603f3d011682016040523d82523d6000602084013e6108c9565b606091505b5050905080610904576040517f8103725c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518281526000906001600160a01b038516907f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e76906020015b60405180910390a3505050565b600082846001600160a01b03167f35a641d6803b18b3c2a97b78c27d31dab914e9626b63b48fb9c5747c93a3f96d60405160405180910390a350630a85bd0160e11b5b949350505050565b6000806109a284610db7565b905060006109b082856127f4565b90506109e1816001600160a01b031660009081526000805160206151ea833981519152602052604090205460ff1690565b156109f85750630b135d3f60e11b91506107999050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0660205260409020610a39813361281e565b80610a695750610a4881612840565b6001148015610a6957506000610a5e828261284a565b6001600160a01b0316145b610a9f576040517f81799bfb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610aa8826118f7565b15610ab857630b135d3f60e11b93505b50505092915050565b6001600160a01b03821660009081526000805160206151ea833981519152602052604081205460ff1615610af757506001610799565b6001600160a01b03831660008181527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216838601908152600160801b9092048116838501529585527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0690935292209051919290914291161180610bad575081604001516001600160801b03164210155b80610bbe5750610bbc81612840565b155b15610bce57600092505050610799565b6000610be5610be06060870187614aaf565b612856565b90506000610bf283612840565b6001148015610c1357506000610c08848261284a565b6001600160a01b0316145b90507f49e2d80a000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610ca357600080610c5e610c5960608a018a614aaf565b6128a8565b9150915082610c8457610c71858361281e565b610c845760009650505050505050610799565b8551811115610c9c5760009650505050505050610799565b5050610daa565b7fb81e25d6000000000000000000000000000000000000000000000000000000006001600160e01b0319831601610d9d57600080610cec610ce760608a018a614aaf565b612925565b509150915082610d4c5760005b8251811015610d4a57610d2e838281518110610d1757610d17614af6565b60200260200101518761281e90919063ffffffff16565b610d42576000975050505050505050610799565b600101610cf9565b505b60005b8251811015610d9557818181518110610d6a57610d6a614af6565b602002602001015187600001511015610d8d576000975050505050505050610799565b600101610d4f565b505050610daa565b6000945050505050610799565b5060019695505050505050565b60008082604051602001610dcd91815260200190565b60405160208183030381529060405280519060200120905060007f82cac545155fcbf147f2a9013809613677ac7d65498556e6d19ce43bcbf6c28482604051602001610e23929190918252602082015260400190565b604051602081830303815290604052805190602001209050610e4361298a565b60405161190160f01b60208201526022810191909152604281018290526062016040516020818303038152906040528051906020012092505050919050565b6000610e8c612ab1565b610e968484612b1b565b9050610ea182612c95565b9392505050565b610eb0611ee6565b6001600160a01b0316336001600160a01b03161480610eeb57503360009081526000805160206151ea833981519152602052604090205460ff165b610f415760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f42842e0e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038481166024830152604482018390528316906342842e0e90606401600060405180830381600087803b158015610faa57600080fd5b505af1158015610fbe573d6000803e3d6000fd5b50505050816001600160a01b0316836001600160a01b03167feea167c0d54572a80626f5fd092a7c1f7b5d8e309533747e7e7d77b0558d6cf18360405161093e91815260200190565b61100f611ee6565b6001600160a01b0316336001600160a01b0316148061104a57503360009081526000805160206151ea833981519152602052604090205460ff165b6110a05760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156110fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111219190614b0c565b81111561115a576040517fb5a0380d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e6001600160a01b0383168483612ce2565b816001600160a01b0316836001600160a01b03167f6f9cbac839b826cc524f53d10416c053fce34ec15fd1001720e777cc49720e768360405161093e91815260200190565b6111bb611ee6565b6001600160a01b0316336001600160a01b031614806111f657503360009081526000805160206151ea833981519152602052604090205460ff165b61124c5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b84818114801561125b57508084145b611291576040517f9e63483b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015611340576112cb8888838181106112b1576112b1614af6565b90506020020160208101906112c6919061434f565b612d67565b6113378888838181106112e0576112e0614af6565b90506020020160208101906112f5919061434f565b87878481811061130757611307614af6565b9050602002013586868581811061132057611320614af6565b90506020028101906113329190614aaf565b612dc4565b50600101611294565b5050505050505050565b6000611359602085018561434f565b90504261136c60e0860160c08701614b3c565b6001600160801b03161115801561139b575061138f610100850160e08601614b3c565b6001600160801b031642105b6113e75760405162461bcd60e51b815260206004820152600760248201527f21706572696f64000000000000000000000000000000000000000000000000006044820152606401610834565b6000806113f5868686611c58565b91509150816114485760405162461bcd60e51b81526004016108349060208082526004908201527f2173696700000000000000000000000000000000000000000000000000000000604082015260600190565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0760209081526040808320805460ff1916600117905561149891908901908901614b68565b60ff1611156114ce5760006114b36040880160208901614b68565b60ff1660011490506114c58482612e86565b50505050505050565b6001600160a01b03831660009081526000805160206151ea833981519152602052604090205460ff16156115445760405162461bcd60e51b815260206004820152600560248201527f61646d696e0000000000000000000000000000000000000000000000000000006044820152606401610834565b61156e7f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0284612fd4565b506040518060600160405280876060013581526020018760800160208101906115979190614b3c565b6001600160801b031681526020016115b560c0890160a08a01614b3c565b6001600160801b031690526000805160206152318339815191526001600160a01b03851660009081526005919091016020908152604080832084518155918401519301516001600160801b03908116600160801b0293169290921760019092019190915561165261163160008051602061523183398151915290565b6001600160a01b038616600090815260069190910160205260409020612fe9565b805190915060005b818110156116c9576116b683828151811061167757611677614af6565b602002602001015161169460008051602061523183398151915290565b6001600160a01b03891660009081526006919091016020526040902090612ff6565b506116c2600182614b99565b905061165a565b506116d76040890189614bac565b9050905060005b8181101561176b576117586116f660408b018b614bac565b8381811061170657611706614af6565b905060200201602081019061171b919061434f565b6001600160a01b03881660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def066020526040902090612fd4565b50611764600182614b99565b90506116de565b506117758861300b565b846001600160a01b0316836001600160a01b03167ff21d10c26e35863a8df291aca54181ee8c4a3bc8e00246c3f7a5a14b69d826a78a6040516117b89190614c89565b60405180910390a35050505050505050565b6117d2611ee6565b6001600160a01b0316336001600160a01b0316148061180d57503360009081526000805160206151ea833981519152602052604090205460ff165b6118635760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e79190614d81565b90506118f381836130f5565b5050565b6001600160a01b03811660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def05602090815260408083208151606081018352815481526001909101546001600160801b03808216948301859052600160801b9091041691810191909152904210801590611980575080604001516001600160801b031642105b8015610ea157506001600160a01b03831660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06602052604081206119c790612840565b119392505050565b606060006119ee6000805160206152318339815191525b600201612fe9565b80519091506000805b82811015611a7f57611a21848281518110611a1457611a14614af6565b60200260200101516118f7565b15611a385781611a3081614d9e565b925050611a6d565b6000848281518110611a4c57611a4c614af6565b60200260200101906001600160a01b031690816001600160a01b0316815250505b611a78600182614b99565b90506119f7565b508067ffffffffffffffff811115611a9957611a99614186565b604051908082528060200260200182016040528015611af257816020015b6040805160a081018252600080825260606020808401829052938301829052820181905260808201528252600019909201910181611ab75790505b5093506000805b83811015611c505760006001600160a01b0316858281518110611b1e57611b1e614af6565b60200260200101516001600160a01b031614611c3e576000858281518110611b4857611b48614af6565b602002602001015190506000611b6960008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a081019094529183529092508101611bdf600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250888580611c1e90614d9e565b965081518110611c3057611c30614af6565b602002602001018190525050505b611c49600182614b99565b9050611af9565b505050505090565b600080611c6e611c67866131fd565b8585613341565b61010086013560009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def07602052604090205490915060ff16158015611cda57506001600160a01b03811660009081526000805160206151ea833981519152602052604090205460ff165b9150935093915050565b611cec611ee6565b6001600160a01b0316336001600160a01b03161480611d2757503360009081526000805160206151ea833981519152602052604090205460ff165b611d7d5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611d8681613393565b50565b60608167ffffffffffffffff811115611da457611da4614186565b604051908082528060200260200182016040528015611dd757816020015b6060815260200190600190039081611dc25790505b509050336000805b84811015610ab8578115611e5e57611e3c30878784818110611e0357611e03614af6565b9050602002810190611e159190614aaf565b86604051602001611e2893929190614db7565b6040516020818303038152906040526133de565b848281518110611e4e57611e4e614af6565b6020026020010181905250611ede565b611ec030878784818110611e7457611e74614af6565b9050602002810190611e869190614aaf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506133de92505050565b848281518110611ed257611ed2614af6565b60200260200101819052505b600101611ddf565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300546000906001600160a01b03168015611f1f57919050565b7f000000000000000000000000000000000000000000000000000000000000000091505090565b6000611f50611ee6565b6001600160a01b0316336001600160a01b03161480611f8b57503360009081526000805160206151ea833981519152602052604090205460ff165b611fe15760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b611fea85612d67565b611ff685858585612dc4565b95945050505050565b612007613403565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000805b84518110156120eb5784818151811061207f5761207f614af6565b6020026020010151866001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b5338684815181106120c4576120c4614af6565b60200260200101516040516120db91815260200190565b60405180910390a3600101612064565b507fbc197c81000000000000000000000000000000000000000000000000000000009695505050505050565b6000612121611ee6565b6040517f35567e1a000000000000000000000000000000000000000000000000000000008152306004820152600060248201526001600160a01b0391909116906335567e1a90604401602060405180830381865afa158015612187573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ab9190614b0c565b905090565b60006121be82840184614e44565b9250505060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639efb95f76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190614d81565b9050612252818361346f565b61225d858585613479565b61226561367d565b5050505050565b606060006122876000805160206152318339815191526119e6565b80519091508067ffffffffffffffff8111156122a5576122a5614186565b6040519080825280602002602001820160405280156122fe57816020015b6040805160a0810182526000808252606060208084018290529383018290528201819052608082015282526000199092019101816122c35790505b50925060005b8181101561241d57600083828151811061232057612320614af6565b60200260200101519050600061234160008051602061523183398151915290565b6001600160a01b038316600081815260059290920160209081526040928390208351606081018552815481526001909101546001600160801b0380821683850152600160801b9091041681850152835160a0810190945291835290925081016123b7600080516020615231833981519152611631565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b03168152508684815181106123fc576123fc614af6565b602002602001018190525050506001816124169190614b99565b9050612304565b50505090565b61242b611ee6565b6001600160a01b0316336001600160a01b0316148061246657503360009081526000805160206151ea833981519152602052604090205460ff165b6124bc5760405162461bcd60e51b815260206004820152602160248201527f4163636f756e743a206e6f742061646d696e206f7220456e747279506f696e746044820152601760f91b6064820152608401610834565b600182511115612548576040517f2eb2c2d60000000000000000000000000000000000000000000000000000000081526001600160a01b03841690632eb2c2d690612511903090339087908790600401614ec6565b600060405180830381600087803b15801561252b57600080fd5b505af115801561253f573d6000803e3d6000fd5b5050505061260d565b826001600160a01b031663f242432a30338560008151811061256c5761256c614af6565b60200260200101518560008151811061258757612587614af6565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b1580156125f457600080fd5b505af1158015612608573d6000803e3d6000fd5b505050505b826001600160a01b0316846001600160a01b03167f910db9ce6f750316c5cbc1d9a16b0d05a718599b12f03354ed7354889c3e24958484604051612652929190614f26565b60405180910390a350505050565b60606121ab600080516020615231833981519152612fe9565b6040805160a08082018352600080835260606020808501829052848601839052818501839052608085018390526001600160a01b0387168084527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0582528684208751938401885280548452600101546001600160801b0380821685850152600160801b90910416838801528651948501875280855283527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def06815294909120929390929082019061274890612fe9565b81526020018260000151815260200182602001516001600160801b0316815260200182604001516001600160801b0316815250915050919050565b600083856001600160a01b03167f82cdbe4ae422077a9568bd10613c8abdb5dc95a06a18ebacad5907f88a07b533856040516127c191815260200190565b60405180910390a3507ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b600080600080612804868661378d565b92509250925061281482826137da565b5090949350505050565b6001600160a01b03811660009081526001830160205260408120541515610ea1565b6000610799825490565b6000610ea183836138de565b600060048210156128915760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61289f600460008486614f4b565b610ea191614f75565b60008060448310156128e45760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b6128f2602460048587614f4b565b8101906128ff919061434f565b915061290f604460248587614f4b565b81019061291c919061436c565b90509250929050565b6060808060648410156129625760405162461bcd60e51b8152602060048201526005602482015264214461746160d81b6044820152606401610834565b61296f8460048188614f4b565b81019061297c9190614faa565b919790965090945092505050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156129e357507f000000000000000000000000000000000000000000000000000000000000000046145b15612a0d57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b612ab9611ee6565b6001600160a01b0316336001600160a01b031614612b195760405162461bcd60e51b815260206004820152601c60248201527f6163636f756e743a206e6f742066726f6d20456e747279506f696e74000000006044820152606401610834565b565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c829052603c81206000612b9a612b5d610140870187614aaf565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506139089050565b9050612ba68186610ac1565b612bb557600192505050610799565b6001600160a01b031660009081527f3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def0560209081526040808320815160608082018452825482526001909201546001600160801b0380821683870152600160801b8204908116928501929092528351928301845294825265ffffffffffff8086169483019490945292831691015260d09190911b7fffffffffffff00000000000000000000000000000000000000000000000000001660a09190911b79ffffffffffff00000000000000000000000000000000000000001617949350505050565b8015611d8657604051600090339060001990849084818181858888f193505050503d8060008114612265576040519150601f19603f3d011682016040523d82523d6000602084013e612265565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612d6290849061392c565b505050565b6001600160a01b03811660009081526020819052604090205460ff16611d86576040517f21ac7c5f0000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610834565b60006060856001600160a01b0316858585604051612de39291906150ba565b60006040518083038185875af1925050503d8060008114612e20576040519150601f19603f3d011682016040523d82523d6000602084013e612e25565b606091505b50909250905081612e3857805160208201fd5b856001600160a01b03167fbd580b8dbdf0089f9c3c255442bbef5c4ae91e268f64a237e8fef2b898806276868686604051612e75939291906150ca565b60405180910390a250949350505050565b612e9082826139bc565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b156118f3578015612f7e576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483005b600101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f6257600080fd5b505af1158015612f76573d6000803e3d6000fd5b505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016639387a380837f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548300612f18565b6000610ea1836001600160a01b038416613a77565b60606000610ea183613ac6565b6000610ea1836001600160a01b038416613b22565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163b15611d86576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016630b61e12b613077602084018461434f565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b5483015460405160e084901b6001600160e01b03191681526001600160a01b0392909216600483015260248201526044015b600060405180830381600087803b1580156130e157600080fd5b505af1158015612265573d6000803e3d6000fd5b6040517f05a3b8090000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301528316906305a3b80990602401602060405180830381865afa158015613154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131789190615100565b6131ae576040517f967bcfbf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038116600081815260208190526040808220805460ff19166001179055513392917fa05fd23fb8e1c138e73b916ea82ed8f5a77a80a4aefb217defddec7508f6502291a35050565b60607f3fd4a1a1a267c84185e3b7eecd57c68783c0581d538b9d6e5f23e4670497c1e961322d602084018461434f565b61323d6040850160208601614b68565b61324a6040860186614bac565b60405160200161325b929190615122565b60408051601f198184030181529190528051602090910120606086013561328860a0880160808901614b3c565b61329860c0890160a08a01614b3c565b6132a860e08a0160c08b01614b3c565b6132b96101008b0160e08c01614b3c565b60408051602081019a909a526001600160a01b039098169789019790975260ff9095166060880152608087019390935260a08601919091526001600160801b0390811660c086015290811660e0850152908116610100848101919091529116610120830152830135610140820152610160016040516020818303038152906040529050919050565b600061098e83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508751602089012061338d92509050613c1c565b90613908565b6001600160a01b038116600081815260208190526040808220805460ff19169055513392917f857479d213c45c7f46523c3e64420c84d4dd0b6ec4d904484a2657a08ac6928c91a350565b6060610ea1838360405180606001604052806027815260200161520a60279139613c49565b3360009081526000805160206151ea833981519152602052604090205460ff16612b195760405162461bcd60e51b815260206004820152600660248201527f2161646d696e00000000000000000000000000000000000000000000000000006044820152606401610834565b6118f38282613cc1565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee03005460ff8082169161010090041680158080156134b9575060018360ff16105b806134d15750303b1580156134d157508260ff166001145b6135435760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610834565b7f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805460ff1916600117905580156135a4577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019166101001790555b6135e48686868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613cf892505050565b7f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b54830155613611866001612e86565b8015612f76577f322cf19c484104d3b1a9c2982ebae869ede3fa5f6c4703ca41b9a48c76ee0300805461ff0019169055604080516001815290517f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989181900360200190a1505050505050565b6040517fc3c5a5470000000000000000000000000000000000000000000000000000000081523060048201527f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0382169063c3c5a54790602401602060405180830381865afa1580156136fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137209190615100565b611d86577f036f52c1827dab135f7fd44ca0bddde297e2f659c710e0ec53e975f22b548301546040517f83a03f8c00000000000000000000000000000000000000000000000000000000815260048101919091526001600160a01b038216906383a03f8c906024016130c7565b600080600083516041036137c75760208401516040850151606086015160001a6137b988828585613d2b565b9550955095505050506137d3565b50508151600091506002905b9250925092565b60008260038111156137ee576137ee615159565b036137f7575050565b600182600381111561380b5761380b615159565b03613842576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600282600381111561385657613856615159565b03613890576040517ffce698f700000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60038260038111156138a4576138a4615159565b036118f3576040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260048101829052602401610834565b60008260000182815481106138f5576138f5614af6565b9060005260206000200154905092915050565b60008060006139178585613dfa565b9150915061392481613e3f565b509392505050565b600080602060008451602086016000885af18061394f576040513d6000823e3d81fd5b50506000513d91508115613967578060011415613974565b6001600160a01b0384163b155b156139b6576040517f5274afe70000000000000000000000000000000000000000000000000000000081526001600160a01b0385166004820152602401610834565b50505050565b6001600160a01b03821660009081526000805160206151ea83398151915260205260409020805460ff19168215801591909117909155613a1457613a0e60008051602061523183398151915283612fd4565b50613a2e565b613a2c60008051602061523183398151915283612ff6565b505b816001600160a01b03167f235bc17e7930760029e9f4d860a2a8089976de5b381cf8380fc11c1d88a1113382604051613a6b911515815260200190565b60405180910390a25050565b6000818152600183016020526040812054613abe57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610799565b506000610799565b606081600001805480602002602001604051908101604052809291908181526020018280548015613b1657602002820191906000526020600020905b815481526020019060010190808311613b02575b50505050509050919050565b60008181526001830160205260408120548015613c0b576000613b4660018361516f565b8554909150600090613b5a9060019061516f565b9050818114613bbf576000866000018281548110613b7a57613b7a614af6565b9060005260206000200154905080876000018481548110613b9d57613b9d614af6565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613bd057613bd0615182565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610799565b6000915050610799565b5092915050565b6000610799613c2961298a565b8360405161190160f01b8152600281019290925260228201526042902090565b6060600080856001600160a01b031685604051613c669190615198565b600060405180830381855af49150503d8060008114613ca1576040519150601f19603f3d011682016040523d82523d6000602084013e613ca6565b606091505b5091509150613cb786838387613fa4565b9695505050505050565b60005b8151811015612d6257613cf083838381518110613ce357613ce3614af6565b60200260200101516130f5565b600101613cc4565b60008282604051602001613d0d9291906151b4565b60405160208183030381529060405280519060200120905092915050565b600080807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0841115613d665750600091506003905082613df0565b604080516000808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015613dba573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613de657506000925060019150829050613df0565b9250600091508190505b9450945094915050565b6000808251604103613e305760208301516040840151606085015160001a613e248782858561401d565b94509450505050613e38565b506000905060025b9250929050565b6000816004811115613e5357613e53615159565b03613e5b5750565b6001816004811115613e6f57613e6f615159565b03613ebc5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610834565b6002816004811115613ed057613ed0615159565b03613f1d5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610834565b6003816004811115613f3157613f31615159565b03611d865760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610834565b6060831561401357825160000361400c576001600160a01b0385163b61400c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610834565b508161098e565b61098e83836140e1565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561405457506000905060036140d8565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156140a8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166140d1576000600192509250506140d8565b9150600090505b94509492505050565b8151156140f15781518083602001fd5b8060405162461bcd60e51b815260040161083491906151d6565b60006020828403121561411d57600080fd5b81356001600160e01b031981168114610ea157600080fd5b6001600160a01b0381168114611d8657600080fd5b803561415581614135565b919050565b6000806040838503121561416d57600080fd5b823561417881614135565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156141c5576141c5614186565b604052919050565b600082601f8301126141de57600080fd5b813567ffffffffffffffff8111156141f8576141f8614186565b61420b601f8201601f191660200161419c565b81815284602083860101111561422057600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806080858703121561425357600080fd5b843561425e81614135565b9350602085013561426e81614135565b925060408501359150606085013567ffffffffffffffff81111561429157600080fd5b61429d878288016141cd565b91505092959194509250565b600080604083850312156142bc57600080fd5b82359150602083013567ffffffffffffffff8111156142da57600080fd5b6142e6858286016141cd565b9150509250929050565b6000610160828403121561430357600080fd5b50919050565b6000806040838503121561431c57600080fd5b823561432781614135565b9150602083013567ffffffffffffffff81111561434357600080fd5b6142e6858286016142f0565b60006020828403121561436157600080fd5b8135610ea181614135565b60006020828403121561437e57600080fd5b5035919050565b60008060006060848603121561439a57600080fd5b833567ffffffffffffffff8111156143b157600080fd5b6143bd868287016142f0565b9660208601359650604090950135949350505050565b6000806000606084860312156143e857600080fd5b83356143f381614135565b9250602084013561440381614135565b929592945050506040919091013590565b60008083601f84011261442657600080fd5b50813567ffffffffffffffff81111561443e57600080fd5b6020830191508360208260051b8501011115613e3857600080fd5b6000806000806000806060878903121561447257600080fd5b863567ffffffffffffffff81111561448957600080fd5b61449589828a01614414565b909750955050602087013567ffffffffffffffff8111156144b557600080fd5b6144c189828a01614414565b909550935050604087013567ffffffffffffffff8111156144e157600080fd5b6144ed89828a01614414565b979a9699509497509295939492505050565b60008083601f84011261451157600080fd5b50813567ffffffffffffffff81111561452957600080fd5b602083019150836020828501011115613e3857600080fd5b60008060006040848603121561455657600080fd5b833567ffffffffffffffff81111561456d57600080fd5b8401610120818703121561458057600080fd5b9250602084013567ffffffffffffffff81111561459c57600080fd5b6145a8868287016144ff565b9497909650939450505050565b600060a083016001600160a01b038351168452602083015160a0602086015281815180845260c087019150602083019350600092505b80831015614617576001600160a01b0384511682526020820191506020840193506001830192506145eb565b50604085015160408701526060850151925061463e60608701846001600160801b03169052565b60808501519250611ff660808701846001600160801b03169052565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f1987860301845261469e8583516145b5565b94506020938401939190910190600101614682565b50929695505050505050565b600080602083850312156146d257600080fd5b823567ffffffffffffffff8111156146e957600080fd5b6146f585828601614414565b90969095509350505050565b60005b8381101561471c578181015183820152602001614704565b50506000910152565b6000815180845261473d816020860160208601614701565b601f01601f19169290920160200192915050565b6000602082016020835280845180835260408501915060408160051b86010192506020860160005b828110156146b357603f19878603018452614795858351614725565b94506020938401939190910190600101614779565b600080600080606085870312156147c057600080fd5b84356147cb81614135565b935060208501359250604085013567ffffffffffffffff8111156147ee57600080fd5b6147fa878288016144ff565b95989497509550505050565b600067ffffffffffffffff82111561482057614820614186565b5060051b60200190565b600082601f83011261483b57600080fd5b813561484e61484982614806565b61419c565b8082825260208201915060208360051b86010192508583111561487057600080fd5b602085015b8381101561488d578035835260209283019201614875565b5095945050505050565b600080600080600060a086880312156148af57600080fd5b85356148ba81614135565b945060208601356148ca81614135565b9350604086013567ffffffffffffffff8111156148e657600080fd5b6148f28882890161482a565b935050606086013567ffffffffffffffff81111561490f57600080fd5b61491b8882890161482a565b925050608086013567ffffffffffffffff81111561493857600080fd5b614944888289016141cd565b9150509295509295909350565b60008060006040848603121561496657600080fd5b833561458081614135565b6000806000806080858703121561498757600080fd5b843561499281614135565b935060208501356149a281614135565b9250604085013567ffffffffffffffff8111156149be57600080fd5b6149ca8782880161482a565b925050606085013567ffffffffffffffff8111156149e757600080fd5b61429d8782880161482a565b602080825282518282018190526000918401906040840190835b81811015614a345783516001600160a01b0316835260209384019390920191600101614a0d565b509095945050505050565b602081526000610ea160208301846145b5565b600080600080600060a08688031215614a6a57600080fd5b8535614a7581614135565b94506020860135614a8581614135565b93506040860135925060608601359150608086013567ffffffffffffffff81111561493857600080fd5b6000808335601e19843603018112614ac657600080fd5b83018035915067ffffffffffffffff821115614ae157600080fd5b602001915036819003821315613e3857600080fd5b634e487b7160e01b600052603260045260246000fd5b600060208284031215614b1e57600080fd5b5051919050565b80356001600160801b038116811461415557600080fd5b600060208284031215614b4e57600080fd5b610ea182614b25565b803560ff8116811461415557600080fd5b600060208284031215614b7a57600080fd5b610ea182614b57565b634e487b7160e01b600052601160045260246000fd5b8082018082111561079957610799614b83565b6000808335601e19843603018112614bc357600080fd5b83018035915067ffffffffffffffff821115614bde57600080fd5b6020019150600581901b3603821315613e3857600080fd5b6000808335601e19843603018112614c0d57600080fd5b830160208101925035905067ffffffffffffffff811115614c2d57600080fd5b8060051b3603821315613e3857600080fd5b81835260208301925060008160005b84811015614c7f578135614c6181614135565b6001600160a01b031686526020958601959190910190600101614c4e565b5093949350505050565b60208152614caa60208201614c9d8461414a565b6001600160a01b03169052565b6000614cb860208401614b57565b60ff8116604084015250614ccf6040840184614bf6565b6101206060850152614ce661014085018284614c3f565b91505060006060850135905080608085015250614d0560808501614b25565b6001600160801b03811660a085015250614d2160a08501614b25565b6001600160801b03811660c085015250614d3d60c08501614b25565b6001600160801b03811660e085015250614d5960e08501614b25565b6001600160801b03811661010085015250610100939093013561012092909201919091525090565b600060208284031215614d9357600080fd5b8151610ea181614135565b600060018201614db057614db0614b83565b5060010190565b8284823760609190911b6bffffffffffffffffffffffff19169101908152601401919050565b600082601f830112614dee57600080fd5b8135614dfc61484982614806565b8082825260208201915060208360051b860101925085831115614e1e57600080fd5b602085015b8381101561488d578035614e3681614135565b835260209283019201614e23565b600080600060608486031215614e5957600080fd5b8335925060208401359150604084013567ffffffffffffffff811115614e7e57600080fd5b614e8a86828701614ddd565b9150509250925092565b600081518084526020840193506020830160005b82811015614c7f578151865260209586019590910190600101614ea8565b6001600160a01b03851681526001600160a01b038416602082015260a060408201526000614ef760a0830185614e94565b8281036060840152614f098185614e94565b838103608090940193909352505060008152602001949350505050565b604081526000614f396040830185614e94565b8281036020840152611ff68185614e94565b60008085851115614f5b57600080fd5b83861115614f6857600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015613c15576001600160e01b0319808560040360031b1b82161691505092915050565b600080600060608486031215614fbf57600080fd5b833567ffffffffffffffff811115614fd657600080fd5b614fe286828701614ddd565b935050602084013567ffffffffffffffff811115614fff57600080fd5b61500b8682870161482a565b925050604084013567ffffffffffffffff81111561502857600080fd5b8401601f8101861361503957600080fd5b803561504761484982614806565b8082825260208201915060208360051b85010192508883111561506957600080fd5b602084015b838110156150ab57803567ffffffffffffffff81111561508d57600080fd5b61509c8b6020838901016141cd565b8452506020928301920161506e565b50809450505050509250925092565b8183823760009101908152919050565b83815260406020820152816040820152818360608301376000818301606090810191909152601f909201601f1916010192915050565b60006020828403121561511257600080fd5b81518015158114610ea157600080fd5b60008184825b85811015614a3457813561513b81614135565b6001600160a01b031683526020928301929190910190600101615128565b634e487b7160e01b600052602160045260246000fd5b8181038181111561079957610799614b83565b634e487b7160e01b600052603160045260246000fd5b600082516151aa818460208701614701565b9190910192915050565b6001600160a01b038316815260406020820152600061098e6040830184614725565b602081526000610ea1602083018461472556fe3181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def04416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65643181e78fc1b109bc611fd2406150bf06e33faa75f71cba12c3e1fd670f2def00a264697066735822122095ddbc5358a3c2fa3bc6e31fe801d0fc0b535683cdb75d0cb98e52f9195cf37464736f6c634300081a00330000000000000000000000005ff137d4b0fdcd49dca30c7cf57e578a026d27890000000000000000000000001df41979e30f247ba4e3338c6461ab542dea3d0b" + } + ], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x72fa75", + "logs": [ + { + "address": "0xb98bb7d458c6d29769513c8a073cb94328c14490", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "blockHash": "0x05c23379305baef91af4439770bfe5808379bfb0103e16aaac93fefe72d5e49d", + "blockNumber": "0x11a6212", + "transactionHash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionIndex": "0xc", + "logIndex": "0x1f", + "removed": false + }, + { + "address": "0x1df41979e30f247ba4e3338c6461ab542dea3d0b", + "topics": [ + "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x00000000000000000000000085e094b259718be1af0d8cbbd41dd7409c2200aa", + "0x0000000000000000000000004e59b44847b379578588920ca78fbf26c0b4956c" + ], + "data": "0x", + "blockHash": "0x05c23379305baef91af4439770bfe5808379bfb0103e16aaac93fefe72d5e49d", + "blockNumber": "0x11a6212", + "transactionHash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionIndex": "0xc", + "logIndex": "0x20", + "removed": false + } + ], + "logsBloom": "0x00000004000000000000000000000000000000020000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000010000000000000000010000000000000100010000000000000000020000000000000000000800000000000000000000080000000000000000000000000000000000000000000000000000001080000000100000000000000000000001000000000000000400000000000000000000001000000000000000000000000000000000000000040000000000000000000100000000000020000000000000000000000000000000000080000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x8108e975d9a983ff94e9ce03c24ec4f23274a943730961ebc3f13635dd7618a1", + "transactionIndex": "0xc", + "blockHash": "0x05c23379305baef91af4439770bfe5808379bfb0103e16aaac93fefe72d5e49d", + "blockNumber": "0x11a6212", + "gasUsed": "0x62f954", + "effectiveGasPrice": "0xb0535", + "from": "0x85e094b259718be1af0d8cbbd41dd7409c2200aa", + "to": "0x4e59b44847b379578588920ca78fbf26c0b4956c", + "contractAddress": "0x1df41979e30f247ba4e3338c6461ab542dea3d0b", + "l1BaseFeeScalar": "0x44d", + "l1BlobBaseFee": "0x1", + "l1BlobBaseFeeScalar": "0xa118b", + "l1Fee": "0x11d12fa9ab5", + "l1GasPrice": "0x117cd04ef", + "l1GasUsed": "0x39d62" + } + ], + "libraries": [], + "pending": [], + "returns": { + "stationRegistry": { + "internal_type": "contract StationRegistry", + "value": "0x1DF41979E30F247ba4e3338c6461Ab542DeA3D0b" + } + }, + "timestamp": 1732780840, + "chain": 84532, + "commit": "0d7b5a9" +} \ No newline at end of file